python - TypeError:Unicode 对象必须在 python 散列之前进行编码以用于 azure iot hub
问题描述
我正在尝试将一些数据从 rasberry pi 上传到 azure iot hub,我遇到了这个问题,我需要在哪里设置编码/字符集?
我试过 data.encode('utf-8') 类似的东西,但没有用。可能有人问,请帮我解决这个特定的代码。我正在关注这个链接。
def generate_sas_token():
expiry=3600
ttl = time.time() + expiry
sign_key = "%s\n%d" % ((quote_plus(URI)), int(ttl))
signature = b64encode(HMAC(b64decode(KEY), sign_key, sha256).digest())
rawtoken = {
'sr' : URI,
'sig': signature,
'se' : str(int(ttl))
}
rawtoken['skn'] = POLICY
return 'SharedAccessSignature ' + urlencode(rawtoken)
def send_message(token, message):
url = 'https://{0}/devices/{1}/messages/events?api-version=2016-11-14'.format(URI, IOT_DEVICE_ID)
headers = {
"Content-Type": "application/json",
"Authorization": token
}
data = json.dumps(message)
print(data)
#data.encode('utf-8')
response = requests.post(url, data=data, headers=headers)
if __name__ == '__main__':
# 2. Generate SAS Token
token = generate_sas_token()
# 3. Send Temperature to IoT Hub
while True:
#temp = read_temp()
message = { "temp": str("12") }
send_message(token, message)
time.sleep(1)
错误是
Traceback (most recent call last):
File "/home/pi/python/test.py", line 45, in <module>
token = generate_sas_token()
File "/home/pi/python/test.py", line 20, in generate_sas_token
signature = b64encode(HMAC(b64decode(KEY), sign_key, sha256).digest())
File "/usr/lib/python3.5/hmac.py", line 84, in __init__
self.update(msg)
File "/usr/lib/python3.5/hmac.py", line 93, in update
self.inner.update(msg)
TypeError: Unicode-objects must be encoded before hashing
解决方案
该错误告诉您必须在创建 HMAC 对象之前进行编码。看来你是先解码它:
HMAC(b64decode(KEY), sign_key, sha256)
推荐阅读
- ruby-on-rails - 使用耐嚼的弹性搜索更新索引后的回调
- c++ - 未找到 CMsg 标识符
- python - 如何在 Python 中限制列表的大小,同时仍使其更改
- flutter - StreamBuilder 快照上的“无效参数”错误 - Flutter
- javascript - 在赛普拉斯测试中创建一个变量来存储页面上的文本,以便将其与不同页面上的文本进行比较
- python - 如何通过硒递归解析嵌套评论树?
- c# - 如何解决 GridViewItem c# (UWP) 的 SelectedIndex 中的延迟
- excel - 列出所有可能的真值组合 VBA
- ruby-on-rails - 如何在 will_paginate Rails 中将数字变为点
- android - 焦点在 EditText 上时 ViewPager2 片段内容消失