AWS IoT设备未收到iOS应用

时间:2016-08-17 19:35:33

标签: python ios swift amazon-web-services aws-iot

所以我正在构建一个可以通过AWS IoT与设备通信的iOS应用程序。设备和应用程序都订阅了更新/接受,获取/接受和更新/增量。我可以从任何一方发布更新,更新反映在AWS IoT事物影子上,但不知何故,更新从未从一个设备转发到另一个设备。因此,如果我按下应用程序上的send,则更新将显示在AWS IoT上,但据称订阅主题的设备似乎永远不会收到此类更新,反之亦然。 以下是设备端的cod代码段。

# 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)

1 个答案:

答案 0 :(得分:1)

这是预期的行为。可以找到here

的解释
  

Delta状态是一种虚拟类型的状态,包含所需状态和报告状态之间的差异。所需部分中不在报告部分中的字段包含在增量中。报告部分中但不在所需部分中的字段包含在增量中