I've been attempting a simple example for reading payload from AWS and publishing payload back to AWS. I'm, somewhat new to both AWS IoT and MQTT. Now, I'm able to read payload on my device but can't get it to publish. And, upon updating shadow state from AWS console, my raspberry pi receives the message but again nothing happens when I try publishing, like even the state on AWS console doesn't seem to change.
What could be happening or going wrong? Please advice. Following is my code:
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()