指定hono-ttd后设备仍不等待响应——ECLIPSE HONO问题咨询
Eclipse Hono 问题排查:hono-ttd 不生效与 hono-cmd-req-id 来源
一、hono-ttd=60 设备未等待指令直接返回的原因及解决
你的请求存在两个核心问题:
请求体不符合遥测数据格式
你发送的curl请求URL是/telemetry(遥测上传端点),但请求体却是Ditto的modify命令格式,这会让Hono适配器误判请求类型,直接返回命令响应而非等待下行指令。遥测数据应该是纯业务数据,比如:{"temperature": 45}正确的遥测上传命令应该是:
curl -i -u demo-device@org.eclipse.packages.c2e:demo-secret \ -H 'application/json' \ --data-binary '{"temperature":45}' \ http://${HTTP_ADAPTER_IP}:${HTTP_ADAPTER_PORT_HTTP}/telemetry?hono-ttd=60hono-ttd 是「最大等待时间」而非「强制等待」
hono-ttd指定的是设备愿意等待下行命令的最长秒数,如果在等待期间没有针对该设备的下行命令,适配器会提前返回确认响应(不会等满60秒)。如果要验证等待逻辑,需要在设备发送遥测后,立即通过Hono北向接口给该设备下发一条命令,此时适配器会在响应中携带命令内容,无需等满超时时间。
二、hono-cmd-req-id 的获取方式
hono-cmd-req-id是设备接收下行命令时从响应头中获取的:
- 当设备通过HTTP长轮询(或带hono-ttd的遥测/事件上传)收到下行命令时,适配器返回的响应头中会包含
hono-cmd-req-id字段,同时响应体就是命令内容。 - 设备在返回命令响应时,需要将这个ID放到请求头
hono-cmd-req-id中,发送到/command/res端点,以此关联命令与响应。
举个示例:
- 设备收到下行命令的响应(来自适配器):
HTTP/1.1 200 OK hono-cmd-req-id: abc123 hono-command: modify content-type: application/vnd.eclipse.ditto+json ... - 设备发送命令响应时的
curl命令:curl -i -u demo-device@org.eclipse.packages.c2e:demo-secret \ -H 'application/json' \ -H 'hono-cmd-req-id: abc123' \ --data-binary '{"status": 200, "payload": {"result": "success"}}' \ http://${HTTP_ADAPTER_IP}:${HTTP_ADAPTER_PORT_HTTP}/command/res
内容的提问来源于stack exchange,提问作者Antonio Landolfi
相关产品推荐
相关产品推荐

