SlideShare ist ein Scribd-Unternehmen logo
1 von 45
Downloaden Sie, um offline zu lesen
中華製安価デバイスを
解析した話
第42回 NDS 2015/06/13
@civic
今日お話する内容
デバイス通信の解析
今日お話しする内容
• ニーズについて
• 温度ロガーについて
• 解析方法について
• 出来上がった成果
ニーズについて
キャンプとか
好き
アウトドアの天候は
変わりやすい
寒い!
暑い!!
色んな経験をした
• どのぐらい寒かった/暑かった
• ある一時点の気温では説明しきれない
• 一日の温度変化を記録すれば説得力抜群
暑い/寒い以上の情報量
データロガー
• 温度、湿度などの環境情報を
定期的に記録
温度ロガーを使って
キャンプ中の温度を
ロギングしよう!
温度ロガー
温度ロガーは結構高価
• 有名メーカーのものは数万円
• 温度センサーの部品は安い
• PC接続するタイプは安い
• バッテリー駆動必須
• min/maxの記録だけのは安い
Amazonで安いの発見
安心の中国製
スペック
• ボタン電池型の充電可能バッテリー
• 外部電源なしで単体動作
• USB接続でデータ取得
• 10分間隔の記録で111日間の記録が可能
• 記録間隔は設定可能(10秒∼24時間)
価格=3100円⁉
唯一の問題点
Windowsツールのみ
意外と高機能
データ取り込みや、
パラメータ設定に使用
カスタマーQ&A
回答
余談
!?
VirtualBoxでなんとかなる
インストール時
• USB-UART変換ドライバ
がインストールされてた
解説しよう
温度ロガー
Windows
USBケーブル 管理ツール
COMx
←温度データくれ
リクエスト
温度データ
レスポンス→
できる?
温度ロガー
MacOS or Linux
USBケーブル
自前
プログラム/dev/tty.*
←温度データくれ
リクエスト
温度データ
レスポンス→
解析方法について
通信をのぞき見
• 通信をのぞき見するか、ブリッジできればよい
• そういったソフトウェアがたくさんある
• レガシーデバイスの再利用で需要あるみたい
モニタリングツール
• Free Serial port Analyzer
• 無料ながらも高機能
Free Serial Analyzer
←便利!
バイナリデータを
見てわかるのか不安
意外と分かりやすかった
解析方針
• モニターしながら設定値を1箇所だけ変更
• 変更前後の差分から推測
例: 日付時刻
07 DF 05 0E 16 2F 04
-- -- -- -- -- -- --
YY YY MM DD HH MI SS
2015 / 5/14 22:47:04
チェックサム
• モジュロ256
• sumして256で割ったあまりが末尾についてる

→0x00∼0xFFの1バイト
一応解析できた
• 初期化処理?
• 設定値取得
• 設定更新
• 記録データ取得
できあがった成果
Pythonプログラムとして作成
• データアクセス用のライブラリ
• コマンドラインツール
データ取得
$ elitech-device.py -c get /dev/tty.SLAB_USBtoUART
1 2015-06-11 23:34:34 26.5
2 2015-06-11 23:35:34 26.7
3 2015-06-11 23:36:34 26.8
4 2015-06-11 23:37:34 26.9
5 2015-06-11 23:38:34 27.0
6 2015-06-11 23:39:34 27.0
7 2015-06-11 23:40:34 27.0
8 2015-06-11 23:41:34 27.1
9 2015-06-11 23:42:34 27.1
設定値取得
$ elitech-device.py -c devinfo /dev/tty.SLAB_USBtoUART
stop_button=StopButton.ENABLE
rec_interval=00:01:00
alarm=AlarmSetting.NONE
delay=0.0
tone_set=ToneSet.NONE
work_sts=WorkStatus.STOP
current=2015-06-12 02:06:24
last_online=2015-06-12 02:06:07
temp_calibration=-1.5
station_no=3
user_info=RC-4 Data Logger
upper_limit=60.0
ライブラリとして利用
import elitech
# 初期化
device = elitech.Device("/dev/tty.SLAB_USBtoUART")
device.init()
# デバイス設定値の取得
devinfo = device.get_devinfo()
ソースコード公開
• Github

https://github.com/civic/elitech-datareader
• PyPI登録

pip install elitech-datareader
まとめ
まとめ
• モニタリングツールを使えば便利
• 通信フォーマットが単純なら解析可能
• USBシリアルポート変換ドライバだったので可
能だった

Weitere ähnliche Inhalte

Mehr von civic Sasaki (6)

むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8
むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8
むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8
 
Amazon SESのメール受信対応でサーバー減らせた話
Amazon SESのメール受信対応でサーバー減らせた話Amazon SESのメール受信対応でサーバー減らせた話
Amazon SESのメール受信対応でサーバー減らせた話
 
第37回NDS Java並行処理 今昔物語
第37回NDS Java並行処理 今昔物語第37回NDS Java並行処理 今昔物語
第37回NDS Java並行処理 今昔物語
 
第36回NDS 発表資料 ちょこっとpython
第36回NDS 発表資料 ちょこっとpython第36回NDS 発表資料 ちょこっとpython
第36回NDS 発表資料 ちょこっとpython
 
Nds35 kindle4
Nds35 kindle4Nds35 kindle4
Nds35 kindle4
 
NDS31 はじめてChrome App
NDS31 はじめてChrome AppNDS31 はじめてChrome App
NDS31 はじめてChrome App
 

第42回中華製安価デバイスの通信を解析した話