将数据从启用BLE的arduino发送到iOS应用

时间:2016-12-19 14:24:41

标签: ios c arduino bluetooth-lowenergy adafruit

我正在与Adafruit Bluefruit Feather合作,构建一个收集数据然后将数据发送到iPhone的设备,在iPhone上进行读取和处理。我已经看过无数试图解释如何对设备进行编程的例子,但我似乎对如何通过蓝牙将设备连接到iPhone有误解。

我们将此代码基于Adafruit的一个示例,我们尝试合并Adafruit BLE Gatt库(https://learn.adafruit.com/introducing-adafruit-ble-bluetooth-low-energy-friend/ble-gatt),但它无法正常工作,这是我们第一次使用蓝牙。我们使用的iOS代码来自https://github.com/nebs/hello-bluetooth。我们没有对swift代码进行任何更改。欢迎任何建议。我们在将数据从应用程序发送到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

     

&lt; - OK ATE = 0

     

&lt; - OK请求Bluefruit信息:   ---------------- BLESPIFRIEND nRF51822 QFACA10 5953B6F51A2BE44E   0.6.7   0.6.7 Sep 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

     

&lt; - 1

     

&lt; - 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

     

&lt; - 1

     

&lt; - 确定添加Writable with Response特性:   AT + GATTADDCHAR = UUID128 = 00-68-42-02-00-77-12-10-13-42-CC-BA-DE-FA-EA-BB,PROPERTIES = 0×04,MIN_LEN = 1,   MAX_LEN = 20,VALUE =绿色

     

&lt; - 2

     

&lt; - OK添加Writable with No Response特性:   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 =绿色

     

&lt; - 3

     

&lt; - 确定添加可读特性:   AT + GATTADDCHAR = UUID128 = 00-70-42-04-00-77-12-10-13-42-CC-BA-DE-FA-EA-BD,PROPERTIES = 0×02,MIN_LEN = 1,   MAX_LEN = 20,VALUE =绿色

     

&lt; - 4

     

&lt; - 确定将自定义GATT服务UUID添加到广告有效负载:   AT + GAPSETADVDATA = 02-01-06-03-02-12-13

     

&lt; - 好的   AT + GATTADDCHAR = UUID = 4,PROPERTIES = 32,MIN_LEN = 5,MAX_LEN = 5,DATATYPE = 5   选项错误:DATATYPE = 5

     

&lt; - ERROR执行SW重置(服务更改需要重置):ATZ

     

&lt; - OK VOLTAGE   0.97 AT + GATTCHAR = 0,01-00-01-02-EE

     

&lt; - 错误   0.97电压   0.15 AT + GATTCHAR = 0,01-00-01-02-EE

2 个答案:

答案 0 :(得分:1)

确保您有足够的电量。如果没有足够的电源启动蓝牙或Wifi设备,某些蓝牙或WiFi Arduinos在运行Arduino草图后关闭。此外,尝试使用Adafruits iPhone代码尝试连接。 https://learn.adafruit.com/bluefruit-le-connect-for-ios

答案 1 :(得分:1)

如果有人遇到类似的问题,请发布此信息 - 我已做过一些研究,最后也在Adafruit论坛上发帖,并从他们的技术支持中得到答案。我的错误是更多的设备/ BLE特定。我将设备视为中心而不是外围设备。

我发布了他们的定义,因为我认为他们解释得非常好:

  

蓝牙将设备分为“中央”和“外围”类别。中央设备启动和控制数据传输,外围设备宣传其存在并等待中心告诉他们该做什么。

因此,我不需要尝试从设备发送信息,而是尝试使用Swift代码来提取信息。我仍然对它的“如何”部分感到迷茫,但这是我对这个问题的理解。