0

そこで、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)
4

1 に答える 1

1

これは意図された動作です。説明はここで見つけることができます

デルタ状態は、目的の状態と報告された状態の違いを含む仮想的な状態です。報告されたセクションにない目的のセクションのフィールドは、デルタに含まれます。報告されたセクションにあり、目的のセクションにないフィールドはデルタに含まれません。

于 2016-08-22T17:08:16.767 に答える