前回BLE通信をつかって、サーバ(BlueNinja)からクライアント(スマホ)に情報を送信する用途を試してみました。
今回は、クライアントからサーバへデータを送信するパターンを試してみたいと思います。
※BLEでは、クライアント/サーバじゃなくてセントラル/ペリフェラルって言った方がいいんですかね。
【参考】
BlueNinjaでBLEを動かしてみる
Androidスマホのボタン操作で、BlueNinjaに繋がったLEDを点消灯させます。
【環境】
・BlueNinja_DSP:RELEASE_150929
・Android 5.0
実装方法
LEDの点灯(0x01)/消灯(0x00)を示すキャラクタリスティックを用意して、スマホからそれを書き換えるという方法で、通信を行うようにしました。
ベースプログラムはCerevoが公開しているBLEサンプルプログラムです。
1.キャラクタリスティック定義の追加
const BLELib_Descriptor tz01_tracker_led_sw_desc = { BLE_GATT_UNIQUE_ID_TZ01_LED_SW_DESC, 0x2902, 0, BLELIB_UUID_16, BLELIB_PERMISSION_READ | BLELIB_PERMISSION_WRITE, tz01_led_sw_desc, sizeof(tz01_led_sw_desc) }; const BLELib_Descriptor *const tz01_tracker_led_sw_descriptors[] = { &tz01_tracker_led_sw_desc }; const BLELib_Characteristics tz01_tracker_led_sw = { BLE_GATT_UNIQUE_ID_TZ01_LED_SW, 0x91825f82ff67e8f8, 0xd43a02140e5f4a80, BLELIB_UUID_128, BLELIB_PROPERTY_WRITE, BLELIB_PERMISSION_WRITE, tz01_led_sw, sizeof(tz01_led_sw), tz01_tracker_led_sw_descriptors, 1 };
キャラクタリスティック定義の追加に関しては前回と同じです。
ただ今回はクライアントから書き込むだけなので、BLELIB_PROPERTY_WRITEとしています。
キャラクタリスティックを定義して既存のサービスに追加します。
2.書き込まれた値をみてLEDを点灯
クライアントから書き込み要求があった場合、writeinDemandCb()が呼ばれるようです。
なので、その中で判定するようにしてみました。
BLELib_RespForDemand writeinDemandCb(const uint8_t unique_id, const uint8_t *const value, const uint8_t value_len) { switch(unique_id) { ... case BLE_GATT_UNIQUE_ID_TZ01_LED_SW: if (value[0]==0) { Driver_GPIO.WritePin(7, 0); } else { Driver_GPIO.WritePin(7, 1); } break; } return BLELIB_DEMAND_ACCEPT; }
3.クライアント側
スマホ側は、適当にボタンを追加して、ボタンを押すたびにOn/Offを切り替えて書き込む様にしました。
mBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isLedOn) { mLedCharacteristics.setValue(new byte[]{0x00}); isLedOn = false; } else { mLedCharacteristics.setValue(new byte[]{0x01}); isLedOn = true; } mGatt.writeCharacteristic(mLedCharacteristics); } });
キャラクタリスティックへの書き込み要求は、writeCharacteristicにて行います。
書き込み要求の結果は、onCharacteristicWriteでコールバックされるようです。
以上…かなり端折っていますが…実装のポイントはこんな感じです。
実行
スマホのボタン操作で、BlueNinjaに接続したLEDの点灯/消灯ができました。
あとがき
思ったりよ簡単にできました。
まぁエラーハンドリング等など、細かい仕様についてはまだまだ理解してない訳ですが追々。
次はなんかアプリっぽいものを作ってみたいと思います。
ではでは〜