第 2 章: Python を使用した Bluetooth コントロールのクラッキング
導入
第 1 章では、Raspberry Pi、Docker、およびパイソン。
次は、以下について詳しく見ていきます。
BLE の仕組み- と、BLE を使用してヒーターと通信する方法。
bluetoothctl- を使用して Bluetooth 接続をデバッグしています。
温度とモード設定のための
データのエンコードとデコード- 。
すべてをまとめた Python スクリプト- 。
Bluetooth Low Energy (BLE) – 概要
Terma MOA Blue
ヒーターは、通信に Bluetooth Low Energy (BLE) を使用します。 BLE デバイスは GATT 特性を公開しており、データ ポイント のように機能し、読み取り または 書き込み が可能です。
主要な概念:
UUID:- 温度やモードなど、特定のデータポイントを識別する一意の ID。
特徴:- 実際のデータを保持する BLE プロパティ。
記述子:- 特性に関する追加のメタデータ。
書き込み操作と読み取り操作:- 一部の特性は 読み取り (例: 現在の温度) のみをサポートしますが、他の特性は 書き込み (例: 温度の設定) を許可します。
bluetoothctl を使用した Bluetooth 接続のデバッグ
Python でプロセスを自動化する前に、手動テストとデバッグに
bluetoothctl
を使用しました。
ステップ 1: デバイスをスキャンする
bluetoothctl
scan on
「Terma Wireless」
という名前のデバイスを探します。
ヒーターがペアリング モードになっていることを確認します。- ライトが点滅するまで、温度ボタンを 5 秒間押し続けます。これによりペアリングモードが有効になります。
最も近いデバイスを特定する:-
最も低い RSSI 値 (例、RSSI: -50) を持つデバイスは、最も近いヒーターである可能性があります。 RSSI 値が低い (負が大きい) と信号が弱いことを示すため、最も強い信号 に注目してください。
ステップ 2: ヒーターとペアリングする
プロンプトが表示されたら、PIN コード
pair <DEVICE_ADDRESS>
123456
を入力します。
ステップ 3: 信頼してつながる
trust <DEVICE_ADDRESS>
connect <DEVICE_ADDRESS>
ステップ 4: 特性を読み取る
接続したら、次を使用します:
bluetoothctl
scan on
これにより、データの読み取りと書き込みに使用可能な UUID が表示されます。
重要な注意事項:
-
まず他のデバイスのことは忘れてください:
- ヒーターが別のデバイス (電話アプリなど) とすでにペアリングしている場合は、続行する前にそのデバイスからペアリングを解除する必要があります。
ヒーターは一度に1 つのアクティブなペアリングのみを維持できます。
-
失敗後の再接続:
- ヒーターが正常に接続されたものの、その後再接続に失敗する場合は、次の手順を実行します。
pair <DEVICE_ADDRESS>
-
Python スクリプトには初期接続が必要です:
- 最初の接続はbluetoothctl経由で手動で確立する必要があります。
ペアリングされると、Python スクリプトはヒーターと対話できるようになります。
-
ただし、後でヒーターを別のデバイスとペアリングする (接続を切断する) 場合は、スクリプトを再度実行する前に、Raspberry Pi から手動で - 削除 し、再接続する必要があります。 .
ヒーターのデータフォーマットの解読
温度エンコーディング
ヒーターは温度を
2 バイト (リトルエンディアン) として 0.1°C 精度 でエンコードします。
例:
trust <DEVICE_ADDRESS>
connect <DEVICE_ADDRESS>
Python デコード:
info <DEVICE_ADDRESS>
Python エンコーディング:
remove <DEVICE_ADDRESS>
モードエンコーディング
動作モードは、特定の値を持つ
単一バイト として保存されます:
- 0: オフ
- 5: 手動 (室温)
- 6: 手動 (発熱体温度)
- 33: 検証済み発熱体モード (16 進数: 0x21)
Python デコード:
Hex: 012d → Decoded: 30.1°C
Python エンコーディング:
def decode_temperature(data):
current_temp = ((data[1] << 8) | data[0]) / 10
target_temp = ((data[3] << 8) | data[2]) / 10
return round(current_temp, 1), round(target_temp, 1)
学んだ主な教訓
-
Bluetooth ペアリングの課題:
手動ペアリングでは、多くの場合、ペアリング モードを有効にして PIN を再入力する必要がありました。
-
切断を避けるためには、デバイスを信頼することが重要でした。
-
-
エンコードミス:
最初の試みでは、温度エンコードに - 255 の代わりに 256 スケーリング を使用しました。
- リトルエンディアン 0.1°C スケーリング に修正することで、デコード エラーが解決されました。
-
モード処理の問題:
- BLE モードは十分に文書化されていないため、値をリバース エンジニアリングする必要がありました。
- テストにより、33 (0x21) が 手動発熱体温度 モードで動作することが確認されました。
次は何ですか?
次の章では、次のことを行います:
-
複数のヒーターをサポートするようにスクリプトを拡張します。
- デプロイメントを容易にするために、Docker 統合 を導入します。
-
ホーム アシスタントを使用して、自動設定の探索を開始します。
フィードバックと提案はありますか?
GitHub リポジトリ:
をチェックしてください。
? GitHub - ha-hudsonread-heater-control
以下のコメント欄でご意見やご提案をお聞かせください。
以上がPython、Docker、Bluetooth を使用したスマート ヒーター コントローラーの構築 #2の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。