首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Azure运行时模块向外部网关发出HTTP POST请求

从Azure运行时模块向外部网关发出HTTP POST请求
EN

Stack Overflow用户
提问于 2021-05-04 18:30:19
回答 1查看 82关注 0票数 0

我在Azure边缘模块上工作,在那里我创建了一个自定义模块,它实际上从边缘运行时中的另一个模块接收消息。

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

问题是,每当我尝试使用HTTP post方法从自定义模块向外部网关(Thingsboard)发送消息时,都会得到HTTP 500的错误。

如果我直接运行容器(而不是在边缘运行时),运行时会运行得很好。

因为我在容器中的代码想要通过互联网向外部世界(外部设备或网关)发送消息。我正在向thingsboard (http://demo.thingsboard.io/api/v1/camera/telemetry)发送消息。

边缘部署清单:

代码语言:javascript
运行
复制
{
  "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"
      }
    }
  }
}

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

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-05-05 15:25:52

默认情况下,Azure URL中的模块将能够访问互联网,除非更改了配置,或者防火墙限制你访问thingsboards.io以验证你的模块是否可以访问该IoT,你可以尝试以下操作:

代码语言:javascript
运行
复制
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的消息),这不是必需的。

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

https://stackoverflow.com/questions/67383037

复制
相关文章

相似问题

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