Отправка данных из Arduino с поддержкой BLE в приложение iOS

Я работаю с Adafruit Bluefruit Feather, чтобы создать устройство, которое собирает данные, а затем отправляет данные на iPhone, где они читаются и обрабатываются. Я просмотрел бесчисленное количество примеров, которые пытаются объяснить, как программировать устройство, но, похоже, у меня есть недопонимание, как подключить устройство через Bluetooth к iPhone.

Мы основали этот код на одном из примеров Adafruit и попытались включить библиотеку Adafruit BLE Gatt (https://learn.adafruit.com/introduction-adafruit-ble-bluetooth-low-energy-friend/ble-gatt), но он не работает и это наш первый опыт работы с Bluetooth. Используемый нами код iOS взят из https://github.com/nebs/hello-bluetooth. Мы не вносили никаких изменений в быстрый код. Любые советы приветствуются. Мы много нашли об отправке данных из приложения в Arduino, но ограничили информацию об отправке данных из Arduino в приложение. Если бы вы могли сообщить нам, на правильном ли мы пути или есть какие-либо изменения, которые необходимо внести в отправку данных, мы будем очень признательны.

Вот с чем я работал до сих пор:

#include <Arduino.h>
#include <SPI.h>
#if not defined (_VARIANT_ARDUINO_DUE_X_) && not defined (_VARIANT_ARDUINO_ZERO_)
  #include <SoftwareSerial.h>
#endif
#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"
#include "BluefruitConfig.h"
#include "Adafruit_BLEGatt.h"
#define FACTORYRESET_ENABLE      1
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
Adafruit_BLEGatt gatt(ble);
void error(const __FlashStringHelper*err) {
  Serial.println(err);
  while (1);
}

int32_t gattServiceId;
int32_t gattNotifiableCharId;
int32_t gattWritableResponseCharId;
int32_t gattWritableNoResponseCharId;
int32_t gattReadableCharId;
int32_t jumperPresentID;

void setup(void){
  while (!Serial);  // required for Flora & Micro
  delay(500);
  boolean success;
  Serial.begin(115200);
  randomSeed(micros());
  Serial.print(F("Initialising the Bluefruit LE module: "));
  if ( !ble.begin(VERBOSE_MODE) ){
    error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
  }
  Serial.println( F("OK!") );
  if ( FACTORYRESET_ENABLE ){
    Serial.println(F("Performing a factory reset: "));
    if ( ! ble.factoryReset() ){
      error(F("Couldn't factory reset"));
    }
  }
  ble.echo(false);
  Serial.println("Requesting Bluefruit info:");
  ble.info();
  Serial.println(F("Adding the Custom GATT Service definition: "));
  success = ble.sendCommandWithIntReply( F("AT+GATTADDSERVICE=UUID128=00-77-13-12-10-00-00-00-00-00-EE-BA-AD-DA-BE-CF"), &gattServiceId);
  if (! success) {
    error(F("Could not add Custom GATT service"));
  }
  Serial.println(F("Adding the Notifiable characteristic: "));
  success = ble.sendCommandWithIntReply( F("AT+GATTADDCHAR=UUID128=00-67-42-01-14-88-59-77-42-42-AB-BA-DA-DA-EE-CC,PROPERTIES=0x10,MIN_LEN=1, MAX_LEN=20, VALUE=-9999"), &gattNotifiableCharId);
    if (! success) {
    error(F("Could not add Custom Notifiable characteristic"));
  }
  Serial.println(F("Adding the Writable with Response characteristic: "));
  success = ble.sendCommandWithIntReply( F("AT+GATTADDCHAR=UUID128=00-68-42-02-00-77-12-10-13-42-CC-BA-DE-FA-EA-BB,PROPERTIES=0x04,MIN_LEN=1, MAX_LEN=20, VALUE=GREEN"), &gattWritableResponseCharId);
    if (! success) {
    error(F("Could not add Custom Writable with Response characteristic"));
  }
  Serial.println(F("Adding the Writable with No Response characteristic: "));
  success = ble.sendCommandWithIntReply( F("AT+GATTADDCHAR=UUID128=00-69-42-03-00-77-12-10-13-42-CC-BA-DE-FA-EA-BC,PROPERTIES=0x08,MIN_LEN=1, MAX_LEN=20, VALUE=GREEN"), &gattWritableNoResponseCharId);
    if (! success) {
    error(F("Could not add Custom Writable with No Response characteristic"));
  }
  Serial.println(F("Adding the Readable characteristic: "));
  success = ble.sendCommandWithIntReply( F("AT+GATTADDCHAR=UUID128=00-70-42-04-00-77-12-10-13-42-CC-BA-DE-FA-EA-BD,PROPERTIES=0x02,MIN_LEN=1, MAX_LEN=20, VALUE=GREEN"), &gattReadableCharId);
    if (! success) {
    error(F("Could not add Custom Readable characteristic"));
  }
  Serial.print(F("Adding Custom GATT Service UUID to the advertising payload: "));
  ble.sendCommandCheckOK( F("AT+GAPSETADVDATA=02-01-06-03-02-12-13") );

  jumperPresentID = gatt.addCharacteristic(0x04, GATT_CHARS_PROPERTIES_INDICATE, 5, 5, 5);

  /* Reset the device for the new service setting changes to take effect */
  Serial.print(F("Performing a SW reset (service changes require a reset): "));
  ble.reset();

  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(A3, INPUT);
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);  
  digitalWrite(A3, LOW);
  digitalWrite(A4, LOW);
  digitalWrite(A5, LOW);
}

void loop(void){
  Serial.println("VOLTAGE");
  int sensorValue = analogRead(A1);
  float voltage = sensorValue * (3.3 / 1023.0);
   delay(2000);
  Serial.println(voltage);
  if(voltage == 0){
    Serial.println("ALERT");
  }
  if(analogRead(A1) == 0 || analogRead(A2) == 0 || analogRead(A3) == 0 || analogRead(A4) == 0 || analogRead(A5) == 0){
      Serial.print("one is removed");
      gatt.setChar(jumperPresentID, 0, 5);
  }else{
    gatt.setChar(jumperPresentID, 2, 5);
  }
  Serial.println(voltage);
  delay(2000);
}

РЕДАКТИРОВАТЬ: я добавил вывод последовательного порта Arduino

Пример команды Adafruit Bluefruit AT ------------------------------------- Инициализация модуля Bluefruit LE: ОК! Выполнение сброса к заводским настройкам: AT + FACTORYRESET

‹- ОК ATE = 0

‹- OK Запрос информации о Bluefruit: ---------------- BLESPIFRIEND nRF51822 QFACA10 5953B6F51A2BE44E 0.6.7 0.6.7 17 сентября 2015 S110 8.0.0, 0.2 -------- -------- Добавление определения пользовательской службы GATT: AT + GATTADDSERVICE = UUID128 = 00-77-13-12-10-00-00-00-00-00-EE-BA-AD-DA-BE -CF

<- 1

‹- OK Добавление характеристики, подлежащей уведомлению: AT + GATTADDCHAR = UUID128 = 00-67-42-01-14-88-59-77-42-42-AB-BA-DA-DA-EE-CC, PROPERTIES = 0x10, MIN_LEN = 1, MAX_LEN = 20, VALUE = -9999

<- 1

‹- OK Добавление характеристики записи с ответом: AT + GATTADDCHAR = UUID128 = 00-68-42-02-00-77-12-10-13-42-CC-BA-DE-FA-EA-BB, PROPERTIES = 0x04, MIN_LEN = 1, MAX_LEN = 20, VALUE = GREEN

<- 2

‹- OK Добавление записываемой характеристики без ответа: AT + GATTADDCHAR = UUID128 = 00-69-42-03-00-77-12-10-13-42-CC-BA-DE-FA-EA-BC, СВОЙСТВА = 0x08, MIN_LEN = 1, MAX_LEN = 20, VALUE = GREEN

<- 3

‹- OK Добавление читаемой характеристики: AT + GATTADDCHAR = UUID128 = 00-70-42-04-00-77-12-10-13-42-CC-BA-DE-FA-EA-BD, PROPERTIES = 0x02, MIN_LEN = 1, MAX_LEN = 20, VALUE = GREEN

<- 4

‹- OK Добавление пользовательского UUID службы GATT в полезную нагрузку рекламы: AT + GAPSETADVDATA = 02-01-06-03-02-12-13

‹- OK AT + GATTADDCHAR = UUID = 4, PROPERTIES = 32, MIN_LEN = 5, MAX_LEN = 5, DATATYPE = 5 Ошибка опции: DATATYPE = 5

‹- ОШИБКА Выполнение сброса ПО (для сервисных изменений требуется сброс): ATZ

‹- OK НАПРЯЖЕНИЕ 0,97 AT + GATTCHAR = 0,01-00-01-02-EE

‹- ОШИБКА 0,97 НАПРЯЖЕНИЕ 0,15 AT + GATTCHAR = 0,01-00-01-02-EE


person zmillard    schedule 19.12.2016    source источник
comment
Что выводит Arduino? Что выводит приложение?   -  person Dellowar    schedule 19.12.2016
comment
Приложение должно выводить изменение цвета фона, когда на iPhone отправляется какое-либо значение, но пока успехов не было. Он действительно появляется как потенциальное устройство Bluetooth в приложении nRF Connect.   -  person zmillard    schedule 19.12.2016
comment
вам нужно добавить полный вывод программы Arduino при запуске.   -  person Dellowar    schedule 19.12.2016
comment
Обновлено! @SanchkeDellowar   -  person zmillard    schedule 19.12.2016


Ответы (2)


Убедитесь, что у вас достаточно мощности. Некоторые Bluetooth или WiFi Arduinos отключаются после запуска скетча Arduino, если недостаточно энергии для запуска устройства Bluetooth или Wi-Fi. Кроме того, попробуйте использовать код iPhone от Adafruits, чтобы попытаться подключиться. https://learn.adafruit.com/bluefruit-le-connect-for-ios

person KBurhans    schedule 19.12.2016

Публикуйте это на случай, если кто-то столкнется с подобной проблемой - я провел небольшое исследование и в итоге разместил сообщение на форуме Adafruit и получил ответ от их технической поддержки. Моя ошибка в этом была больше специфичной для устройства / BLE. Я рассматривал устройство как центральное, а не периферийное.

Я публикую их определение, так как считаю, что они его очень хорошо объясняют:

Bluetooth разделяет устройства на «центральные» и «периферийные» категории. Центральные устройства инициируют и контролируют передачу данных, периферийные устройства объявляют о своем присутствии и ждут, пока центральное устройство не скажет им, что делать.

Поэтому вместо того, чтобы пытаться отправить информацию с устройства, мне нужно попытаться получить ее с помощью кода Swift. Я все еще немного запутался в части «как», но это мое понимание проблемы.

person zmillard    schedule 21.12.2016