First attempt to get paho-mqtt working with Ably. I'm sort of translating the following NodeJS example (which works for me) to Python. In the Python version, I don't seem to get any CONNACK back from the server.
NodeJS Example
// Using https://www.npmjs.com/package/mqtt
var [usr, pwd] = process.env['ABLY_API_KEY'].split(':');
let mqtt = require('mqtt');
let options = {
keepAlive: 15,
username: usr,
password: pwd,
port: 8883
};
let client = mqtt.connect('mqtts:mqtt.ably.io', options);
let channel = '[product:flight-data/flight-data]flight';
client.on('connect', () => {
console.log('connected!')
client.subscribe(channel);
});
client.on('message', (topic, message) => {
console.log('Message received', message.toString());
});
My Python version (with logger added for debugging output)
mport os
import paho.mqtt.client as mqtt
import logging
def create_logger():
logger = logging.getLogger('mqtt debug')
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
logger.addHandler(ch)
return logger
host = 'mqtt.ably.io'
port = 8883
channel = '[product:flight-data/flight-data]flight'
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe(channel)
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
api_key = os.environ.get('ABLY_API_KEY', '')
username, passwd = api_key.split(':')
print(username)
mqttc = mqtt.Client(client_id="Test", clean_session=True, userdata=None)
mqttc.enable_logger(logger=create_logger())
mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.username_pw_set(username, passwd)
mqttc.connect(host, port=port, keepalive=15)
mqttc.loop_forever()
I get logger output like this
2022-06-20 20:03:39,956 - mqtt debug - DEBUG - Sending CONNECT (u1, p1, wr0, wq0, wf0, c1, k15) client_id=b'Test'
2022-06-20 20:03:56,040 - mqtt debug - DEBUG - Sending CONNECT (u1, p1, wr0, wq0, wf0, c1, k15) client_id=b'Test'
And this repeats until I ctrl-C out of the program.
However, testing very similar code with another broker seems to work. Here's the working test (cutting out the imports and create_logger function which are identical to the above)
(snip)
port = 1883
host = 'broker.hivemq.com'
channel = '$SYS/#'
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe(channel)
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
mqttc = mqtt.Client(client_id="Test", clean_session=True, userdata=None)
mqttc.enable_logger(logger=create_logger())
mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.connect(host, port=port, keepalive=15)
mqttc.loop_forever()
This time I get expected output
2022-06-20 20:02:51,380 - mqtt debug - DEBUG - Sending CONNECT (u0, p0, wr0, wq0, wf0, c1, k15) client_id=b'Test'
2022-06-20 20:02:51,496 - mqtt debug - DEBUG - Received CONNACK (0, 0)
Connected with result code 0
So, in summary, I can connect to Ably in JS but not in Python. Yet my Python code is able to connect to other brokers. I'm sure I'm overlooking something I need to do in paho-mqtt, but have not been able to figure it out.