[英]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.