背景:我正在创建一个Node.js Web应用程序来模拟设备&将事件发布到Node-Red应用程序&设备在Watson IoT Platform中注册。
Node red Application订阅该事件并执行自定义逻辑。
作为Node.js Web应用程序的一部分,单击Web应用程序中的“提交”按钮,我将提交带有文本框值的发布请求。我正在处理app.js中的请求并发布事件
问题:当我第一次提交请求时,它完全正常。但是从第二次开始,它不断尝试重新连接并重复发布事件
App.js代码 - >发布方法部分
app.post('/status/data', function(req, res) { console.log("3rd param is " + req.body.eid); application.connect(); console.log("Successfully connected to our IoT service!"); application.on("connect", function () { console.log("About to publish data "); application.publishDeviceEvent(deviceType, deviceId, eventType, eventFormat, eventData); console.log("published data "); }); res.writeHead(200, "OK", {'Content-Type': 'text/plain'}); res.end(); });
首次发布请求 - 日志详细信息
Jun 29,2017 04:12:47.346 PM APP / PROC / WEB / 0 3rd param is 111111 Jun 29,2017 04:13:04.785 PM APP / PROC / WEB / 0 [BaseClient:connect] 与主机连接到IoTF: ssl://9z9mtd.messaging.internetofthings.ibmcloud.com:8883六月29,2017 04:13:04.786 PM APP / PROC / WEB / 0成功连接到我们的物联网 服务! 2017年6月29日04:13:04.814 PM APP / PROC / WEB / 0即将发布 数据Jun 29,2017 04:13:04.855 PM APP / PROC / WEB / 0 [ApplicationClient:publish]发布: IOT-2 /类型/ CardSim / ID / EB27FNW / EVT /更新/ FMT / JSON, {“d”:{“eid”:222261,“loc”:1234}},QoS:0 Jun 29,2017 04:13:04.855 PM APP / PROC / WEB / 0发布数据2017年6月29日04:13:04.855 PM APP / PROC / WEB / 0 [ApplicationClient:connnect] ApplicationClient 已连接2017年6月29日04:13:04.855 PM RTR / 1
第二次POst请求 - 日志详细信息
PP / PROC / WEB / 0 3rd param是222222 Jun 29,2017 04:13:52.891 PM APP / PROC / WEB / 0 [BaseClient:connect]与主机连接到IoTF: ssl://9z9mtd.messaging.internetofthings.ibmcloud.com:8883六月29,2017 04:13:52.891 PM RTR / 0 cardreaderapp.mybluemix.net - [2017-06-29T10:43:52.857 + 0000]“POST / status / data HTTP / 1.1”200 10 0 “ - ”“Mozilla / 5.0(Windows NT 6.1; WOW64; rv:45.0)Gecko / 20100101 Firefox / 45.0“”108.168.250.151:18180“”169.47.199.84:63789“ x_forwarded_for:“167.230.96.8”x_forwarded_proto:“https” vcap_request_id: “0801beea-5ab8-434b-403D-6c5cc92e9aad” response_time:0.050970748 app_id:“0cdbfec6-ac2a-4be1-9bab-3b1933ba3c57”app_index:“0” x_global_transaction_id:“1003954655”x_b3_traceid:“920cb5951fe2dee3” x_b3_spanid:“920cb5951fe2dee3”x_b3_parentspanid:“ - ”2017年6月29日 04:13:52.908 PM APP / PROC / WEB / 0成功连接到我们的物联网 服务! 2017年6月29日04:13:52.895 PM APP / PROC / WEB / 0 [BaseClient:onClose]连接已关闭。 2017年6月29日04:13:52.929 PM APP / PROC / WEB / 0 [BaseClient:connect] Iotfclient离线。重试 连接Jun 29,2017 04:13:52.928 PM APP / PROC / WEB / 0 [BaseClient:connect]在3秒内重试。数量:2017年6月29日 04:13:52.928 PM APP / PROC / WEB / 0 [ApplicationClient:connnect] ApplicationClient已连接2017年6月29日04:13:52.930 PM APP / PROC / WEB / 0即将发布数据2017年6月29日04:13:53.972 PM APP / PROC / WEB / 0 [ApplicationClient:publish]发布: IOT-2 /类型/ CardSim / ID / EB27FNW / EVT /更新/ FMT / JSON, {“d”:{“eid”:222261,“loc”:1234}},QoS:0
这个过程不断重复。请帮忙
答案 0 :(得分:1)
对于应用程序的每个POST,您(重新)连接到IoTP并注册on-connect()回调。
而不是这样做,你应该连接并注册任何on-connect回调(不是发布POST数据的回调!)在处理POST的函数之外,比如app init。
在POST功能中,您唯一需要做的就是致电publishDeviceEvent()
。
注意publishDeviceEvent()
当然是异步的,所以当函数返回时它可能不会实际发布。您可以通过传入回调来等待它,然后回调通过已写入标题的res.end()来响应调用者。