如何通过ios应用程序通过BLE打开连接到Arduino的LED?

时间:2019-07-26 19:16:43

标签: ios swift arduino bluetooth-lowenergy esp32

这是场景。我有一个esp32、2 led和一个在网上here找到的ios示例应用程序。当前,如果我按下esp32上的按钮,它会通知ios应用程序显示“ 1”,如果再次按下,它将显示“ 0”。这很完美。

棘手的是,此ios应用程序允许我向esp32发送写命令。我想这样做,如果发送的是“ 1”,则LED A点亮而LED B熄灭,那么发送0时LED A熄灭,LED B点亮。我无法做到这一点。尽我所能,我无法弄清楚该项目链中哪里出了问题。也许是esp32上的代码,或者是我不确定的应用。

这是我的arduino代码。 (还有更多未提到的代码,我实际上有4个led,但我只想在发送写命令时打开2个特定的led。)

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
boolean oldState = LOW;
uint32_t value = 0;

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
};

void onDisconnect(BLEServer* pServer) {
  deviceConnected = false;
}
};

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();

      if (rxValue.length() > 0) {
        Serial.print("Received Value: ");

        for (int i = 0; i < rxValue.length(); i++) {
          Serial.print(rxValue[i]);
         }

        Serial.println();

        if (rxValue.find("1") != -1) {
          digitalWrite(13, HIGH);
          digitalWrite(27, LOW);
        }
        else if (rxValue.find("0") != -1) {
          digitalWrite(13, LOW);
          digitalWrite(27, HIGH);
        }
      }
    }
};

const int bt1 = 14;
boolean bt1g = true;
int bt1t = 0;


void setup() {
  pinMode(13, OUTPUT);
  pinMode(15, OUTPUT);
  pinMode(33, OUTPUT);
  pinMode(27, OUTPUT);
  pinMode(bt1, INPUT_PULLUP);
  Serial.begin(9600);

  BLEDevice::init("ESP32");
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());
  BLEService *pService = pServer->createService(SERVICE_UUID);

  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_WRITE  |
                      BLECharacteristic::PROPERTY_NOTIFY
                    );

  pCharacteristic->addDescriptor(new BLE2902());

  pService->start();

  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(false);
  pAdvertising->setMinPreferred(0x0);
  BLEDevice::startAdvertising();
  Serial.println("Waiting a client connection to notify...");
}

void loop()
{


  if (bt1g) {
    if (digitalRead(bt1) == LOW ) {
      bt1t = (bt1t + 1) % 2;
      Serial.println(bt1t);
      bt1g = false;

    }
  }
  if (!bt1g) {
    if (digitalRead(bt1) == HIGH) {
      bt1g = true;
    }
  }

  if (bt1t == 0) {
    digitalWrite(15, LOW);
    digitalWrite(33, HIGH);

  }
  }

  boolean newState = digitalRead(15);

  if (deviceConnected) {
    if (newState != oldState) {
      if (newState == LOW) {
        pCharacteristic->setValue("1");

      }
      else {
        pCharacteristic->setValue("0");

      }
      pCharacteristic->notify();
    };

    oldState = newState;

  }
  delay(50);
}

似乎ios应用程序的整个代码太长了,无法提交到这篇文章,所以here是github

我真的不确定,陷入困境。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

是不是您没有找到正确的特征?看来您只有一项服务和一项功能。