如何对 mqtt 和 AWS 物联网进行故障排除
How to troubleshoot mqtt and AWS iot
我也是 AWS IoT 和 MQTT 的新手。我正在尝试用简单的示例从 AWS 读取有效负载并将有效负载发布到 AWS。我能够读取设备上的有效负载但无法发布。当我从 AWS 控制台更新影子状态时,我的 raspberry pi 能够收到消息,但是当我发布时什么也没发生。甚至 AWS 控制台上的状态都没有改变。
附上代码。请提出建议。
def on_connect(mqttc, obj, flags, rc):
if rc==0:
print ("Subscriber Connection status code: "+str(rc)+" | Connection status: successful")
elif rc==1:
print ("Subscriber Connection status code: "+str(rc)+" | Connection status: Connection refused")
def on_subscribe(mqttc, obj, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos)+"data"+str(obj))
first_message()
def on_message(mqttc, obj, msg):
print("Received message from topic: "+msg.topic+" | QoS: "+str(msg.qos)+" | Data Received: "+str(msg.payload))
def on_publish(client, userdata, mid):
print("Message is published")
def first_message():
data = {} data['r'] = 2 data['g'] = 255 data['b'] = 95 data2 = {} data2['color'] = data data3 = {} data3['reported'] = data2 data4 = {}
data4['state'] = data3 json_data = json.dumps(data4) print(str(json_data))
(rc, mid) = mqttc.publish("$aws/things/thirdthing/shadow/update/", str(json_data), 1)
mqttc = mqtt.Client(client_id="thirdthing1")
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_message = on_message
mqttc.on_publish = on_publish
mqttc.tls_set("/home/pi/deviceSDK/root-CA.crt",
certfile="/home/pi/deviceSDK/7391d7d21d-certificate.pem.crt",
keyfile="/home/pi/deviceSDK/7391d7d21d-private.pem.key",
tls_version=ssl.PROTOCOL_TLSv1_2,
ciphers=None)
mqttc.connect("AYYCW0HM971XS.iot.us-west-2.amazonaws.com", port=8883) #AWS IoT service hostname and portno
mqttc.subscribe("$aws/things/thirdthing/shadow/update/#", qos=1) #The names of these topics start with $aws/things/thingName/shadow."
mqttc.loop_forever()
好的,我自己解决了这个问题。
以上代码中的错误是 json 我发送的数据形式化。如果我用给定的代码替换 first_message() 函数,那么这个例子就可以完美运行。
def first_message():
payload = json.dumps({
"state":{
"reported":{
"this_thing_is_alive":True,
"color":{
"r":255,
"g":1,
"b":255
}
}
}
})
mqttc.publish("$aws/things/thirdthing/shadow/update", payload)
我也是 AWS IoT 和 MQTT 的新手。我正在尝试用简单的示例从 AWS 读取有效负载并将有效负载发布到 AWS。我能够读取设备上的有效负载但无法发布。当我从 AWS 控制台更新影子状态时,我的 raspberry pi 能够收到消息,但是当我发布时什么也没发生。甚至 AWS 控制台上的状态都没有改变。
附上代码。请提出建议。
def on_connect(mqttc, obj, flags, rc):
if rc==0:
print ("Subscriber Connection status code: "+str(rc)+" | Connection status: successful")
elif rc==1:
print ("Subscriber Connection status code: "+str(rc)+" | Connection status: Connection refused")
def on_subscribe(mqttc, obj, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos)+"data"+str(obj))
first_message()
def on_message(mqttc, obj, msg):
print("Received message from topic: "+msg.topic+" | QoS: "+str(msg.qos)+" | Data Received: "+str(msg.payload))
def on_publish(client, userdata, mid):
print("Message is published")
def first_message():
data = {} data['r'] = 2 data['g'] = 255 data['b'] = 95 data2 = {} data2['color'] = data data3 = {} data3['reported'] = data2 data4 = {}
data4['state'] = data3 json_data = json.dumps(data4) print(str(json_data))
(rc, mid) = mqttc.publish("$aws/things/thirdthing/shadow/update/", str(json_data), 1)
mqttc = mqtt.Client(client_id="thirdthing1")
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_message = on_message
mqttc.on_publish = on_publish
mqttc.tls_set("/home/pi/deviceSDK/root-CA.crt",
certfile="/home/pi/deviceSDK/7391d7d21d-certificate.pem.crt",
keyfile="/home/pi/deviceSDK/7391d7d21d-private.pem.key",
tls_version=ssl.PROTOCOL_TLSv1_2,
ciphers=None)
mqttc.connect("AYYCW0HM971XS.iot.us-west-2.amazonaws.com", port=8883) #AWS IoT service hostname and portno
mqttc.subscribe("$aws/things/thirdthing/shadow/update/#", qos=1) #The names of these topics start with $aws/things/thingName/shadow."
mqttc.loop_forever()
好的,我自己解决了这个问题。
以上代码中的错误是 json 我发送的数据形式化。如果我用给定的代码替换 first_message() 函数,那么这个例子就可以完美运行。
def first_message():
payload = json.dumps({
"state":{
"reported":{
"this_thing_is_alive":True,
"color":{
"r":255,
"g":1,
"b":255
}
}
}
})
mqttc.publish("$aws/things/thirdthing/shadow/update", payload)