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:
import paho.mqtt.client as mqtt import ssl, random, jwt_maker from time import sleep root_ca = './../roots.pem' public_crt = './../my_cert.pem' private_key = './../my_pr.pem' mqtt_url = "mqtt.googleapis.com" mqtt_port = 8883 mqtt_topic = "/projects/my_project/topics/sm1" project_id = "my_project" cloud_region = "us-central1" registry_id = "sm1" device_id = "sm1" connflag = False def error_str(rc): """Convert a Paho error to a human readable string.""" return "Some error occurred. {}: {}".format(rc, mqtt.error_string(rc)) def on_disconnect(unused_client, unused_userdata, rc): """Paho callback for when a device disconnects.""" print("on_disconnect", error_str(rc)) def on_connect(client, userdata, flags, response_code): global connflag connflag = True print("Connected with status: {0}".format(response_code)) def on_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_disconnect print("Connecting to Google IoT Broker...") client.connect(mqtt_url, mqtt_port, keepalive=60) client.loop_start() while True: sleep(0.5) print connflag if connflag == 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) if not res.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