Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Hammaga salom.

Biz, Viktor Antipov va Ilya Aleshin, bugun Python PyUSB orqali USB qurilmalari bilan ishlash tajribamiz va teskari muhandislik haqida bir oz gaplashamiz.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Sana oldin

2019 yilda Rossiya Federatsiyasi Hukumatining 224-sonli "Tamaki mahsulotlarini identifikatsiyalash vositalari bilan markalash qoidalarini va identifikatsiya vositalari bilan majburiy tamg'alanishi kerak bo'lgan tovarlar aylanishini monitoring qilish davlat axborot tizimini joriy etish xususiyatlarini tasdiqlash to'g'risida" gi qarori. tamaki mahsulotlariga nisbatan” qonuni kuchga kirdi.
Hujjatda tushuntirilishicha, 1-yil 2019-iyuldan boshlab ishlab chiqaruvchilar har bir tamaki qutisiga yorliq qo‘yishlari shart. Va to'g'ridan-to'g'ri distribyutorlar ushbu mahsulotlarni universal uzatish hujjati (UDD) bilan olishlari kerak. Do‘konlar, o‘z navbatida, yorliqli mahsulotlar savdosini kassa apparati orqali ro‘yxatdan o‘tkazishi kerak.

Shuningdek, 1-yil 2020-iyuldan boshlab etiketlanmagan tamaki mahsulotlarini muomalaga kiritish taqiqlanadi. Bu shuni anglatadiki, barcha sigaret qutilari maxsus Datamatrix shtrix-kodi bilan belgilanishi kerak. Bundan tashqari - muhim nuqta - Datamatrix oddiy emas, balki teskari bo'lishi ma'lum bo'ldi. Ya'ni, oq rangdagi qora kod emas, aksincha.

Biz skanerlarimizni sinab ko'rdik va ularning ko'pchiligini qayta tiklash/qayta tayyorlash kerakligi ma'lum bo'ldi, aks holda ular bu shtrix-kod bilan normal ishlay olmaydi. Voqealarning bu burilishi bizga qattiq bosh og'rig'ini kafolatladi, chunki bizning kompaniyamiz keng hududda tarqalgan ko'plab do'konlarga ega. Bir necha o'n minglab kassa apparatlari - va juda oz vaqt.

Nima qilish kerak edi? Ikkita variant mavjud. Birinchisi: saytdagi muhandislar skanerlarni qo'lda qaytaradi va sozlaydi. Ikkinchidan: biz masofadan ishlaymiz va afzalroq, bir iteratsiyada bir vaqtning o'zida bir nechta skanerlarni qamrab olamiz.

Birinchi variant, shubhasiz, biz uchun mos emas edi: biz muhandislarga tashrif buyurish uchun pul sarflashimiz kerak edi va bu holda jarayonni nazorat qilish va muvofiqlashtirish qiyin bo'ladi. Ammo eng muhimi, odamlar ishlashi, ya'ni biz juda ko'p xatolarga yo'l qo'yishimiz mumkin va, ehtimol, belgilangan muddatga to'g'ri kelmasligi mumkin.

Ikkinchi variant, agar bitta narsa bo'lmasa, hamma uchun yaxshi. Ba'zi sotuvchilarda barcha kerakli operatsion tizimlar uchun zarur bo'lgan masofadan miltillovchi vositalar yo'q edi. Muddatlar tugab borayotgani uchun men o'z boshim bilan o'ylashga majbur bo'ldim.

Keyinchalik, biz sizga Debian 9.x OS uchun qo'lda skanerlar uchun vositalarni qanday ishlab chiqqanimizni aytib beramiz (barcha kassa apparatlarimiz Debian-da joylashgan).

Topishmoqni hal qiling: skanerni qanday yoqish kerak

Bu haqda Viktor Antipov xabar bermoqda.

Sotuvchi tomonidan taqdim etilgan rasmiy yordam dasturi Windows ostida va faqat IE bilan ishlaydi. Yordamchi dastur skanerni miltillashi va sozlashi mumkin.

Bizning maqsadli tizimimiz Debian bo'lgani uchun biz Debian-da usb-qayta yo'naltiruvchi serverni va Windows-da usb-qayta yo'naltiruvchi mijozni o'rnatdik. Usb-redirector yordam dasturlari yordamida biz skanerni Linux mashinasidan Windows mashinasiga uzatdik.

Windows sotuvchisining yordamchi dasturi skanerni ko'rdi va hatto uni odatdagidek yondirdi. Shunday qilib, biz birinchi xulosaga keldik: hech narsa operatsion tizimga bog'liq emas, bu miltillovchi protokol masalasi.

KELISHDIKMI. Biz Windows mashinasida miltillashni ishga tushirdik va Linux mashinasida axlatni olib tashladik.

Biz chiqindixonani WireShark-ga to'ldirdik va ... xafa bo'ldik (men axlatxonaning ba'zi tafsilotlarini o'tkazib yuboraman, ular hech qanday qiziqish uyg'otmaydi).

Chiqindixona bizga nimani ko'rsatdi:

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Wireshark tomonidan baholangan 0000-0030 manzillari USB xizmati haqida ma'lumotdir.

Bizni 0040-0070 qismi qiziqtirdi.

MOCFT belgilaridan tashqari bitta uzatish ramkasidan hech narsa aniq emas edi. Ushbu belgilar proshivka faylidagi belgilar, shuningdek, ramkaning oxirigacha qolgan belgilar (proshivka fayli ta'kidlangan) bo'lib chiqdi:

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Fd 3e 02 01 fe belgilari nimani anglatishini men shaxsan Ilya kabi bilmasdim.

Men quyidagi ramkaga qaradim (xizmat ma'lumotlari bu erda o'chirildi, proshivka fayli ta'kidlangan):

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Nima aniq bo'ldi? Birinchi ikki bayt qandaydir doimiydir. Barcha keyingi bloklar buni tasdiqladi, lekin uzatish blokining tugashidan oldin:

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Bu ramka ham hayratlanarli edi, chunki doimiy o'zgargan (ta'kidlangan) va, g'alati, faylning bir qismi bor edi. Faylning uzatilgan baytlari hajmi 1024 bayt uzatilganligini ko'rsatdi. Qolgan baytlar nimani anglatishini yana bilmadim.

Avvalo, eski BBS taxallusi sifatida men standart uzatish protokollarini ko'rib chiqdim. Hech qanday protokol 1024 baytni uzatmadi. Men apparatni o'rganishni boshladim va 1K Xmodem protokoliga duch keldim. Bu 1024 ni uzatishga imkon berdi, ammo ogohlantirish bilan: dastlab faqat 128 ta, va agar xato bo'lmasa, protokol uzatilgan baytlar sonini oshirdi. Men darhol 1024 baytni o'tkazdim. Men uzatish protokollarini, xususan, X-modemni o'rganishga qaror qildim.

Modemning ikkita varianti mavjud edi.

Birinchidan, CRC8 qo'llab-quvvatlanadigan XMODEM paket formati (asl XMODEM):

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Ikkinchidan, CRC16 qo'llab-quvvatlanadigan XMODEM paket formati (XmodemCRC):

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

SOH, paket raqami va CRC va paket uzunligidan tashqari, u o'xshash ko'rinadi.

Men ikkinchi uzatish blokining boshiga qaradim (va yana proshivka faylini ko'rdim, lekin allaqachon 1024 bayt bilan chegaralangan):

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Men tanish fd 3e 02 sarlavhasini ko'rdim, lekin keyingi ikki bayt allaqachon o'zgargan: u 01 fe edi va 02 fd bo'ldi. Keyin men ikkinchi blok endi 02 raqamlanganligini payqadim va shunday tushundim: mening oldimda transmissiya blokining raqamlanishi bor edi. Birinchi 1024 vites - 01, ikkinchisi - 02, uchinchisi - 03 va boshqalar (lekin olti burchakli, albatta). Lekin fe dan fd ga o'zgarish nimani anglatadi? Ko'zlar 1 ga kamayganini ko'rdi, miya dasturchilar 0 emas, 1 dan hisoblashlarini eslatdi. Lekin nega birinchi blok 1 emas, balki 0? Haligacha bu savolga javob topolmadim. Lekin men ikkinchi blok qanday hisoblanganini tushundim. Ikkinchi blok FF dan boshqa narsa emas - (minus) birinchi blokning soni. Shunday qilib, ikkinchi blok = 02 (FF-02) = 02 FD sifatida belgilandi. Chiqindilarni keyingi o'qish mening taxminimni tasdiqladi.

Keyin uzatishning quyidagi surati paydo bo'la boshladi:

Uzatish boshlanishi
fd 3e 02 - Boshlash
01 FE - uzatish hisoblagichi
O'tkazish (34 blok, 1024 bayt uzatildi)
fd 3e 1024 bayt ma'lumot (30 bayt bloklarga bo'lingan).
Translyatsiyaning tugashi
fd 25

Qolgan ma'lumotlar 1024 baytga tenglashtiriladi.

Blokni uzatish so'nggi ramkasi qanday ko'rinishga ega:

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

fd 25 - blokni uzatishni tugatish uchun signal. Keyingi 2f 52 - hajmi 1024 baytgacha bo'lgan faylning qolgan qismi. 2f 52, protokolga ko'ra, 16 bitli CRC nazorat summasi.

Qadimgi vaqtlar uchun men C tilida fayldan 1024 baytni tortib olgan va 16 bitli CRCni hisoblaydigan dastur yaratdim. Dasturni ishga tushirish bu 16 bitli CRC emasligini ko'rsatdi. Yana stupor - taxminan uch kun. Bu vaqt davomida men nazorat summasi bo'lmasa, nima bo'lishi mumkinligini tushunishga harakat qildim. Ingliz tilidagi saytlarni o'rganayotib, men X-modem o'zining nazorat summasini hisoblashdan foydalanishini aniqladim - CRC-CCITT (XModem). Men ushbu hisob-kitobning hech qanday C ilovasini topmadim, lekin men ushbu nazorat summasini onlayn hisoblagan saytni topdim. Mening faylimning 1024 baytini veb-sahifaga o'tkazgandan so'ng, sayt menga fayldagi nazorat summasiga to'liq mos keladigan nazorat summasini ko'rsatdi.

Xayr! Oxirgi topishmoq hal qilindi, endi men o'zimning dasturiy ta'minotimni yaratishim kerak edi. Keyin men o'z bilimlarimni (va u faqat mening boshimda qoldi) kuchli Python asboblar to'plami bilan tanish bo'lgan Ilyaga berdim.

Dastur yaratish

Bu haqda Ilya Aleshin xabar bermoqda.

Tegishli ko'rsatmalarni olgach, men juda xursand bo'ldim.

Qayerdan boshlash kerak? To'g'ri, boshidanoq.  USB portidan dump olishdan.

USB-pcap-ni ishga tushiring https://desowin.org/usbpcap/tour.html

Qurilma ulangan portni va biz dumpni saqlaydigan faylni tanlang.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Biz skanerni Windows uchun mahalliy EZConfigScanning dasturi o'rnatilgan mashinaga ulaymiz.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Unda biz qurilmaga buyruqlar yuborish uchun elementni topamiz. Ammo jamoalar haqida nima deyish mumkin? Ularni qayerdan olsam bo'ladi?
Dastur boshlanganda, uskuna avtomatik ravishda so'raladi (biz buni birozdan keyin ko'ramiz). Va rasmiy jihoz hujjatlaridan o'quv shtrix kodlari bor edi. MUHIM. Bu bizning jamoamiz.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Kerakli ma'lumotlar olindi. Wireshark orqali dump.pcap faylini oching.

EZConfigScanning ishga tushganda blokirovka qiling. E'tibor berishingiz kerak bo'lgan joylar qizil rang bilan belgilangan.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Bularning barchasini birinchi marta ko'rib, ko'nglim yo'qoldi. Keyinchalik qaerga qazish kerakligi aniq emas.

Bir oz aqliy hujum va-va-va... Aha! Axlatxonada tashqarida - deb inva in u tashqarida.

URB_INTERRUPT nima ekanligini googledan qidirdim. Men bu ma'lumotlarni uzatish usuli ekanligini bilib oldim. Va shunday 4 ta usul mavjud: nazorat, uzilish, izoxron, ommaviy. Siz ular haqida alohida o'qishingiz mumkin.

USB qurilma interfeysidagi so'nggi nuqta manzillarini "lsusb –v" buyrug'i yoki pyusb yordamida olish mumkin.

Endi biz ushbu VID bilan barcha qurilmalarni topishimiz kerak. Siz maxsus VID:PID orqali qidirishingiz mumkin.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Bu shunday ko'rinadi:

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Shunday qilib, bizda kerakli ma'lumotlar mavjud: P_INFO buyruqlari. yoki DEFALT, buyruqlar qayerga yozilishi kerak endpoint=03 va javob so'nggi nuqtasi=86 qaerdan olinadi. Qolgan narsa buyruqlarni hexga aylantirishdir.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Qurilmani allaqachon topib olganimiz uchun uni yadrodan uzamiz...

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

... va 0x03 manzili bilan oxirgi nuqtaga yozing,

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

... va keyin 0x86 manzili bilan oxirgi nuqtadan javobni o'qing.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Strukturaviy javob:

P_INFOfmt: 1
mode: app
app-present: 1
boot-present: 1
hw-sn: 18072B44CA
hw-rev: 0x20
cbl: 4
app-sw-rev: CP000116BBA
boot-sw-rev: CP000014BAD
flash: 3
app-m_name: Voyager 1450g
boot-m_name: Voyager 1450g
app-p_name: 1450g
boot-p_name: 1450g
boot-time: 16:56:02
boot-date: Oct 16 2014
app-time: 08:49:30
app-date: Mar 25 2019
app-compat: 289
boot-compat: 288
csum: 0x6986

Biz bu ma'lumotlarni dump.pcap da ko'ramiz.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Ajoyib! Tizim shtrix kodlarini hexga aylantiring. Mana, o'quv funksiyasi tayyor.

Mikrodastur haqida nima deyish mumkin? Hamma narsa bir xil bo'lib tuyuladi, lekin bir nuance bor.

Miltillash jarayonini to'liq tashlab, biz nima bilan shug'ullanayotganimizni taxminan tushundik. XMODEM haqidagi maqola, umumiy ma'noda bo'lsa ham, ushbu aloqa qanday sodir bo'lishini tushunishda juda foydali bo'ldi: http://microsin.net/adminstuff/others/xmodem-protocol-overview.html Men uni o'qishni tavsiya qilaman.

Dampga qarab, siz ramka o'lchami 1024, URB-ma'lumotlar hajmi esa 64 ekanligini ko'rishingiz mumkin.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Shuning uchun - 1024/64 - biz blokda 16 ta satr olamiz, proshivka faylini bir vaqtning o'zida 1 belgidan o'qiymiz va blok hosil qilamiz. Blokdagi 1 qatorni maxsus belgilar fd3e02 + blok raqami bilan to'ldirish.
Keyingi 14 satr fd25 + bilan to'ldiriladi, XMODEM.calc_crc() yordamida biz butun blokning nazorat summasini hisoblaymiz ("FF - 1" CSUM ekanligini tushunish uchun ko'p vaqt kerak bo'ldi) va oxirgi, 16-qator to'ldiriladi fd3e bilan.

Bu shunday tuyuladi, proshivka faylini o'qing, bloklarni bosing, skanerni yadrodan ajratib oling va uni qurilmaga yuboring. Lekin bu unchalik oddiy emas. Skanerni proshivka rejimiga o'tkazish kerak,
отправив ему NEWAPP = ‘\xfd\x0a\x16\x4e\x2c\x4e\x45\x57\x41\x50\x50\x0d’.
Bu jamoa qayerdan? Axlatxonadan.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Ammo 64 chegarasi tufayli biz butun blokni skanerga yubora olmaymiz:

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Xo'sh, NEWAPP miltillovchi rejimidagi skaner hexni qabul qilmaydi. Shuning uchun, har bir satr bayt_massivini tarjima qilishingiz kerak bo'ladi

[253, 10, 22, 78, 44, 78, 69, 87, 65, 80, 80, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Va keyin bu ma'lumotlarni skanerga yuboring.

Javobni olamiz:

[2, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Agar siz XMODEM haqidagi maqolani tekshirsangiz, bu aniq bo'ladi: ma'lumotlar qabul qilingan.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Barcha bloklar o'tkazilgandan so'ng, biz uzatishni yakunlaymiz END_TRANSFER = 'xfdx01x04'.

Xo'sh, bu bloklar oddiy odamlar uchun hech qanday ma'lumotga ega emasligi sababli, biz proshivkani yashirin rejimda sukut bo'yicha o'rnatamiz. Va har qanday holatda, biz tqdm orqali taraqqiyot panelini tashkil qilamiz.

Ishlab chiquvchi uchun vazifa yoki biz sotuvchisiz qo'lda skanerlarni qanday yoritdik

Aslida, bu kichik narsalar masalasidir. Qolgan yagona narsa, kassalarda ishlash jarayonini sekinlashtirmaslik va jurnalni qo'shish uchun aniq belgilangan vaqtda ommaviy replikatsiya uchun skriptlarga yechimni o'rashdir.

Xulosa

Ko'p vaqt va kuch va sochlarni boshimizga sarflab, biz kerakli echimlarni ishlab chiqishga muvaffaq bo'ldik, shuningdek, belgilangan muddatga erishdik. Shu bilan birga, skanerlar endi markazlashtirilgan tarzda qayta tiklandi va qayta o'qitiladi, biz butun jarayonni aniq nazorat qilamiz. Kompaniya vaqt va pulni tejaydi va biz ushbu turdagi teskari muhandislik uskunalarida bebaho tajribaga ega bo'ldik.

Manba: www.habr.com

a Izoh qo'shish