Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Γεια σε όλους.

Εμείς, ο Viktor Antipov και ο Ilya Aleshin, σήμερα θα μιλήσουμε για την εμπειρία μας από την εργασία με συσκευές USB μέσω Python PyUSB και λίγο για την αντίστροφη μηχανική.

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Ιστορικό

Το 2019, το διάταγμα της κυβέρνησης της Ρωσικής Ομοσπονδίας αριθ. σε σχέση με τα προϊόντα καπνού» τέθηκε σε ισχύ.
Το έγγραφο εξηγεί ότι από την 1η Ιουλίου 2019, οι κατασκευαστές υποχρεούνται να επισημαίνουν κάθε συσκευασία καπνού. Και οι άμεσοι διανομείς πρέπει να λαμβάνουν αυτά τα προϊόντα με την εκτέλεση ενός εγγράφου καθολικής μεταφοράς (UDD). Τα καταστήματα, με τη σειρά τους, πρέπει να καταχωρούν την πώληση προϊόντων με ετικέτα μέσω της ταμειακής μηχανής.

Επίσης, από την 1η Ιουλίου 2020, απαγορεύεται η κυκλοφορία των προϊόντων καπνού χωρίς ετικέτα. Αυτό σημαίνει ότι όλα τα πακέτα τσιγάρων πρέπει να φέρουν ειδικό γραμμωτό κώδικα Datamatrix. Επιπλέον - ένα σημαντικό σημείο - αποδείχθηκε ότι το Datamatrix δεν θα είναι συνηθισμένο, αλλά αντίστροφο. Δηλαδή όχι μαύρος κώδικας στο λευκό, αλλά το αντίστροφο.

Δοκιμάσαμε τους σαρωτές μας και αποδείχθηκε ότι οι περισσότεροι από αυτούς πρέπει να ανανεωθούν/εκπαιδευτούν, διαφορετικά απλά δεν μπορούν να λειτουργήσουν κανονικά με αυτόν τον γραμμωτό κώδικα. Αυτή η εξέλιξη των γεγονότων μας εγγυήθηκε έναν σοβαρό πονοκέφαλο, επειδή η εταιρεία μας έχει πολλά καταστήματα που είναι διάσπαρτα σε μια τεράστια περιοχή. Αρκετές δεκάδες χιλιάδες ταμειακές μηχανές – και πολύ λίγος χρόνος.

Τι έπρεπε να γίνει; Υπάρχουν δύο επιλογές. Πρώτον: οι επιτόπιοι μηχανικοί ανανεώνουν και προσαρμόζουν χειροκίνητα τους σαρωτές. Δεύτερον: εργαζόμαστε εξ αποστάσεως και, κατά προτίμηση, καλύπτουμε πολλούς σαρωτές ταυτόχρονα σε μία επανάληψη.

Η πρώτη επιλογή, προφανώς, δεν ήταν κατάλληλη για εμάς: θα έπρεπε να ξοδέψουμε χρήματα για να επισκεφτούμε μηχανικούς και σε αυτήν την περίπτωση θα ήταν δύσκολο να ελέγξουμε και να συντονίσουμε τη διαδικασία. Αλλά το πιο σημαντικό είναι ότι οι άνθρωποι θα δούλευαν, δηλαδή, θα κάναμε δυνητικά πολλά λάθη και, πιθανότατα, δεν θα τηρούσαμε την προθεσμία.

Η δεύτερη επιλογή είναι καλή για όλους, αν όχι για ένα πράγμα. Ορισμένοι προμηθευτές δεν διέθεταν τα εργαλεία απομακρυσμένης αναλαμπής που χρειαζόμασταν για όλα τα απαιτούμενα λειτουργικά συστήματα. Και αφού οι προθεσμίες τελείωναν, έπρεπε να σκεφτώ με το κεφάλι μου.

Στη συνέχεια, θα σας πούμε πώς αναπτύξαμε εργαλεία για σαρωτές χειρός για το Debian 9.x OS (όλες οι ταμειακές μας μηχανές βρίσκονται στο Debian).

Λύστε το αίνιγμα: πώς να αναβοσβήσετε έναν σαρωτή

αναφέρει ο Βίκτορ Αντίποφ.

Το επίσημο βοηθητικό πρόγραμμα που παρέχεται από τον προμηθευτή λειτουργεί υπό Windows και μόνο με IE. Το βοηθητικό πρόγραμμα μπορεί να αναβοσβήνει και να ρυθμίσει τις παραμέτρους του σαρωτή.

Δεδομένου ότι το σύστημα στόχος μας είναι το Debian, εγκαταστήσαμε έναν διακομιστή ανακατεύθυνσης usb στο Debian και έναν πελάτη ανακατεύθυνσης usb στα Windows. Χρησιμοποιώντας βοηθητικά προγράμματα ανακατεύθυνσης usb, προωθήσαμε τον σαρωτή από μια μηχανή Linux σε μια μηχανή Windows.

Ένα βοηθητικό πρόγραμμα από έναν προμηθευτή των Windows είδε τον σαρωτή και μάλιστα τον αναβοσβήνει κανονικά. Έτσι, καταλήξαμε στο πρώτο συμπέρασμα: τίποτα δεν εξαρτάται από το λειτουργικό σύστημα, είναι θέμα του πρωτοκόλλου που αναβοσβήνει.

ΕΝΤΑΞΕΙ. Τρέξαμε το αναβοσβήνει στο μηχάνημα των Windows και αφαιρέσαμε το dump στο μηχάνημα Linux.

Γεμίσαμε τη χωματερή στο WireShark και... στεναχωρηθήκαμε (θα παραλείψω μερικές από τις λεπτομέρειες της χωματερής, δεν έχουν κανένα ενδιαφέρον).

Τι μας έδειξε η χωματερή:

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Οι διευθύνσεις 0000-0030, κρίνοντας από το Wireshark, είναι πληροφορίες υπηρεσίας USB.

Μας ενδιέφερε το τμήμα 0040-0070.

Τίποτα δεν ήταν ξεκάθαρο από ένα πλαίσιο μετάδοσης εκτός από τους χαρακτήρες MOCFT. Αυτοί οι χαρακτήρες αποδείχτηκαν χαρακτήρες από το αρχείο υλικολογισμικού, καθώς και οι υπόλοιποι χαρακτήρες μέχρι το τέλος του πλαισίου (το αρχείο υλικολογισμικού επισημαίνεται):

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Τι σήμαιναν τα σύμβολα fd 3e 02 01 fe, προσωπικά, όπως και ο Ilya, δεν είχα ιδέα.

Κοίταξα το ακόλουθο πλαίσιο (οι πληροφορίες υπηρεσίας έχουν αφαιρεθεί εδώ, το αρχείο υλικολογισμικού έχει επισημανθεί):

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Τι έγινε σαφές; Ότι τα δύο πρώτα byte είναι κάποιου είδους σταθερά. Όλα τα επόμενα μπλοκ επιβεβαίωσαν αυτό, αλλά πριν από το τέλος του μπλοκ μετάδοσης:

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Αυτό το πλαίσιο ήταν επίσης εντυπωσιακό, αφού η σταθερά είχε αλλάξει (τονιστεί) και, παραδόξως, υπήρχε μέρος του αρχείου. Το μέγεθος των μεταφερθέντων byte του αρχείου έδειξε ότι μεταφέρθηκαν 1024 byte. Και πάλι δεν ήξερα τι σήμαιναν τα υπόλοιπα byte.

Πρώτα απ 'όλα, ως παλιό ψευδώνυμο BBS, εξέτασα τα τυπικά πρωτόκολλα μετάδοσης. Κανένα πρωτόκολλο δεν μεταδόθηκε 1024 byte. Άρχισα να μελετώ το υλικό και βρήκα το πρωτόκολλο 1K Xmodem. Επιτρέπει τη μετάδοση 1024, αλλά με μια προειδοποίηση: στην αρχή μόνο 128, και μόνο αν δεν υπήρχαν σφάλματα, το πρωτόκολλο αύξησε τον αριθμό των byte που μεταδίδονταν. Αμέσως είχα μεταφορά 1024 byte. Αποφάσισα να μελετήσω πρωτόκολλα μετάδοσης και συγκεκριμένα το X-modem.

Υπήρχαν δύο παραλλαγές του μόντεμ.

Πρώτον, η μορφή πακέτου XMODEM με υποστήριξη CRC8 (το αρχικό XMODEM):

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Δεύτερον, η μορφή πακέτου XMODEM με υποστήριξη CRC16 (XmodemCRC):

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Μοιάζει παρόμοιο, εκτός από το SOH, τον αριθμό συσκευασίας και το CRC και το μήκος συσκευασίας.

Κοίταξα την αρχή του δεύτερου μπλοκ μετάδοσης (και είδα ξανά το αρχείο υλικολογισμικού, αλλά είχε ήδη εσοχές κατά 1024 byte):

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Είδα τη γνωστή κεφαλίδα fd 3e 02, αλλά τα επόμενα δύο byte είχαν ήδη αλλάξει: ήταν 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 byte)
fd 3e 1024 byte δεδομένων (διαιρείται σε μπλοκ 30 byte).
Τέλος μετάδοσης
fd 25

Τα δεδομένα που απομένουν πρέπει να ευθυγραμμιστούν στα 1024 byte.

Πώς μοιάζει το τελικό πλαίσιο μετάδοσης μπλοκ:

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

fd 25 – μετάδοση σήματος σε μπλοκ άκρου. Επόμενο 2f 52 – το υπόλοιπο αρχείο μεγέθους έως 1024 byte. Το 2f 52, κρίνοντας από το πρωτόκολλο, είναι ένα άθροισμα ελέγχου CRC 16-bit.

Για χάρη των παλιών καιρών, έφτιαξα ένα πρόγραμμα σε C που έβγαζε 1024 byte από ένα αρχείο και υπολόγιζε ένα CRC 16 bit. Η εκκίνηση του προγράμματος έδειξε ότι δεν πρόκειται για CRC 16-bit. Θλίψη και πάλι - για περίπου τρεις ημέρες. Όλο αυτό το διάστημα προσπαθούσα να καταλάβω τι θα μπορούσε να είναι, αν όχι άθροισμα ελέγχου. Ενώ μελετούσα αγγλόφωνους ιστότοπους, ανακάλυψα ότι το X-modem χρησιμοποιεί τον δικό του υπολογισμό αθροίσματος ελέγχου - CRC-CCITT (XModem). Δεν βρήκα καμία υλοποίηση C αυτού του υπολογισμού, αλλά βρήκα έναν ιστότοπο που υπολόγιζε αυτό το άθροισμα ελέγχου στο διαδίκτυο. Έχοντας μεταφέρει 1024 byte του αρχείου μου στην ιστοσελίδα, ο ιστότοπος μου έδειξε ένα άθροισμα ελέγχου που ταίριαζε πλήρως με το άθροισμα ελέγχου από το αρχείο.

Ζήτω! Ο τελευταίος γρίφος λύθηκε, τώρα έπρεπε να φτιάξω το δικό μου υλικολογισμικό. Στη συνέχεια, μετέδωσα τις γνώσεις μου (και μου έμειναν μόνο στο μυαλό) στον Ilya, ο οποίος είναι εξοικειωμένος με την ισχυρή εργαλειοθήκη Python.

Δημιουργία προγράμματος

αναφέρει ο Ilya Aleshin.

Έχοντας λάβει τις κατάλληλες οδηγίες, ήμουν πολύ «ευτυχισμένος».

Από πού να ξεκινήσω; Έτσι είναι, από την αρχή.  Από τη λήψη dump από τη θύρα USB.

Εκκινήστε το USB-pcap https://desowin.org/usbpcap/tour.html

Επιλέξτε τη θύρα στην οποία είναι συνδεδεμένη η συσκευή και το αρχείο όπου θα αποθηκεύσουμε το dump.

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Συνδέουμε το σαρωτή σε ένα μηχάνημα όπου είναι εγκατεστημένο το εγγενές λογισμικό 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 και πού να ληφθεί η απάντηση endpoint=86. Το μόνο που μένει είναι να μετατρέψουμε τις εντολές σε hex.

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Επειδή έχουμε ήδη βρει τη συσκευή, ας την αποσυνδέσουμε από τον πυρήνα...

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

...και γράψτε στο τελικό σημείο με διεύθυνση 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.

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Εξαιρετική! Μετατρέψτε τους γραμμωτούς κώδικες συστήματος σε hex. Αυτό είναι όλο, η λειτουργικότητα της εκπαίδευσης είναι έτοιμη.

Τι γίνεται με το υλικολογισμικό; Όλα μοιάζουν να είναι ίδια, αλλά υπάρχει μια απόχρωση.

Έχοντας κάνει μια πλήρη χωματερή της διαδικασίας αναλαμπής, καταλάβαμε κατά προσέγγιση με τι είχαμε να κάνουμε. Ακολουθεί ένα άρθρο σχετικά με το XMODEM, το οποίο ήταν πολύ χρήσιμο για την κατανόηση του τρόπου με τον οποίο συμβαίνει αυτή η επικοινωνία, αν και με γενικούς όρους: http://microsin.net/adminstuff/others/xmodem-protocol-overview.html Συνιστώ να διαβάσετε.

Κοιτάζοντας το dump, μπορείτε να δείτε ότι το μέγεθος του πλαισίου είναι 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 δεν δέχεται hex. Επομένως, θα πρέπει να μεταφράσετε κάθε γραμμή 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.

Μια εργασία για έναν προγραμματιστή ή πώς αναβοσβήσαμε σαρωτές χειρός χωρίς προμηθευτή

Στην πραγματικότητα, τότε είναι θέμα μικρών πραγμάτων. Το μόνο που μένει είναι να τυλίξουμε τη λύση σε σενάρια για μαζική αναπαραγωγή σε σαφώς καθορισμένο χρόνο, ώστε να μην επιβραδύνουμε τη διαδικασία της εργασίας στα ταμεία και να προσθέσουμε καταγραφή.

Σύνολο

Έχοντας ξοδέψει πολύ χρόνο και κόπο και τρίχες στο κεφάλι μας, καταφέραμε να αναπτύξουμε τις λύσεις που χρειαζόμασταν, και επίσης τηρήσαμε την προθεσμία. Ταυτόχρονα, οι σαρωτές ανανεώνονται και επανεκπαιδεύονται κεντρικά, ελέγχουμε σαφώς όλη τη διαδικασία. Η εταιρεία εξοικονόμησε χρόνο και χρήμα και αποκτήσαμε ανεκτίμητη εμπειρία σε εξοπλισμό αντίστροφης μηχανικής αυτού του τύπου.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο