如何从本地Spring服务向Azure IoT Edge自定义Java模块发送数据
Azure IoT Edge 本地Spring服务与自定义Java模块通信解决方案
错误原因说明
你之前的实现逻辑存在方向性错误:使用目标自定义模块的连接字符串构造ModuleClient调用sendEventAsync,本质是模拟该自定义模块的身份向edgeHub上报事件,消息流向是从模块到edgeHub,自然不会进入自定义模块的输入队列。
另外你对Routes的理解存在偏差:Routes不仅支持模块间、模块与edgeHub的通信,也支持下游设备/服务到模块、模块到下游设备的消息路由,完全可以满足你的需求。
可用实现方案
方案1:通过edgeHub路由转发(推荐,符合IoT Edge原生架构)
- 先将本地Spring服务作为IoT Edge的下游挂载设备,申请对应的IoT设备连接字符串
- 发送消息时给消息添加自定义标识属性,用于路由规则匹配
- 在IoT Edge部署清单的路由配置中添加规则,将带指定标识的消息转发到自定义Java模块的输入端点,示例路由规则:
FROM /messages/* WHERE targetModule = '你的自定义Java模块名称' INTO BrokeredEndpoint("/modules/你的自定义Java模块名称/inputs/input1") - 你的自定义Java模块添加对应
input1端点的消息监听逻辑,即可正常收到Spring服务发送的数据
调整后的Spring服务端代码示例:
// 此处填写Spring服务作为下游设备的连接字符串,不是目标自定义模块的连接字符串 String connString = "你的Spring服务对应IoT设备连接字符串"; IotHubClientProtocol protocol = IotHubClientProtocol.AMQPS; Message messageToSendFromDeviceToModule = new Message("lorem ipsum......."); // 添加自定义属性用于路由匹配 messageToSendFromDeviceToModule.setProperty("targetModule", "你的自定义Java模块名称"); ModuleClient moduleClient = new ModuleClient(connString ,protocol); moduleClient.open(); moduleClient.sendEventAsync(messageToSendFromDeviceToModule ,null ,null); System.out.println("MESSAGE SENT"); Thread.sleep(1000); moduleClient.closeNow();
方案2:自定义模块直接暴露HTTP接口(适合本地低延迟交互)
- 直接在自定义Java模块中内嵌轻量HTTP服务,对外暴露指定端口和数据接收接口
- 本地Spring服务直接通过「模块所在主机IP+暴露端口+接口路径」发起HTTP请求,即可直接将数据传给自定义模块,无需经过edgeHub路由,适配本地低延迟交互场景
内容的提问来源于stack exchange,提问作者Akshay Kumar
相关产品推荐
相关产品推荐

