Conclusion des informations sur l'affichage de l'acheteur

L'affichage client est apparu. Il est devenu intéressant d'essayer de l'utiliser comme un panneau d'information pour afficher des informations sur la journée en cours, l'heure jusqu'à la fin de la journée / semaine de travail, les informations météorologiques et les taux de change.


En même temps, je ne voulais pas utiliser des applications gourmandes en ressources et mon PC. Il s'est arrêté à un tas de mini-PC Raspberry + Linux + Customer Display.


@ Affichage client avec informations | centre | 700x0


@Raspberry Pi 2 | centre | 300x0


Commentaires obligatoires


Je ne considère pas l'installation et la configuration de Linux OS sur un périphérique Raspberry dans cet article.

Pour éditer du texte sous Linux, j'ai utilisé les éditeurs nano et mcedit.
Pour accéder aux mini-PC basés sur Linux OS à partir de l'environnement Windows, j'ai utilisé des clients pour l'accès à distance via le protocole SSH - KiTTY / PuTTY.
Pour transférer des fichiers entre Windows et Linux, j'ai utilisé WinSCP.

Bash - shell (shell).
Bash est une abréviation de "Bourne-Again Shell" (shell "revived"). Les mots-clés, la syntaxe et d'autres fonctionnalités de base du langage ont été empruntés à un autre shell sh (abréviation de shell).
Bash est également un langage de programmation puissant.

Je suis engagé dans la maintenance de produits logiciels basés sur 1C et pour moi ce fut l'occasion de me familiariser avec la programmation dans l'environnement Linux.
Au mieux de ma compréhension, j'expliquerai les commandes en cours d'exécution. Cela se fait dans le but d'atteindre un large public.

Qu'avez-vous utilisé?


  • Ordinateur monocarte Raspberry Pi 2 modèle B v1.1 avec Raspbian GNU / Linux 9.4 (stretch) installé.
  • Écran client POSUA LPOS-VFD USB.
  • La coquille bash

1er étage. Connecter et configurer l'affichage client


Après avoir connecté l'écran du client (DP) au port USB, nous découvrirons les paramètres de l'appareil connecté. Dans le terminal, exécutez la commande:


usb-devices 

Obtenez une liste des périphériques USB connectés à Raspberry:


 T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 1 D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=1d6b ProdID=0002 Rev=04.14 S: Manufacturer=Linux 4.14.69-v7+ dwc_otg_hcd S: Product=DWC OTG Controller S: SerialNumber=3f980000.usb C: #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 5 D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=02 MxPS=64 #Cfgs= 1 P: Vendor=0424 ProdID=9514 Rev=02.00 C: #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=2mA I: If#= 0 Alt= 1 #EPs= 1 Cls=09(hub ) Sub=00 Prot=02 Driver=hub T: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0424 ProdID=ec00 Rev=02.00 C: #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=2mA I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=ff Driver=smsc95xx T: Bus=01 Lev=02 Prnt=02 Port=01 Cnt=02 Dev#= 4 Spd=12 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=0000 ProdID=0131 Rev=01.00 S: Manufacturer=www.posua.com S: Product=POSua LPOS-II-VFD USB CDC C: #Ifs= 2 Cfg#= 1 Atr=a0 MxPwr=16mA I: If#= 0 Alt= 0 #EPs= 3 Cls=02(commc) Sub=02 Prot=01 Driver=usbserial_generic I: If#= 1 Alt= 0 #EPs= 2 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid 

À partir des informations reçues par la commande, nous trouvons la ligne Product = POSua LPOS-II-VFD USB CDC . Ceci est notre affichage client. Dans cette section, nous avons besoin de la ligne Vendor = 0000 ProdID = 0131 Rev = 01.00. A savoir vendeur = 0000 prodID = 0131 . Ainsi, l'appareil s'identifie.


Pour un fonctionnement correct avec le DP, il est nécessaire de charger le module de fonctionnement USB dans le cœur du système. Exécutez la commande avec des privilèges élevés:


 sudo modprobe usbserial vendor=0x0000 product=0x0131 

modprobe est un programme pour ajouter des modules au noyau Linux. usbserial est un module du noyau qui émule un port COM sur des périphériques USB. 0x - signifie le format hexadécimal.


Étant donné que j'ai un périphérique USB connecté, sur un système Linux, il reçoit automatiquement le fichier ttyUSB0 . Il s'agit d'une caractéristique importante de l'interaction avec des périphériques sous Linux - travailler avec le périphérique en tant que fichier. Les fichiers de périphérique sont stockés dans le /dev .


Pour fonctionner correctement avec DP, définissez le taux de transfert de données:


 stty -F /dev/ttyUSB0 9600 

stty - la commande définit les paramètres d'entrée / sortie du terminal pour le périphérique. -F est l'appareil. Dans notre cas, l'affichage de l'acheteur est /dev/ttyUSB0 . Et pour cet appareil, une vitesse de 9600 bauds est définie.


Vous pouvez maintenant essayer d'afficher un message de bienvenue (en anglais jusqu'à présent):


 echo "Hello!" > /dev/ttyUSB0 

Si tout a été fait correctement, notre message apparaîtra à l'écran. Plus de détails sur l'équipe ci-dessous.


2 étages. Programmation


À l'étape précédente, nous avons affiché un message en anglais en haut de l'écran de démarrage de l'appareil. Et ce n'est pas très beau.


Pour effacer l'écran d'affichage, exécutez la commande:


 echo -e -n "\x0c\x0b" > /dev/ttyUSB0 

echo - commande de sortie du terminal. L'option -e - permet la prise en charge de la sortie des séquences d'échappement, -n - indique qu'il n'est pas nécessaire de sortir les sauts de ligne. L'entrée -en est autorisée.


Les combinaisons de caractères consistant en une barre oblique inversée \ suivie d'une lettre ou d'un ensemble de chiffres sont appelées séquences d'échappement.

0 - efface l'écran d'affichage et annule le mode ligne, 0b - déplace le curseur dans la position supérieure gauche. Symbole > - contrôle de flux (redirige la sortie). Dans ce cas, le fichier / dev / ttyUSB0 de notre appareil. Si vous exécutez simplement l' echo "Hello!" , le texte indiqué entre guillemets apparaîtra dans la fenêtre du terminal.


Soit dit en passant, la commande qui modifie la vitesse de transmission des données vers l'appareil pourrait être écrite comme suit:


 stty 9600 < /dev/ttyUSB0 

Eh bien, pour afficher des messages en russe, faites:


 echo -n "!" | iconv -f UTF-8 -t CP866 > /dev/ttyUSB0 

| - Redirige la sortie d'une commande vers l'entrée d'une autre (pipeline). Dans notre cas, la séquence de caractères "Bonjour!" il n'est pas sorti immédiatement dans le fichier du périphérique, mais transféré vers l'utilitaire "conversion" iconv. iconv - convertit d'un encodage à un autre.
Le shell bash vous permet non seulement d'exécuter des commandes directement dans le terminal, mais également d'écrire des fichiers de script.


Un script est un fichier en texte brut avec une séquence de commandes exécutées.

Pour que bash comprenne qu'il s'agit de «son», le #! / Bin / bash est indiqué au début du fichier. Et pour exécuter le script directement, vous devez exécuter la commande:


 sudo chmod u+x namefile.sh 

Où nomfichier.sh est le fichier de script. L'extension sh - signifie qu'il s'agit d'un fichier de script bash. chmod est un programme pour changer les droits d'accès aux fichiers et répertoires. u+x - définit le droit d'exécuter le fichier pour l'utilisateur actuel.


Nous allons résoudre le problème avec deux scripts. Le premier script est le principal ( dispos.sh ). Il affiche toutes les informations nécessaires sur l'écran de l'acheteur. Le second auxiliaire ( parse.sh ) reçoit les données météorologiques, les services de cotation de devises et écrit les données dans des fichiers intermédiaires. Les fichiers de données intermédiaires sont utilisés dans le premier script.


Pour que les scripts puissent s'exécuter, vous devez exécuter les commandes suivantes:


 sudo chmod +x dispos.sh sudo chmod +x parse.sh 

Notez que seulement +x . Il s'agit d'une version abrégée de u+x .


Les scripts doivent être exécutés à intervalles réguliers. Pour ce faire, utilisez le planificateur crontab standard. Pour éditer, utilisez la commande:


 crontab -e 

Ajoutez deux lignes au planificateur:


 */20 * * * * /home/pi/parse.sh */1 * * * * /home/pi/dispos.sh 

Le script parse.sh s'exécute toutes les 20 minutes et le script dispos.sh toutes les minutes.


Avant l'affichage initial du client sur l'écran, vous devez d'abord exécuter le script parse.sh, qui recevra les principales données météorologiques et monétaires.


 ./parse.sh 

Ensuite, je donnerai les scripts complets avec de courts commentaires.


Description des fichiers de script


Fichier Dispos.sh


fichier dispos.sh
 #!/bin/bash #        POSua LPOS-VFD. # -  ttyUSB0. #     tty  : # modprobe usbserial vendor=0x0000 product=0x0131. #  0x0000  0x0131  ,   # usb-devices, lsusb  dmesg. #    stty 9600 < /dev/ttyUSB0. #          parse.sh #     crontab      . # **************************************************************** #   # ttyUSB -      (POS-) DEV_DISPLAY="/dev/ttyUSB0" #        #   ,  ,   18:00:00 #    17:00:00 TIME_OF_WORKDAY="18:00:00" if (( $(date "+%u") >= 5 )); then TIME_OF_WORKDAY="17:00:00" fi #      ( 17:00:00) #      DAY_OF_WEEKEND=`date +"%s" --date="friday 17:00:00"` # **************************************************************** #       #    disp_clear(){ echo -en "\x0c\x0b" > "${DEV_DISPLAY}" } #       disp_cr(){ echo -e "\x0b" > "${DEV_DISPLAY}" } #       disp_print(){ echo -n $1 | iconv -f UTF-8 -t CP866 > "${DEV_DISPLAY}" } # **************************************************************** #    # 1.    disp_clear #   disp_print ": `date "+%A"`" disp_cr #     disp_print " `date "+%d.%m.%Y %H:%M"`" sleep 8 # **************************************************************** # 2.       disp_clear disp_print "   . :" disp_cr HOURS=$(( ( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) / 3600 )) MINUTES=$(( (( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) - $HOURS * 3600) / 60 )) #       if (( $MINUTES > -1 )); then OUTPUT_TIME=" ${HOURS} . ${MINUTES} ." else OUTPUT_TIME=" !" fi #       disp_print "${OUTPUT_TIME}" sleep 8 # **************************************************************** # 3.       disp_clear disp_print "  . :" disp_cr DAYS=$(( ($DAY_OF_WEEKEND-$(date +%s)) / (24*3600) )) HOURS=$(( (($DAY_OF_WEEKEND-$(date +%s)) - ($DAYS*24*3600)) / 3600 )) MINUTES=$(( (($DAY_OF_WEEKEND-$(date +%s)) - ($DAYS*24*3600) - ($HOURS*60*60)) / 60 )) #       if (( $MINUTES > -1 )); then OUTPUT_TIME="${DAYS} . ${HOURS} . ${MINUTES} " else OUTPUT_TIME=" !" fi #       disp_print "${OUTPUT_TIME}" sleep 8 # **************************************************************** # 4.     # 4.1.      LINE1=$(sed -n '1{p;q}' /tmp/weather.txt) DISPLAY_LINE1=${LINE1:0:19} DISPLAY_LINE2=${LINE1:19:19} #     (2 ) disp_clear disp_print "${DISPLAY_LINE1}" disp_cr disp_print "${DISPLAY_LINE2}" sleep 4 # 4.2.    LINE1=$(sed -n '2{p;q}' /tmp/weather.txt) DISPLAY_LINE1=${LINE1:0:14} DISPLAY_LINE2=${LINE1:14:19} #     (2 ) disp_clear disp_print " ${DISPLAY_LINE1}" disp_cr disp_print "${DISPLAY_LINE2}" sleep 8 # **************************************************************** # 5.      #      #  DOLLAR=$(sed -n '1{p;q}' /tmp/ex.txt) DOLLAR=${DOLLAR//–/-} #  EURO=$(sed -n '2{p;q}' /tmp/ex.txt) EURO=${EURO//–/-} #     disp_clear disp_print ": ${DOLLAR}" disp_cr disp_print ": ${EURO}" sleep 8 # **************************************************************** # 6.      #      # BTC while read line do BTC=${line:0:13} done </tmp/bitcoin.txt # ETH while read line do ETH=${line:0:13} done </tmp/ethereum.txt #     #      disp_clear disp_print "BTC: ${BTC//./,}" disp_cr disp_print "ETH: ${ETH//./,}" #sleep 8 # **************************************************************** # 7.      #      (.  20 ) #DISPLAY_LINE1="  !" #DISPLAY_LINE2="  !" #      #disp_clear #disp_print "${DISPLAY_LINE1:0:19}" #disp_cr #disp_print "${DISPLAY_LINE2:0:19}" 

Commentaires


Pour afficher la date actuelle, utilisez la commande date . Exemple


 echo `date "+%d.%m.%Y %H:%M"` 

Après exécution, nous obtenons la date du formulaire: 20/05/2019 12:11.


Pour calculer l'heure jusqu'à la fin de la journée, nous utilisons la variable supplémentaire TIME_OF_WORKDAY et définissons la valeur TIME_OF_WORKDAY="18:00:00" . Eh bien, nous calculons les heures et les minutes jusqu'à la fin de la journée de travail:


 HOURS=$(( ( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) / 3600 )) MINUTES=$(( (( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) - $HOURS * 3600) / 60 )) 

Le symbole $ indique qu'il s'agit d'une variable.
Le symbole # est un commentaire.


date +%s - obtenez la date et l'heure actuelles en secondes.
date +%s --date=$TIME_OF_WORKDAY - obtenir le temps en secondes jusqu'à TIME_OF_WORKDAY ("18:00:00") .


Calcul du temps jusqu'à la fin de la semaine de travail:


 DAYS=$(( ($DAY_OF_WEEKEND-$(date +%s)) / (24*3600) )) HOURS=$(( (($DAY_OF_WEEKEND-$(date +%s)) - ($DAYS*24*3600)) / 3600 )) MINUTES=$(( (($DAY_OF_WEEKEND-$(date +%s)) - ($DAYS*24*3600) - ($HOURS*60*60)) / 60 )) 

DAY_OF_WEEKEND=`date +"%s" --date="friday 17:00:00"` est le temps en secondes de l'heure actuelle jusqu'au vendredi 17:00:00.


Une partie du script est implémentée à l'aide de fonctions. Par exemple


 #    disp_clear(){ echo -en "\x0c\x0b" > "${DEV_DISPLAY}" } 

disp_clear() est le nom de la fonction. Dans {} , les commandes exécutables sont indiquées.


La variable DEV_DISPLAY est "globale" et est définie au début du script et, par conséquent, DEV_DISPLAY="/dev/ttyUSB0" .


Lecture des données d'un fichier, par exemple une ligne spécifique (1):


 LINE1=$(sed -n '1{p;q}' /tmp/weather.txt) 

sed est un éditeur de texte qui effectue des opérations d'édition sur les informations d'un flux ou d'un fichier d'entrée standard. L' -n affiche la ligne actuellement sélectionnée. '1{p;q}' - imprime 1 ligne et quitte sans lire le reste ( p - print, q - output).


Une autre option pour lire à partir d'un fichier (ligne par ligne):


 while read line do BTC=${line:0:13} done </tmp/bitcoin.txt 

Et ainsi DISPLAY_LINE1=${LINE1:0:14} de la ligne LINE1 extrait une sous-chaîne de 14 caractères de long à partir de 0.


Les caractères sont remplacés par la combinaison // , par exemple, DOLLAR//–/- . Le symbole "-" est remplacé par un "-".


Fichier parse.sh


fichier parse.sh
 #!/bin/bash #      RSS   http://rp5.ru/rss/1859/ru # 1859 -    #       conv(){ #        CURRENCY=$(sed -n '1!G;h;$p' /tmp/ex.xml | sed -n "${1}{p;q}") CURRENCY=${CURRENCY//[^,^(^)^0-9^–^+]/} echo $CURRENCY } #   c     # 1.  wget -q -O /tmp/rp5weather.xml http://rp5.ru/rss/1859/ru # 2.      wget -q -O /tmp/ex.xml http://currr.ru/rss/ # 3.   bitcoin/ethereum wget -q -O /tmp/bitcoin.json https://api.coinmarketcap.com/v1/ticker/bitcoin/ wget -q -O /tmp/ethereum.json https://api.coinmarketcap.com/v1/ticker/ethereum/ #   #   ,  ,    #     LINE31=$(sed -n '31{p;q}' /tmp/rp5weather.xml) LINE33=$(sed -n '33{p;q}' /tmp/rp5weather.xml) WEATHER1=${LINE31//"</title>"} WEATHER1=${WEATHER1//" °C"} WEATHER1=${WEATHER1//"  "} WEATHER1=${WEATHER1:29} WEATHER2=${LINE33##*} WEATHER2=${WEATHER2//"°"} echo "${WEATHER1}" > /tmp/weather.txt echo ${WEATHER2%.*} >> /tmp/weather.txt #   Bitcoin LINEBTC=$(sed -n '7{p;q}' /tmp/bitcoin.json) echo "${LINEBTC//[^.^0-9]/}" > /tmp/bitcoin.txt #   Ethereum LINEETH=$(sed -n '7{p;q}' /tmp/ethereum.json) echo "${LINEETH//[^.^0-9]/}" > /tmp/ethereum.txt #   DOLLAR=$(conv 8) echo $DOLLAR > /tmp/ex.txt EURO=$(conv 6) echo $EURO >> /tmp/ex.txt 

Commentaires


La commande wget vous permet de télécharger des fichiers, des pages, etc. à partir du réseau. L'option -q - affiche un minimum d'informations, -O - enregistre dans le fichier spécifié.


Les lignes ci-dessous écrivent dans le fichier:


 echo "${WEATHER1}" > /tmp/weather.txt echo ${WEATHER2%.*} >> /tmp/weather.txt 

De plus, si la redirection du flux de sortie vers le fichier > , le contenu du fichier est écrasé et l'utilisation >> ajoute des données au fichier.


Un exemple d'utilisation d'un paramètre dans une fonction:


 conv 6 

Directement en fonction:


 CURRENCY=$(sed -n '1!G;h;$p' /tmp/ex.xml | sed -n "${1}{p;q}") 

{1} est le paramètre. Le numéro 6 est passé.


Faites attention à la fonction de remplacement de sous-chaîne compliquée, par exemple:


 LINEBTC//[^.^0-9]/ 

Seul le "." et tous les nombres vont de 0 à 9.


Postface


En bash, presque toutes les fonctionnalités des langages de programmation "ordinaires" sont disponibles. Et certaines équipes, par rapport aux analogues du 1C, surprennent par leur laconicisme et leur fonctionnalité.


À l'heure actuelle, l'affichage du client sous forme de tableau d'affichage fonctionne régulièrement depuis plus de six mois.


Liste des ressources


  1. Page d'affichage de l'acheteur LPOS-VFD
  2. Programmer les symboles monétaires pour l'affichage client
  3. BASH Basics (Partie 1)
  4. BASH Basics (Partie 2)
  5. Comment utiliser PuTTY
  6. Éditeur de texte nano Linux pour débutants
  7. Manuel pour les utilisateurs de WinSCP

Source: https://habr.com/ru/post/fr457352/


All Articles