【问题标题】:Sending message to Azure IoT Hub via python HTTPS - using urllib3 - results in no response通过 python HTTPS 向 Azure IoT Hub 发送消息 - 使用 urllib3 - 导致无响应
【发布时间】:2021-07-02 14:04:48
【问题描述】:

根据官方documentation和网上的几篇帖子,成功发送消息到Azure IoT Hub设备的响应是:“204 No Content”。

我们知道消息已成功发送并被 IoTHub 接收,我们可以看到消息(包括消息正文):1)在 Device Explorer 工具中,2)我们可以使用 Azure IoT SDK(azure.eventhub)看到它并创建一个读取函数 3) 我们还可以在 Azure 门户中看到消息。

在 Python 3.8 中使用 Python 请求库 发送消息时,我们确实收到了 204 响应。但是,对于一个位置,我们需要使用 Python urllib3 库,而我们在进行 POST 时根本没有得到任何响应。代码如下。 注意:我们之前尝试了 urllib2 也没有得到响应。

  1. Azure IoT Hub 通常成功响应的数据类型是什么?是简单的字符串吗?

  2. 什么可能阻止响应显示在 urllib3 和 urllib2 中?

谢谢。 生长激素

import urllib3
import json
import datetime
import ssl
import certifi

print("certifi: " + certifi.where())
print("urllib3 ver: " + urllib3.__version__)
print("ssl ver: " + ssl.OPENSSL_VERSION)

# IoT DeviceID
deviceID = "gwy1"
# Iot Hub Name
IoTHubName = "aziothub1"
# RestAPI Version
iotHubAPIVer = "2020-03-13"
iotHubRestURI = "https://" + IoTHubName + ".azure-devices.net/devices/" + deviceID + "/messages/events?api-version=" + iotHubAPIVer

SASToken = "SharedAccessSignature sr=gwy1-aziothub1.azure-devices.net%2Fdevices%2Fglualwpr-gwy1&sig=v-----------------------------------&se=1629182336"


# Message Payload
datetime =  datetime.datetime.now()
body = {}
body['datetime'] = str(datetime)
body['deviceClient'] = deviceID
body['Message'] = 'Python Device to Cloud Message over HTTPS'

encoded_body = json.dumps(body)

# Headers
Headers = {
    'Content-type' : 'application/json',
    'Authorization' : SASToken
}


http = urllib3.PoolManager(ssl_version=ssl.PROTOCOL_TLSv1_2)

httpResponse =  http.request('POST', iotHubRestURI,
                headers=Headers,
                body=encoded_body)

print ("response: " + httpResponse.read()) # Do something with the response

【问题讨论】:

  • urllib3 得到的状态码是什么?
  • 在 urllib3 中,我们得到一个空响应(空白)。早些时候我们尝试了 urllib2,但由于没有响应(空响应),我们尝试了 urrlib3。但是,urllib3 是一样的。谢谢。
  • 我的意思是httpResponse.status 代码是什么?
  • 感谢 Abdul Niyas,您的评论让我们找到了答案

标签: python azure python-2.7 rest azure-iot-hub


【解决方案1】:

使用 urllib3 Python 库:要获取状态码(整数),必须获取字段状态的值。函数 read() 不返回任何内容。

这条线有效:

print ("Response status: " + str(httpResponse.status))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多