# UDP 心跳 `efka` 通过独立的 `efka_heartbeat` 进程向 `iot` 发送 UDP 心跳。该心跳只表示主机存活,不依赖 TLS control channel 是否在线。 ## 配置 TLS 和 UDP 共用同一个 `iot_server.host`: ```erlang {iot_server, [ {host, "localhost"}, {tls_port, 443}, {udp_port, 18080} ]}, {heartbeat, [ {interval, 5000} ]}, {auth, [ {uuid, "qbxmjyzrkpntfgswaevodhluicqzxplkm"}, {token, "zpxlkvmqwnbghytrujsdieofazxcvbnm"} ]} ``` - `tls_port` 用于 `efka_client` 建立 TLS 连接。 - `udp_port` 用于 `efka_heartbeat` 发送 UDP 心跳。 - `heartbeat.interval` 是发送间隔,单位毫秒,默认 5000。 - UDP 心跳和 TLS 鉴权复用 `auth.uuid` 和 `auth.token`。 ## 包格式 ```erlang << Version:8, UuidLen:16, UUID:UuidLen/binary, Timestamp:64/unsigned-big, Nonce:16/binary, Mac:32/binary >> ``` `Mac` 使用 HMAC-SHA256: ```erlang HeartbeatSecret = crypto:hash(sha256, Token), Payload = <>, Mac = crypto:mac(hmac, sha256, HeartbeatSecret, Payload) ``` 其中 `Token` 是 `auth.token`。`iot` 侧注册 efka client 时保存同样的 `SHA256(Token)` 派生值,并用它校验心跳。