SlideShare a Scribd company logo
1 of 14
Download to read offline
Python	で BLE
(Bluetooth	Low	Energy)
2016年9月15日
西本卓也 @24motz
広島版 IoT 縛りの勉強会 Vol.3
http://ja.nishimotz.com/iotlt_hiroshima
https://github.com/nishimotz/BluefruitLE_samples
1
CR2032 ボタン電池
• 230mAh,	3V	で 6ヶ月 =	BLE	のユースケース
• http://rbs.ta36.com/?p=20398
2
Generic	Access	Profile
• Peripheral	=	デバイス(ITAG)
• Central	=	デバイスと接続するアプリ(Python)
• Broadcaster	=	ビーコン
• Observer	=	ビーコン受信アプリ
3
Key	Finder	+	リモコン機能
• ITAGを紛失するとスマートフォンが警告
• スマートフォンを紛失するとITAGが警告
• ITAGのボタンを押すと
• 位置情報を記録
• ダブルクリックでボイスレコーダー実行
• アプリ iTracing →	更新されていない
• 互換アプリはある(Androidのみ確認)
• いつの間にか静かに接続が切れていたり
• 夜中に突然警告が鳴ったり
4
ITAGの中身
5
状態遷移モデル
6
スタンバイ
アドバタイズ
スレーブ
LED点滅
電源オフ
3秒押し
5秒押し
ボタン押しを送信
警告を受信
警告(LED点滅とブザー)
切断
ボタン押し
ボタン押し
接続
警告停止
Centralの状態遷移モデル
7
スタンバイ
デバイスの一覧を取得
スキャン
イニシエイト
マスター
特定のデバイスに接続要求
スレーブの機能を利用(このまま数ヶ月でも)
LightBlue for	Mac
• BLEデバイスのリストが見える
• スタンバイ →	スキャン →	スタンバイ状態
• 機器を選ぶと Service,	Characteristic	が見える
• イニシエイト →	マスター状態
• GATT	=	Generic Attribute Profile
• 16進数(GUID/UUID)で指定
• ベース部分は共通
• BATTERY SERVICE =	180f
• 0000180f-0000-1000-8000-00805f9b34fb
8
ITAGで確認できること
• 180f	=	BATTERY	SERVICE
• 2a19	=	BATTERY	LEVEL
• 0x64	=	100
• 1802	=	IMMEDIATE	ALERT	SERVICE
• 2a06	=	ALERT	LEVEL
• 0x02	を書き込むと警告
• 0x00	で停止
• ffe0	=	未定義Service
• ffe1	=	未定義Characteristics
• subscribe	するとボタン押しで 0x01	が notify	される
9
BluefruitLE Python	Library
• Adafruit が公開
• MacとLinux(Raspberry	Pi)に対応
• Linux	PyBluez
• Core Bluetooth	PyObjC
• Adafruit のデバイスで使う例しかない
• やってみたら ITAG	を叩ける
10
メインループ
import	Adafruit_BluefruitLE,	uuid
BATTERY_SERVICE	=	uuid.UUID('0000180f-…)
BATTERY_LEVEL	=	uuid.UUID('00002a19-…')
def main():
#デバイスのスキャン、接続、値の読み書き
provider	=	Adafruit_BluefruitLE.get_provider()
provider.initialize()
provider.run_mainloop_with(main)
11
デバイスのスキャン
adapter	=	provider.get_default_adapter()				
adapter.power_on()
adapter.start_scan()
device	=	provider.find_device()
adapter.stop_scan()
print(device.name)
12
接続して値の読み取り
device.connect()
device.discover([BATTERY_SERVICE],	[BATTERY_LEVEL])
service	=	device.find_service(BATTERY_SERVICE)
c	=	service.find_characteristic(BATTERY_LEVEL)
v	=	c.read_value()
print(ord(v[0]))
device.disconnect()
13
書き込み:write_value()
通知待ち:start_notify()
まとめ
• IMMEDIATE_ALERT は hello	world
• Bluefruit LE	Python	は Central	専用
• データ収集
• Peripheral	の調査やデバッグ
• RasPi を Central	として運用
• MacでPythonが独自ビルド版の場合は
• pip	install	pyobjc
• リファレンスがないのでソースを読んで理解
• スマートフォンアプリ開発
14

More Related Content

What's hot

What's hot (20)

SLAMチュートリアル大会 Direct Sparse Odometry 紹介
SLAMチュートリアル大会 Direct Sparse Odometry 紹介SLAMチュートリアル大会 Direct Sparse Odometry 紹介
SLAMチュートリアル大会 Direct Sparse Odometry 紹介
 
実践イカパケット解析
実践イカパケット解析実践イカパケット解析
実践イカパケット解析
 
ESP32開発環境まとめ
ESP32開発環境まとめESP32開発環境まとめ
ESP32開発環境まとめ
 
[DL輪読会]3D Hair Synthesis Using Volumetric Variational Autoencoders
[DL輪読会]3D Hair Synthesis Using Volumetric Variational Autoencoders[DL輪読会]3D Hair Synthesis Using Volumetric Variational Autoencoders
[DL輪読会]3D Hair Synthesis Using Volumetric Variational Autoencoders
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
Protocol Buffers 入門
Protocol Buffers 入門Protocol Buffers 入門
Protocol Buffers 入門
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
SLAM勉強会(PTAM)
SLAM勉強会(PTAM)SLAM勉強会(PTAM)
SLAM勉強会(PTAM)
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
ソシャゲにおけるサーバとクライアントの決めごと
ソシャゲにおけるサーバとクライアントの決めごとソシャゲにおけるサーバとクライアントの決めごと
ソシャゲにおけるサーバとクライアントの決めごと
 
とある小型の青歯規格(ブルートゥース)
とある小型の青歯規格(ブルートゥース)とある小型の青歯規格(ブルートゥース)
とある小型の青歯規格(ブルートゥース)
 
SIGNATE 国立国会図書館の画像データレイアウト認識 1st place solution
SIGNATE 国立国会図書館の画像データレイアウト認識 1st place solutionSIGNATE 国立国会図書館の画像データレイアウト認識 1st place solution
SIGNATE 国立国会図書館の画像データレイアウト認識 1st place solution
 
第1回 GPT / ジェネレーティブAI 勉強会「ChatGPTでMML音楽を奏でてみた&LLMで思うこと」
第1回 GPT / ジェネレーティブAI 勉強会「ChatGPTでMML音楽を奏でてみた&LLMで思うこと」第1回 GPT / ジェネレーティブAI 勉強会「ChatGPTでMML音楽を奏でてみた&LLMで思うこと」
第1回 GPT / ジェネレーティブAI 勉強会「ChatGPTでMML音楽を奏でてみた&LLMで思うこと」
 
ARMアーキテクチャにおけるセキュリティ機構の紹介
ARMアーキテクチャにおけるセキュリティ機構の紹介ARMアーキテクチャにおけるセキュリティ機構の紹介
ARMアーキテクチャにおけるセキュリティ機構の紹介
 
tf,tf2完全理解
tf,tf2完全理解tf,tf2完全理解
tf,tf2完全理解
 
避けては通れないバイナリ地獄 - NDEFってなんだろう -
避けては通れないバイナリ地獄 - NDEFってなんだろう -避けては通れないバイナリ地獄 - NDEFってなんだろう -
避けては通れないバイナリ地獄 - NDEFってなんだろう -
 
Bluetooth meshの基礎
Bluetooth meshの基礎Bluetooth meshの基礎
Bluetooth meshの基礎
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 

More from Takuya Nishimoto

More from Takuya Nishimoto (20)

221217 SwiftはPythonに似ている
221217 SwiftはPythonに似ている221217 SwiftはPythonに似ている
221217 SwiftはPythonに似ている
 
220427-pydata 統計・データ分析 特集
220427-pydata 統計・データ分析 特集220427-pydata 統計・データ分析 特集
220427-pydata 統計・データ分析 特集
 
220126 python-datalake-spark
220126 python-datalake-spark220126 python-datalake-spark
220126 python-datalake-spark
 
211120 他人の書いたPythonスクリプトをステップ実行で理解する
211120 他人の書いたPythonスクリプトをステップ実行で理解する211120 他人の書いたPythonスクリプトをステップ実行で理解する
211120 他人の書いたPythonスクリプトをステップ実行で理解する
 
211020 すごい広島 with OSH 2021.10
211020 すごい広島 with OSH 2021.10211020 すごい広島 with OSH 2021.10
211020 すごい広島 with OSH 2021.10
 
210917 オープンセミナー@広島のこれまでとこれから
210917 オープンセミナー@広島のこれまでとこれから210917 オープンセミナー@広島のこれまでとこれから
210917 オープンセミナー@広島のこれまでとこれから
 
210911 これから始める電子工作とMicroPython
210911 これから始める電子工作とMicroPython210911 これから始める電子工作とMicroPython
210911 これから始める電子工作とMicroPython
 
210728 mpy
210728 mpy210728 mpy
210728 mpy
 
210630 python
210630 python210630 python
210630 python
 
210526 Power Automate Desktop Python
210526 Power Automate Desktop Python210526 Power Automate Desktop Python
210526 Power Automate Desktop Python
 
210428 python
210428 python210428 python
210428 python
 
200918 hannari-python
200918 hannari-python200918 hannari-python
200918 hannari-python
 
200429 python
200429 python200429 python
200429 python
 
200325 flask
200325 flask200325 flask
200325 flask
 
200208 osh-nishimoto-v2
200208 osh-nishimoto-v2200208 osh-nishimoto-v2
200208 osh-nishimoto-v2
 
191208 python-kansai-nishimoto
191208 python-kansai-nishimoto191208 python-kansai-nishimoto
191208 python-kansai-nishimoto
 
191101 nvda-sightworld-nishimoto
191101 nvda-sightworld-nishimoto191101 nvda-sightworld-nishimoto
191101 nvda-sightworld-nishimoto
 
191114 iotlt-nishimoto
191114 iotlt-nishimoto191114 iotlt-nishimoto
191114 iotlt-nishimoto
 
191030 anna-with-python
191030 anna-with-python191030 anna-with-python
191030 anna-with-python
 
190916 nishimoto-nvda-pyconjp
190916 nishimoto-nvda-pyconjp190916 nishimoto-nvda-pyconjp
190916 nishimoto-nvda-pyconjp
 

Mac から Python で BLE ペリフェラルを操作する