当前位置: 首页 > 知识库问答 >
问题:

Google Cloud IoT-无效的MQTT发布主题

翟奕
2023-03-14

我使用带有paho-mqtt的Python客户机发布Google Cloud IoT的特定主题: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控制台,我可以看到以下错误信息:

无效的MQTT发布主题:projects/my_project/topics/sm1

下面是输出:

连接到Google IoT Broker...
连接状态:0--msg:接受连接。
为真
发布...
数据未发布!!
('on_disconnect','some error arcest.1:内存不足。')

这真的很奇怪,因为主题就在那里,创建了,并且有一个与之相关的订阅!

任何帮助都将不胜感激。我已经阅读了以下文档和代码:

    null

共有1个答案

戚祺
2023-03-14

您的主题名称不正确。

这很令人困惑(我刚刚也击中了这个)。

客户端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

在云iot核心中,MQTT主题与云PubSub主题是多对一的。对于安全性-设备只能发布到MQTT主题,主题前缀是它们的设备名称空间。然后,您可以将子主题匹配到其他Cloud PubSub主题,如这里所述,但最多只能匹配10个。这不是为了允许1:1映射设备到PubSub主题而设计的。

 类似资料:
  • 更新时间:2019-10-31 10:56:59 节点简介 MQTT发布节点用于将设备的消息进行下发,自定义消息包,获取设备的信息,设备的动态 使用场景 使用MQTT发布节点,可以自定义提醒内容,下发设备的状态数据,下发设备信息,方便用户获取设备的信息,通常用于获取设备信息。 配置项 心跳配置 CONNECT指令中需包含Keep Alive(保活时间)。 保活心跳时间取值范围为30至1200秒。如

  • 我希望有一个简单的命令,就像我在bash中使用的一样,在AWS Lambda函数中发布一些内容到MQTT上的主题。按照:mosquitto_pub-h my.server.com-t“light/set”-m“on” 背景:我想和Alexa一起打开和关闭一盏灯。Alexa可以启动一个Lambda函数,在这个Lambda函数中,我想启动一个MQTT发布,因为lamp可以侦听MQTT主题并对那里的消息

  • 有人知道我在哪里可以得到一些示例MQTT客户端Go(golang)代码,它在无限循环中发布和订阅? null 下面是我正在使用的代码: 我翻阅了GoDocs寻找一些关于如何保持连接畅通的提示,但似乎没有什么相关的。我当然可以在subscribe上执行无限循环,但这似乎效率低下。

  • 问题内容: 蚂蚁建造中的问题 蚂蚁源和目标1.6到jdk 1.6的可变路径 问题答案: 您使用的编译器无法进行编译(javac:无效的目标版本:1.6)。您确定使用JDK 1.6吗?也许ant已安装并使用了JDK 1.5。通过在目标中添加以下行来检查使用的Java版本: 它输出Ant使用的Java版本。 您可以将编译器设置为使用其他Java版本。您必须使用fork属性来使用外部javac并指定要使

  • PubSub的文档说明解码后的最大有效负载是10MB。我的问题是,在发布之前压缩发布服务器上的有效负载以增加数据吞吐量是否有利? 如果有效负载像json格式的有效负载具有很高的压缩比,这尤其有用。