0

我正在使用 Azure IoT Central 创建一个 IoT 应用程序。客户端是用 python 编写的,我正在使用 iotc 库 ( https://pypi.org/project/iotc/ ) 来发送/接收消息。我工作场所的防火墙可能阻止了 MQTT 流量,这就是 python iotc 解决方案不起作用的原因。

我的设置在热点上工作,但不是在我工作的公司的有线网络上工作。所以这就是为什么我认为我们的防火墙阻止了端口 8883 上的 MQTT 流量。根据https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-mqtt-support我也应该能够在 WebSockets 和端口 443 上使用 MQTT。我正在尝试找到一种方法来使用来自 https://github.com/Azure/iot-central-firmware/blob/master/RaspberryPi/app.py 的示例 python应用程序端口 8883 上的 Websockets 而不是 MQTT。

这是来自 Microsoft 的演示应用程序。我想“iotc.connect()”行附近的某个地方是我应该尝试从 mqtt 更改为 websockets 的地方

# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license.

import iotc
from iotc import IOTConnectType, IOTLogLevel
from random import randint

deviceId = "DEVICE_ID"
scopeId = "SCOPE_ID"
deviceKey = "PRIMARY/SECONDARY device KEY"

iotc = iotc.Device(scopeId, deviceKey, deviceId, IOTConnectType.IOTC_CONNECT_SYMM_KEY)
iotc.setLogLevel(IOTLogLevel.IOTC_LOGGING_API_ONLY)

gCanSend = False
gCounter = 0

def onconnect(info):
  global gCanSend
  print("- [onconnect] => status:" + str(info.getStatusCode()))
  if info.getStatusCode() == 0:
     if iotc.isConnected():
       gCanSend = True

def onmessagesent(info):
  print("\t- [onmessagesent] => " + str(info.getPayload()))

def oncommand(info):
  print("- [oncommand] => " + info.getTag() + " => " + str(info.getPayload()))

def onsettingsupdated(info):
  print("- [onsettingsupdated] => " + info.getTag() + " => " + info.getPayload())

iotc.on("ConnectionStatus", onconnect)
iotc.on("MessageSent", onmessagesent)
iotc.on("Command", oncommand)
iotc.on("SettingsUpdated", onsettingsupdated)

iotc.connect()

while iotc.isConnected():
  iotc.doNext() # do the async work needed to be done for MQTT
  if gCanSend == True:
    if gCounter % 20 == 0:
      gCounter = 0
      print("Sending telemetry..")
      iotc.sendTelemetry("{ \
\"temp\": " + str(randint(20, 45)) + ", \
\"accelerometerX\": " + str(randint(2, 15)) + ", \
\"accelerometerY\": " + str(randint(3, 9)) + ", \
\"accelerometerZ\": " + str(randint(1, 4)) + "}")

    gCounter += 1

我希望有一些配置可以选择使用的协议。不幸的是,到目前为止我还没有找到。

4

1 回答 1

0

查看文档,我认为您需要使用setServiceHost(URL)

设置服务主机

设置服务端点 URL

device.setServiceHost(url)
  • url:服务端点的 URL。(默认值为 global.azure-devices-provisioning.net)

在连接之前调用它

由于这需要一个 URL,因此您应该能够包含一个端口号,例如

wss://foo.microsoft.com:443/

(虽然 443 应该是默认端口wss://

于 2019-08-16T14:05:11.840 回答