食関連産業IT化(機械化)講座 応用編 
Bluetooth Low Energy入門講座 
モノとアプリをつなげる基本技術 
第二部 実習 
北海道ソフトウェア技術開発機構 
2013年11月12日~13日
2日目の内容 
• 午前 
– コードによるデータの取得 
– 各方法の説明 
• 午後 
– インターネットへのアップロード
コードによる制御
コード制御の実装方法 
• 自動化やデータ処理を行ないたい 
• プログラムによる制御をする必要がある 
• 3案 
– gatttool+python 
– libbluetooth+socket(C言語) 
– btle.js (BLEのnode.js実装: JavaScript)
TI社のサンプル 
• TI社提供のサンプルコード 
– iOS用 
– Android用 
– http://www.ti.com/tool/sensortag-sw
実装方法 
• python+gatttool 
– gatttoolコマンドを使用、簡便 
• libbluetooth+socket 
– C言語 
– 正統派だが面倒 
• btle.js 
– BLEのnode.js実装: JavaScript 
– Webとの連携に良いかも
gatttool+スクリプト 
• gatttoolを利用してデバイスを制御 
• スクリプト言語としてpythonを利用 
– 前述のgatttoolをサブプロセスとしてstdio経由 
で使用する 
• サンプル 
– ble-python ディレクトリ 
– IR Temperatureの取得 
– これを実際に動作させてみる
python超入門 
• ブロック 
– Cでいう { ... } 
– コロン“:”で始まりインデントを下げる 
– インデントにはタブを使わない(ほうが良い) 
• 関数呼び出しには括弧が必須 
– エラーにならないので注意 
• 関数定義はdef文
ble-python(0) 
• 準備 
– BDアドレスを調べておく 
$ sudo hcitool lescan 
LE Scan ... 
90:59:AF:0A:A8:A4 (unknown) 
90:59:AF:0A:A8:A4 SensorTag
ble-python(1) 
• ソース: sensortag-temp.py 
• BDアドレスを修正 
def main(bdaddr='90:59:AF:0A:A8:A4'): 
tool = connect(bdaddr) 
while True: 
try: 
tmpr = read_data(tool) 
print tmpr 
except: 
print "Error:", sys.exc_info() 
time.sleep(5)
ble-python(2) 
• 実行手順 
– 必要に応じてボタンを押す 
$ sudo python sensortag-temp.py 
Preparing to connect. You might need to press the 
side button... 
15.3 
15.6 
15.3
ble-python(3) 
• データをどうやって取っているか 
– コマンドを送って、反応を受け取る 
tool.sendline('char-read-hnd 0x25') 
tool.expect('descriptor: .*') 
rval = tool.after.split() 
#print rval 
objT = floatfromhex(rval[2] + rval[1]) 
ambT = floatfromhex(rval[4] + rval[3]) 
tmpr = calcTmpTarget(objT, ambT) 
– どんな応答を受け取っているかprintで確認
ble-python(4) 
• 他のセンサを使用するよう修正 
– UUIDを変更して別のセンサ値を取得してみる 
– 参考: http://processors.wiki.ti.com/index.php/SensorTag_User_Guide 
• 初期化部分 
– イネーブルして一度取得 
tool.sendline('char-write-cmd 0x29 01') 
tool.expect('¥[LE¥]>') 
tool.sendline('char-read-hnd 0x25') 
tool.expect('descriptor: .*')
ble-python(5) 
• 初期化部分 
– イネーブル対象を変更 
tool.sendline('char-write-cmd 0x29 01') 
tool.expect('¥[LE¥]>') 
tool.sendline('char-read-hnd 0x25') 
tool.expect('descriptor: .*') 
• データ取得部分 
tool.sendline('char-read-hnd 0x25') 
tool.expect('descriptor: .*') 
rval = tool.after.split() 
#print rval
ble-python(6) 
• 温度 
• 加速度 
• 方位(地磁気) 
• ボタン 
• 気圧 
• ジャイロ
socket+C言語 
• 別実装の方法として参考提示 
• サンプル 
– ble-cディレクトリ
socket+C言語: コンパイル 
• ライブラリのインストール(済) 
$ sudo apt-get install libbluetooth-dev 
• コード中のアドレスを修正 
– test.c line:186 
str2ba("90:59:AF:0A:A8:A4", &opts.dst); 
• コンパイル 
$ make
socket+C言語: 実行 
• コマンド入力後、センサーのボタンを押す 
• その後Enterを入力 
$ ./test 
push side button 
bt_io_connect: 3 
write WRITE_CMDwrite: 4 
write READ_REQwrite: 3 
read responseread: 5 
opcode: 11 
ad fe c8 0a 
temperature: 17.554379
socket+C言語: 解説 
• 講習の範囲を超えるので簡単に 
• ユーティリティとしてbtio.c/hを使用 
– 後述のbtle.jsの一部、bluz由来 
• ソケットを作成 
– PF_BLUETOOTH 
– PROTO_L2CAP 
• ATTのデータフォーマットで入出力 
• root権限でなくても動作する
btle.js 
• Node.js向けBLEモジュール 
– beetle juiceと発音するそうです 
– bluezのコードをベースに、glib等ライブラリ依 
存を削除 
– githubで公開 
• https://github.com/jacklund/btle.js 
– npmでインストール可能
Node.jsとは 
• 趣旨から外れるので一言だけ説明 
– サーバサイドJavaScript 
– イベントドリブン 
– 高負荷にも耐えるWebアプリケーションサーバ 
として知られる
btle.js(0) 
• インストール(済) 
– node.jsの最新版をインストール 
– npmでbtle.jsをインストール 
$ sudo apt-get install libbluetooth-dev 
$ sudo apt-get install python-software-properties python 
$ sudo apt-get install g++ make 
$ sudo add-apt-repository ppa:chris-lea/node.js 
$ sudo apt-get update 
$ sudo apt-get install nodejs npm 
$ npm install -g node-gyp 
$ npm install btle.js
btle.js(1) 
• アドレスの修正 
// Connect 
btle.connect('90:59:AF:0A:A8:A4', function(err, device) { 
• 実行 
$ node btle-test.js 
Temperature, 65230, 2944 
Temperature, 65220, 2944 
– Notificationを受信して生データを表示
btle.js(2) 
• アトリビュートの読み出し版 
$ node btle-read2.js 
connecting SensorTag... 
connected 
Temperature: 17.475821408366528 
Got close 
– 温度への変換を実装 
– 少し遅延を入れている
btle.js(3) 
• HTTPサーバ版 
$ node btle-http2.js 
connecting SensorTag... 
connected 
– ブラウザから参照する http://localhost:1337/
noble 
• noble: もうひとつのnode.js ble実装 
– というか決定版 
– https://github.com/sandeepmistry/noble 
– 各種デバイス対応やペリフェラルも存在
noble+sensortag 
• インストールはこれだけ 
$ sudo npm install sensortag 
$ sudo npm install async 
• 実行 
$ cd node_modules/sensortag 
$ sudo node test.js
インターネット連携
インターネット連携 
• やること:センサーから取得したデータをサ 
ーバにアップロードする 
• クラウドサービスを利用する
xively.com 
• 「Public Cloud for the Internet of Things」 
• モノのインターネットのためのクラウド 
• データの蓄積 
• グラフ化 
• WebAPI (REST) 
• 各種プラットフォーム用ライブラリあり 
• Developer Accountは無料で取得可能
xively.com
実例:室温記録
xivelyのはじめ方 
1. アカウントを作成 
2. フィードを作成 
3. APIキーを取得 
4. データをアップロード
xively: アカウント作成 
• (作成済みのアカウントを共有します)
xively:手順 
• ログイン 
• デバイス(フィード)作成 
• Feed IDとAPI Keyを取得 
• スクリプトに設定 
• 実行
xively:デバイス追加
xively:Feed IDとAPI Key
xively:スクリプト 
• Feed IDとAPIキーを転記 
XIVELY_API_KEY = 
"eIpXlvKHd9CdtdD5SK9TgzaiZ9osxOX2a05MK18epQdAb0iy" 
XIVELY_FEED_ID = 813879821 
• Bluetoothアドレスを転記 
def main(bdaddr='90:59:AF:0A:A8:A4'): 
• インターバルを調整
xively:実行 
• 実行すると、データ取得&アップロードを 
継続 
$ python ./sensortag2xively.py 
Preparing to connect. You might need to press the side 
button... 
(datetime.datetime(2013, 11, 9, 14, 11, 29, 172604, 
tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>), 20.7) 
(datetime.datetime(2013, 11, 9, 14, 11, 30, 828813, 
tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>), 21.1) 
....
xively:コンソール
xively:フィード表示 
• Xivelyのサイトでグラフ表示 
– https://xively.com/feeds/813879821
xively:データ取得 
• REST APIにより蓄積データを参照可能 
– https://xively.com/dev/docs/api/quick_reference/historical_data/ 
– JSON, XML, CSV 
• CSVで一日分のデータを取得する例 
$ wget --header "X-ApiKey: 
eIpXlvKHd9CdtdD5SK9TgzaiZ9osxOX2a05MK18epQdAb0iy" 
'https://api.xively.com/v2/feeds/813879821/datastreams/tmpr. 
csv?start=2013-11-09T00:00:00Z&duration=24hours' -O tmpr.csv
xively:グラフイメージ取得 
• グラフイメージの取得 
– see https://xively.com/dev/docs/api/data/read/single_datastream/ 
https://api.xively.com/v2/feeds/{feed id}/datastreams/{stream id}.png
xively:JSによるグラフ作成 
• インタラクティブなグラフを含むページ作成 
– http://xively.github.io/channel-viz/
まとめ 
• BLEの仕組みの理解 
• Linuxからの利用 
• Xivelyへのアップロード

Bluetooth Low Energy入門講座 -part2