繁体   English   中英

Mqtt 客户端适用于 Node.js,不适用于 Python

[英]Mqtt Client works on Node.js, doesn't on Python

我正在尝试制作一个小脚本来获取 ShareNow的汽车信息并对其进行处理。 在网上寻找 api 时,我只发现了这个GitHub 存储库,其中他使用 Node.js 连接到 mqtt 经纪人并获取有关汽车的信息。

现在,我从未使用过 Node,也从未听说过 mqtt,但是我尝试翻译他在 python 中连接到代理的部分代码,但它不起作用,我似乎无法找到翻译这行的方法

let client = mqtt.connect('mqtts://driver.eu.share-now.com:443', {
    clientId,
    rejectUnauthorized: false,
    reconnectPeriod: 0
});

进入一种连接到 Node.js 之外的代理的方法。 我所了解的是 url 是driver.eu.share-now.com并且端口是443 ,我不知道它是否正确但是当我尝试连接到它时(使用 Z23EEEB7347BDD756BDDZFC 外部程序)它只是无所事事或超时。

我不明白的是它为什么以及如何在他的代码上工作,但即使在 mqtt 客户端测试器上尝试,我也找不到连接的方法。

这是 node.js 中 GitHub 代码的简化(并且仍在工作)版本:

const mqtt = require("mqtt");
const uuid = require("uuid-random");
const zlib = require("zlib");


class ShareNowClient {
    static VEHICLELIST = "C2G/S2C/20/VEHICLELIST.GZ"
    vehicles = [];
    #updateCallback;

    connect() {
        let clientId = `a:${uuid()}`;
        let client = mqtt.connect('mqtts://driver.eu.share-now.com:443', {
            clientId,
            rejectUnauthorized: false,
            reconnectPeriod: 0
        });

        client.on('connect', () => {
            client.subscribe(ShareNowClient.VEHICLELIST, {qos: 0});
        });

        client.on("message", (topic, message) => {
            let json = JSON.parse(zlib.gunzipSync(message));
            if (topic === ShareNowClient.VEHICLELIST) {
                client.unsubscribe(ShareNowClient.VEHICLELIST);
                this.vehicles = json.connectedVehicles;
                console.log(this.vehicles[0]) //prints the first vehicle to check if it works
                client.end();
            }
        });

        client.on("error", error => {
            console.log(`Error: ${error}`);
        });
    }
}

let cars = new ShareNowClient();
cars.connect();
 

这是我在 python 中尝试过的(它显然不起作用)

import paho.mqtt.client as mqtt
import uuid

def on_connect(client, userdata, flags, rc): 
    print("Connected with result code {0}".format(str(rc)))
    client.subscribe(topic)


def on_message(client, userdata, msg): 
    print(str(msg.payload))
    #print("Message received-> " + msg.topic + " " + str(msg.payload))

clientId = f'a:{uuid.uuid4()}'

client = mqtt.Client(clientId)  
client.on_connect = on_connect 
client.on_message = on_message


broker = 'driver.eu.share-now.com'
port = 443
topic = "C2G/S2C/20/VEHICLELIST.GZ"

client.connect(broker , port)
client.loop_forever()

当我尝试连接到测试代理时,python 代码有效,但是当我尝试连接到 sharenow 的 url 时,只是循环什么都不做。

任何人都可以帮助它工作吗? 谢谢

您传递给 NodeJS 客户端的 URL 以mqtts://开头,这表示 MQTT over TLS 连接,因为您没有告诉 python 客户端您正在尝试连接到启用 TLS 的代理,它没有尝试执行 TLS握手。

在调用client.connect() client.tls_set() ) 将解决问题。

import paho.mqtt.client as mqtt
import uuid

def on_connect(client, userdata, flags, rc): 
    print("Connected with result code {0}".format(str(rc)))
    client.subscribe(topic)


def on_message(client, userdata, msg): 
    print(str(msg.payload))
    #print("Message received-> " + msg.topic + " " + str(msg.payload))

clientId = f'a:{uuid.uuid4()}'

client = mqtt.Client(clientId)  
client.on_connect = on_connect 
client.on_message = on_message


broker = 'driver.eu.share-now.com'
port = 443
topic = "C2G/S2C/20/VEHICLELIST.GZ"

client.tls_set()

client.connect(broker , port)
client.loop_forever()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM