Pour avoir un temps de réponse très rapide j'utilise le protocole mqtt.
Sur le Raspberry Pi j'ai installé mosquito
Voici comment est configurer mon fichier /etc/mosquitto/mosquitto.conf:
Code : Tout sélectionner
per_listener_settings true
pid_file /run/mosquitto/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
allow_anonymous false
listener 1883
password_file /etc/mosquitto/passwdCode : Tout sélectionner
pip install paho-mqtt
pip install pyautoguiCode : Tout sélectionner
import ctypes
import time
import paho.mqtt.client as mqtt
import os
import pyautogui
from env import USERNAME, PASSWORD
import logging
import argparse
# Créer un objet ArgumentParser pour lire les arguments de la ligne de commande
parser = argparse.ArgumentParser()
parser.add_argument("-l", "--log_path", help="chemin où enregistrer le fichier log")
# Lire les arguments de la ligne de commande
args = parser.parse_args()
# Configurer la journalisation
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s',
handlers=[
# Envoyer les messages à la console
logging.StreamHandler(),
# Envoyer les messages à un fichier log
logging.FileHandler(args.log_path) if args.log_path else logging.FileHandler('serverWin.log')
]
)
logging.debug("start")
broker_address = "192.168.1.72"
broker_port = 1883
username = USERNAME
password = PASSWORD
topic = "domoticz/out"
# Obtenir le handle de la console
kernel32 = ctypes.windll.kernel32
console_window_handle = kernel32.GetConsoleWindow()
# Utiliser le handle pour masquer la fenêtre
ctypes.windll.user32.ShowWindow(console_window_handle, 0)
start_first_time = time.time()
hide_window = False
# Fonction de callback pour gérer les messages MQTT reçus
def on_message(client, userdata, message):
payload = message.payload.decode("utf-8")
logging.debug("Message : " + payload)
if payload == "shutdown":
logging.debug("Arrêt de l'ordinateur en cours...")
os.system("shutdown /s /t 0")
elif payload == "reboot":
logging.debug("Redémarrage de l'ordinateur en cours...")
os.system("shutdown /r /t 0")
elif payload == "exit":
logging.debug("Fermeture du programme...")
client.disconnect()
exit()
elif payload == "show":
logging.debug("Affiche la console...")
ctypes.windll.user32.ShowWindow(console_window_handle, 1)
elif payload == "hide":
logging.debug("Masque la console...")
ctypes.windll.user32.ShowWindow(console_window_handle, 0)
elif payload == "next":
logging.debug("Passer à la piste suivante...")
pyautogui.press('nexttrack')
elif payload == "prev":
logging.debug("Passer à la piste d'avant...")
pyautogui.press('prevtrack')
elif payload == "stop":
logging.debug("Stoper la piste en cours...")
pyautogui.press('stop')
elif payload == "playpause":
logging.debug("Joue la piste en cours...")
pyautogui.press('playpause')
elif payload == "volumedown":
logging.debug("Baisse le son...")
pyautogui.press('volumedown')
pyautogui.press('volumedown')
pyautogui.press('volumedown')
pyautogui.press('volumedown')
pyautogui.press('volumedown')
elif payload == "volumeup":
logging.debug("Monte le son...")
pyautogui.press('volumeup')
pyautogui.press('volumeup')
pyautogui.press('volumeup')
pyautogui.press('volumeup')
pyautogui.press('volumeup')
# Fonction de callback pour gérer la perte de connexion MQTT
def on_disconnect(client, userdata, rc):
logging.warning("Connexion interrompue. Tentative de reconnexion...")
while True:
try:
client.reconnect()
break
except:
logging.error("Echec de la reconnexion. Nouvelle tentative dans 5 secondes...")
time.sleep(5)
# Configuration du client MQTT et connexion au broker
logging.debug("Configuration du client MQTT et connexion au broker")
client = mqtt.Client()
client.username_pw_set(username, password)
client.connect(broker_address, broker_port)
# Abonnement au topic MQTT
logging.debug("Abonnement au topic MQTT : "+ topic)
client.subscribe(topic)
# Configuration de la fonction de callback pour les messages MQTT reçus
client.on_message = on_message
# Configuration de la fonction de callback pour la perte de connexion MQTT
client.on_disconnect = on_disconnect
# Boucle principale pour écouter les messages MQTT en continu
while True:
try:
# Ajout d'une mesure de performance pour la boucle principale
start_time = time.time()
rc = client.loop()
if rc != 0:
logging.warning("Connexion perdue. Tentative de reconnexion dans 5 secondes...")
time.sleep(5)
client.reconnect()
# Ajout d'une notification pour les temps de réponse élevés
response_time = time.time() - start_time
if response_time > 1.2:
logging.warning("Temps de réponse élevé : {} secondes".format(response_time))
# Vérifier si le temps écoulé depuis le début du programme dépasse 5 secondes
elapsed_time = time.time() - start_first_time
if elapsed_time > 5 and not hide_window:
logging.debug("Masquage de la fenêtre de la console...")
ctypes.windll.user32.ShowWindow(console_window_handle, 0)
hide_window = True
# Gestion des erreurs potentielles
except Exception as e:
logging.error("Erreur détectée : {}".format(str(e)))
time.sleep(5)
try:
os.system("python serverWin.py")
except Exception as e:
logging.error("Erreur détectée : {}".format(str(e)))
# mosquitto_pub -h 192.168.1.72 -t domoticz/out -u User -P MotDePasse -m "shutdown"Code : Tout sélectionner
USERNAME = "User"
PASSWORD = "MotDePasse"Ce fichier doit contenir le texte suivant:
Code : Tout sélectionner
@echo on
python chemin_vers_serverWin.py -l chemin_vers_serverWin.logMaintenant, il ne reste plus qu'à tester sur le Raspberry Pi que le serveur fonctionne bien avec la commande
Code : Tout sélectionner
mosquitto_pub -h 192.168.1.72 -t domoticz/out -u User -P MotDePasse -m "shutdown"