Integración del contador eléctrico MIR C-05.10 con Raspberry Pi por Bluetooth: GATT e ingeniería inversa
La Raspberry Pi Zero 2W, gracias a su módulo Bluetooth integrado, permite leer los datos del contador eléctrico MIR C-05.10-230-5(80)-G2Z1B-KNQ-S-D sin necesidad de una sonda óptica USB. La interfaz se basa en un perfil GATT sobre BLE. Para comenzar, instala los paquetes de Bluetooth necesarios:
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
En la utilidad bluetoothctl, ejecuta un escaneo (scan on), empareja el dispositivo (pair MAC), márcalo como de confianza (trust MAC) y conéctate (connect MAC). Los contadores aparecerán identificados como C05-número_de_serie.
Una vez establecida la conexión, los servicios GATT quedan accesibles. El servicio principal para SPP-over-BLE es 4880c12c-fdcb-4077-8920-a450d7f9b907, que incluye la característica fec26ec4-6d71-4442-9f81-55bc21d658d6 (notificación/escritura sin respuesta). El servicio OTA de Silicon Labs puede ignorarse sin problemas.
Lectura de características GATT básicas
Un script en Python que utilice bleak permite escanear las características disponibles y activar las notificaciones:
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())
La salida del script revela los detalles del dispositivo: fabricante NPO "MIR", modelo C05, número de serie 50912525161818 y versión de firmware v2.81.9.0. Otras características se encuentran bloqueadas y requieren autenticación (READ_NOT_PERMITTED).
Ingeniería inversa del protocolo mediante registros HCI de Android
Para analizar el tráfico de comunicación, se necesita un dispositivo Android con acceso root. Activa las Opciones de desarrollador, habilita el registro de espionaje HCI de Bluetooth (Bluetooth HCI snoop log) y activa la depuración por USB. Tras emparejar el dispositivo con la aplicación oficial "MIR DP", extrae los registros mediante adb bugreport o con los siguientes comandos:
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
El archivo binario btsnoop_hci.log puede analizarse con Wireshark o herramientas asistidas por IA. Este proceso revela la secuencia exacta de comandos BLE utilizada para la inicialización y la obtención de datos: consumo total de energía, lecturas de tarifas T1/T2, fecha y hora, intensidad de corriente y voltaje.
Script de sondeo secuencial para lecturas del contador
El protocolo exige solicitudes BLE individuales para cada punto de datos. A continuación, se muestra una plantilla de script:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Reading MIR C-05 meter data via BLE.
1. Connect and initialize.
2. Enable notifications.
3. Send sequential read commands.
"""
# Insert commands extracted from HCI logs here: write-without-response to fec26ec4...
El script se encarga de inicializar el servicio, habilitar las notificaciones y enviar las solicitudes de lectura. Las respuestas se procesan en unidades estándar: kWh, A y V.
Conclusiones clave:
- La conexión BLE se mantiene estable sin necesidad de volver a emparejar.
- Las características GATT están protegidas; se requiere un PIN específico del fabricante para acceder a todas las funciones.
- Los registros HCI son fundamentales para decodificar el protocolo SPP-over-BLE.
- La integración fluida en Home Assistant es posible mediante MQTT o la ejecución directa del script.
- El sondeo secuencial es obligatorio; enviar solicitudes por lotes provocará la desconexión.
— Editorial Team
Aún no hay comentarios.