2장: Python을 사용하여 Bluetooth 제어 크래킹
소개
1장에서는 Raspberry Pi, Docker를 이용하여 Terma MOA Blue 히터를 제어할 수 있는 기반을 마련하고, 파이썬.
이제 더 자세히 알아볼 시간입니다.
-
BLE의 작동 방식 및 이를 사용하여 히터와 통신하는 방법
-
bluetoothctl을 사용하여 블루투스 연결 디버깅.
-
온도 및 모드 설정을 위한 데이터 인코딩 및 디코딩
-
모든 것을 하나로 묶어주는 Python 스크립트
저전력 블루투스(BLE) – 간략한 개요
테르마 MOA 블루 히터는 저전력 블루투스(BLE)를 사용하여 통신합니다. BLE 장치는 데이터 포인트처럼 작동하는 GATT 특성을 노출하며 읽기하거나 쓰기할 수 있습니다.
주요 개념:
-
UUID: 온도나 모드와 같은 특정 데이터 포인트를 식별하는 고유 ID입니다.
-
특성: 실제 데이터를 보유하는 BLE 속성입니다.
-
설명어: 특성에 대한 추가 메타데이터입니다.
-
쓰기 및 읽기 작업: 일부 특성은 읽기(예: 현재 온도)만 지원하는 반면 다른 특성은 쓰기(예: 온도 설정)를 허용합니다.
bluetoothctl을 사용하여 블루투스 연결 디버깅
Python으로 프로세스를 자동화하기 전에 수동 테스트 및 디버깅을 위해 bluetoothctl을 사용했습니다.
1단계: 장치 검색
bluetoothctl
scan on
로그인 후 복사
로그인 후 복사
"Terma Wireless"라는 장치를 찾으세요.
-
히터가 페어링 모드인지 확인하세요. 표시등이 깜박일 때까지 온도 버튼을 5초 동안 누릅니다. 그러면 페어링 모드가 활성화됩니다.
-
가장 가까운 장치 식별: 가장 낮은 RSSI 값(예: RSSI: -50)을 갖는 장치가 가장 가까운 히터일 가능성이 높습니다. RSSI 값이 낮을수록(더 음수일수록) 신호가 약하다는 것을 의미하므로 가장 강한 신호에 집중하세요.
2단계: 히터와 페어링
pair <DEVICE_ADDRESS>
로그인 후 복사
로그인 후 복사
메시지가 나타나면 PIN 코드 123456을 입력하세요.
3단계: 신뢰와 연결
trust <DEVICE_ADDRESS>
connect <DEVICE_ADDRESS>
로그인 후 복사
로그인 후 복사
4단계: 특성 읽기
연결되면 다음을 사용하세요.
bluetoothctl
scan on
로그인 후 복사
로그인 후 복사
데이터 읽기 및 쓰기에 사용할 수 있는 UUID를 표시합니다.
중요 사항:
-
다른 장치를 먼저 잊어버리세요:
- 히터가 다른 기기(예: 전화 앱)와 이미 페어링된 경우 계속하기 전에 해당 기기에서 페어링을 해제해야 합니다.
히터는 한 번에 하나의 활성 페어링만 유지할 수 있습니다.
-
실패 후 재연결:
- 히터가 성공적으로 연결되었지만 나중에 다시 연결하지 못한 경우 다음 단계를 따르세요.
pair <DEVICE_ADDRESS>
로그인 후 복사
로그인 후 복사
- 그런 다음 위의 단계에 따라 다시 페어링하세요.
-
Python 스크립트를 사용하려면 초기 연결이 필요합니다:
- 첫 번째 연결은 bluetoothctl을 통해 수동으로 설정해야 합니다.
- 페어링되면 Python 스크립트가 히터와 상호 작용할 수 있습니다.
- 그러나 나중에 히터를 다른 장치와 페어링하는 경우(연결이 끊어짐) 스크립트를 다시 실행하기 전에 Raspberry Pi에서 수동으로 제거하고 다시 연결해야 합니다. .
히터의 데이터 형식 크래킹
온도 인코딩
히터는 0.1°C 정밀도를 사용하여 온도를 2바이트(리틀 엔디안)로 인코딩합니다.
예:
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)
로그인 후 복사
배운 주요 교훈
-
블루투스 페어링 과제:
- 수동 페어링을 하려면 페어링 모드를 활성화하고 PIN을 다시 입력해야 하는 경우가 많습니다.
- 연결 끊김을 방지하려면 기기를 신뢰하는 것이 중요했습니다.
-
인코딩 실수:
- 초기 시도에서는 온도 인코딩에 255 대신 256 스케일링을 사용했습니다.
-
리틀 엔디안 0.1°C 스케일링으로 수정하여 디코딩 오류를 해결했습니다.
-
모드 처리 문제:
- BLE 모드는 잘 문서화되어 있지 않아 값을 리버스 엔지니어링해야 했습니다.
- 테스트 확인 33(0x21)이 수동 발열체 온도 모드에서 작동했습니다.
다음은 무엇입니까?
다음 장에서는 다음을 수행합니다.
-
다중 히터를 지원하도록 스크립트를 확장합니다.
- 더 쉬운 배포를 위해 Docker 통합을 도입하세요.
-
홈 어시스턴트를 사용하여 자동화 설정 탐색을 시작하세요.
피드백과 제안이 있으신가요?
GitHub 저장소를 확인하세요.
? GitHub - ha-hudsonread-heater-control
아래 댓글로 여러분의 생각과 제안을 알려주세요!
위 내용은 Python, Docker 및 Bluetooth를 사용하여 스마트 히터 컨트롤러 구축 #2의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!