Azure IoT Hub - код «Подписаться» не работает: «соединение было отклонено» - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь получать «уведомления» от IoT Hub, когда некоторые данные публикуются в теме MQTT devices/device_id/messages/events/.Для получения данных я использую следующую тему: devices/device_id/messages/devicebound/.Мой код подписки ниже (Python):

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

root_ca = "./certs/digicertbaltimoreroot.pem"
public_crt = './certs/rsa_cert.pem'
private_key = './certs/rsa_private.pem'

iothub_name = "myhub"
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.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_message = on_message
    client.on_disconnect = on_disconnect

    print("Connecting to Azure IoT Hub...")
    client.connect(mqtt_url, mqtt_port, keepalive=60)
    client.loop_forever()

При запуске я получаю следующий вывод:

Подключение к концентратору IoT Azure ...
Подключеносо статусом: 3
('on_disconnect', 'Произошла некоторая ошибка. 5: Соединение было отклонено.')
Соединено со статусом: 3
('on_disconnect', 'Произошла некоторая ошибка. 5: Theв соединении было отказано. ')

Кто-нибудь может подсказать, что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Как уже упоминала Рита, сообщение D2C не поддерживается для приема на стороне устройства.

Концентратор Azure IoT - это путь к облачным воротам в решении IoT, как показано ниже: enter image description here

Концентратор Azure IoT предоставляет сервис для поддерживаемого решения и устройства на основе конечных точек .В настоящее время он предоставляет устройство для облачной функции , например сообщения D2C , Свойства устройства, о которых сообщается в Twin Twin и загрузка файла .А из облака мы можем использовать облако для устройства , например, прямой метод, требуемые свойства Twin и сообщения облако на устройство .

Я пытаюсь получать "уведомления" от IoT Hub, когда некоторые данные публикуются в теме MQTT devices / device_id / messages / events /

Это зависит от того, какойсторона, которую вы хотите получить сообщение.В настоящее время существует два сценария, которые поддерживает концентратор IoT Azure.

  1. Отправка сообщения Device-to-Cloud на стороне устройства и получение сообщения в облачном серверном решении (сообщение D2C поддерживает только протокол AMQP).)

  2. Отправьте сообщение Could-to-device на облачное серверное решение и получите сообщение на стороне устройства.

    И если у вас есть идеи или отзывы о AzureIoT Hub, вы можете отправить его через Azure IoT Hub - голос пользователя .

0 голосов
/ 21 мая 2018

На основании документа "Использование протокола 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 , которые вы можетеотправьте как это для простого теста:

Из проводник устройства :

enter image description here

Отпортал Azure:

enter image description here

Upate: Получать сообщения D2C:

Как я указал в моих комментариях,Azure IoT Hub не является универсальным посредником MQTT, поэтому вы не можете напрямую подписываться на сообщения, отправленные с устройства.Чтобы обойти это, вы можете использовать совместимую с концентраторами событий конечную точку, предоставляемую концентратором IoT, например, " Считать телеметрию с вашего концентратора ".Но, к сожалению, Python не поддерживает этот способ.Вы можете использовать утилиту CLI iothub-explorer или создать Node.js или .NET или Java консольное приложение на основе концентратора событий для чтения устройства.сообщения в облако от IoT Hub.

...