【家庭で使える!? Beaconアプリづくりにチャレンジ】BLEAD-TSHで遊ぼう!編 第1回

【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

BLEAD-TSHのアドバタイズデータ

TSHはどんなアドバタイズデータを飛ばしているのでしょうか?
さっそく見ていきましょう。

アドバタイズデータの中のManufacturer Dataに必要なデータが格納されています。
そのフォーマットは下記のようになっています。

BLEAD-TSH アドバタイズデータ フォーマット表

項目バイト数設定値備考
Company ID20xCE01リトルエンディアン
識別20x5304
シリアル6設定されたシリアル値上位2バイトがZZ
下位4バイトがリトルエンディアン
予備10x00
X1加速度センサ X軸測定範囲:-2G〜2G (-128〜127)
Y1加速度センサ Y軸測定範囲:-2G〜2G (-128〜127)
Z1加速度センサ 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縛りなんだろうな・・・新宿区か?墨田区か?それとも鳥取県境港市とか?)
それでは!

関連記事

  1. 「処理時間5分が6秒に!大手製造業におけるWijmo活用事例」@Gra…

  2. Beaconアプリ開発記【その4 画面表示編】

  3. Beaconアプリ開発記【その1 開発準備編】

  4. BLEAD-TSHで遊ぼう!【作例集 モーターの無線遠隔制御編】

  5. 観光施設をガイドする音声アプリ「eGuide」で密集・密接せずに旅行を…

  6. グローバル管理者による SharePoint の管理