AWSIoT: AWSIoTShadowClient против AWSIoTMQTTClient - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть проект IoT, который:

  • 2 лампы, подключите к 2 Raspberry Pi (python)
  • веб-приложение (Javascript) с 3 кнопками: одна для включения/ выключить лампочку 1, одну для включения / выключения лампочки 2, одну для включения / выключения обеих лампочек.

Я подошел к двум разным путям

с использованием AWSIoTMQTTClient:

  1. Pi:

     class CallbackContainer(object):
    
        def __init__(self, client):
            self._client = client
    
        def messagePrint(self, client, userdata, message):
            print("Received a new message: ")
            print(message.payload)
            print("from topic: ")
            print(message.topic)
            print("--------------\n\n")
    
    
    myAWSIoTMQTTClient = AWSIoTMQTTClient("myClientID")
    myAWSIoTMQTTClient.configureEndpoint("xxxxx.iot.eu-west-1.amazonaws.com", 8883)
    myAWSIoTMQTTClient.configureCredentials("./certs/rootCA.pem", "./certs/xxxxxxx-private.pem.key", "./certs/xxxxxxx-certificate.pem.crt")
    myAWSIoTMQTTClient.configureConnectDisconnectTimeout(10)  # 10 sec
    myAWSIoTMQTTClient.configureMQTTOperationTimeout(5)  # 5 sec
    myCallbackContainer = CallbackContainer(myAWSIoTMQTTClient)
    
    myAWSIoTMQTTClient.connect()
    
    myAWSIoTMQTTClient.subscribe("topic_both", 0, myCallbackContainer.messagePrint)
    myAWSIoTMQTTClient.subscribe("topic_bulb1", 0, myCallbackContainer.messagePrint)
    
    while True:
       time.sleep(1)
    
  2. Javascript:

    var params = {
        payload: JSON.stringify(body),
        topic: myTopic, //"topic_both" or "topic_bulb1"
        qos: 0 
    };
    
    
    var iotPromise = iotData.publish(params).promise();
    

с использованием AWSIoTShadowClient:

  1. Pi:

    def customShadowCallback_Delta(payload, responseStatus, token):
    
       print(responseStatus)
       payloadDict = json.loads(payload)
       print("++++++++DELTA++++++++++")
       print("property: " + str(payloadDict["state"]))
       print("+++++++++++++++++++++++\n\n")
       #Need to handle JSON to control bulbs
    
    thingName = "control_bulb"
    
    myAWSIoTMQTTShadowClient = AWSIoTMQTTShadowClient("myClientID")
    myAWSIoTMQTTShadowClient.configureEndpoint("xxxxxx.iot.eu-west-1.amazonaws.com", 8883)
    myAWSIoTMQTTShadowClient.configureCredentials("/certs/rootCA.pem", "/certs/xxxxx-private.pem.key", "/certs/xxxxx-certificate.pem.crt")
    myAWSIoTMQTTShadowClient.configureConnectDisconnectTimeout(10)  # 10 sec
    myAWSIoTMQTTShadowClient.configureMQTTOperationTimeout(5)  # 5 sec
    
    myAWSIoTMQTTShadowClient.connect()
    
    
    deviceShadowHandler = myAWSIoTMQTTShadowClient.createShadowHandlerWithName(thingName, True)
    deviceShadowHandler.shadowRegisterDeltaCallback(customShadowCallback_Delta)
    
    
    while True:
       time.sleep(1)
    
  2. JavaScript:

    var params = {
       payload: '{"state":{"desired":' + JSON.stringify(body) + '}}',
       thingName: 'control_bulb'
    };
    
    
    iotData.updateThingShadow(params, function(err, data) {
    }
    

Оба подхода позволяют достичь целипроект.Тем не менее, мои вопросы:

  • Чем отличается AWSIoTMQTTClient от AWSIoTShadowClient с точки зрения производительности, безопасности, обслуживания?
  • В каком случае используется AWSIoTShadowClient или AWSIoTMQTTClient?

Спасибо

1 Ответ

0 голосов
/ 21 октября 2018

Два разных клиента представляют две разные (хотя и внешне похожие) функции AWS IoT:

  • AWSIoTMQTTClient предоставляет общий интерфейс для брокера MQTT AWS IoT.Все, что он делает, это позволяет отправлять и получать сообщения по темам.На самом деле, если вы действительно хотите, вы можете использовать любой MQTT-клиент для этого (например, Paho MQTT), но я бы остановился на AWS, так как он настроен для их брокера.
  • AWSIoTShadowClient - этоинтерфейс специально для AWS IoT Device Shadow.Тень устройства - это управляемое AWS, для каждого устройства, двустороннее синхронизированное «состояние».Просто так получается, что один способ взаимодействия с тенью - это MQTT.Но цель состоит не только в отправке / получении сообщений, но и в том, чтобы предоставить механизмам для сохранения устройств и получения их состояния из облака. (подробнее здесь)

Итак, чтобы ответить на ваш вопрос:

  • Производительность : оба используют одно и то жебазовый протокол и так имеют аналогичную производительность.При нажатии AWSIoTMQTTClient может работать лучше, если вы специализируете его для собственного использования, а не по шаблону Device Shadow;но я ожидаю, что любой выигрыш будет незначительным.

  • Безопасность : еще раз оба защищены точно так же, используя модель безопасности клиента / сертификата AWS IoT.AWSIoTShadowClient, по-видимому, более безопасен по умолчанию, поскольку он уже настроен для обеспечения того, что только устройство может устанавливать свое сообщаемое состояние.

  • Техническое обслуживание : это немного зависит,Если ваш вариант использования (обсуждаемый далее) заключается в том, чтобы устройство сообщало о своем состоянии, и чтобы это состояние можно было проверять и обновлять из облака, то AWSIoTShadowClient гораздо более удобен в обслуживании;просто потому, что это то, для чего он разработан и протестирован - вам придется писать и поддерживать меньше своего собственного кода!

Выбор подхода:

  • Тень устройства : Если у вас нет причин нет, используйте тень.Это управляемый и хорошо протестированный шаблон (который включает в себя крайние случаи, например, когда blub находится в автономном режиме, когда вы запрашиваете его изменение), чтобы ваши устройства отправляли состояние отправки / получения / синхронизации из облака.Он встроен в AWS, поэтому вы можете легко просматривать / изменять это состояние в консоли.Он также имеет встроенную постоянство, поэтому вы всегда можете проверить это последнее состояние, даже если вы не постоянно слушаете изменения в брокере.

  • Ваши собственные темы MQTT : есть несколько причин не использовать тень.Тень требует, чтобы вы отправляли полезные данные JSON, а в ситуациях с высокой нагрузкой на батарею / сеть вы можете использовать свой собственный двоичный протокол для сохранения байтов.Точно так же это о двойной стоимости (хотя все еще действительно дешево).Наконец, если ваши показания быстро движутся, только для записи, телеметрии, которые вам не нужно сохранять и на которые можно подписаться, когда вы заинтересованы, вы можете пропустить тень, потому что вам не нужны какие-либо ее функции.

Так что в вашем случае я бы сказал, что вы хотите использовать тень.

...