.. SimpleUI documentation master file, created by sphinx-quickstart on Sat May 16 14:23:51 2020. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Работа с оборудованием ================================ Работа со сканерами штрихкода через стандартные настройки. ----------------------------------------------------------------- Работа со сканерами ТСД ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Подключение через подписку на событие (рекомендовано) """""""""""""""""""""""""""""""""""""""""""""""""""""""" Производители ТСД поставляют на своих устройствах ПО, работающее как сервис, которое раздает сообщения(intent) при сканировании штрихкода. В настройках ТСД это может называться Intent broadcast или что то подобное со словом “Intent”. Для того, чтобы SimpleUI мог принимать такие сообщения в настройках следует активировать «Использовать подписку на события сканера», заполнить поля «Сообщение сканера», «Переменная сканера» и, в некоторых случаях, «Длина значения»(для случаев когда штрихкод передается не в виде строки а в виде байт-массива и отдельно передается длина значения. Эту информацию можно почерпнуть как правила из документации или примеров. Этот способ подключения является рекомендованным, т.к. в отличии от различных подключений через эмуляцию клавиатуры этот способ не перехватывает поля ввода на экране. Подключение через различные виды эмуляции клавиатуры """""""""""""""""""""""""""""""""""""""""""""""""""""""" По умолчанию, если сканер настроен выдавать свой результат через эмуляцию клавиатуры и если в конце штрихкода имеется один из вариантов суффикса разделителя строк (например CR, CR/LF ) то подобный ввод воспринимается как штрихкод – т.е. будет сгенерировано событие штрихкода. В случае настроек вывода штрихкода именно как генерации нажатия клавиш друг за другом (обычно в настройках это называется со словом wedge) следует включить галочку Wedge as keys. Работа с внешними сканерами штрихкода Bluetooth через настройки ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Можно подключать Bluetooth- сканеры в режиме прямого сопряжения (не через эмуляцию клавиатуры, а через чтение событий сканера напрямую). Это более эффективный путь чем через различные виды эмуляции клавиатуры. Для подобного сопряжения нужно в настройках поставить галочку “Иcпользовать Bluetooth”, выбрать в выпадающем списке Bluetooth устройство и указать суффикс штрихкода (13 по умолчанию) .. note:: Этот кейс также можно реализовать собственными силами через методы описанные в разделе «Работа с Bluetooth устройствами». Подключение к внешним устройствам через Bluetooth, Wi-Fi и USB. Для всех типов устройств. --------------------------------------------------------------------------------------------- Работа с Bluetooth устройствами ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ В общем случае, для различных категорий Bluetooth устройств схема работы состоит из: 1. Чтение подключенных устройств с целью выбора устройства. Необязательный шаг, если вам известен mac-адрес устройства. На данном шаге могут анализироваться как уже сопряженные устройства так и обнаружение новых 2. Отправка данных на порт устройства – в виде байт-массива. 3. Подписка на данные, получаемые из устройства Команды для работы с Bluetooth доступны через импорт java-модуля SimpleBluetooth из python-обработчиков и частично через команды-переменные. Методы и команды доступные из процессов для выбора устройств: **BTGetBounded** – команда-переменная для поиска сопряжённых устройств. Получает ответ в переменной **BTResult** в виде JSON-массива подключенных устройств. **BTStartScan** – команда-переменная для запуска сканирования новых устройств (помимо уже сопряжённых). По окончанию, возвращает результат в **BTDiscoverResult** в виде JSON-массива устройств. Также совместно с этой командой имеет смысл использовать команду **BTDiscoverHandlers** в качестве параметра к которой указывается стандартный массив обработчиков. Это событие будет сгенерировано по окончанию поиска устройств. Подключение к устройству в режиме аксессуара (пассивный режим устройства, например принтер) """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Подключение к устройству (mac-выбранный из списка устройств mac-адрес устройства,handlers – строка с обработчиками в случае неудачи) .. code-block:: Python from ru.travelfood.simple_ui import SimpleBluetooth as BT bt = BT() device = bt.get_device(mac) #получение устройства по mac-адресу if device==None: hashMap.put("toast","Не получилось подключиться") else: if bt.connect_to_client(device,handlers): #подключение к устройству #действия с устройством bt.close_socket() #отключение от устройства Подключение к устройству в режиме хоста (активный режим, например сканер) """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .. code-block:: Python from ru.travelfood.simple_ui import SimpleBluetooth as BT bt = BT() device = bt.get_device(mac) if device==None: hashMap.put("toast","Не получилось подключиться") else: if bt.connect_to_server(device): #действия с устройством Отправка данных (методы модуля SimpleBluetooth) """""""""""""""""""""""""""""""""""""""""""""""""""" **write_data(<данные>,<строка-массив обработчиков>)** Данные – данные в виде строки, целого числа или массива байтов. Массив обработчиков – строка с обработчиками в случае неудачи Подписка на данные устройства, отключение подписки (методы модуля SimpleBluetooth) """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" **begin_listen_for_data(<строка-массив обработчиков>)** – подключает массив обработчиков на события устройства. Обработчики должны быть обязательно pythonbytes **stop_listen()** – отключение подписки на события устройства Подключение к устройству через TCP/IP (только отправка) ----------------------------------------------------------- Возможно только из python-обработчика. Работа заключается в вызове Java-функции boolean write_socket(String host,int port, String message,String charset) из модуля SimpleUtilites: .. code-block:: Python from ru.travelfood.simple_ui import SimpleUtilites as su su.write_socket(IP,port,data,handlers) , где IP,port – IP-адрес и порт (9100 по умолчанию) принтера data – либо байт-массив либо строка(UTF-8) данных handlers – строка-массив обработчиков в случае неудачи Функция возвращает Истина в случае успешной отправки и Ложь – во всех остальных случаях Подключение к устройству через USB (только отправка) ------------------------------------------------------- Подключение осуществляется из модуля SimpleUSB. Сканируются подключенные в такущий момент устройства и возвращается первое из списка либо первый принтер из списка подключенных. Подключение и отправка данных на любое устройство осуществляется командой **write_usb(data,handlers)** (data – строка или массив байтов, handlers – обработчики в случае неудачи): .. code-block:: Python from ru.travelfood.simple_ui import SimpleUSB as usbClass usb = usbClass() usb.write_usb(data, handlers) Подключение к принтеру через USB осуществляется аналогичной командой **print_usb(data,handlers)** .. code-block:: Python from ru.travelfood.simple_ui import SimpleUSB as usbClass usb = usbClass() usb.print_usb(data, handlers) Работа с POS-принтерами ----------------------------- Работа по выводу информации на принтер состоит из двух шагов: В случае работы напрямую с портом принтера: 1. Подготовка макета для печати – это может быть строка ZPL, ESC-POS, CPCL или другие данные 2. Подключение к принтеру (в случае с Bluetooth – сканирование и выбор принтера,USB – выбор первого из списка подключенных устройств) и отправка на порт принтера данных для печати в виде byte – массива. Далее при необходимости закрытие сокета. В случае работы с макетами и печати через менеджер печати Android (опционально -вывод в PNG-файл): 1. Подготовка html-макета документа и вызов команды PrintPreview 2. *Опционально*. В случае вывода в PNG – этот этап может быть продолжен – картинка встроена в данные, передаваемые на порт принтера, например в zpl и далее процесс продолжится как в случае подключения напрямую к порту принтера В случае работы напрямую с портом(сокетом) принтера используются ранее описанные приемы подключения через Bluetooth(как к аксессуару), к TCP-сокету и к USB-устройству (функция print_usb). Данные могут быть представлены строкой или байт-массивом. Далее описаны методы подготовки этого макета. Подготовка данных для принтера оффлайн используя макеты ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ В целом, любые печатные формы (документов, счетов, этикеток) можно оффлайн готовить в виде html-макетов и заполнять шаблонизатором в python. В дальнейшем печать осуществляется через менеджер печати Android. Данный способ с демо примером описан в статье ``_ Вывод данных макета в png """""""""""""""""""""""""""" В дополнению к подготовке макета в виде html, также можно сохранить этот html-документ в виде png-файла с целью дальнейшего вывода на печать не через менеджер печати. Это делается с помощью команды-переменной PrintToBitmap совместно с PrintPreview. Эта команда переопределяет кнопку печати (которая по умолчанию вызывает менеджер печати) таким образом, что происходит сохранение картинки в файл (она помещается в PrintBitmapPath) и вызывается обработчик события с listener=PrintBitmap . Т.е. перехватив данный обработчик можно получить картинку из файла и продолжить с ней работу. Работа с готовым PDF либо подготовка онлайн """""""""""""""""""""""""""""""""""""""""""""" В случае, если необходимо напечатать или вывести на предпросмотр PDF файл можно воспользоваться командами-переменными PrintPDF и ViewPDF передав в качестве параметра путь к PDF-файлу. Также можно подготовить PDF на стороне веб сервиса, описано тут ``_ Подготовка данных для принтера с использованием языков ZPL,ESC POS и т.д. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Принтер ожидает байт-массив котрый может быть закодированной строкой, которая из себя может представлять как просто текст, так и макет страницы или управляющие комманды, в специальном языке разметки. Для разметки страницы могут использоваться любые языки разметки. Можно готовить подобные разметки вне приложения (например использовать онлайн-конструктор разметки, после чего менять в нем значения полей заменой в тексте). Можно генерировать код самими в коде обработчика. Также существует ряд библиотек котрые генерируют разметку по исходным данным в удобной для разработчика форме. В пакет приложения включены библиотеки zpl (``_) и escpos-gen (``_) Расширенное взаимодействие с SDK некоторых устройств --------------------------------------------------------- Для устройств некоторых производителей в SimpleUI интегрирована поддержка Android-SDK этих производителей, которая дает дополнительные функции. Например, для ТСД это может быть, помимо просто сканирования штрихкода, возможность включать и выключать сканер программно, блокировать сканер, получать дополнительную информацию в приложении. Не все производители реализуют подобный SDK ТСД Urovo ~~~~~~~~~~~~~~ Функции для Urovo реализованы в модуле SimpleUtilites (from ru.travelfood.simple_ui import SimpleUtilites) **urovo_set_lock_trigger(<статус>)** блокировка/разблокировка сканера(если заблокирован, то заблокирована кнопка сканирования). Статус – истина(заблокировано), ложь (разблокировано) ** urovo_open_scanner()** - открыть объект сканера (не запускает сканирование, а просто инициализирует сканер и проверяет доступность) . Эта функция должна предшествовать urovo_start_decode **urovo_start_decode()** включает сканер в режим сканирования **urovo_stop_decode()** выключает режим сканирования **urovo_close_scanner()** завершает работу со сканером **urovo_get_scanner_state()** возвращает текущее состояние сканера **urovo_get_lock_trigger_state()** возвращает текущее состояние блокировки сканера ТСД Meferi ~~~~~~~~~~~~~~ ТСД Meferi имеет свое Андроид-SDK которое позволяет упраять состоянием сканера и настройками ТСД в целом. В SimpleUI включен сам SDK и он отдается разработчику в виде объектов класса .. code-block:: Python from ru.travelfood.simple_ui import Meferi as Meferi #получение объекта класса ScanManager manager = Meferi().getScanManager() #далее работа с объектом, утилизация методов manager.setScanEnable(True) manager.keyScan(True)