我有一个IoT项目,即:
我采用了两种不同的方法
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)
Javascript:
var params = {
payload: JSON.stringify(body),
topic: myTopic, //"topic_both" or "topic_bulb1"
qos: 0
};
var iotPromise = iotData.publish(params).promise();
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)
JavaScript:
var params = {
payload: '{"state":{"desired":' + JSON.stringify(body) + '}}',
thingName: 'control_bulb'
};
iotData.updateThingShadow(params, function(err, data) {
}
两种方法都可以实现项目目的。但是,我的问题是:
谢谢
答案 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有效负载,并且在电池/网络高度受限的情况下,您可能希望使用自己的二进制协议来保存字节。同样,这大约是成本的两倍(尽管仍然很便宜)。最后,如果您的读数是快速变化的,仅写的遥测,不需要持久并且可以在感兴趣时订阅,则可能会跳过阴影,因为您不需要其任何功能。
所以在您的情况下,我会说您想使用阴影。