Volver al inicio

Raspberry Pi y medidor MIR S-05: BLE GATT

Los desarrolladores obtienen instrucciones para conectar Raspberry Pi al medidor MIR S-05.10 vía Bluetooth. Servicios GATT descritos, ingeniería inversa del protocolo vía logs HCI de Android, scripts bleak para leer lecturas. Adecuado para integración en sistemas de hogar inteligente.

Integración BLE del medidor MIR S-05 con Raspberry Pi Zero
Advertisement 728x90

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.

Google AdInline article slot

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:

Google AdInline article slot
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.

Google AdInline article slot

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

Advertisement 728x90

Leer después