如何配置Python iotc以通过端口443而不是通过端口8883的MQTT使用WebSockets

时间:2019-08-16 12:58:11

标签: python websocket mqtt azure-iot-central

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

我的设置通过热点工作,但不在我工作的公司的有线网络上工作。所以这就是为什么我认为我们的防火墙阻止了端口8883上的MQTT通信。 根据{{​​3}},我还应该能够通过WebSockets和端口443使用MQTT。我正在尝试找到一种方法来使用来自https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-mqtt-support的示例python应用程序,该应用程序使用Websockets而不是端口8883上的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

我希望可以进行一些配置,在其中可以选择所使用的协议。不幸的是,到目前为止,我找不到一个。

1 个答案:

答案 0 :(得分:0)

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

  

setServiceHost

     

设置服务端点URL

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

在连接之前调用此

由于它采用了网址,因此您应该能够包含端口号,例如

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

(尽管443应该是wss://的默认端口)