首页 > 解决方案 > 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

标签: pythonazureraspberry-pi3azure-iot-hub

解决方案


该错误告诉您必须在创建 HMAC 对象之前进行编码。看来你是先解码它:

HMAC(b64decode(KEY), sign_key, sha256)

推荐阅读