M5Stackをゲートウェイにして、M5StickCとM5StickCPlusからBLEでデータを送信する。今回はテストとして単なる文字列を送る。
BLEの仕様がいまいちわかっていないのでもう少し調べないといけない。パッシブで通信を行ったがちゃんとハンドシェイクをするようにしたい。
以下のコードは入門書のコードを改造したもの。
M5Stackのコード
#include <M5Stack.h>
#include "BLEDevice.h"
#define MyManufacturerId 0xffff
uint8_t seq = 0xff;
BLEScan* pBLEScan;
void setup(){
M5.begin();
BLEDevice::init("");
pBLEScan = BLEDevice::getScan();
pBLEScan->setActiveScan(false);
}
void loop(){
bool found= false;
std::string device_name;
BLEScanResults foundDevices = pBLEScan->start(3);
int count = foundDevices.getCount();
for(int i=0; i < count; i++){
BLEAdvertisedDevice d = foundDevices.getDevice(i);
if(d.haveManufacturerData()){
std::string data = d.getManufacturerData();
int manu = data[1] << 8| data[0];
if(manu == MyManufacturerId && seq != data[2]){
found = true;
seq = data[2];
device_name = data[3]; // M
device_name += data[4]; // 5
device_name += data[5]; // S
device_name += data[6]; // t
M5.Lcd.printf(">>> seq: %d name: %s\r\n", seq, device_name.c_str());
}
}
}
}
M5StickC、M5StickCPlusのコード
//#include <M5StickC.h>
#include <M5StickCPlus.h>
#include "BLEDevice.h"
#include "UNIT_ENV.h"
#define T_PERIOD 10
#define S_PERIOD 10
BLEAdvertising *pAdvertising;
uint8_t seq = 0;
void setAdvData(BLEAdvertising *pAdvertising){
char *device_name = "M5CP";
//char *device_name = "M5C";
BLEAdvertisementData oAdvertisementData = BLEAdvertisementData();
oAdvertisementData.setFlags(0x06);
std::string strServiceData = "";
strServiceData += (char)0x08;
strServiceData += (char)0xff;
strServiceData += (char)0xff;
strServiceData += (char)0xff;
strServiceData += (char)seq;
strServiceData += device_name;
oAdvertisementData.addData(strServiceData);
pAdvertising->setAdvertisementData(oAdvertisementData);
}
void setup() {
// put your setup code here, to run once:
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.setTextSize(1);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.println("BLE TEST");
Wire.begin();
BLEDevice::init("BLE TEST");
BLEServer *pServer = BLEDevice::createServer();
pAdvertising = pServer->getAdvertising();
}
void loop() {
// put your main code here, to run repeatedly:
setAdvData(pAdvertising);
pAdvertising->start();
delay(T_PERIOD*1000);
pAdvertising->stop();
delay(S_PERIOD*1000);
seq++;
}
コメントを残す