На основании документа "Использование протокола MQTT напрямую" вам необходимо
, чтобы загрузить и сослаться на корневой сертификат DigiCert Baltimore.Этот сертификат является тем, который Azure использует для защиты соединения.
Как вы делали в процессе публикации, как этот:
client.tls_set(ca_certs=path_to_root_cert,
certfile=None, keyfile=None,
cert_reqs=ssl.CERT_REQUIRED,
tls_version=ssl.PROTOCOL_TLSv1,
ciphers=None)
Также вам необходимо установить имя пользователяи пароль :
client.username_pw_set(username=iot_hub_name+".azure-devices.net/" + device_id, password=sas_token)
Наконец, вы можете подписаться следующим образом:
client.subscribe(topic=topic, qos=0)
Пример кода для Ключи безопасности аутентифицированного устройства :
import paho.mqtt.client as mqtt
import ssl, random
from time import sleep
path_to_root_cert = "./certs/digicertbaltimoreroot.cer"
iothub_name = "your hub name"
device_id = "device1"
sas_token = "SharedAccessSignature sr=[your hub name].azure-devices.net%2Fdevices%2Fdevice1&sig=[sig]&se=1526955728"
mqtt_url = "{}.azure-devices.net".format(iothub_name)
mqtt_port = 8883
topic = "devices/{}/messages/devicebound/#".format(device_id)
def error_str(rc):
return "Some error occurred. {}: {}".format(rc, mqtt.error_string(rc))
def on_disconnect(unused_client, unused_userdata, rc):
print("on_disconnect", error_str(rc))
def on_connect(client, userdata, flags, response_code):
print("Connected with status: {0}".format(response_code))
client.subscribe(topic, 1)
def on_subscribe(client, userdata, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos))
def on_message(client, userdata, msg):
print("Topic: {0} -- Payload: {1}".format(msg.topic, str(msg.payload)))
if __name__ == "__main__":
client = mqtt.Client(device_id, protocol=mqtt.MQTTv311)
client.username_pw_set(username=iothub_name+".azure-devices.net/" + device_id, password=sas_token)
client.tls_set(ca_certs=path_to_root_cert, certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1, ciphers=None)
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
print("Connecting to Azure IoT Hub...")
client.connect(mqtt_url, mqtt_port, keepalive=60)
client.subscribe(topic=topic, qos=0)
client.loop_forever()
Пример кода для x509 устройства с проверкой подлинности : (Нужно предоставить сертификат устройства и файлы закрытого ключа. Не нужен токен SAS в качестве пароля; просто оставьте его пустым. Но все же нужноукажите имя пользователя.)
import paho.mqtt.client as mqtt
import ssl, random
from time import sleep
root_ca = "./certs/digicertbaltimoreroot.cer"
public_crt = './certs/mydevice-public.pem'
private_key = './certs/mydevice-private.pem'
iothub_name = "your hub name"
device_id = "mydevice"
mqtt_url = "{}.azure-devices.net".format(iothub_name)
mqtt_port = 8883
topic = "devices/{}/messages/devicebound/#".format(device_id)
def error_str(rc):
return "Some error occurred. {}: {}".format(rc, mqtt.error_string(rc))
def on_disconnect(unused_client, unused_userdata, rc):
print("on_disconnect", error_str(rc))
def on_connect(client, userdata, flags, response_code):
print("Connected with status: {0}".format(response_code))
client.subscribe(topic, 1)
def on_subscribe(client, userdata, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos))
def on_message(client, userdata, msg):
print("Topic: {0} -- Payload: {1}".format(msg.topic, str(msg.payload)))
if __name__ == "__main__":
client = mqtt.Client(device_id, protocol=mqtt.MQTTv311)
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
client.username_pw_set(username=iothub_name+".azure-devices.net/" + device_id, password="")
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.tls_insecure_set(False)
print("Connecting to Azure IoT Hub...")
client.connect(mqtt_url, mqtt_port, keepalive=60)
client.subscribe(topic=topic, qos=0)
client.loop_forever()
Примечание : Тема: "devices / {device-id} / messages / devicebound / # ".
Как создавать файлы сертификатов устройств, вы можете сослаться на здесь .
Обновление: Эти примеры кода используются для получения сообщений D2C , которые вы можетеотправьте как это для простого теста:
Из проводник устройства :
Отпортал Azure:
Upate: Получать сообщения D2C:
Как я указал в моих комментариях,Azure IoT Hub не является универсальным посредником MQTT, поэтому вы не можете напрямую подписываться на сообщения, отправленные с устройства.Чтобы обойти это, вы можете использовать совместимую с концентраторами событий конечную точку, предоставляемую концентратором IoT, например, " Считать телеметрию с вашего концентратора ".Но, к сожалению, Python не поддерживает этот способ.Вы можете использовать утилиту CLI iothub-explorer или создать Node.js или .NET или Java консольное приложение на основе концентратора событий для чтения устройства.сообщения в облако от IoT Hub.