AWSIoT:AWSIoTShadowClient与AWSIoTMQTTClient

时间:2018-09-26 13:00:54

标签: javascript python amazon-web-services iot aws-iot

我有一个IoT项目,即:

  • 2个灯泡,连接到2个Raspberry Pi(python)
  • 具有3个按钮的网络应用(Javascript):一个用于打开/关闭灯泡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 :(得分:1)

两个不同的客户端代表了AWS IoT的两个不同(尽管表面上相似)功能:

  • AWSIoTMQTTClient为AWS IoT的MQTT代理提供了通用界面。它所做的只是允许您跨主题发送和接收消息。实际上,如果您确实愿意,可以使用任何MQTT客户端(例如Paho MQTT),但是我会坚持使用AWS',因为已经为他们的经纪人配置了它。
  • AWSIoTShadowClient是专门用于AWS IoT设备影子的界面。设备影子是AWS管理的,按分度,双向同步的“状态”。碰巧的是,与阴影交互的一种方法是MQTT。但是,其目的不只是发送/接收消息,还在于为设备提供持久性机制并从云中获取其状态。 (more specifics here)

所以要解决您的问题:

  • 性能:两者都使用相同的基础协议,因此具有相似的性能。如果您将AWSIoTMQTTClient专门用于自己的用途,而不是遵循“设备阴影”模式,则可能会表现更好。但我希望任何收益都是微不足道的。

  • 安全性:再次使用AWS IoT的客户端/证书安全性模型以完全相同的方式保护两者。默认情况下,AWSIoTShadowClient可能更安全,因为它已经配置为确保只有设备才能设置其报告状态。

  • 维护:这有点不同。如果您的用例(接下来讨论)是让设备报告其状态,并且可以从云中检查和更新该状态,那么AWSIoTShadowClient更具可维护性。仅仅是因为这就是它的设计和测试目的,所以您只需编写和维护更少的自己的代码!

选择一种方法

  • 设备阴影:如果没有理由,请使用阴影。这是一种托管且经过良好测试的模式(包括一些极端情况,例如当您请求更改时,blub处于脱机状态),以使设备从云发送发送/接收/同步状态。它内置于AWS中,因此您可以在控制台中轻松查看/更改此状态。它还具有内置的持久性,因此即使您不经常侦听代理程序的更改,您也可以始终检查最新状态。

  • 您自己的MQTT主题:有一些不使用阴影的原因。影子要求您发送JSON有效负载,并且在电池/网络高度受限的情况下,您可能希望使用自己的二进制协议来保存字节。同样,这大约是成本的两倍(尽管仍然很便宜)。最后,如果您的读数是快速变化的,仅写的遥测,不需要持久并且可以在感兴趣时订阅,则可能会跳过阴影,因为您不需要其任何功能。

所以在您的情况下,我会说您想使用阴影。