Upload
edy555
View
1.864
Download
1
Embed Size (px)
DESCRIPTION
BLEデバイスをLinuxから使って、基礎的なインターネット連携をしてみようという実習講座の資料です。(第二部)
Citation preview
Bluetooth Low Energy入門講座
第二部 実習
食関連産業IT化(機械化)講座 応用編
モノとアプリをつなげる基本技術
北海道ソフトウェア技術開発機構
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)
• データをどうやって取っているか – コマンドを送って、反応を受け取る
– どんな応答を受け取っているかprintで確認
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)
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
• コンパイル $ make
str2ba("90:59:AF:0A:A8:A4", &opts.dst);
socket+C言語: 実行
$ ./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
• コマンド入力後、センサーのボタンを押す
• その後Enterを入力
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)
• アドレスの修正
• 実行
– Notificationを受信して生データを表示
// Connect
btle.connect('90:59:AF:0A:A8:A4', function(err, device) {
$ node btle-test.js
Temperature, 65230, 2944
Temperature, 65220, 2944
btle.js(2)
• アトリビュートの読み出し版
– 温度への変換を実装
– 少し遅延を入れている
$ node btle-read2.js
connecting SensorTag...
connected
Temperature: 17.475821408366528
Got close
btle.js(3)
• HTTPサーバ版
– ブラウザから参照する http://localhost:1337/
$ node btle-http2.js
connecting SensorTag...
connected
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キーを転記
• Bluetoothアドレスを転記
• インターバルを調整
XIVELY_API_KEY =
"eIpXlvKHd9CdtdD5SK9TgzaiZ9osxOX2a05MK18epQdAb0iy"
XIVELY_FEED_ID = 813879821
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へのアップロード