我在Azure边缘模块上工作,在那里我创建了一个自定义模块,它实际上从边缘运行时中的另一个模块接收消息。
我的需求是通过HTTP post方法将数据发送到外部网关(例如thingsboard)。在docker文件中,暴露80端口,并与本机80端口绑定。
问题是,每当我尝试使用HTTP post方法从自定义模块向外部网关(Thingsboard)发送消息时,都会得到HTTP 500的错误。
如果我直接运行容器(而不是在边缘运行时),运行时会运行得很好。
因为我在容器中的代码想要通过互联网向外部世界(外部设备或网关)发送消息。我正在向thingsboard (http://demo.thingsboard.io/api/v1/camera/telemetry)发送消息。
边缘部署清单:
{
"modulesContent": {
"$edgeAgent": {
"properties.desired": {
"schemaVersion": "1.0",
"runtime": {
"type": "docker",
"settings": {
"minDockerVersion": "v1.25",
"loggingOptions": "",
"registryCredentials": {
"cameraedgedev": {
"username": "username",
"password": "password",
"address": "cameraedgedev.azurecr.io"
}
}
}
},
"systemModules": {
"edgeAgent": {
"type": "docker",
"settings": {
"image": "mcr.microsoft.com/azureiotedge-agent:1.0",
"createOptions": "{}"
}
},
"edgeHub": {
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "mcr.microsoft.com/azureiotedge-hub:1.0",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}],\"8082/tcp\":[{\"HostPort\":\"8082\"}]}}}"
}
}
},
"modules": {
"lvaEdge": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "mcr.microsoft.com/media/live-video-analytics:2",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"8082/tcp\":[{\"HostPort\":\"8082\"}]},\"LogConfig\":{\"Type\":\"\",\"Config\":{\"max-size\":\"10m\",\"max-file\":\"10\"}},\"Binds\":[\"/var/media:/var/media/\",\"/var/lib/azuremediaservices:/var/lib/azuremediaservices\"]}}"
}
},
"rtspsim": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "mcr.microsoft.com/lva-utilities/rtspsim-live555:1.2",
"createOptions": "{\"HostConfig\":{\"Binds\":[\"/home/cameraedgevm_user/samples/input:/live/mediaServer/media\"]}}"
}
},
"lvaSupport": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "cameraedgedev.azurecr.io/lvasupport:1.2",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"80/tcp\":[{\"HostPort\":\"80\"}]}}}"
}
},
"ai_module": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"env": {
"PYTHONUNBUFFERED": {
"value": "1"
},
"NVIDIA_VISIBLE_DEVICES": {
"value": "all"
}
},
"settings": {
"image": "cameraedgedev.azurecr.io/ai_module:1.2",
"createOptions": "{\"HostConfig\":{\"Runtime\":\"nvidia\",\"PortBindings\":{\"8082/tcp\":[{\"HostPort\":\"8082\"}]},\"Binds\":[\"/home/cameraedgevm_user/ai_module/data:/ai_module/data/\"]}}"
}
}
}
}
},
"$edgeHub": {
"properties.desired": {
"schemaVersion": "1.0",
"routes": {
"LVAToHub": "FROM /messages/modules/lvaEdge/outputs/* INTO $upstream",
"LVATolvaSupportModule": "FROM /messages/modules/lvaEdge/outputs/* INTO BrokeredEndpoint(\"/modules/lvaSupport/inputs/input1\")"
},
"storeAndForwardConfiguration": {
"timeToLiveSecs": 7200
}
}
},
"lvaEdge": {
"properties.desired": {
some properties
}
},
"lvaSupport": {
"properties.desired": {
"Gateway": "http://demo.thingsboard.io/api/v1/camera/telemetry",
"gatewayMethod": "POST"
}
}
}
}
我该如何解决这个问题?如何向外部网关发送消息
谢谢。
发布于 2021-05-05 15:25:52
默认情况下,Azure URL中的模块将能够访问互联网,除非更改了配置,或者防火墙限制你访问thingsboards.io以验证你的模块是否可以访问该IoT,你可以尝试以下操作:
docker run -i --rm -p 80:80 --network="azure-iot-edge" alpine ping thingsboard.io
这将在与您的模块相同的Docker网络上运行一个容器,并查看您是否可以解析URL。
您提到了HTTP状态代码500,它表明服务器(来自Thingsboard)对您的请求有问题。因为您提到如果您只是手动运行容器,这将起作用,这可能是因为当您在Azure IoT边缘运行时运行您的模块时,您的有效负载是不同的。一种简单的方法是使用日志记录来检查您在每个场景中发送到Thingsboard的内容。
注意:在你的问题中,你说
docker文件中的
,暴露80端口,并与本机80端口绑定
只有当您希望模块通过端口80接受传入请求时,才需要这样做。对于传出请求(例如发送到Thingsboard的消息),这不是必需的。
https://stackoverflow.com/questions/67383037
复制相似问题