Google Cloud IoT - 无效的 MQTT 发布主题
Google Cloud IoT - Invalid MQTT publish topic
我正在使用带有 paho-mqtt 的 Python 客户端在 Google 云物联网的这个特定主题中发布:projects/my_project/topics/sm1
。我的代码如下,基于 Google IoT 文档的示例:
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...")
当我运行时,客户端连接但不发布。在 Google IoT 控制台,我可以看到以下错误消息:
Invalid MQTT publish topic: projects/my_project/topics/sm1
这是输出:
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.')
真的很奇怪,因为主题在那里,创建了,并且有关联的订阅!
如有任何帮助,我们将不胜感激。我已经阅读了以下文档和代码:
您的主题名称不正确。
迷糊了(我也是刚打的)
客户端 ID(如您所用)必须是:
"projects/{}/locations/{}/registries/{}/devices/{}".format(
project_id,
cloud_region,
registry_id,
device_id
)
主题必须采用以下形式:
/devices/{}/config
/devices/{}/state
/devices/{}/events
/devices/{}/events/some/other/topic
如@ptone 的评论所述:
In cloud iot core, MQTT topics are many-to-one with Cloud PubSub topics. For security - devices may only publish to MQTT topics prefixed with their device namespace. You can then match sub-topics to other Cloud PubSub topics as noted here, but only up to 10. This is not designed to allow a 1:1 mapping device to PubSub Topic.
当我将 mqtt_topic
从 events
更改为 state
时,我的 python 代码可以正常工作。在此示例中,我尝试将当前温度和湿度从我的设备上传到 Google IoT Core。
...
data = {'temp': temperature, 'humid': humidity}
device_id = 'freedgePrototype'
topic = 'state'
mqtt_topic = '/devices/{}/{}'.format(device_id, topic)
payload = json.dumps(data)
print('Publishing message {}'.format(payload))
client.publish(mqtt_topic, payload, qos=1)
结果应该是这样的。
我正在使用带有 paho-mqtt 的 Python 客户端在 Google 云物联网的这个特定主题中发布:projects/my_project/topics/sm1
。我的代码如下,基于 Google IoT 文档的示例:
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...")
当我运行时,客户端连接但不发布。在 Google IoT 控制台,我可以看到以下错误消息:
Invalid MQTT publish topic: projects/my_project/topics/sm1
这是输出:
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.')
真的很奇怪,因为主题在那里,创建了,并且有关联的订阅!
如有任何帮助,我们将不胜感激。我已经阅读了以下文档和代码:
您的主题名称不正确。
迷糊了(我也是刚打的)
客户端 ID(如您所用)必须是:
"projects/{}/locations/{}/registries/{}/devices/{}".format(
project_id,
cloud_region,
registry_id,
device_id
)
主题必须采用以下形式:
/devices/{}/config
/devices/{}/state
/devices/{}/events
/devices/{}/events/some/other/topic
如@ptone 的评论所述:
In cloud iot core, MQTT topics are many-to-one with Cloud PubSub topics. For security - devices may only publish to MQTT topics prefixed with their device namespace. You can then match sub-topics to other Cloud PubSub topics as noted here, but only up to 10. This is not designed to allow a 1:1 mapping device to PubSub Topic.
当我将 mqtt_topic
从 events
更改为 state
时,我的 python 代码可以正常工作。在此示例中,我尝试将当前温度和湿度从我的设备上传到 Google IoT Core。
...
data = {'temp': temperature, 'humid': humidity}
device_id = 'freedgePrototype'
topic = 'state'
mqtt_topic = '/devices/{}/{}'.format(device_id, topic)
payload = json.dumps(data)
print('Publishing message {}'.format(payload))
client.publish(mqtt_topic, payload, qos=1)
结果应该是这样的。