TypeError: Unicode-objects must be encoded before hashing in python for azure iot hub

TypeError: Unicode-objects must be encoded before hashing in python for azure iot hub

我正在尝试将一些数据从 rasberry pi 上传到 azure iot hub,我遇到了这个问题,我需要在哪里设置 encoding/charsets?

我试过 data.encode('utf-8') 类似的东西但没有用。 可能有人问,请帮我解决这个特定的代码。 我正在关注 this link.

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)

可能的解决方案是:

HMAC(b64decode(KEY), sign_key.encode('utf-8'), sha256)