AWS IoT - операции подключения и публикации с использованием paho-mqtt не работают

Пытаясь работать с AWS IoT, у меня есть следующий код, который работал вчера:

import paho.mqtt.client as mqtt
import ssl, random
from time import sleep

mqtt_url = "XXXXXXXX.iot.us-east-2.amazonaws.com"
root_ca = './certs/iotRootCA.pem'
public_crt = './certs/deviceCert.crt'
private_key = './certs/deviceCert.key'

connflag = False

def on_connect(client, userdata, flags, response_code):
    global connflag
    connflag = True
    print("Connected with status: {0}".format(response_code))

def on_publish(client, userdata, mid):
    print userdata + " -- " + mid
    #client.disconnect()

if __name__ == "__main__":
    print "Loaded MQTT configuration information."
    print "Endpoint URL: " + mqtt_url
    print "Root Cert: " + root_ca
    print "Device Cert: " + public_crt
    print "Private Key: " + private_key

    client = mqtt.Client()
    client.tls_set(root_ca,
                   certfile = public_crt,
                   keyfile = private_key,
                   cert_reqs = ssl.CERT_REQUIRED,
                   tls_version = ssl.PROTOCOL_TLSv1_2,
                   ciphers = None)

    client.on_connect = on_connect
#    client.on_publish = on_publish

    print "Connecting to AWS IoT Broker..."
    client.connect(mqtt_url, port = 8883, keepalive=60)
    client.loop_start()
#    client.loop_forever()

    while 1==1:
        sleep(0.5)
        print connflag
        if connflag == True:
            print "Publishing..."
            ap_measurement = random.uniform(25.0, 150.0)
            client.publish("ActivePower", ap_measurement, qos=1)
            print("ActivePower published: " + "%.2f" % ap_measurement )
        else:
            print "waiting for connection..."

Как я уже говорил, вчера этот код работал. Сегодня я получаю следующее (нет связи):

python awsiot-publish.py
Загружена информация о конфигурации MQTT.
URL конечной точки: XXXXXXX.iot.us-east-2.amazonaws.com
Root Cert:./certs/iotRootCA.pem
Сертификат устройства: ./certs/deviceCert.crt
Закрытый ключ: ./certs/deviceCert.key
Подключение к AWS IoT Broker... Неверно
жду соединения...
Ложь
жду соединения...
Ложь
жду соединения... Ложь

Я не знаю, есть ли проблема с AWS IoT... Я просто думаю, что документация недостаточна: не ясно, как мы можем использовать наш код...

1 ответ

Решение

Я считаю, что ваша проблема в том, что политика вашего сертификата не имеет надлежащих разрешений для подключения. Если не указано, paho генерирует случайный client_id. Вы должны установить client_id. Вам также нужна политика, которая позволяет вашему сертификату подключаться с использованием этого идентификатора клиента.

{
  "Effect": "Allow",
  "Action": "iot:Connect",
  "Resource":"arn:aws:iot:us-east1:123456789012:client/yourClientIdGoesHere"
}

Может быть полезно установить значение client_id, совпадающее с именем вещи. (Это не обязательно, хотя.) Вы также можете установить ресурс в вашей политике на * и затем соединитесь с любым client_id:

{
  "Effect": "Allow",
  "Action": "iot:Connect",
  "Resource":"*"
}
Другие вопросы по тегам