Directorio de artículos
descripción general
En el proceso de uso python
y desarrollo, MQTT
el mecanismo de suscripción de mensajes se utiliza para cumplir con los requisitos comerciales. Uno de ellos es que los clientes que se suscriben a los mensajes necesitan recibir 上线与下线
mensajes push sobre los servidores MQTT de otros clientes. Aquí hay un registro de los pasos y precauciones de implementación.
Plataforma del sistema operativo y versión del software :
- Sistema operativo:
Windows 10
- versión emqx:
emqx 4.3
Los pasos principales para realizar son :
- Cambiar el mecanismo de verificación de la suscripción del cliente, es decir,
是否允许匿名登录
de permitir a no permitir - Cree un nombre de usuario y una contraseña de administrador, y otórguele el permiso de suscripción de mensajes instantáneos del sistema (el cierre de sesión del cliente y las notificaciones fuera de línea son mensajes a nivel del sistema)
- Inicie la función de complemento de verificación de nombre de usuario y contraseña
Las principales consideraciones :
emqx
La diferencia de versión (emqx 4.3
la versión4.2
es diferente del método de configuración de la versión anterior)- Una vez completada la modificación del archivo de configuración, el servidor eqmx debe reiniciarse para que surta efecto.
Procedimientos de operación
emqx 4.2
y versiones anteriores
emqx 4.2
Cómo cambiar el nombre de usuario y la contraseña de inicio de sesión en versiones anteriores se puede recuperar a través de motores de búsqueda.Hay una gran cantidad de documentos o blogs técnicos con instrucciones, por lo que no los repetiré aquí.
versión emqx 4.3
Modificar la configuración de autenticación de inicio de sesión anónimo
Suponiendo que emqx está instalado en D:\
el disco, el tutorial de instalación , en este momento, abra el archivo de configuración del sistema, ubicado en d:\emqx\etc\emqx.conf
, abra en modo texto, modifique el elemento de configuración allow_anonymous
como false
, antes de la modificación, el valor predeterminado del sistema true
:
## Allow anonymous authentication by default if no auth plugins loaded.
## Notice: Disable the option in production deployment!
##
## Value: true | false
allow_anonymous = false
Después de la modificación, guarde y salga.
Abra el complemento de verificación de inicio de sesión
Inicie sesión 127.0.0.1:18083
, ingrese el nombre de cuenta predeterminado admin
y la contraseña predeterminada public
para iniciar sesión en la consola, haga clic en la barra de navegación izquierda Plugins
(la interfaz china muestra es 插件
) y emqx_auth_mnesia
comience
Antes de la versión Emqx4.3, había una
emqx_auth_username
extensión que podíaemqx_auth_username
modificar su configuración iniciando el módulo de complemento para verificar la cuenta y la contraseña.
PeroEmqx 4.3
es diferente después de la versión. El documento oficial indica queemqx 4.3
en la versiónemqx_auth_clientid
yemqx_auth_usernmae
se fusiona conemqx_auth_mnesia
.emqx_auth_username
A partir de ahora, el módulo está obsoleto.Emqx 4.3
Cargar el complemento en la versiónemq_auth_username
informará un error que no existe, así que no busqueemqx_auth_username
más el módulo de instalación. Modifique directamenteemqx_auth_mnesia.conf
el archivo de configuración del módulo y agregue la contraseña de la cuenta.
Añadir nombre de usuario y contraseña
Busque emqx_auth_mnesia
el archivo de configuración correspondiente al complemento, ubicado en D:\emqx\etc\plugins\emqx_auth_mnesia.conf
, agregue el siguiente nombre de usuario y contraseña:
## Password hash.
##
## Value: plain | md5 | sha | sha256 | sha512
auth.mnesia.password_hash = sha256
##--------------------------------------------------------------------
## ClientId Authentication
##--------------------------------------------------------------------
auth.client.1.clientid = admin
auth.client.1.password = your_own_password
##--------------------------------------------------------------------
## Username Authentication
##--------------------------------------------------------------------
## Examples:
auth.user.1.username = admin
auth.user.1.password = your_own_password
Guardar y Salir.
Modificar archivos de configuración de control de acceso
Abra d:\emqx\etc\acl.conf
, agregue una línea de configuración de acceso de usuario:
{allow, {user, "admin"}, subscribe, ["$SYS/#"]}.
Permite admin
a los usuarios suscribirse a mensajes a nivel del sistema. Guardar y salir, reiniciar emqx
el servicio
Suscripción de mensajes del sistema para el cliente en línea y fuera de línea
Los mensajes en línea y fuera de línea del cliente son notificaciones a nivel del sistema, que requieren que el cliente se suscriba a los predefinidos del sistema topic
:
-
tema sin conexión
$SYS/brokers/+/clients/+/disconnected
-
tema en línea
$SYS/brokers/+/clients/+/connected
-
Tema en línea y fuera de línea
$SYS/brokers/+/clients/#
Código de muestra:
def on_connect(client, userdata, flags, rc):
# this method will be called when client connected to server successfully
# TODO do something when this client been notified about successfully connected to server
pass
def on_message(client, userdata, msg: mqtt.MQTTMessage):
# this method will be called when this client get a message under the topic(s) it subscribed, encluding the system message (I assuming you've already configure it properly)
# TODO do something when this client get a message
pass
mqtt_server = "127.0.0.1"
client = mqtt.Client("surveillance_client")
client.username_pw_set("admin", "aoto@123")
# 定义回调方法
client.on_connect = on_connect
client.on_message = on_message
# 600为keepalive的时间间隔
client.connect(mqtt_server, 1883, 600)
client.subscribe('surveillance', qos=0)
client.subscribe(r"$SYS/brokers/+/clients/#", qos=0)
# 启动mqtt消息订阅(非阻塞式)
client.loop_start()
Después de que se ejecuta el código anterior, si otros clientes se conectan o desconectan, on_message()
se vuelve a llamar al método aquí y se recupera el mensaje de cierre de sesión del sistema, de la siguiente manera:
客户端上线 topic: $SYS/brokers/[email protected]/clients/654321/connected
客户端上线消息报文 :
{
"username": "admin",
"ts": 1627476021893,
"sockport": 1883,
"proto_ver": 4,
"proto_name": "MQTT",
"keepalive": 600,
"ipaddress": "127.0.0.1",
"expiry_interval": 0,
"connected_at": 1627476021893,
"connack": 0,
"clientid": "654321",
"clean_start": true
}
客户端下线 topic: $SYS/brokers/[email protected]/clients/654321/disconnected
客户端下线消息报文 :
{
"username": "admin",
"ts": 1627476028659,
"reason": "tcp_closed",
"disconnected_at": 1627476028659,
"clientid": "654321"
}
Las expresiones regulares se pueden usar r"^\$SYS\/brokers\/.*\/clients\/.*\/(dis)?connected"
para hacer coincidir y filtrar mensajes en línea y fuera de línea para el procesamiento de lógica empresarial.