استنتاج المعلومات على شاشة المشتري

لقد ظهرت شاشة العميل. أصبح من المثير للاهتمام محاولة استخدامه بمثابة لوحة معلومات لعرض معلومات حول اليوم الحالي ، والوقت حتى نهاية يوم العمل / الأسبوع ، ومعلومات الطقس ، وأسعار الصرف.


في نفس الوقت ، لم أكن أرغب في استخدام تطبيقات كثيفة الاستخدام للموارد وجهاز الكمبيوتر الخاص بي. توقف عند مجموعة من أجهزة الكمبيوتر المصغرة Raspberry + Linux + Customer Display.


@ عرض العملاء مع المعلومات | مركز | 700x0


@ التوت بي 2 | مركز | 300x0


التعليقات المطلوبة


لا أفكر في تثبيت نظام التشغيل Linux وتكوينه على جهاز Raspberry في هذه المقالة.

لتحرير النص في Linux ، استخدمت محرري nano و mcedit.
للوصول إلى كمبيوتر صغير يعتمد على Linux من Windows ، استخدم العملاء للوصول عن بُعد عبر بروتوكول SSH - KiTTY / PuTTY.
لنقل الملفات بين Windows و Linux ، استخدمت WinSCP.

باش - شل (شل).
Bash هو اختصار لـ "Bourne-Again Shell" ("revived" shell). تم استعارة الكلمات الأساسية ، بناء الجملة ، والميزات الأساسية الأخرى للغة من قذيفة sh أخرى (اختصار لـ shell).
باش هي أيضا لغة برمجة قوية.

أنا منخرط في صيانة منتجات البرمجيات على أساس 1C وبالنسبة لي كانت فرصة للتعرف على البرمجة في بيئة Linux بنفسي.
حسب فهمي ، سأشرح لك الأوامر التي يتم تنفيذها. يتم ذلك بهدف الوصول إلى جمهور كبير.

ماذا استخدمت؟


  • Raspberry Pi 2 Model B v1.1 كمبيوتر واحد مع تثبيت Raspbian GNU / Linux 9.4 (امتداد).
  • عرض العملاء POSUA LPOS-VFD USB.
  • قذيفة باش

المرحلة الأولى. ربط وإعداد عرض العملاء


بعد إرفاق شاشة العميل (DP) بمنفذ USB ، سنتعرف على معلمات الجهاز المتصل. في المحطة ، قم بتنفيذ الأمر:


usb-devices 

الحصول على قائمة بأجهزة USB المتصلة بـ 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 

من المعلومات التي تلقاها الأمر ، نجد السطر Product = POSua LPOS-II-VFD USB CDC . هذا هو عرض عملائنا. في هذا القسم ، نحتاج إلى خط البائع = 0000 ProdID = 0131 Rev = 01.00. أي بائع = 0000 prodID = 0131 . لذلك يعرف الجهاز نفسه.


من أجل التشغيل الصحيح مع DP ، من الضروري تحميل وحدة التشغيل USB في قلب النظام. قم بتشغيل الأمر بامتيازات مرتفعة:


 sudo modprobe usbserial vendor=0x0000 product=0x0131 

modprobe هو برنامج لإضافة وحدات إلى Linux kernel. usbserial هي وحدة kernel التي تحاكي منفذ COM على أجهزة USB. 0x - يعني التنسيق السداسي عشري.


نظرًا لأن لدي جهاز USB واحد متصل ، على نظام Linux ، فإنه يتلقى ملف ttyUSB0 تلقائيًا. هذه ميزة مهمة للتفاعل مع الأجهزة في Linux - العمل مع الجهاز كملف. يتم تخزين ملفات الجهاز في دليل /dev .


للعمل بشكل صحيح مع DP ، اضبط معدل نقل البيانات:


 stty -F /dev/ttyUSB0 9600 

stty - يقوم الأمر بتعيين معلمات الإدخال / الإخراج الطرفية للجهاز. -F هو الجهاز. في حالتنا ، عرض المشتري هو /dev/ttyUSB0 . ولهذا الجهاز ، تم ضبط سرعة 9600 باود.


يمكنك الآن محاولة عرض رسالة ترحيب (باللغة الإنجليزية حتى الآن):


 echo "Hello!" > /dev/ttyUSB0 

إذا تم كل شيء بشكل صحيح ، فستظهر رسالتنا على الشاشة. مزيد من التفاصيل حول الفريق أدناه.


2 المرحلة. برمجة


في المرحلة السابقة ، عرضنا رسالة باللغة الإنجليزية أعلى شاشة البداية بالجهاز. وانها ليست جميلة جدا.


لمسح شاشة العرض ، قم بتنفيذ الأمر:


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

أمر إخراج المحطة الطرفية. يشير الخيار -e - الذي يتيح دعم إخراج تسلسل الهروب ، -n - إلى أنه ليس من الضروري إخراج موجزات الأسطر. دخول -en مسموح به.


تسمى مجموعات الأحرف التي تتكون من شرطة مائلة للخلف \ متبوعة بحرف أو مجموعة من الأرقام ، تسلسل هروب.

0 - تقوم بمسح شاشة العرض وإلغاء وضع الخط ، 0b - تحريك المؤشر إلى الموضع العلوي الأيسر. الرمز > - التحكم في التدفق (إعادة توجيه الإخراج). في هذه الحالة ، يكون الملف / dev / ttyUSB0 لجهازنا . إذا قمت بتشغيل echo "Hello!" ، ثم يظهر النص المشار إليه بعلامات اقتباس في نافذة المحطة الطرفية.


بالمناسبة ، يمكن كتابة الأمر الذي يغير سرعة نقل البيانات إلى الجهاز على النحو التالي:


 stty 9600 < /dev/ttyUSB0 

حسنًا ، لعرض الرسائل باللغة الروسية ، قم بما يلي:


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

| - يعيد توجيه إخراج أمر واحد إلى مدخلات أخرى (خط أنابيب). في حالتنا ، تسلسل الأحرف "Hello!" لا يتم إخراجها إلى ملف الجهاز على الفور ، ولكن يتم نقلها إلى iconv الأداة المساعدة "التحويل". iconv - يحول من ترميز واحد إلى آخر.
يسمح لك bash shell ليس فقط بتنفيذ الأوامر مباشرة في الجهاز الطرفي ، ولكن أيضًا كتابة ملفات البرامج النصية.


البرنامج النصي هو ملف نصي عادي مع سلسلة من الأوامر المنفذة.

لكي يفهم bash أنه "خاص به" ، تتم الإشارة إلى #! / Bin / bash في بداية الملف. ولتنفيذ البرنامج النصي مباشرةً ، تحتاج إلى تشغيل الأمر:


 sudo chmod u+x namefile.sh 

حيث namefile.sh هو ملف البرنامج النصي. التمديد sh - يعني أنه ملف نصي bash. chmod هو برنامج لتغيير حقوق الوصول إلى الملفات والدلائل. u+x - يحدد الحق في تنفيذ الملف للمستخدم الحالي.


سنقوم بحل المشكلة مع اثنين من البرامج النصية. البرنامج النصي الأول هو البرنامج الرئيسي ( dispos.sh ). يعرض جميع المعلومات اللازمة على شاشة المشتري. الثانية - مساعدة ( parse.sh ) يتلقى بيانات الطقس ، خدمات اقتباس العملة ويكتب البيانات إلى ملفات وسيطة. يتم استخدام ملفات البيانات الوسيطة في البرنامج النصي الأول.


لكي تتمكن البرامج النصية من التشغيل ، يجب تشغيل الأوامر التالية:


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

لاحظ أنه +x فقط. هذه نسخة مختصرة من u+x .


تحتاج البرامج النصية إلى تشغيلها على فترات منتظمة. للقيام بذلك ، استخدم جدولة crontab القياسية. للتحرير ، استخدم الأمر:


 crontab -e 

أضف سطرين إلى المجدول:


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

يتم تشغيل البرنامج النصي parse.sh كل 20 دقيقة ، والبرنامج النصي dispos.sh كل دقيقة.


قبل العرض الأولي للعميل على الشاشة ، يجب أولاً تشغيل البرنامج النصي parse.sh ، والذي سيتلقى بيانات الطقس والعملة الأساسية.


 ./parse.sh 

بعد ذلك ، سأقدم النص الكامل مع تعليقات قصيرة.


وصف ملفات البرامج النصية


ملف 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}" 

تعليقات


لعرض التاريخ الحالي ، استخدم أمر date . مثال


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

بعد التنفيذ ، نحصل على تاريخ الاستمارة: 05/20/2019 12:11.


لحساب الوقت حتى نهاية اليوم ، نستخدم المتغير الإضافي TIME_OF_WORKDAY TIME_OF_WORKDAY="18:00:00" القيمة TIME_OF_WORKDAY="18:00:00" . حسنًا ، فإننا نحسب الساعات والدقائق حتى نهاية يوم العمل:


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

يشير الرمز $ إلى أنه متغير.
الرمز # تعليق.


date +%s - احصل على التاريخ والوقت الحاليين بالثواني.
date +%s --date=$TIME_OF_WORKDAY - احصل على الوقت بالثواني حتى TIME_OF_WORKDAY ("18:00:00") .


حساب الوقت حتى نهاية أسبوع العمل:


 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"` هو الوقت بالثواني من الوقت الحالي وحتى الجمعة الساعة 17:00:00.


يتم تنفيذ جزء من البرنامج النصي باستخدام وظائف. على سبيل المثال


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

disp_clear() هو اسم الوظيفة. في {} ، تتم الإشارة إلى الأوامر القابلة للتنفيذ.


المتغير DEV_DISPLAY هو "عام" ويتم تعيينه في بداية البرنامج النصي ووفقًا لذلك DEV_DISPLAY="/dev/ttyUSB0" .


قراءة البيانات من ملف ، على سبيل المثال سطر معين (1):


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

sed هو محرر نصوص يقوم بإجراء عمليات التحرير على المعلومات في دفق أو ملف إدخال قياسي. يعرض -n الخط المحدد حاليًا. '1{p;q}' - يطبع سطرًا واحدًا ويخرج دون قراءة الباقي ( p - print ، q - output).


خيار آخر للقراءة من ملف (سطرا بسطر):


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

وبالتالي DISPLAY_LINE1=${LINE1:0:14} من السطر LINE1 باستخراج سلسلة فرعية مكونة من 14 حرفًا تبدأ من 0.


يتم استبدال الحروف بمجموعة // ، على سبيل المثال ، DOLLAR//–/- . يتم استبدال الرمز "-" بالرمز "-".


ملف parse.sh


ملف 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 

تعليقات


يتيح لك الأمر wget تنزيل الملفات والصفحات وما إلى ذلك من الشبكة. الخيار -q - يعرض الحد الأدنى من المعلومات ، -O - يحفظ إلى الملف المحدد.


الأسطر أدناه تكتب إلى الملف:


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

علاوة على ذلك ، إذا تم استخدام إعادة توجيه دفق الإخراج إلى الملف > ، فستتم الكتابة فوق محتويات الملف ، وتستخدم >> إلحاق البيانات بالملف.


مثال على استخدام معلمة في دالة:


 conv 6 

مباشرة في الوظيفة:


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

حيث {1} هي المعلمة. تم تمرير الرقم 6.


انتبه إلى وظيفة استبدال السلسلة الفرعية المعقدة ، على سبيل المثال:


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

فقط "." وجميع الأرقام من 0 إلى 9.


خاتمة


في bash ، تتوفر جميع ميزات لغات البرمجة "العادية" تقريبًا. وبعض الفرق ، بالمقارنة مع نظائرها في 1C ، تفاجئ بسرورها ووظائفها.


في الوقت الحالي ، تعمل شاشة العميل بصفته لوحة إعلانات بشكل مطرد لأكثر من ستة أشهر.


قائمة الموارد


  1. صفحة عرض المشتري LPOS-VFD
  2. برنامج رموز العملات لعرض العملاء
  3. أساسيات BASH (الجزء الأول)
  4. أساسيات BASH (الجزء 2)
  5. كيفية استخدام المعجون
  6. لينكس محرر النص نانو للمبتدئين
  7. دليل لمستخدمي WinSCP

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


All Articles