何故NimBLEに移行するのか
・・そこにBLEがあるから
いや、そんな理由じゃなくてファームのネットワークアップデート(OTA)を実装するのにそろそろストレージがヤバくなってきたから
#include <nimBledevice.h>
#include <nimBleutils.h>
#include <nimBleserver.h>
// #include <BLEDevice.h>
// #include <BLEUtils.h>
// #include <BLEServer.h>
なのでこんなふうにまずは各BLEのヘッダをすげ替えてみました
マクロで定義されていた
他の人のページを見ているとBLEXXXというクラスやメソッドをNimBLEXXXに書き換える必要があると書いてあったのだけど
NimBLEDevice.hというヘッダに
#define BLEDevice NimBLEDevice
#define BLEClient NimBLEClient
#define BLERemoteService NimBLERemoteService
#define BLERemoteCharacteristic NimBLERemoteCharacteristic
#define BLERemoteDescriptor NimBLERemoteDescriptor
#define BLEAdvertisedDevice NimBLEAdvertisedDevice
#define BLEScan NimBLEScan
#define BLEUUID NimBLEUUID
#define BLESecurity NimBLESecurity
#define BLESecurityCallbacks NimBLESecurityCallbacks
#define BLEAddress NimBLEAddress
#define BLEUtils NimBLEUtils
#define BLEClientCallbacks NimBLEClientCallbacks
#define BLEAdvertisedDeviceCallbacks NimBLEAdvertisedDeviceCallbacks
#define BLEScanResults NimBLEScanResults
#define BLEServer NimBLEServer
#define BLEService NimBLEService
#define BLECharacteristic NimBLECharacteristic
#define BLEAdvertising NimBLEAdvertising
#define BLEServerCallbacks NimBLEServerCallbacks
#define BLECharacteristicCallbacks NimBLECharacteristicCallbacks
#define BLEAdvertisementData NimBLEAdvertisementData
#define BLEDescriptor NimBLEDescriptor
#define BLE2902 NimBLE2902
#define BLE2904 NimBLE2904
#define BLEDescriptorCallbacks NimBLEDescriptorCallbacks
#define BLEBeacon NimBLEBeacon
#define BLEEddystoneTLM NimBLEEddystoneTLM
#define BLEEddystoneURL NimBLEEddystoneURL
ちなみにこんなふうに、変換マクロが定義されていた
最近親切な人が取り込んでくれたのかね
多分昔は無かったんだろう
早速問題発生
参ったね
データを受信したところが早速ビルドが通らなかった
void BleCtrlCallback::onWrite(BLECharacteristic *pCharacteristic)
{
uint8_t *data = pCharacteristic->getData(); //受信したデータの先頭アドレス
size_t size = pCharacteristic->getLength(); //受信したデータサイズ
getData,getLengthが早速「そんなメソッドはない」とエラー
明日以降直そ・・・・
眠い
修正
修正しました
まずはデータ取得部
NimBLEは単純なuint8_tの配列取得は出来なくなっていて、必ずstd:stringやvector<uint8_t>のようなサイズのわかる型で取るようになっていました
まあ、不明なサイズで取るとバグの原因になるからね
uint8_t *data = pCharacteristic->getData(); //受信したデータの先頭アドレス
size_t size = pCharacteristic->getLength(); //受信したデータサイズ
これを、↓のように変更
std::vector<uint8_t> data = pCharacteristic->getValue(); //受信したデータの先頭アドレス
size_t size = data.size(); //受信したデータサイズ
vectorで取得したらsizeが不要じゃないか・・・
getValueはヘッダの中で
NimBLEAttValue getValue(time_t *timestamp = nullptr);
こんな定義をされてる
何じゃこりゃ・・・・
この中を覗いてみたら、あれ?
単純なuint8_tのポインタOKだった
それどころかuint16_tの ポインタまであるじゃん
使いどころは難しそうだけど文字列でも撮れるようにしてるのか・・・と思ったらけどstd::stringでも取得出来るしねぇ
まあ、今回はせっかくなのでvectorにしてプログラムをすっきりさせよう
createCharacteristicの引数
今まではリード、ライト、通知の権限のプロパティはBLEcharacteristicの各プロパティ変数を使っていたのですが
pCharacteristic = pService->createCharacteristic(
characteristicUUID,
BLECharacteristic::PROPERTY_READ
| BLECharacteristic::PROPERTY_WRITE
| BLECharacteristic::PROPERTY_NOTIFY
専用の列挙型が用意されているので、そちらを使うようになりました
pCharacteristic = pService->createCharacteristic(
characteristicUUID,
NIMBLE_PROPERTY::READ
| NIMBLE_PROPERTY::WRITE
| NIMBLE_PROPERTY::NOTIFY
これだけやってビルドして見たらビルドが通りました
ホントか?
実際にバイナリをボードに転送してスマホからコマンドを送っても問題無さそうです
11000000バイトを超えていたバイナリが、629408 bytesまで小さくなりました
ホントかこれ?
なんか騙されてるような
けど、上手く行ってるから 全てOK!
これだけバイナリが小さくなれば、Wifiのライブラリを組み込んでもなんともないぜ
おしまい
コメント
コメントを投稿