Hono 1.10.0下AMQP设备接收命令后回复无法送达业务端问题咨询
问题根源排查
以下是你当前实现存在的3个核心问题:
- 设备端响应sender配置错误
你在设备端收到命令后构造响应sender时,传入了target地址为None,不符合Hono AMQP适配器的要求。Hono要求设备发送命令响应时,必须显式将sender的target地址设置为命令携带的reply_to字段值,不能使用匿名sender。
你的错误写法:
sender = event.container.create_sender(self.connection, None, options=AtLeastOnce())
修改为:
sender = event.container.create_sender(self.connection, event.message.reply_to, options=AtLeastOnce())
- 业务端命令发送链路提前断开
从Dispatch Router日志可以看到,业务端发送命令的链路在建立后立刻被断开,命令还没下发到设备就被丢弃,设备根本收不到命令自然不会返回响应。问题出在你的AmqpSender实现:on_sendable触发后直接关闭了sender和连接,没有等待消息被Hono服务端确认。Hono的命令发送是异步流程,你需要等待消息返回accepted的disposition确认之后再关闭链路。 - 缺少消息状态确认逻辑
你当前的MessagingHandler子类没有实现on_accepted、on_rejected这类消息状态回调,无法感知消息是否被服务端正常接收,也就无法判断发送流程是否真正完成。
临时测试验证方案
你可以先修改AmqpSender的on_sendable逻辑,不要立刻关闭连接,等待2秒再关闭,验证命令是否能下发到设备:
def on_sendable(self, event): print("In Msg send") for msg in self.messages: event.sender.send(msg) # 新增等待,不要立刻关闭 time.sleep(2) event.sender.close() event.connection.close() print("Sender & connection closed")
内容的提问来源于stack exchange,提问作者Armin Gruber
相关产品推荐
相关产品推荐

