如何连接到 KaaIOT MQTT 代理

How to connect to KaaIOT MQTT broker

我想连接我的 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()


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

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()