TypeError: Unicode-объекты должны быть закодированы перед хэшированием в python для Azure Iot Hub - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь загрузить некоторые данные из 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

1 Ответ

1 голос
/ 04 апреля 2019

Ошибка говорит о том, что вы должны кодировать перед созданием объекта HMAC. Кажется, вы сначала расшифровываете:

HMAC(b64decode(KEY), sign_key, sha256)
...