1

我的脚本运行正常,并且在主机 RaspberryPi、Python3.7 以及我的 Windows10 笔记本电脑上运行时可以连接到 IOT 中心。但是,在使用 python:3.7-buster 构建的容器中运行时,它会引发 InvalidURL(f"URL can't contain control characters. {url!r} 错误。

我尝试了各种 Python Docker 映像,但得到了相同的错误。

import iotc
from iotc import IOTConnectType, IOTLogLevel
from random import randint
import settings, client
import json, time

# settings_fp = r"config.json"
settings_fp = '/var/lib/project/config.json'


with open(settings_fp, 'r') as settings_file:
  settings = json.load(settings_file)

scopeId = settings['cloud']['scope_id']
deviceId = settings['cloud']['device_id']
deviceKey = settings['cloud']['primary_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
       print("Connected to the cloud!!!")

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() # code fails here

我希望能正常连接到 IOT 中心,但会得到

InvalidURL(f"URL 不能包含控制字符。{url!r}"

4

3 回答 3

2

在 iotc 包的 0.3.5版本中报告了问题并在此解决。

于 2019-11-07T13:47:53.443 回答
0

我遇到了同样的问题,请务必使用 Python 3.7、PIP3 并使用 PIP3 安装 iotc 并且它可以工作,在我的情况下它有多个版本并且我已经使用 Python2.7 安装了 iotc

pip3 安装 iotc

于 2019-11-08T04:57:33.123 回答
0

在此处添加分辨率以供参考:

在 python 2.7 上运行时,0.3.4 版运行良好,并且在访问 URL 时不会出错。

从单个 http 标头字符串迁移到标头对象。这修复了 python 3+ 和最新的 http lib 的 URL 解析错误。

有关详细信息,请参阅:IoTC python 客户端连接异常:InvalidURL

于 2019-11-08T09:38:57.640 回答