Annuaire d'articles
aperçu
Dans le processus d'utilisation python
et de développement, MQTT
le mécanisme d'abonnement aux messages est utilisé pour répondre aux besoins de l'entreprise. L'un d'eux est que les clients qui s'abonnent aux messages doivent recevoir 上线与下线
des messages push sur les serveurs MQTT des autres clients. Voici un compte rendu des étapes de mise en œuvre et des précautions.
Plate-forme du système d'exploitation et version du logiciel :
- système opérateur:
Windows 10
- version emqx :
emqx 4.3
Les principales étapes à réaliser sont :
- Modifier le mécanisme de vérification de l'abonnement du client, c'est-à-dire
是否允许匿名登录
d'autoriser à interdire - Créez un nom d'utilisateur et un mot de passe d'administrateur et donnez-lui l'autorisation d'abonnement aux messages instantanés du système (la déconnexion du client et les notifications hors ligne sont des messages au niveau du système)
- Démarrer la fonction de plug-in de vérification du nom d'utilisateur et du mot de passe
Les principales considérations :
emqx
La différence de version (emqx 4.3
la version4.2
est différente de la méthode de réglage de la version précédente)- Une fois la modification du fichier de configuration terminée, le serveur eqmx doit être redémarré pour prendre effet
Modes opératoires
emqx 4.2
et versions précédentes
emqx 4.2
Comment changer le nom d'utilisateur et le mot de passe de connexion dans les versions précédentes peut être récupéré via les moteurs de recherche.Il existe un grand nombre de documents ou de blogs techniques avec des instructions, je ne les répéterai donc pas ici.
version emqx 4.3
Modifier les paramètres d'authentification de connexion anonyme
En supposant qu'emqx est installé sur D:\
le disque, le tutoriel d'installation , à ce moment, ouvre le fichier de configuration du système, situé dans d:\emqx\etc\emqx.conf
, ouvert en mode texte, modifie l'élément de configuration allow_anonymous
comme false
, avant modification, la valeur par défaut du système true
:
## Allow anonymous authentication by default if no auth plugins loaded.
## Notice: Disable the option in production deployment!
##
## Value: true | false
allow_anonymous = false
Après modification, enregistrez et quittez.
Ouvrez le plugin de vérification de connexion
Connectez-vous 127.0.0.1:18083
, entrez le nom du compte par défaut admin
et le mot de passe par défaut public
pour vous connecter à la console, cliquez sur la barre de navigation de gauche Plugins
(l'interface chinoise indique 插件
) et emqx_auth_mnesia
démarrez
Avant la version Emqx4.3, il y avait une
emqx_auth_username
extension, qui pouvaitemqx_auth_username
modifier sa configuration en démarrant le module plug-in pour vérifier le compte et le mot de passe.
MaisEmqx 4.3
c'est différent après la version.Le document officiel indique queemqx 4.3
dans la versionemqx_auth_clientid
etemqx_auth_usernmae
est fusionné dansemqx_auth_mnesia
.emqx_auth_username
Le module est désormais obsolète.Emqx 4.3
Le chargement du plug-in dans la versionemq_auth_username
rapportera une erreur qui n'existe pas, alors ne cherchezemqx_auth_username
plus le module d'installation. Modifiez directementemqx_auth_mnesia.conf
le fichier de configuration du module et ajoutez le mot de passe du compte.
Ajouter un nom d'utilisateur et un mot de passe
Recherchez emqx_auth_mnesia
le fichier de configuration correspondant au plug-in, situé dans D:\emqx\etc\plugins\emqx_auth_mnesia.conf
, ajoutez le nom d'utilisateur et le mot de passe suivants :
## 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
Sauvegarder et quitter.
Modifier les fichiers de configuration du contrôle d'accès
Ouvrez d:\emqx\etc\acl.conf
, ajoutez une ligne de configuration d'accès utilisateur :
{allow, {user, "admin"}, subscribe, ["$SYS/#"]}.
Permet admin
aux utilisateurs de s'abonner aux messages au niveau du système. Enregistrez et quittez, redémarrez emqx
le service
Abonnement aux messages système pour le client en ligne et hors ligne
Les messages client hors ligne et en ligne sont des notifications au niveau du système, qui nécessitent que le client s'abonne aux paramètres prédéfinis du systèmetopic
:
-
sujet hors ligne
$SYS/brokers/+/clients/+/disconnected
-
sujet en ligne
$SYS/brokers/+/clients/+/connected
-
Sujet en ligne et hors ligne
$SYS/brokers/+/clients/#
Exemple de code :
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()
Une fois le code ci-dessus exécuté, si d'autres clients se connectent ou se déconnectent, on_message()
la méthode est rappelée ici et le message de déconnexion du système est récupéré, comme suit :
客户端上线 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"
}
Les expressions régulières peuvent être utilisées r"^\$SYS\/brokers\/.*\/clients\/.*\/(dis)?connected"
pour faire correspondre et filtrer les messages en ligne et hors ligne pour le traitement de la logique métier.