そこで、AWS IoT 経由でデバイスと通信できる iOS アプリを構築しています。デバイスとアプリの両方が、update/accepted、get/accepted、および update/delta にサブスクライブされます。どちらの側からも更新を発行でき、更新は AWS IoT Thing Shadow に反映されますが、どういうわけか、更新がデバイス間で中継されることはありませんでした。そのため、アプリで送信を押すと、更新が AWS IoT に表示されますが、トピックにサブスクライブされていると思われるデバイスはそのような更新を受信しないようで、その逆も同様です。 以下は、デバイス側のタラ スニペットです。
# For certificate based connection
myShadowClient = AWSIoTMQTTShadowClient("myDevice")
myShadowClient.configureEndpoint("xxxxxxxxx.iot.us-east-1.amazonaws.com", 8883)
myShadowClient.configureCredentials("certs/root-CA.crt", "certs/private.pem.key", "certs/certificate.pem.crt")
myShadowClient.configureConnectDisconnectTimeout(10) # 10 sec
myShadowClient.configureMQTTOperationTimeout(5) # 5 sec
# Custom MQTT message callback
def customCallback(client, userdata, message):
print("Received a new message: ")
print(message.payload)
print("from topic: ")
print(message.topic)
print("--------------\n\n")
# Custom Shadow callback
def customShadowCallback_Update(payload, responseStatus, token):
# payload is a JSON string ready to be parsed using json.loads(...)
# in both Py2.x and Py3.x
if responseStatus == "timeout":
print("Update request " + token + " time out!")
if responseStatus == "accepted":
payloadDict = json.loads(payload)
print("~~~~~~~~~~~~~~~~~~~~~~~")
print("Update request with token: " + token + " accepted!")
print("property: " + str(payloadDict["state"]["desired"]["property"]))
print("~~~~~~~~~~~~~~~~~~~~~~~\n\n")
if responseStatus == "rejected":
print("Update request " + token + " rejected!")
def customShadowCallback_Delete(payload, responseStatus, token):
if responseStatus == "timeout":
print("Delete request " + token + " time out!")
if responseStatus == "accepted":
print("~~~~~~~~~~~~~~~~~~~~~~~")
print("Delete request with token: " + token + " accepted!")
print("~~~~~~~~~~~~~~~~~~~~~~~\n\n")
if responseStatus == "rejected":
print("Delete request " + token + " rejected!")
#MQTT Operations
JSONPayload = '{"state":{"reported":{"property": "published from Device"}}}'
myShadowClient.connect()
myMQTTClient = myShadowClient.getMQTTConnection()
# AWSIoTMQTTClient connection configuration
myMQTTClient.configureAutoReconnectBackoffTime(1, 32, 20)
myMQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing
myMQTTClient.configureDrainingFrequency(2) # Draining: 2 Hz
myMQTTClient.configureConnectDisconnectTimeout(10) # 10 sec
myMQTTClient.configureMQTTOperationTimeout(5) # 5 sec
myMQTTClient.publish("$aws/things/myDevice/shadow/update", JSONPayload, 1)
myMQTTClient.publish("$aws/things/myDevice/shadow/get", "", 1)
myMQTTClient.subscribe("$aws/things/myDevice/shadow/update/accepted", 1, customCallback)
myMQTTClient.subscribe("$aws/things/myDevice/shadow/update/rejected", 1, customCallback)
myMQTTClient.subscribe("$aws/things/myDevice/shadow/get/accepted", 1, customCallback)
myMQTTClient.subscribe("$aws/things/myDevice/shadow/get/rejected", 1, customCallback)
myMQTTClient.subscribe("$aws/things/myDevice/shadow/update/delta", 1, customCallback)
# Create a device shadow instance using persistent subscription
myDeviceShadow = myShadowClient.createShadowHandlerWithName("Bot", True)
while True:
time.sleep(10)