Как подключить Flask -mqtt к теме AWS Mqtt - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь настроить приложение FLask для подключения к брокеру AWS, мне не удалось, всякий раз, когда я устанавливал app.config ['MQTT_TLS_ENABLED'] = True, я получал следующую Flask -ошибку:

Traceback (most recent call last):
  File "/home/rgeronimo/paho-mqtt/main.py", line 36, in <module>
    mqtt = Mqtt(app)
  File "/home/rgeronimo/paho-mqtt/venv/lib/python3.8/site-packages/flask_mqtt/__init__.py", line 104, in __init__
    self.init_app(app)
  File "/home/rgeronimo/paho-mqtt/venv/lib/python3.8/site-packages/flask_mqtt/__init__.py", line 183, in init_app
    self._connect()
  File "/home/rgeronimo/paho-mqtt/venv/lib/python3.8/site-packages/flask_mqtt/__init__.py", line 209, in _connect
    res = self.client.connect(
  File "/home/rgeronimo/paho-mqtt/venv/lib/python3.8/site-packages/paho/mqtt/client.py", line 937, in connect
    return self.reconnect()
  File "/home/rgeronimo/paho-mqtt/venv/lib/python3.8/site-packages/paho/mqtt/client.py", line 1079, in reconnect
    sock = self._ssl_context.wrap_socket(
  File "/home/rgeronimo/paho-mqtt/venv/lib/python3.8/site-packages/eventlet/green/ssl.py", line 437, in wrap_socket
    return GreenSSLSocket(sock, *a, _context=self, **kw)
  File "/home/rgeronimo/paho-mqtt/venv/lib/python3.8/site-packages/eventlet/green/ssl.py", line 67, in __new__
    ret = _original_wrap_socket(
TypeError: wrap_socket() got an unexpected keyword argument '_context'

Я проверил официальную документацию, но у них нет ни одного примера с включенной безопасностью TLS. Есть идеи, в какой конфигурации мне следует изменить или добавить в свой код?

Это мой FLask Код:

import eventlet
from flask import Flask, render_template
from flask_mqtt import Mqtt
from flask_socketio import SocketIO

eventlet.monkey_patch()

prefix = '76c8497666'
uid = '6ghbxn5zm10lso-ats'
aws_region = 'us-west-1'
topic = 'node/testing'

client_id = 'myNode'
ca_cert = 'AmazonRootCA1.pem'
certfile = f'{prefix}-certificate.pem.crt'
keyfile = f'{prefix}-private.pem.key'
mqtt_url = f'{uid}.iot.{aws_region}.amazonaws.com'


app = Flask(__name__)
app.config['MQTT_BROKER_URL'] = mqtt_url
app.config['MQTT_BROKER_PORT'] = 8883
app.config['MQTT_CLIENT_ID'] = client_id  # unique client id string used when connecting to the broker
app.config['MQTT_USERNAME'] = ''  # set the username here if you need authentication for the broker
app.config['MQTT_PASSWORD'] = ''  # set the password here if the broker demands authentication
app.config['MQTT_REFRESH_TIME'] = 5
app.config['MQTT_KEEPALIVE'] = 60
app.config['MQTT_TLS_ENABLED'] = False
app.config['MQTT_TLS_INSECURE'] = True
app.config['MQTT_TLS_CA_CERTS'] = ca_cert
app.config['MQTT_TLS_CERTFILE'] = certfile
app.config['MQTT_TLS_KEYFILE'] = keyfile



mqtt = Mqtt(app)
socketio = SocketIO(app)

@mqtt.on_connect()
def handle_connect(client, userdata, flags, rc):
    mqtt.subscribe(topic)

@mqtt.on_message()
def handle_mqtt_message(client, userdata, message):
    data = dict(
        topic=message.topic,
        payload=message.payload.decode()
    )
    # emit a mqtt_message event to the socket containing the message data
    socketio.emit('mqtt_message', data=data)

@app.route('/')
def index():
    return render_template('index.html')

@mqtt.on_log()
def handle_logging(client, userdata, level, buf):
    print(level, buf)

if __name__ == '__main__':
    socketio.run(app, host='localhost', port=5000, use_reloader=True, debug=True)

Я буду признателен за любую помощь!

...