我在java中有一个用VS代码开发的iot边缘模块。到目前为止,一切都在正常工作(意思是:我可以毫无问题地向物联网中心发送消息)。现在我想添加从物联网集线器接收消息的选项。由于这不是直接实现的,所以我订阅了直接方法调用。在我的情况下,这似乎是不正确的。但是,一旦我删除了对该方法的订阅,一切就都正常了。因此,订阅的行为似乎破坏了一些东西。
当我添加订阅直接方法调用的代码时,模块仍然可以向物联网集线器发送消息,但是连接会在5秒间隔内丢失并重新建立。过了一段时间(大约5分钟),我看到了来自iotHubEventCallback的消息(错误):
230162 MQTT Rec: myEdgeDevice/JavaModule警告HbIIoTGateway -连接状态:重试 230995 MQTT Rec: myEdgeDevice/JavaModule警告HbIIoTGateway -连接状态:连接 240196 MQTT Rec: myEdgeDevice/JavaModule警告HbIIoTGateway -连接状态:重试 240994 MQTT Rec: myEdgeDevice/JavaModule警告HbIIoTGateway -连接状态:连接 250228 MQTT Rec: myEdgeDevice/JavaModule警告HbIIoTGateway -连接状态:重试 250229天青-物联网-IotHubSendTask INFO HbIIoTGateway -直接方法# IoT集线器响应设备方法确认状态:错误 251005 MQTT Rec: myEdgeDevice/JavaModule警告HbIIoTGateway -连接状态:连接
在此之后,连接保持稳定。但是,我不能调用方法调用(例如从azure门户调用),它们会得到一个超时:
无法调用设备方法:{“消息”:“GatewayTimeout:{\r\n\”消息\“:”{\“错误代码\”:504101,“GatewayTimeout 05:20:00\",\”消息\“:”超时等待设备的响应“。\”GatewayTimeout\“:{\”timeout\“:”00:00:10“},\"timestampUtc\":\"2019-04-26T05:20:00.6977425Z\"}\",\r\n \"ExceptionMessage\":\“\”\r}}
国际知识服务的地位似乎没有问题:
peers_docker_dev iotedged52836: 2019-04-26T05:21:09Z信息-检查边缘运行时状态 4月26日05:21:09 peers_docker_dev iotedged52836: 2019-04-26T05:21:09Zinfo- Edge运行时正在运行。 peers_docker_dev iotedged52836: 2019-04-26T05:21:10Z INFO - mgmt -- 2019-04-26 05:21:10.206275755 UTC "GET /modules?api-version=2018-06-28 HTTP/1.1“200 OK 1483 "-”-“pid”
以下是有关的守则:
m_client = new ModuleClient(sConnString, IotHubClientProtocol.MQTT);
// Set the callback for messages
m_client.setMessageCallback(INPUT_NAME, new MessageCallback()
{
public IotHubMessageResult execute(Message msg, Object context)
{
App.m_logger.info("Received message from hub: " + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET));
return IotHubMessageResult.COMPLETE;
}
}, m_client);
// Register the callback for connection state change
m_client.registerConnectionStatusChangeCallback(new IotHubConnectionStatusChangeCallback ()
{
public void execute(IotHubConnectionStatus status, IotHubConnectionStatusChangeReason statusChangeReason, Throwable throwable, Object callbackContext)
{
String statusStr = "Connection Status: %s";
switch (status)
{
case CONNECTED:
App.m_logger.warn(String.format(statusStr, "Connected"));
break;
case DISCONNECTED:
App.m_logger.error(String.format(statusStr, "Disconnected"));
if (throwable != null)
{
throwable.printStackTrace();
}
break;
case DISCONNECTED_RETRYING:
App.m_logger.warn(String.format(statusStr, "Retrying"));
break;
default:
break;
}
}
}, null);
// Open client
m_client.open();
// Register to receive direct method calls.
m_client.subscribeToMethod(new DeviceMethodCallback() {
@Override
public DeviceMethodData call(String methodName, Object methodData, Object context) {
App.m_logger.info("Method called:" + methodName);
return new DeviceMethodData(METHOD_SUCCESS, "Executed direct method " + methodName);
}
}, null, new IotHubEventCallback()
{
public void execute(IotHubStatusCode status, Object context)
{
App.m_logger.info("Direct method # IoT Hub responded to device method acknowledgement with status: " + status.name());
}
}, null);实际输出如上所示。我希望有一个稳定的连接和接收方法调用。知道我可能做错了什么吗?
谢谢你的帮忙!
发布于 2019-04-30 11:18:41
为了解决这个问题:我可以通过在蔚蓝门户中添加一个新设备和一个新模块来让它工作。有了这些连接字符串,它就能工作。
我不知道我对第一个设备/模块做了什么错误。如果你有什么想法,请告诉我。
感谢并致以最良好的问候,
https://stackoverflow.com/questions/55861306
复制相似问题