So, I am trying to publish in this specific topic of Google Cloud IoT: projects/my_project/topics/sm1. I'm using paho-mqtt with a Python client.
Code:
importpaho.mqtt.clientasmqttimportssl,random,jwt_makerfromtimeimportsleep root_ca='./../roots.pem'public_crt='./../my_cert.pem'private_key='./../my_pr.pem'mqtt_url="mqtt.googleapis.com"mqtt_port=8883mqtt_topic="/projects/my_project/topics/sm1"project_id="my_project"cloud_region="us-central1"registry_id="sm1"device_id="sm1"connflag=Falsedeferror_str(rc):"""Convert a Paho error to a human readable string."""return"Some error occurred. {}: {}".format(rc,mqtt.error_string(rc))defon_disconnect(unused_client,unused_userdata,rc):"""Paho callback for when a device disconnects."""print("on_disconnect",error_str(rc))defon_connect(client,userdata,flags,response_code):globalconnflag connflag=Trueprint("Connected with status: {0}".format(response_code))defon_publish(client,userdata,mid):print("User data: {0} -- mid: {1}".format(userdata,mid))#client.disconnect()if__name__=="__main__":client=mqtt.Client("projects/{}/locations/{}/registries/{}/devices/{}".format(project_id,cloud_region,registry_id,device_id))client.username_pw_set(username='unused',password=jwt_maker.create_jwt(project_id,private_key,algorithm="RS256"))client.tls_set(root_ca,certfile=public_crt,keyfile=private_key,cert_reqs=ssl.CERT_REQUIRED,tls_version=ssl.PROTOCOL_TLSv1_2,ciphers=None)client.on_connect=on_connect client.on_publish=on_publish client.on_disconnect=on_disconnectprint("Connecting to Google IoT Broker...")client.connect(mqtt_url,mqtt_port,keepalive=60)client.loop_start()whileTrue:sleep(0.5)printconnflagifconnflag==True:print("Publishing...")ap_measurement=random.uniform(25.0,150.0)#payload = "sm1/sm1-payload-{}".format(ap_measurement)res=client.publish(mqtt_topic,ap_measurement,qos=1)ifnotres.is_published():print("Data not published!!")else:print("ActivePower published: %.2f"%ap_measurement)else:print("Waiting for connection...")
Error Message:
Invalid MQTT publish topic: projects/my_project/topics/sm1
Output:
Connecting to Google IoT Broker...
Connected with status: 0 -- msg: Connection Accepted.
True
Publishing...
Data not published!!
('on_disconnect', 'Some error occurred. 1: Out of memory.')
Any help is welcome and would be appreciated.
It's pretty simple. You have the incorrect topic name.
Your client ID must be:
"projects/{}/locations/{}/registries/{}/devices/{}".format( project_id, cloud_region, registry_id, device_id )
And your topics must then be:
/devices/{}/config /devices/{}/state /devices/{}/events /devices/{}/events/some/other/topic