TRANXACT.AI Ayuda

Medidores IoT: cómo registrar un dispositivo y cómo firma sus lecturas

Dispositivos IoT: registre un AMI o un punto final IoT, copie su secreto (que se muestra una vez), cámbielo con un nuevo secreto y vea cómo el dispositivo firma cada solicitud a /api/public/utilities/iot/reads, con un ejemplo de solicitud, los límites y todas las respuestas que puede obtener.

Un medidor AMI o IoT envía sus lecturas a TRANXACT a través de HTTPS. Cada dispositivo tiene una clave generada por el servidor (utd_ seguida de 24 letras y dígitos) y un secreto. El dispositivo verifica su identidad en cada solicitud, por lo que nadie más puede enviar lecturas de ese medidor.

Registro de un dispositivo

  1. Abra CRM › Servicios públicos › Medidores y lecturas de servicios públicos › Dispositivos IoT y pulse Nuevo.
  2. Introduzca una etiqueta, seleccione el medidor que lee y elija Firmar con: hmac (una firma HMAC-SHA256 de cada solicitud —recomendado), portador (la clave y el secreto enviados como un token) o ambos.
  3. Configure el número máximo de lecturas por minuto para este dispositivo y el firmware, si lo conoce.
  4. Guardar. La respuesta muestra la clave y el secreto: “Copia el secreto ahora; no se mostrará de nuevo”. Introduce ambos en la configuración del dispositivo.

El secreto se muestra una sola vez. No vuelve a aparecer en la lista, ni siquiera para un administrador; la lista solo muestra sus últimos cuatro caracteres (Fin del secreto). Si se pierde, genere uno nuevo.

Girando el secreto

En la fila del dispositivo, pulse «Nueva clave secreta» y confirme. La nueva clave se mostrará una sola vez y la anterior dejará de funcionar en ese momento, así que introduzca la nueva clave inmediatamente. Establezca el estado en «Deshabilitado» para detener un dispositivo sin rotación, o en «Retirado» cuando se retire del servicio.

Cómo un dispositivo registra una lectura

  1. Construye el cuerpo JSON: una lista de lecturas, cada una con read_at (hora ISO 8601) y lectura. La batería, la señal, el firmware y las alarmas son opcionales.
  2. Toma la hora Unix actual en segundos como marca de tiempo.
  3. Calcula el HMAC-SHA256, bajo la clave secreta del dispositivo, de la marca de tiempo, un punto y los bytes exactos del cuerpo: “<marca de tiempo>.<cuerpo>”. Escríbelo como 64 caracteres hexadecimales en minúscula.
  4. POST el cuerpo a /api/public/utilities/iot/reads con los encabezados X-Utility-Device (la clave), X-Utility-Timestamp y X-Utility-Signature (el hexadecimal, opcionalmente con el prefijo sha256=).
POST https://<your-tranxact-host>/api/public/utilities/iot/reads
Content-Type: application/json
X-Utility-Device: <utd_DEVICE_KEY>
X-Utility-Timestamp: <1792252800>
X-Utility-Signature: sha256=<64 hex characters>

{"reads":[{"read_at":"<2026-10-17T09:30:00Z>","reading":<48213.4>}],
 "battery_pct":<87>,"signal_dbm":<-71>,"firmware":"<2.4.1>",
 "alarms":[{"type":"<leak>","detail":"<continuous flow 6 h>"}]}

La misma firma funciona en un shell, para probar un dispositivo antes de su instalación:

BODY='{"reads":[{"read_at":"<2026-10-17T09:30:00Z>","reading":<48213.4>}]}'
TS=$(date +%s)
SIG=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "<DEVICE_SECRET>" | sed 's/^.* //')
curl -X POST "https://<your-tranxact-host>/api/public/utilities/iot/reads" \
  -H "Content-Type: application/json" \
  -H "X-Utility-Device: <utd_DEVICE_KEY>" \
  -H "X-Utility-Timestamp: $TS" \
  -H "X-Utility-Signature: sha256=$SIG" \
  --data-binary "$BODY"

Firma exactamente los bytes que envíes. Si reformateas el JSON después de firmarlo o lo envías con un final de línea diferente, los bytes cambian y la firma deja de coincidir.

Un dispositivo configurado como portador (o ambos) puede enviar Authorization: Bearer <utd_DEVICE_KEY>.<DEVICE_SECRET> y no incluir encabezados de firma. HMAC es la opción más segura: el secreto nunca se transmite y una solicitud capturada no se puede reproducir.

Límites

  • La marca de tiempo debe tener una diferencia máxima de 5 minutos con respecto a la hora del servidor: mantenga la hora del dispositivo sincronizada mediante NTP.
  • La misma solicitud firmada dos veces se rechaza como una repetición. Una lectura que ya está en el archivo se considera duplicada y se almacena una sola vez.
  • Como máximo 64 KB y 500 lecturas por solicitud, el propio dispositivo Lecturas por minuto como máximo, y 600 solicitudes por minuto desde una dirección.
  • El dispositivo debe estar activo y conectado a un medidor.

Lo que el dispositivo recibe de vuelta

RespuestaSignificado
201 o 200 con aceptados, duplicados, excepciones, rechazados, alarmas y problemasLa solicitud fue procesada. Cada lectura se contabiliza; los problemas identifican cualquier lectura que no sea válida mediante su índice.
401 device_authClave desconocida o inactiva, modo incorrecto o firma que no coincide. El contador de intentos rechazados del dispositivo aumenta.
401 marca de tiempo obsoletaLa marca de tiempo tiene un desfase de más de 5 minutos.
Repetición 409Esta solicitud firmada ya ha sido recibida.
413 lecturas demasiado_manchasMás de 500 lecturas en una sola solicitud.
422 sin medidorEl dispositivo no está conectado a un medidor.
429 tasa_limitadaEl envío supera el límite. Espere y vuelva a enviar.
400 bad_jsonEl cuerpo no es JSON.
403 utilidades_desactivadasLos servicios públicos de la empresa están cortados.

Salud y alarmas

  • Cada solicitud actualiza la última conexión, el porcentaje de batería y la señal en dBm del dispositivo. Una batería con menos del 15 % activa una alarma de batería baja.
  • Tipos de alarma que puede enviar un dispositivo: batería baja, manipulación, fuga, flujo inverso, sin flujo, fuera de línea y otras. Una alarma activa de cada tipo por dispositivo.
  • La función Alarmas de dispositivo las muestra; Borrar cierra una con una nota. Una fuga genera automáticamente una orden de servicio de investigación de fugas de alta prioridad; una alarma de manipulación o de flujo inverso también genera una orden de servicio.
  • La cifra de informes de medidores IoT (24 h) del panel de control contabiliza los dispositivos activos de los que se ha tenido señal en el último día.