前回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の点灯/消灯ができました。
あとがき
思ったりよ簡単にできました。
まぁエラーハンドリング等など、細かい仕様についてはまだまだ理解してない訳ですが追々。
次はなんかアプリっぽいものを作ってみたいと思います。
ではでは〜



