首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在物联网边缘java模块中正确注册直接方法?

如何在物联网边缘java模块中正确注册直接方法?
EN

Stack Overflow用户
提问于 2019-04-26 05:29:41
回答 1查看 532关注 0票数 0

我在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”

以下是有关的守则:

代码语言:javascript
复制
            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);

实际输出如上所示。我希望有一个稳定的连接和接收方法调用。知道我可能做错了什么吗?

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

发布于 2019-04-30 11:18:41

为了解决这个问题:我可以通过在蔚蓝门户中添加一个新设备和一个新模块来让它工作。有了这些连接字符串,它就能工作。

我不知道我对第一个设备/模块做了什么错误。如果你有什么想法,请告诉我。

感谢并致以最良好的问候,

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55861306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档