Conclusión de la información en la pantalla del comprador.

La pantalla del cliente ha aparecido. Se volvió interesante tratar de usarlo como un tablero de información para mostrar información sobre el día actual, el tiempo hasta el final del día / semana laboral, información meteorológica y tipos de cambio.


Al mismo tiempo, no quería usar aplicaciones de uso intensivo de recursos y mi PC. Se detuvo en un montón de mini-PC Raspberry + Linux + Customer Display.


@ Pantalla del cliente con información | centro | 700x0


@Raspberry Pi 2 | centro | 300x0


Comentarios requeridos


No considero instalar y configurar el sistema operativo Linux en un dispositivo Raspberry en este artículo.

Para editar texto en Linux, utilicé los editores nano y mcedit.
Para acceder a una mini PC basada en Linux desde Windows, utilizó clientes para acceso remoto a través del protocolo SSH: KiTTY / PuTTY.
Para transferir archivos entre Windows y Linux, utilicé WinSCP.

Bash - concha (concha).
Bash es una abreviatura de "Bourne-Again Shell" (shell "revivido"). Las palabras clave, la sintaxis y otras características básicas del lenguaje se tomaron prestadas de otro sh shell (abreviatura de shell).
Bash también es un poderoso lenguaje de programación.

Me dedico al mantenimiento de productos de software basados ​​en 1C y para mí fue una oportunidad para familiarizarme con la programación en el entorno Linux.
A mi entender, explicaré los comandos que se están ejecutando. Esto se hace con el objetivo de llegar a una gran audiencia.

Que usaste


  • Computadora de placa única Raspberry Pi 2 Modelo B v1.1 con Raspbian GNU / Linux 9.4 (stretch) instalado.
  • Pantalla del cliente POSUA LPOS-VFD USB.
  • El bash shell

1ra etapa. Conectar y configurar la pantalla del cliente


Después de conectar la pantalla del cliente (DP) al puerto USB, descubriremos los parámetros del dispositivo conectado. En la terminal, ejecute el comando:


usb-devices 

Obtenga una lista de dispositivos USB conectados a 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 

De la información recibida por el comando encontramos la línea Producto = POSua LPOS-II-VFD USB CDC . Esta es nuestra exhibición del cliente. En esta sección, necesitamos la línea Proveedor = 0000 ProdID = 0131 Rev = 01.00. A saber, proveedor = 0000 prodID = 0131 . Entonces el dispositivo se identifica a sí mismo.


Para la operación correcta con el DP, es necesario cargar el módulo de operación USB en el núcleo del sistema. Ejecute el comando con privilegios elevados:


 sudo modprobe usbserial vendor=0x0000 product=0x0131 

modprobe es un programa para agregar módulos al kernel de Linux. usbserial es un módulo de kernel que emula un puerto COM en dispositivos USB. 0x: significa formato hexadecimal.


Como tengo un dispositivo USB conectado, en un sistema Linux, recibe automáticamente el archivo ttyUSB0 . Esta es una característica importante de interactuar con dispositivos en Linux: trabajar con el dispositivo como un archivo. Los archivos del dispositivo se almacenan en el /dev .


Para trabajar correctamente con DP, configure la velocidad de transferencia de datos:


 stty -F /dev/ttyUSB0 9600 

stty : el comando establece los parámetros de entrada / salida del terminal para el dispositivo. -F es el dispositivo. En nuestro caso, la pantalla del comprador es /dev/ttyUSB0 . Y para este dispositivo, se establece una velocidad de 9600 baudios.


Ahora puede intentar mostrar un mensaje de bienvenida (hasta ahora en inglés):


 echo "Hello!" > /dev/ttyUSB0 

Si todo se hizo correctamente, nuestro mensaje aparecerá en la pantalla. Más detalles sobre el equipo a continuación.


2 etapas. Programacion


En la etapa anterior, mostramos un mensaje en inglés en la parte superior de la pantalla de inicio del dispositivo. Y no es muy bonito.


Para borrar la pantalla, ejecute el comando:


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

echo - comando de salida del terminal. La opción -e - habilita el soporte para la salida de secuencias de escape, -n - indica que no es necesario generar saltos de línea. La entrada -en está permitida.


Las combinaciones de caracteres que consisten en una barra invertida \ seguida de una letra o un conjunto de números se denominan secuencias de escape.

0 : borra la pantalla y cancela el modo de línea; 0b : mueve el cursor a la posición superior izquierda. Símbolo > - control de flujo (redirige la salida). En este caso, el archivo / dev / ttyUSB0 de nuestro dispositivo. Si solo ejecuta el echo "Hello!" , el texto indicado entre comillas aparecerá en la ventana del terminal.


Por cierto, el comando que cambia la velocidad para transmitir datos al dispositivo podría escribirse de la siguiente manera:


 stty 9600 < /dev/ttyUSB0 

Bueno, para mostrar mensajes en ruso, haga lo siguiente:


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

| - Redirige la salida de un comando a la entrada de otro (canalización). En nuestro caso, la secuencia de caracteres "¡Hola!" no se envía al archivo del dispositivo inmediatamente, sino que se transfiere al ícono de la utilidad de "conversión" v. iconv : convierte de una codificación a otra.
El shell bash le permite no solo ejecutar comandos directamente en el terminal, sino también escribir archivos de script.


Un script es un archivo de texto sin formato con una secuencia de comandos ejecutados.

Para que bash entienda que es "suyo", el #! / Bin / bash se indica al comienzo del archivo. Y para ejecutar el script directamente, debe ejecutar el comando:


 sudo chmod u+x namefile.sh 

Donde namefile.sh es el archivo de script. La extensión sh significa que es un archivo de script bash. chmod es un programa para cambiar los derechos de acceso a archivos y directorios. u+x : establece el derecho a ejecutar el archivo para el usuario actual.


Resolveremos el problema con dos scripts. El primer script es el principal ( dispos.sh ). Muestra toda la información necesaria en la pantalla del comprador. El segundo - auxiliar ( parse.sh ) recibe datos meteorológicos, servicios de cotización de divisas y escribe datos en archivos intermedios. Los archivos de datos intermedios se utilizan en el primer script.


Para que los scripts puedan ejecutarse, debe ejecutar los siguientes comandos:


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

Tenga en cuenta que solo +x . Esta es una versión abreviada de u+x .


Las secuencias de comandos deben ejecutarse a intervalos regulares. Para hacer esto, use el programador crontab estándar. Para editar, use el comando:


 crontab -e 

Agregue dos líneas al planificador:


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

El script parse.sh se ejecuta cada 20 minutos y el script dispos.sh cada minuto.


Antes de la visualización inicial del cliente en la pantalla, primero debe ejecutar el script parse.sh, que recibirá los datos primarios de clima y moneda.


 ./parse.sh 

A continuación, daré los guiones completos con breves comentarios.


Descripción de los archivos de script


Archivo Dispos.sh


archivo 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}" 

Comentarios


Para mostrar la fecha actual, use el comando de date . Ejemplo


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

Después de la ejecución, obtenemos la fecha del formulario: 20/05/2019 12:11.


Para calcular el tiempo hasta el final del día, utilizamos la variable adicional TIME_OF_WORKDAY y establecemos el valor TIME_OF_WORKDAY="18:00:00" . Bueno, entonces calculamos las horas y minutos hasta el final de la jornada laboral:


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

El símbolo $ indica que es una variable.
El símbolo # es un comentario.


date +%s : obtenga la fecha y hora actuales en segundos.
date +%s --date=$TIME_OF_WORKDAY - obtenga el tiempo en segundos hasta TIME_OF_WORKDAY ("18:00:00") .


Cálculo del tiempo hasta el final de la semana laboral:


 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 )) 

Donde DAY_OF_WEEKEND=`date +"%s" --date="friday 17:00:00"` es el tiempo en segundos desde la hora actual hasta el viernes 17:00:00.


Parte del script se implementa utilizando funciones. Por ejemplo


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

disp_clear() es el nombre de la función. En {} , se indican los comandos ejecutables.


La variable DEV_DISPLAY es "global" y se establece al comienzo del script y, en consecuencia, DEV_DISPLAY="/dev/ttyUSB0" .


Lectura de datos de un archivo, por ejemplo, una línea específica (1):


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

sed es un editor de texto que realiza operaciones de edición de información en una secuencia o archivo de entrada estándar. La -n muestra la línea seleccionada actualmente. '1{p;q}' : imprime 1 línea y sale sin leer el resto ( p - imprimir, q - salida).


Otra opción para leer desde un archivo (línea por línea):


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

Y así DISPLAY_LINE1=${LINE1:0:14} de la línea LINE1 extraemos una subcadena de 14 caracteres de longitud a partir de 0.


Los caracteres se reemplazan por la combinación // , por ejemplo, DOLLAR//–/- . El símbolo "-" se reemplaza por un "-".


Archivo parse.sh


archivo 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 

Comentarios


El comando wget permite descargar archivos, páginas, etc. de la red. La opción -q - muestra un mínimo de información, -O - guarda en el archivo especificado.


Las siguientes líneas escriben en el archivo:


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

Además, si > redirección de la secuencia de salida al archivo > , el contenido del archivo se sobrescribe y el uso >> agrega datos al archivo.


Un ejemplo de uso de un parámetro en una función:


 conv 6 

Directamente en función:


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

Donde {1} es el parámetro. Se pasa el número 6.


Preste atención a la complicada función de reemplazo de subcadenas, por ejemplo:


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

Solo el "." y todos los números son del 0 al 9.


Epílogo


En bash, casi todas las características de los lenguajes de programación "ordinarios" están disponibles. Y algunos equipos, en comparación con los análogos en 1C, sorprenden con su laconicismo y funcionalidad.


Por el momento, la pantalla del cliente como un tablón de anuncios ha estado funcionando de manera constante durante más de seis meses.


Listado de recursos


  1. Página de visualización del comprador LPOS-VFD
  2. Programar símbolos de moneda para la visualización del cliente
  3. BASH Basics (Parte 1)
  4. BASH Basics (Parte 2)
  5. Cómo usar PuTTY
  6. Editor de nano texto de Linux para principiantes
  7. Manual para usuarios de WinSCP

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


All Articles