Integrace elektroměru MIR C-05.10 přes Bluetooth s Raspberry Pi: GATT a reverzní inženýrství
Raspberry Pi Zero 2W s integrovaným Bluetooth umožňuje číst data z elektroměru MIR C-05.10-230-5(80)-G2Z1B-KNQ-S-D bez potřeby USB optické sondy. Rozhraní využívá GATT profil přes BLE. Nejprve nainstalujte potřebné balíčky pro práci s Bluetooth:
sudo apt update
sudo apt install -y bluez bluez-tools bluetooth python3-pip
python3 -m pip install --break-system-packages bleak
sudo systemctl enable bluetooth
sudo systemctl restart bluetooth
V nástroji bluetoothctl spusťte skenování (scan on), spárování (pair MAC), důvěryhodnost (trust MAC) a připojení (connect MAC). Elektroměry se zobrazují jako C05-sériové_číslo.
Po připojení jsou dostupné služby GATT. Hlavní pro SPP-over-BLE je 4880c12c-fdcb-4077-8920-a450d7f9b907 s charakteristikou fec26ec4-6d71-4442-9f81-55bc21d658d6 (notify/write without response). Službu Silicon Labs OTA lze ignorovat.
Čtení základních charakteristik GATT
Skript využívající knihovnu bleak prohledá dostupné charakteristiky a aktivuje oznámení (notify):
import asyncio
from bleak import BleakClient
ADDR = "E4:06:BF:87:CD:69"
CHARS = [
"00002a29-0000-1000-8000-00805f9b34fb",
"00002a24-0000-1000-8000-00805f9b34fb",
"00002a25-0000-1000-8000-00805f9b34fb",
"00002a27-0000-1000-8000-00805f9b34fb",
"00002a26-0000-1000-8000-00805f9b34fb",
"2bb1d64f-451a-4541-ac89-24df683309dc",
"d24a5138-1448-48ea-a983-f7df274c6d89",
"4335a5be-fbbd-464e-8659-1a4212239e3e",
"b3f7e595-2951-42fa-879e-0d9dfa5e846e",
"fec26ec4-6d71-4442-9f81-55bc21d658d6",
"f7bf3564-fb6d-4e53-88a4-5e37e0326063",
]
def fmt(data: bytes) -> str:
try:
txt = data.decode("utf-8", errors="strict")
return f'hex={data.hex(" ")} | utf8={txt!r}'
except Exception:
return f'hex={data.hex(" ")}'
async def main():
def cb(sender, data):
print(f"NOTIFY {sender}: {fmt(bytes(data))}")
async with BleakClient(ADDR, timeout=20.0) as client:
print("connected:", client.is_connected)
for uuid in CHARS:
try:
data = await client.read_gatt_char(uuid)
print(f"READ {uuid}: {fmt(bytes(data))}")
except Exception as e:
print(f"READ {uuid}: ERROR: {e}")
try:
await client.start_notify("fec26ec4-6d71-4442-9f81-55bc21d658d6", cb)
print("notify enabled on fec26...")
except Exception as e:
print("notify fec26 error:", e)
await asyncio.sleep(10)
asyncio.run(main())
Výstup zobrazuje údaje: výrobce NPO"MIR"", model C05, sériové číslo 50912525161818, verze v2.81.9.0. Ostatní charakteristiky vyžadují autentizaci (READ_NOT_PERMITTED).
Reverzní inženýrství protokolu pomocí Android HCI logů
Pro analýzu provozu je potřeba zařízení s Androidem s root přístupem. Aktivujte vývojářské možnosti, HCI snoop logy a ladění přes USB. Po připojení k aplikaci „MIR DP" lze logy extrahovat pomocí adb bugreport nebo:
adb shell su -c "cp /data/misc/bluetooth/logs/btsnoop_hci.log /sdcard/Download/btsnoop_hci.log && chmod 666 /sdcard/Download/btsnoop_hci.log"
adb pull /sdcard/Download/btsnoop_hci.log
Binární soubor btsnoop_hci.log lze analyzovat (např. ve Wiresharku nebo pomocí AI). Odhalena byla sekvence BLE příkazů pro inicializaci a čtení dat: celková spotřeba, tarify T1/T2, datum/čas, proud a napětí.
Skript pro sekvenční dotazování dat
Protokol vyžaduje samostatné BLE požadavky. Ukázkový skript:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Sčítání dat z elektroměru MIR C-05 přes BLE.
1. Připojení a inicializace.
2. Aktivace notify.
3. Sekvenční příkazy pro čtení.
"""
# Zde jsou příkazy z HCI logů: write-without-response na fec26ec4...
Skript provede inicializaci, aktivuje oznámení a odešle požadavky. Odpovědi jsou následně parsovány na hodnoty v kWh, A a V.
Co je důležité vědět:
- Připojení přes BLE je stabilní a nevyžaduje opakované párování.
- Charakteristiky GATT jsou chráněny; je vyžadován PIN od dodavatele.
- HCI logy jsou klíčem k porozumění protokolu SPP-over-BLE.
- Integrace do Home Assistant je možná přes MQTT nebo přímé volání skriptu.
- Sekvenční dotazování je nezbytné: hromadné požadavky způsobují odpojení.
— Editorial Team
Zatím žádné komentáře.