Bonjour,
j'utilise un socket pour envoyer les données météo sur une tablette.
La tablette établit une connexion via un socket puis interroge régulièrement un serveur (raspberry connecté à ma station elle même capable de répondre via quelques commandes).
J'utilise un screen sur le serveur et lance ceci :
/usr/bin/screen -S meteo -d -m /bin/nc.traditional -l -p 4444 -k -c /usr/local/bin/valeurs
L'objectif est de répondre à chaque demande sans interruption via le script valeurs que voici :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #!/bin/bash
password_Utilisateur="xxxx"
password_Admin="xxxx"
units="km/h C mm hPa "
#fonction qui change temporairement les données météo se trouvant dans r2300.txt
remplace () {
sed -i "0,/"$1" /{/"$1" /s#.*#""$2""#}" /usr/local/bin/r2300.txt
}
#Boucle lisant les demandes
while read entree
do
# 5 paramètres envoyés
cmd=$(echo "$entree" | cut -f1 -d" ")
v_param=$(echo "$entree" | cut -f2 -d" ")
reset_param=$(echo "$entree" | cut -f3 -d" ")
categorie=$(echo "$entree" | cut -f4 -d" ")
chaine_begin="$cmd"" ""$v_param"" ""$reset_param"" ""$categorie"" "
password=${entree:${#chaine_begin}}
valeur="$(cat /usr/local/bin/r2300.txt | grep "$v_param " | cut -f2- -d" " )" # valeurs courantes
if [ "$categorie" = "_" ]; then
categorie=""
valeur="0"
fi
# réponses envoyées
case "$cmd" in
"g_values" )
if [ "$password" = "$password_Utilisateur" -o "$password" = "$password_Admin" ]; then
# attends si occupé
while fuser -s /dev/ttyUSB0 ; do
sleep 1
done
cat /usr/local/bin/r2300.txt
else
echo "01"
fi
;;
"g_unites")
if [ "$password" = "$password_Utilisateur" -o "$password" = "$password_Admin" ]; then
# envoie des unités
if [ "$password" = "$password_Admin" ]; then
Bool_Admin="1"
else
Bool_Admin="0"
fi
echo "$units""$Bool_Admin"
else
echo "02"
fi
;;
"g_delete")
if [ "$password" = "$password_Admin" ];
then
# commandes pour effacer certaines données météo
D=$(sed -n 1p /usr/local/bin/r2300.txt | cut -c6-)
T=$(sed -n 2p /usr/local/bin/r2300.txt | cut -c6-10)
minmax2300 "$reset_param" /etc/open2300.conf
remplace "$v_param""$categorie" "$v_param""$categorie ""$valeur"
remplace "T""$v_param""$categorie" "T""$v_param""$categorie ""$T"
remplace "D""$v_param""$categorie" "D""$v_param""$categorie ""$D"
else
echo "03"
fi
;;
*)
echo "03"
;;
esac
done |
Tout n'est peut-être pas à lire mais voici ma question :
Cela fonctionne mais quand je quitte mon application sur la tablette, le script s'arrête et la connexion est perdue.
Voici un des messages d'erreur obtenu :
1 2 3
| listening on [any] 4444 ...
192.168.0.1: inverse host lookup failed: Unknown host
connect to [192.168.0.6] from (UNKNOWN) [192.168.0.1] 62741 |
J'ai aussi eu aussi :
read ligne 12 read: read error: 0: Connection reset by peer
Merci de m’éclairer.
Partager