Mqtt 客户端适用于 Node.js,不适用于 Python
Mqtt Client works on Node.js, doesn't on Python
我正在尝试制作一个小脚本来抓取 ShareNow 的汽车信息并用它做一些事情。
在网上寻找 api 时,我只找到了 this 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,我不知道它是否正确,但是当我尝试连接到它时(使用 python 或使用外部程序)它只是什么都不做或超时。
我不明白的是为什么以及如何在他的代码上工作,但即使在 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()
我正在尝试制作一个小脚本来抓取 ShareNow 的汽车信息并用它做一些事情。 在网上寻找 api 时,我只找到了 this 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,我不知道它是否正确,但是当我尝试连接到它时(使用 python 或使用外部程序)它只是什么都不做或超时。
我不明白的是为什么以及如何在他的代码上工作,但即使在 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()