M5Stack Core2をBLEペリフェラルとし、LightBlueによりコマンドをM5Stack Core2に出力します。なお、LightBlueについては、「LightBlueを使ってSensorTagの加速度データの入力」で使用しています。
コマンド出力アプリの作成
コマンド出力アプリは受け取ったデータをシリアル端末に表示します。
- コマンドを受け取ると28行目のクラスに制御が移り、受け取ったデータをシリアル端末に表示します。
- 67行目でコールバック「MyCallbacks」を設定します。
blewritetest.ino
#include <BLEDevice.h> #include <BLEServer.h> #include <BLEUtils.h> #include <BLE2902.h> BLEServer* pServer = NULL; BLECharacteristic* pCharacteristic = NULL; bool deviceConnected = false; bool oldDeviceConnected = false; int bleRX, bleTX; uint8_t notifySend[2] = {0, 0}; #define SERVICE_UUID "00002220-0000-1000-8000-00805F9B34FB" #define CHARACTERISTIC_UUID_RX "00002222-0000-1000-8000-00805F9B34FB" // write //#define CHARACTERISTIC_UUID_TX "00002221-0000-1000-8000-00805F9B34FB" // notify 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.println("*********"); Serial.print("Received Value: "); for (int i = 0; i < rxValue.length(); i++) Serial.print(rxValue[i], HEX); } } }; void setup() { Serial.begin(115200); // Create the BLE Device BLEDevice::init("BleDevice"); // Create the BLE Server BLEServer *pServer = BLEDevice::createServer(); pServer->setCallbacks(new MyServerCallbacks()); // Create the BLE Service BLEService *pService = pServer->createService(SERVICE_UUID); // Create a BLE Characteristic /* pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY ); pCharacteristic->addDescriptor(new BLE2902()); */ BLECharacteristic *pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE ); pCharacteristic->setCallbacks(new MyCallbacks()); // Start the service pService->start(); // Start advertising BLEAdvertising *pAdvertising = pServer->getAdvertising(); pAdvertising->addServiceUUID(SERVICE_UUID); pServer->getAdvertising()->start(); Serial.println("Waiting a client connection to notify"); } void loop() { // notify changed value /* if (deviceConnected) { if (bleRX < 100) bleTX++; else bleTX = 0; notifySend[0] = bleTX; notifySend[1] = bleRX; pCharacteristic->setValue(notifySend, 2); pCharacteristic->notify(); delay(1000); // bluetooth stack will go into congestion, if too many packets are sent, // in 6 hours test i was able to go as low as 3ms } */ // disconnecting if (!deviceConnected && oldDeviceConnected) { delay(500); // give the bluetooth stack the chance to get things ready pServer->startAdvertising(); // restart advertising Serial.println("start advertising"); oldDeviceConnected = deviceConnected; } // connecting if (deviceConnected && !oldDeviceConnected) { // do stuff here on connecting oldDeviceConnected = deviceConnected; } }
コマンド出力アプリの実行
作成したコマンド出力アプリに、LightBlueを使ってBLEで接続して次のように操作します。
LightBlueを使って次のように16進数で「123ABC」を出力します。
LightBlueを使って入力したデータ「123ABC」が次のようにシリアル端末に表示されます。