「BGScript」タグアーカイブ

概要

BLEデバイスを使用し、BLEタグをハックする

想定読者

Arduinoなどを使用しBLEデバイスを作った後、実際にBLEデバイス量産を踏まえた開発を行ってみたい方

はじめに

こんにちは。ハードエンジニアの川越です。
IoTデバイス等でBLEデバイスの開発をしたい!となると、実際の商品化を前提に開発を進める事が出てくると思います。
今回は、量産化を踏まえた開発が可能な開発キットを使って、市販のBLEタグをハックし、Lチカするまでを紹介したいと思います。(2017/1月に書いてからずっと放置していた記事なのでちょっと古い情報です)

開発デバイス&環境

BLEモジュール

低消費電力ながら処理能力の高いCortex-M4を搭載した、SiliconLabs「BGM113」開発キットを使用します。
BGM113
BGM113 開発キット

BLEタグ

Amazonで販売していた「Logitec Bluetooth 4.0対応 BLEタグ」を使用します
BLEタグ

開発環境

BlueGeckoシリーズ用の開発言語、BGScriptを使用します
(BLE開発が初めてという方にお勧めの開発言語との事ですが…言語としての制限が多すぎるので、Cでの開発がおすすめです)

タグの解析

BLEタグを外部から制御する為に、タグの解析を行います。
BLE接続が可能なアプリを使用し、内部でLED点灯に関係していそうな値を探します
今回は、Alert Levelに0x01 or 0x02を書き込んだところ、LEDの点灯が出来ました

コンパイルの実行まで

  1. 開発環境ダウンロード先
  2. インストーラ選択bgm
  3. コマンドラインより[bgbuild.exeのパス  bgプロジェクトのパス  -f]を実行
    例 : 「C:\SiliconLabs\bgm-1.0.4-1073\bin\bgbuild.exe XXX.bgproj -f」

タグに接続し、LEDを点灯させる

  • BGScript(.bgs)
# le_gap_scan_response
dim lg_i # overall ad data position index
dim lg_j # individual ad field position index
dim ad_field_length
dim ad_field_type

event system_boot(major, minor, patch, build, bootloader, hw)
 # configure scanning (100ms interval, 100ms window, passive)
 call le_gap_set_scan_parameters(160, 160, 0)

 # start scanning
 call le_gap_discover(le_gap_discover_generic)
end

event le_gap_scan_response(rssi, packet_type, sender, address_type, bonding, data_len, data_data)

 lg_i = 0

 while lg_i < data_len
 
 ad_field_length = data_data(lg_i:1)
 ad_field_type = data_data(lg_i + 1:1)

 if sender(0:3) = $02E2C7 && sender(3:3)=$441319 then
 if ad_field_type = $02 || ad_field_type = $03 then # partial ($02) or complete ($03) list of 16-bit UUIDs
 lg_j = 0
 
 while lg_j < ad_field_length

 if data_data(lg_i + lg_j + 2:1) = $1802 && data_data(lg_i + lg_j + 3:1) = $2A06 then
 call le_gap_end_procedure()
 call le_gap_open(sender(0:6),address_type)

 # set loop counters to 100 so we'll stop looking
 # (there is no "break" function in BGScript)
 lg_i = 100
 lg_j = 100
 end if

 lg_j = lg_j + 2

 end while
 end if
 end if

 lg_i = lg_i + ad_field_length + 1

 end while
end

event le_connection_opened(address,address_type,master,connection,bonding)
# connection established
 call gatt_write_characteristic_value_without_response(connection, address(:), 1, $01)
end

まとめ

実際の開発に当たっては、Simplicity Studioを使用して開発する事になるかと思いますが、IoTデバイス開発に必須の電源測定機能など、開発に必要な機能が各種ありますのでおすすめです。が、BGScriptでの開発は…マジでやめておきましょう。配列使えないとかあるので。

補足

本デバイスをそもそも使用したのは
1. 外部ネットワークからWifi経由でBLEデバイスを制御したい
2. 外部ネットワーク操作からデバイスがレスポンスするまで1s程度
3. BLEデバイスをボタン電池2個で1年持たせる
という要件があり、それの検証時に使用したものです。
IoTデバイス開発でお困りの方がみえましたら、ご相談頂けますと幸いです。