从Azure运行时模块到外部网关的HTTP POST请求



我正在开发Azure边缘模块,在那里我创建了一个自定义模块,该模块实际上在边缘运行时内接收到了来自另一个模块的消息。

我的要求是通过HTTPpost方法将数据发送到外部网关(例如thingsboard(。在docker文件中,暴露80端口并与本地机器80端口绑定。

问题是,每当我试图使用HTTP-post方法将消息从自定义模块发送到外部网关(thingsboard(时,都会得到HTTP500的错误。

如果我直接运行容器(而不是在边缘运行时下(,工作正常。

由于我在容器中的代码想要通过互联网向外部世界(外部设备或网关(发送消息。我正在向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"
}
}
}
}

我应该如何解决这个问题?如何将消息发送到外部网关

谢谢。

默认情况下,您在Azure IoT Edge中的模块将能够访问互联网,除非配置发生了更改,或者有防火墙限制您访问事物。io要验证您的模块是否可以访问该URL,您可以尝试以下操作:

docker run -i --rm -p 80:80 --network="azure-iot-edge" alpine ping thingsboard.io

这将在与模块相同的Docker网络上运行一个容器,并查看您是否可以解析URL。

您提到了HTTP状态代码500,它表示服务器(来自Thingsboard(对您的请求有问题。因为你提到,如果你只是手动运行容器,这是有效的,这可能是因为当你在Azure IoT Edge运行时运行模块时,你的负载不同。一个简单的方法是使用日志记录来检查在每个场景中发送给Thingsboard的内容。

注意:在你的问题中,你说

在docker文件中,暴露80端口并与本地机器80端口绑定

只有当您希望模块通过端口80接受传入的请求时,才需要这样做。对于传出请求(例如发送到Thingsboard的消息(,不需要这样做。

最新更新