如何连接到KaaIOT MQTT代理

如何连接到KaaIOT MQTT代理,mqtt,kaa,Mqtt,Kaa,我想连接我的KaaIOT云并订阅一个主题以显示来自终端的结果。我不知道在哪里可以找到订阅的主题名。我已经阅读了KaaIOT的文档,但仍然没有一个清晰的概念。有人能帮我提供一个示例代码供我参考吗 KaaIOT信息 appVersion.name: c184ijqrqa51q5haskp0-v1 appVersion.registeredDate: 2021-03-16T05:59:54.185Z createdDate: 2021-03-16T05:59:54.186Z endpointId

我想连接我的KaaIOT云并订阅一个主题以显示来自终端的结果。我不知道在哪里可以找到订阅的主题名。我已经阅读了KaaIOT的文档,但仍然没有一个清晰的概念。有人能帮我提供一个示例代码供我参考吗

KaaIOT信息

appVersion.name: c184ijqrqa51q5haskp0-v1

appVersion.registeredDate: 2021-03-16T05:59:54.185Z

createdDate: 2021-03-16T05:59:54.186Z

endpointId: fc2c5833-77c5-445a-89a0-9b0e7498c048

model: Raspberry Pi (192.168.0.171)

metadataUpdatedDate: 2021-03-17T09:13:01.809Z
示例代码


import itertools
import json
import queue
import random
import string
import sys
import time

import paho.mqtt.client as mqtt

KPC_HOST = "mqtt.cloud.kaaiot.com"  # Kaa Cloud plain MQTT host
KPC_PORT = 1883                     # Kaa Cloud plain MQTT port

APPLICATION_VERSION = ""  # Paste your application version
ENDPOINT_TOKEN = ""       # Paste your endpoint token


class MetadataClient:

    def __init__(self, client):
        self.client = client
        self.metadata_by_request_id = {}
        self.global_request_id = itertools.count()
        get_metadata_subscribe_topic = f'kp1/{APPLICATION_VERSION}/epmx/{ENDPOINT_TOKEN}/get/#'
        self.client.message_callback_add(get_metadata_subscribe_topic, self.handle_metadata)

    def handle_metadata(self, client, userdata, message):
        request_id = int(message.topic.split('/')[-2])
        if message.topic.split('/')[-1] == 'status' and request_id in self.metadata_by_request_id:
            print(f'<--- Received metadata response on topic {message.topic}')
            metadata_queue = self.metadata_by_request_id[request_id]
            metadata_queue.put_nowait(message.payload)
        else:
            print(f'<--- Received bad metadata response on topic {message.topic}:\n{str(message.payload.decode("utf-8"))}')

    def get_metadata(self):
        request_id = next(self.global_request_id)
        get_metadata_publish_topic = f'kp1/{APPLICATION_VERSION}/epmx/{ENDPOINT_TOKEN}/get/{request_id}'

        metadata_queue = queue.Queue()
        self.metadata_by_request_id[request_id] = metadata_queue

        print(f'---> Requesting metadata by topic {get_metadata_publish_topic}')
        self.client.publish(topic=get_metadata_publish_topic, payload=json.dumps({}))
        try:
            metadata = metadata_queue.get(True, 5)
            del self.metadata_by_request_id[request_id]
            return str(metadata.decode("utf-8"))
        except queue.Empty:
            print('Timed out waiting for metadata response from server')
            sys.exit()

    def patch_metadata_unconfirmed(self, metadata):
        partial_metadata_udpate_publish_topic = f'kp1/{APPLICATION_VERSION}/epmx/{ENDPOINT_TOKEN}/update/keys'

        print(f'---> Reporting metadata on topic {partial_metadata_udpate_publish_topic}\nwith payload {metadata}')
        self.client.publish(topic=partial_metadata_udpate_publish_topic, payload=metadata)


def main():
    # Initiate server connection
    print(f'Connecting to Kaa server at {KPC_HOST}:{KPC_PORT} using application version {APPLICATION_VERSION} and endpoint token {ENDPOINT_TOKEN}')

    client_id = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(6))
    client = mqtt.Client(client_id=client_id)
    client.connect(KPC_HOST, KPC_PORT, 60)
    client.loop_start()

    metadata_client = MetadataClient(client)

    # Fetch current endpoint metadata attributes
    retrieved_metadata = metadata_client.get_metadata()
    print(f'Retrieved metadata from server: {retrieved_metadata}')

    # Do a partial endpoint metadata update
    metadata_to_report = json.dumps({"model": "BFG 9000", "mac": "00-14-22-01-23-45"})
    metadata_client.patch_metadata_unconfirmed(metadata_to_report)

    time.sleep(5)
    client.disconnect()


if __name__ == '__main__':
    main()



进口itertools
导入json
导入队列
随机输入
导入字符串
导入系统
导入时间
将paho.mqtt.client作为mqtt导入
KPC_HOST=“mqtt.cloud.kaaiot.com”#Kaa cloud平原mqtt主机
KPC#U端口=1883#Kaa云平面MQTT端口
应用程序版本=“粘贴您的应用程序版本”
ENDPOINT_TOKEN=”“#粘贴您的ENDPOINT TOKEN
类MetadataClient:
定义初始化(自我,客户机):
self.client=client
self.metadata_by_请求_id={}
self.global\u request\u id=itertools.count()
get_metadata_subscribe_topic=f'kp1/{APPLICATION_VERSION}/epmx/{ENDPOINT_TOKEN}/get/#'
self.client.message\u callback\u add(获取元数据\u订阅\u主题,self.handle\u元数据)
def handle_元数据(自身、客户端、用户数据、消息):
请求_id=int(message.topic.split('/')[-2])
如果message.topic.split('/')[-1]='status'和self.metadata中的request\u id由\u request\u id执行:
打印(f'使用有效负载{元数据}报告主题{partial_metadata_udpate_publish_topic}\n上的元数据)
self.client.publish(主题=partial\u metadata\u udpate\u publish\u主题,负载=metadata)
def main():
#启动服务器连接
打印(f'在{KPC_主机}:{KPC_端口}使用应用程序版本{application_版本}和端点标记{endpoint_标记}连接到Kaa服务器)
client_id=''.join(随机.choice(string.ascii_大写+string.digits)表示范围(6)内的u)
client=mqtt.client(client\u id=client\u id)
client.connect(KPC_主机,KPC_端口,60)
client.loop_start()
metadata_client=MetadataClient(客户端)
#获取当前端点元数据属性
检索到的\u元数据=元数据\u客户端。获取\u元数据()
打印(f'Retrieved metadata from server:{Retrieved_metadata}')
#执行部分端点元数据更新
元数据报告=json.dumps({“model”:“BFG 9000”,“mac”:“00-14-22-01-23-45”})
元数据\u客户端。修补程序\u元数据\u未确认(元数据\u到\u报告)
时间。睡眠(5)
client.disconnect()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

我使用MQTT协议与EMQX代理建立了通信。但我对KaaIoT了解不多但这可能对你有帮助。当我浏览您的代码时,我没有看到您订阅主题的部分(如果我错了,请纠正我)。你可以参考这个。我已经实现了sub-pub模型,下面是针对EMQX broker运行良好的订户代码。你可以为凯奥特试试

import paho.mqtt.client as mqtt
import time
import logging
def on_connect(client, userdata, flags, rc):
    logging.info("Connected flags"+str(flags)+"result code " + str(rc)+ "client1_id")
    client.connected_flag=True
def on_message(client, userdata, message):
    print("Received message: " ,str(message.payload.decode("utf-8")))
def on_disconnect(client, userdata, rc):
    if rc != 0:
        print("Unexpected MQTT disconnection. Will auto-reconnect")
client = mqtt.Client('''Your client id string''')
client.connect("mqtt.cloud.kaaiot.com", 1883, 60) 
client.subscribe('''Your topic name (mentioned where data is published)''',qos=1)
client.on_connect = on_connect
client.on_message=on_message 
client.on_disconnect = on_disconnect
client.loop_forever()

当您运行所提供的代码时,您需要包括哪些输出和哪些不起作用的详细信息。只是说“它不起作用”是没有帮助的。对不起,这个问题不清楚。这里的问题是我不知道从哪里获取我的主题,在文档中它说主题格式将是
kp1/{application\u version}/{extension\u instance\u name}/{endpoint\u token}/{resource\u path}[/{request\u id}]
。资源路径和请求id在哪里?感谢您的回复,这里的问题是我不知道在KaaIOT平台中从哪里可以获得主题名称。我看到的只是上面的信息。文档说主题格式将是
kp1/{application\u version}/{extension\u instance\u name}/{endpoint\u token}/{resource\u path}[/{request\u id}]