BlueNinjaを使ってBLEでLチカ


Pocket

前回BLE通信をつかって、サーバ(BlueNinja)からクライアント(スマホ)に情報を送信する用途を試してみました。
今回は、クライアントからサーバへデータを送信するパターンを試してみたいと思います。

※BLEでは、クライアント/サーバじゃなくてセントラル/ペリフェラルって言った方がいいんですかね。

【参考】
BlueNinjaでBLEを動かしてみる
 

Androidスマホのボタン操作で、BlueNinjaに繋がったLEDを点消灯させます。
BLEでLチカ

【環境】
・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でコールバックされるようです。

以上…かなり端折っていますが…実装のポイントはこんな感じです。

 

実行

bleでLチカ

スマホのボタン操作で、BlueNinjaに接続したLEDの点灯/消灯ができました。

 

あとがき

思ったりよ簡単にできました。
まぁエラーハンドリング等など、細かい仕様についてはまだまだ理解してない訳ですが追々。
次はなんかアプリっぽいものを作ってみたいと思います。

ではでは〜
 
 

Leave a Comment

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