Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Ҳама хонед

Мо, Виктор Антипов ва Илья Алешин, имрӯз дар бораи таҷрибаи кор бо дастгоҳҳои USB тавассути Python PyUSB ва каме дар бораи муҳандисии баръакс сӯҳбат хоҳем кард.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

prehistory

Дар соли 2019 Қарори Ҳукумати Федератсияи Русия № 224 «Дар бораи тасдиқи Қоидаҳои тамғагузории маҳсулоти тамоку бо воситаҳои ҳаммонандсозӣ ва хусусиятҳои татбиқи системаи давлатии иттилоотии мониторинги муомилоти молҳое, ки бояд тамғагузории ҳатмӣ дошта бошанд бо воситаҳои ҳаммонандсозӣ. нисбат ба махсулоти тамоку» эътибор пайдо кард.
Ҳуҷҷат тавзеҳ медиҳад, ки аз 1 июли соли 2019 истеҳсолкунандагон бояд ҳар як қуттии тамокуро тамғагузорӣ кунанд. Ва дистрибюторҳои мустақим бояд ин маҳсулотро бо иҷрои ҳуҷҷати интиқоли универсалӣ (UDD) гиранд. Магазинхо, дар навбати худ, бояд фуруши махсулоти тамга-дорро ба воситаи касса ба кайд гиранд.

Ҳамчунин, аз 1 июли соли 2020 муомилоти маҳсулоти тамокуи тамғанашуда манъ аст. Ин маънои онро дорад, ки ҳама қуттиҳои сигор бояд бо штрих-коди махсуси Datamatrix қайд карда шаванд. Гузашта аз ин - як нуқтаи муҳим - маълум шуд, ки Datamatrix оддӣ нест, балки баръакс. Яъне, на рамзи сиёҳ дар сафед, балки баръакс.

Мо сканерҳои худро санҷидем ва маълум шуд, ки аксари онҳо бояд дубора навсозӣ/омӯзонида шаванд, вагарна онҳо бо ин штрих-код ба таври оддӣ кор карда наметавонанд. Ин гардиши ҳодисаҳо ба мо дарди сари сахтро кафолат дод, зеро ширкати мо мағозаҳои зиёде дорад, ки дар қаламрави васеъ паҳн шудаанд. Якчанд даҳҳо ҳазор мошинҳои хазинавӣ - ва вақти хеле кам.

Чӣ бояд кард? Ду вариант вуҷуд дорад. Якум: муҳандисони макон сканерҳоро дастӣ бозсозӣ ва танзим мекунанд. Дуюм: мо ба таври фосилавӣ кор мекунем ва беҳтараш бисёр сканерҳоро якбора дар як такрор фаро мегирем.

Варианти якум, аз афташ, ба мо мувофик набуд: мо лозим меомад, ки барои мехмонони инженерон пул сарф кунем ва дар ин сурат назорат ва мутобик кардани процесс душвор мебуд. Аммо аз ҳама муҳимаш ин аст, ки одамон кор мекарданд, яъне мо эҳтимолан ба хатогиҳои зиёд роҳ меёфтем ва ба эҳтимоли зиёд ба мӯҳлати муқарраршуда ҷавобгӯ намебошем.

Варианти дуюм барои ҳама хуб аст, агар барои як чиз набошад. Баъзе фурӯшандагон асбобҳои дурахши дурахширо, ки барои ҳамаи системаҳои оператсионии зарурӣ лозим буданд, надоштанд. Ва азбаски мӯҳлатҳо тамом мешуданд, ман маҷбур будам бо сари худ фикр кунам.

Минбаъд, мо ба шумо мегӯям, ки чӣ тавр мо асбобҳоро барои сканерҳои дастӣ барои OS Debian 9.x таҳия кардем (ҳамаи мошинҳои хазинадории мо дар Debian ҳастанд).

Муамморо ҳал кунед: чӣ гуна сканерро дурахш кардан мумкин аст

Виктор Антипов хабар медихад.

Утилитаи расмии аз ҷониби фурӯшанда пешниҳодшуда дар зери Windows ва танҳо бо IE кор мекунад. Утилита метавонад сканерро флешдор ва танзим кунад.

Азбаски системаи ҳадафи мо Debian аст, мо сервери масири USB-ро дар Debian ва мизоҷи масири USB-ро дар Windows насб кардем. Бо истифода аз utilities usb-redirector, мо сканерро аз мошини Linux ба мошини Windows интиқол додем.

Утилита аз фурӯшандаи Windows сканерро дид ва ҳатто онро ба таври муқаррарӣ дурахшид. Ҳамин тариқ, мо хулосаи аввал баровардем: ҳеҷ чиз аз ОС вобаста нест, сухан дар бораи протоколи дурахшанда аст.

ДУРУСТ. Мо дурахшро дар мошини Windows иҷро кардем ва партовро дар мошини Linux хориҷ кардем.

Мо партовгоҳро ба WireShark пур кардем ва... ғамгин шудем (ман баъзе ҷузъиёти партовҳоро сарфи назар мекунам, онҳо ҳеҷ гуна манфиат надоранд).

Чизе, ки партов ба мо нишон дод:

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Суроғаҳои 0000-0030, аз рӯи Wireshark, маълумоти хидматрасонии USB мебошанд.

Мо ба қисми 0040-0070 таваҷҷӯҳ доштем.

Аз як чаҳорчӯбаи интиқол чизе ба ҷуз аломатҳои MOCFT равшан набуд. Ин аломатҳо аломатҳои файли нармафзори миёнаравӣ ва инчунин аломатҳои боқимонда то охири чаҳорчӯба буданд (файли нармафзор таъкид карда мешавад):

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Рамзхои fd 3e 02 01 fe чи маъно доранд, ман шахсан мисли Илья намедонистам.

Ман ба чаҳорчӯбаи зерин назар кардам (маълумоти хидмат дар ин ҷо нест карда шудааст, файли нармафзори нармафзор таъкид шудааст):

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Чӣ равшан шуд? Ки ду байти аввал як навъ доимист. Ҳамаи блокҳои минбаъда инро тасдиқ карданд, аммо пеш аз ба охир расидани блоки интиқол:

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Ин чаҳорчӯба низ ҳайратовар буд, зеро константа тағир ёфтааст (таъйид шудааст) ва аҷиб он аст, ки як қисми файл мавҷуд буд. Андозаи байтҳои интиқолёфтаи файл нишон дод, ки 1024 байт интиқол дода шудааст. Ман боз намедонистам, ки байтҳои боқимонда чӣ маъно доранд.

Пеш аз ҳама, ҳамчун лақаби кӯҳнаи BBS, ман протоколҳои интиқоли стандартиро баррасӣ кардам. Ягон протокол 1024 байт интиқол дода нашудааст. Ман ба омӯзиши сахтафзор шурӯъ кардам ва бо протоколи 1K Xmodem дучор омадам. Он имкон дод, ки 1024 интиқол дода шавад, аммо бо огоҳӣ: дар аввал танҳо 128 ва танҳо дар сурати мавҷуд набудани хатогиҳо, протокол шумораи байтҳои интиқолшударо зиёд кард. Ман фавран интиқоли 1024 байт доштам. Ман тасмим гирифтам, ки протоколҳои интиқол ва махсусан X-модемро омӯзам.

Ду варианти модем вуҷуд дошт.

Аввалан, формати бастаи XMODEM бо дастгирии CRC8 (XMODEM аслии):

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Дуюм, формати бастаи XMODEM бо дастгирии CRC16 (XmodemCRC):

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Чунин ба назар мерасад, ба истиснои SOH, рақами баста ва CRC ва дарозии баста.

Ман ба оғози блоки дуюми интиқол нигоҳ кардам (ва бори дигар файли нармафзорро дидам, аммо аллакай бо 1024 байт дохил карда шудааст):

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Ман сарлавҳаи шиноси fd 3e 02-ро дидам, аммо ду байтҳои оянда аллакай тағир ёфта буданд: он 01 fe буд ва 02 fd шуд. Баъд ман пайхас кардам, ки блоки дуюм акнун 02 раќамдор шудааст ва ба њамин тавр фањмидам: дар пеши назари ман раќами блоки трансмиссионӣ буд. Аввалин фишанги 1024 01, дуюм 02, сеюм 03 ва ғайра (аммо дар шонздаҳӣ, албатта). Аммо тағирот аз fe ба fd чӣ маъно дорад? Чашмҳо 1 коҳишро диданд, майна хотиррасон кард, ки барномасозон аз 0 ҳисоб мекунанд, на 1. Аммо пас чаро блоки аввал 1 аст, на 0? Ман то ҳол ба ин савол ҷавоб наёфтаам. Аммо ман фаҳмидам, ки блоки дуюм чӣ гуна ҳисоб карда мешавад. Блоки дуюм чизе беш аз FF нест - (минус) шумораи блоки якум. Ҳамин тариқ, блоки дуюм ҳамчун = 02 (FF-02) = 02 FD таъин карда шуд. Хониши минбаъдаи партовгоҳ тахмини маро тасдиқ кард.

Пас аз он тасвири зерини интиқол пайдо шуд:

Оғози интиқол
fd 3e 02 - Оғоз
01 FE – ҳисобкунаки интиқол
Интиқол (34 блок, 1024 байт интиқол дода шудааст)
fd 3e 1024 байт маълумот (ба блокҳои 30 байт тақсим карда мешавад).
Анҷоми интиқол
fd 25

Маълумоти боқимонда бояд ба 1024 байт мувофиқ карда шавад.

Чаҳорчӯбаи охири интиқоли блок чӣ гуна аст:

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

fd 25 - сигнал барои анҷоми интиқоли блок. Оянда 2f 52 - қисми боқимондаи файл то 1024 байт андозаи. 2f 52, мувофиқи протокол, маблағи санҷиши 16-битии CRC аст.

Ба хотири замонҳои қадим, ман дар C барномае сохтам, ки аз файл 1024 байт гирифта, CRC-и 16-битро ҳисоб мекард. Оғози барнома нишон дод, ки ин CRC 16-бит нест. Боз stupor - тақрибан се рӯз. Ҳама вақт ман кӯшиш мекардам, ки бифаҳмам, ки ин чӣ метавонад бошад, агар маблағи назоратӣ набошад. Ҳангоми омӯзиши сайтҳои инглисизабон ман фаҳмидам, ки X-модем ҳисобкунии маблағи назоратии худ - CRC-CCITT (XModem) -ро истифода мебарад. Ман ягон татбиқи C-и ин ҳисобкуниро наёфтам, аммо ман сайтеро пайдо кардам, ки ин маблағи чекро онлайн ҳисоб кардааст. Пас аз интиқоли 1024 байт файли ман ба саҳифаи интернетӣ, сайт ба ман маблағи чекро нишон дод, ки ба маблағи чеки файл комилан мувофиқ аст.

Ура! Муаммои охирин ҳал карда шуд, акнун ба ман лозим буд, ки нармафзори худамро созам. Баъдан, ман дониши худро (ва он танҳо дар сари ман боқӣ монд) ба Иля, ки бо асбоби пурқуввати Python шинос аст, додам.

Эҷоди барнома

Илья Алешин хабар медихад.

Пас аз гирифтани дастурҳои мувофиқ, ман хеле "хушбахт" будам.

Аз куҷо сар кардан? Дуруст, аз аввал.  Аз гирифтани партов аз порти USB.

USB-pcap-ро оғоз кунед https://desowin.org/usbpcap/tour.html

Портеро, ки дастгоҳ ба он пайваст аст ва файлеро, ки мо партовро захира мекунем, интихоб кунед.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Мо сканерро ба мошине пайваст мекунем, ки дар он нармафзори аслии EZConfigScanning барои Windows насб шудааст.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Дар он мо ҷузъро барои фиристодани фармонҳо ба дастгоҳ пайдо мекунем. Аммо дар бораи дастаҳо чӣ гуфтан мумкин аст? Ман онҳоро аз куҷо гирифта метавонам?
Вақте ки барнома оғоз меёбад, таҷҳизот ба таври худкор пурсиш карда мешавад (мо инро каме дертар хоҳем дид). Ва штрих-кодҳои омӯзишӣ аз ҳуҷҷатҳои таҷҳизоти расмӣ мавҷуданд. DEFALT. Ин дастаи мост.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Маълумоти зарурӣ гирифта шудааст. dump.pcapро тавассути wireshark кушоед.

Ҳангоми оғоз кардани EZConfigScanning блок кунед. Ҷойҳое, ки шумо бояд ба онҳо диққат диҳед, бо ранги сурх қайд карда шудаанд.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Хамаи инро бори аввал дида дилам гум шуд. Маълум нест, ки минбаъд дар куҷо кобед.

Каме ҳуҷум ва-ва-ва... Аҳа! Дар партовгоҳ берун аз - аст, inва in ин берун аз.

Ман дар Google ҷустуҷӯ кардам, ки URB_INTERRUPT чист. Ман фаҳмидам, ки ин усули интиқоли маълумот аст. Ва 4 чунин усул вуҷуд дорад: назорат, қатъ, изохронӣ, оммавӣ. Шумо метавонед дар бораи онҳо алоҳида хонед.

Ва суроғаҳои ниҳоиро дар интерфейси дастгоҳи USB метавон тавассути фармони "lsusb –v" ё бо истифода аз pyusb дастрас кард.

Ҳоло мо бояд ҳамаи дастгоҳҳоро бо ин VID пайдо кунем. Шумо метавонед махсус тавассути VID: PID ҷустуҷӯ кунед.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Чунин ба назар мерасад:

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Ҳамин тавр, мо маълумоти зарурӣ дорем: фармонҳои P_INFO. ё DEFALT, суроғаҳо дар куҷо навиштани фармонҳои endpoint=03 ва аз куҷо гирифтани ҷавоби ниҳоӣ=86. Ҳама чизи боқимонда табдил додани фармонҳоро ба шонздаҳӣ аст.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Азбаски мо аллакай дастгоҳро ёфтаем, биёед онро аз ядро ​​ҷудо кунем...

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

...ва ба нуқтаи ниҳоӣ бо суроғаи 0x03 нависед,

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

... ва сипас посухро аз нуқтаи ниҳоӣ бо суроғаи 0x86 хонед.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Ҷавоби сохторӣ:

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

Мо ин маълумотро дар dump.pcap мебинем.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Аҷоиб! Штрих-кодҳои системаро ба шонздаҳӣ табдил диҳед. Ин аст, функсияи омӯзиш омода аст.

Дар бораи нармафзори нармафзор чӣ гуфтан мумкин аст? Ба назар чунин мерасад, ки ҳама чиз якхела аст, аммо як нозуки вуҷуд дорад.

Пас аз гирифтани партовҳои пурраи раванди дурахш, мо тақрибан фаҳмидем, ки мо бо чӣ кор карда истодаем. Ин аст мақолае дар бораи XMODEM, ки дар фаҳмидани он ки ин муошират чӣ гуна рух медиҳад, ҳарчанд дар маҷмӯъ, хеле муфид буд: http://microsin.net/adminstuff/others/xmodem-protocol-overview.html Ман онро хондан тавсия медиҳам.

Ба партов нигоҳ карда, шумо мебинед, ки андозаи чаҳорчӯба 1024 ва андозаи URB-маълумот 64 аст.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Бинобар ин – 1024/64 – мо дар як блок 16 сатр мегирем, файли нармафзорро дар як вақт 1 аломат мехонем ва блок ташкил мекунем. Мукаммал кардани 1 сатр дар блок бо аломатҳои махсус fd3e02 + рақами блок.
14 сатри навбатӣ бо fd25 + илова карда мешавад, бо истифода аз XMODEM.calc_crc() мо маблағи назоратии тамоми блокро ҳисоб мекунем (барои фаҳмидани он, ки “FF – 1” CSUM аст, вақти зиёд лозим буд) ва хати охирин, 16-ум илова карда мешавад. бо fd3e.

Чунин ба назар мерасад, ки ин ҳама аст, файли нармафзорро хонед, блокҳоро пахш кунед, сканерро аз ядро ​​ҷудо кунед ва онро ба дастгоҳ фиристед. Аммо ин чандон оддӣ нест. Сканер бояд ба ҳолати миёнаравӣ гузаронида шавад,
отправив ему NEWAPP = ‘\xfd\x0a\x16\x4e\x2c\x4e\x45\x57\x41\x50\x50\x0d’.
Ин даста аз куҷост?? Аз партовгоҳ.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Аммо мо наметавонем блоки пурраро ба сканер бо сабаби маҳдудияти 64 ирсол кунем:

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Хуб, сканер дар ҳолати дурахши NEWAPP шонздаҳиро қабул намекунад. Аз ин рӯ, шумо бояд ҳар як сатри bytes_array-ро тарҷума кунед

[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]

Ва он гоҳ ин маълумотро ба сканер фиристед.

Мо ҷавоб мегирем:

[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]

Агар шумо мақоларо дар бораи XMODEM тафтиш кунед, маълум мешавад: маълумот қабул карда шудааст.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Пас аз интиқоли ҳама блокҳо, мо интиқолро анҷом медиҳем END_TRANSFER = 'xfdx01x04'.

Хуб, азбаски ин блокҳо барои одамони оддӣ ягон маълумот надоранд, мо бо нобаёнӣ нармафзорро дар ҳолати пинҳонӣ насб мекунем. Ва танҳо дар ҳолате, мо тавассути tqdm як сатри пешрафт ташкил хоҳем кард.

Вазифа барои таҳиягар ё чӣ гуна мо сканерҳои дастиро бе фурӯшанда дурахш кардем

Дар асл, он гоҳ ин як чизи хурд аст. Танҳо он боқӣ мемонад, ки ҳалли онро дар скриптҳо барои такрори оммавӣ дар вақти аниқ муайяншуда печонед, то раванди кор дар кассаҳоро суст накунад ва ба қайдгири илова карда шавад.

Натиҷа

Ваќту саъю кўшиши зиёд ва мӯи сари худро сарф карда, мо тавонистем ҳалли заруриро таҳия кунем ва инчунин мӯҳлати муқарраршударо иҷро кунем. Ҳамзамон, сканерҳо ҳоло ба таври мутамарказ навсозӣ ва бозомӯзӣ шудаанд, мо тамоми равандро ба таври возеҳ назорат мекунем. Ширкат вақт ва маблағро сарфа кард ва мо дар таҷҳизоти ин гуна муҳандисии баръакс таҷрибаи бебаҳо ба даст овардем.

Манбаъ: will.com

Илова Эзоҳ