これはブログです

3DCGとかプログラミングとか

M5StackでBLE通信をする

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++;
  
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください