BLEモジュール（BL600)を使ってiBeaconを作る

なんと4年ぶりのブログなので、書き方忘れた...
この記事はAdvent Calendar 21日目の記事です。

今回はiBeacon（BLE）で使えるBluetoothモジュールについて書いてみます。
iBeaconといえばAppleがiOS7に採用した近接位置情報取得の手段で、iOSからみたら位置情報取得のサービスとして、
BLEの知識なしでもプログラムが組めるぐらいカプセル化されています。

実際にiBeaconを試してみるには、Beacon信号を発信するペリフェラル側が必要ですが、
BLE対応のiPhone,iPad,MacでiBeaconのアプリを作成するのが一番手っ取り早いかな。

mac
　　[iOS 7] [iBeacon] Mac を Beacon 端末にする
  　http://dev.classmethod.jp/smartphone/iphone/mac-beacon/
iOS
　　[iOS 7] 新たな領域観測サービス iBeacon を使ってみる
　　http://dev.classmethod.jp/references/ios7-ibeacon-api/

の記事を参考にすれば、そんなにコードを書かなくてもiBeaconの信号を出す事が出来ます。
iOSアプリ(estimoteのアプリ）でもできるみたいですね。
　　1行もコードを書かずにiBeaconで遊んでみる
　　http://geo.hatenablog.com/entry/2013/12/01/074148

でも実際に色々な場所にビーコンを設置して試すためには、iBeaconのハードが欲しくなりますよね。
現状日本で入手可能なビーコンは
　　estimote (技適が通ってない orz）　http://estimote.com/

開発キットでは
　konashi(ユカイ工学）　    http://konashi.ux-xu.com/
　 REBLE112WB(Running Electronics) http://www.runele.com/ca1/17/
　 TI CC2541 Sensor Kit   http://www.tij.co.jp/tool/jp/cc2541dk-sensor
その他、BLEモジュールの開発キットがBlueGiga、Lairdから出ているのでこれも使えるはずです。

あと、アプリックス、Braveridgeからも出ています（開発キットは購入していますが、まだ届いていません）
今後色々な所から出てくることが予想されます。

電子工作が得意な人はBLEモジュールを使って自作する手もありますよ。
日本で使うためには当然技適通っているものを使いたいので、選択肢としては
　BlueGiga　BLE112  TI CC2541
　Laird	  BL600   Nordic nRF51
ぐらいかな。
村田のものもあるけど個人では入手しにくい関係で対象に入れてません。
アプリックス、Braveridgeはまだ未入手です（今後に期待）。

これらのモジュールの特徴は、

　・＠1000円ぐらいと安価、今後は500円以下になりそう
　・CPUコアチップを搭載していて、メモリも豊富（8051,ARM Coretex M0)
　・Basic系の言語で制御できる（＋ATコマンド）　→　Arduino感覚で制御可能
　・GPIO、アナログ入力、PWM、I2C、SPIなどIO盛りだくさん

まさに、これだけでたいていのことが出来てしまいそう。
iBeaconであれば基本はこれにコイン電池付けるだけです。

さて、iBeaconをBLEモジュールを使って作るわけですが、実は情報的にはBLE112が多くて、色々な記事が見つかります。

BLE112でiBeaconを作る記事はこちらを参照
　http://jenswilly.dk/2013/09/ibeacons-ready/
　https://www.evernote.com/shard/s3/sh/a0b8b004-dc12-410c-b3cf-　1aeb8383008f/73fb5a16fe7849622c859b15313cc323

BLE112でiBeaconを作る場合、

アドバタイズのパラメータ、モードの設定
　　call gap_set_adv_parameters()
　　call gap_set_mode()

アドバタイズドデータのセット(iBeaconのデータに合わせる）
　　call gap_set_adv_data(0,,,)
Local Nameのセット
　　call gap_set_adv_data(1,,,)
な感じでiBeaconのビーコン側が出来そうです。

情報のあるBL112を使うという手もあったのだけど、今回は、まだまだ情報の少ないLaird社のBL600を使ってiBeaconを作ってみます。なんてM体質..

BL600はNordic Semiconductor社のnRF51をコアチップに使ってますので、ARM　Coretex M0がコアで、256kB flash + 16kB RAM　のメモリがあります。
BlueGigaを使わずにBL600を選んだのは、コアチップがARMだった（BLE112は8051）という単純な理由。^o^/

開発ボードはLaird社のBL600開発キットを使いました。
　http://www.digikey.jp/product-detail/ja/DVK-BL600-SA/DVK-BL600-SA-ND/3995739

プログラムはSmartBasicというBasic系の言語で組みます（久しぶりのBasic！）
これはBLE112と同じですね。Basicの関数は全く別ですけど。

iBeaconはBLEのアドバタイズの処理でアドバタイズド・パケットにUUID、major,minerのデータをセットして送るだけなので、BL600でアドバタイジング関係の関数を使えば同じようにiBeaconが作れるはず。

BLEのアドバタイジング関連の関数は

BleAdvertStart()　　　　　　　アドバタイジング開始　nAdvType,peerAddr$,nAdvInterval, nAdvTimeout, nFilterPolicy
BleAdvertStop()　　　　　　　アドバタイジング停止
BleAdvRptInit()	　　　　　　　advert reportの初期化　advRpt$, nFlagsAD, nAdvAppearance, nMaxDevName
BleScanRptInit()　　　　　　scan reportの初期化
BleAdvRptAddUuid16()　　UUID情報追加16ビット
BleAdvRptAddUuid128()　UUID情報追加128ビット
BleAdvRptAppendAD()　　arbitrary AD (Advertising record)書込み
BleAdvRptsCommit()　　　　データのコミット

があるので、これを組み合わせればいいかな。

まずはアドバタイジング開始のBleAdvertStart()を実行してみます。

BLEスキャンアプリから、認識できました。

![device-2013-12-21-124133.png](https://qiita-image-store.s3.amazonaws.com/0/33661/05b9065c-7267-3085-2848-58277e8fdf0e.png)

”LARID_PRX"がそうですね。

Local Nameとかアドバタイズド・パケットの設定はBleGapSvcInit()で変えられました。よしよし。

送信するアドバタイズド・パケットにUUIDとかの識別コードが必要なので、その設定関数を捜してみます。

　　BleAdvRptInit()、BleScanRptInit()で初期化して
　　BleAdvRptAddUuid128()でサービスのUUIDセットして
　　BleAdvRptAppendAD()でレコードを追加して
　　BleAdvRptsCommit()でコミット

までの流れは理解できたけど、iBeaconのパケットデータに合わせてデータを書き込むのはどうしたらいいの？
サービスUUIDはiBeaconで使ってないみたいだし。

うーんわからん。

サンプルをみてもわからん。
なんかBLE関連の関数、複雑すぎませんか？

Advent Calendar 時間切れですか orz

ということで、今回は残念ながら実装でiBeaconは作れませんでした...
引き続き調査をかけているので、うまくいったら記事に追記します。

AndroidとiBeacon(日本Androidの会　福岡支部　Android Night 12/20 LT資料)
http://www.slideshare.net/ikuyama10/androidi-beaconble-29405590