【2020年2月追記】※本文内で紹介している BLEAD-TSH は 現在販売停止しております。各種センサーとビーコンを組み合わせたソリューションをご希望の場合は、個別ににお問合せ下さい。
開発部のなーさんです。
以前、ご紹介した自宅Wi-Fiお知らせアプリのブログ記事の時はSwiftとXcodeに苦戦していましたが、今では少しずつ慣れてきました。しかし!まだまだインスタンス生成でnewってうっかり書いてしまいます。
さて、ひさびさの技術ブログはSwiftを使って弊社のちょっと面白いBeacon、BLEAD-TSHで遊んでみたので何回かにわけて紹介していきます。初回はBLEAD-TSHとは何かについてです。
下記は2019年5月現在の情報で執筆しています。
文中、画像中で使用されている商標等はそれぞれの企業、団体に帰属します。
コンセプト実証用のソースコードのため簡略化等された箇所があります。
BLEAD-TSHってなに?
BLEAD-TSHはスティック型のBeaconです。ストラップ穴もついているので、首やカバンにぶら下げることだってできます。一見ただのiBeaconですが・・・実は、内蔵されている加速度センサや温度センサの値をアドバタイズする機能もあるんです!
このアドバタイズをスマホなどで受信できれば、余計なケーブルなしで手軽にセンサ値を利用できるようになります。
なーさんは、以前から「これがあれば楽しいアプリケーションが作れるのに・・・」と目をつけていました。
※アドバタイズを切り替えるときは、BLEAD-MC-Lightの設定画面でBLEAD-Sに切り替えてください。
BLEAD-TSHのアドバタイズデータ
TSHはどんなアドバタイズデータを飛ばしているのでしょうか?
さっそく見ていきましょう。
アドバタイズデータの中のManufacturer Dataに必要なデータが格納されています。
そのフォーマットは下記のようになっています。
BLEAD-TSH アドバタイズデータ フォーマット表
項目 | バイト数 | 設定値 | 備考 |
Company ID | 2 | 0xCE01 | リトルエンディアン |
識別 | 2 | 0x5304 | |
シリアル | 6 | 設定されたシリアル値 | 上位2バイトがZZ 下位4バイトがリトルエンディアン |
予備 | 1 | 0x00 | |
X | 1 | 加速度センサ X軸 | 測定範囲:-2G〜2G (-128〜127) |
Y | 1 | 加速度センサ Y軸 | 測定範囲:-2G〜2G (-128〜127) |
Z | 1 | 加速度センサ Z軸 | 測定範囲:-2G〜2G (-128〜127) |
温度 | 1 | 温度センサ | 25度からの相対値 |
未使用 | 9 | ||
バッテリ | 2 | バッテリ電圧[mV] | リトルエンディアン |
全体が26Byteで、いくつかの項目はリトルエンディアンになります。復元するときは気をつけてください。
【シリアル】
先頭2Byteを文字に変換すると「ZZ」になり、そのあとに問答無用で「00」をつけます。後半4Byteは、下記のように計算してください。Byte0が最下位バイトを示します。
計算式: シリアル番号 = Byte3 + Byte2 * 256 + Byte1 * 256 * 256 + Byte0 * 256 * 256 * 256
最終的には、「ZZ00 + シリアル番号」の形式になります。
【加速度】
水平・静止状態では下向きになっている軸に1G = 64がかかります。このとき残りの2軸は0になります。また、補数表現なので128以上の値については-256してください。だいたい1秒に一回の頻度で発信される値が更新されます
その点を考慮すると、通常100ms間隔で送信しますが、もう少し間引いて電池を温存してもいいかもしれません。
※担当者曰く、特注品ならもっと頻度上げられまっせ~、とのこと
【温度】
0x80のときはOFFになります。こちらも補数表現なので128以上の値については-256してください。
ケースに覆われていることもあってなのか、実際の気温とは誤差があるようですね。いいオフセット値を探してみてください。
【バッテリ】
バッテリの電圧は下記のように計算してください。Byte0が最下位バイトを示します。
計算式: 電圧[mV] = Byte1 + Byte0 * 256
iOSで受信するには
(Android技術者の方、すみません!!)
iOSで受信する場合は、CoreBluetoothのCBCentralManagerを使います。使うのはアドバタイズのスキャンまでなので、下記のデリゲートに処理を書くだけで処理できます。
1つ目のデリゲートは、Bluetoothの状態を通知してくれるもの、2つ目のデリゲートが受信できたアドバタイスを通知してくれるものです。2つ目で取得されたadvertisementDataのキーにCBAdvertisementDataManufacturerDataKeyを指定すれば、TSHのデータを取り出せます。
・centralManagerDidUpdateState(_ central: CBCentralManager)
・centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)
せっかくなので、次回はTSHのアドバタイズを受信する簡単なサンプルを作ってみたいと思います。待てない方は、CoreBluetoothについて検索すれば色々と情報が出てくるので、調べてみてください。
おわりに
今回は、BLEAD-TSHの基本的な情報について書いてみました。
何を隠そう、このTSHというネーミングは、
弊社の大井町オフィスの住所(Tokyo-to Shinagawa-ku Higashiooimachi)から名付けられました!
・・・というのは嘘です。
(ちなみに恵比寿オフィスの住所もTSHなんです。きっと次にオフィスつくるときもTSH縛りなんだろうな・・・新宿区か?墨田区か?それとも鳥取県境港市とか?)
それでは!