Данный релиз и простенький скрипт к нему закрывает потребности в любых видах синхронизации между пользователями Simple как между устройствами так и между бек-системами. По сути – это очень простой python-скрипт, который можно запустить на доступной машине, сервере или VPS, и он будет связывать клиентские устройства между собой и с 1С или другими бек-системами. В самой платформе появилось для этого множество доработок.
В Simple нет push, но отчаянно нужна замена, т.к. постоянно пинговать сервер с целью проверить, есть ли данные для устройства – не лучшая практика. В клиенты Simple встроен собственный http-сервер, но его IP не внешний, получается, до него не достучаться из внешнего интернета – только внутри одной подсети. Цель этого релиза сделать так, чтобы закрыть все потребности передачи информации между клиентами Simple и серверами, что называется, «из коробки». Т.е. прописать пару настроек шины в «Настройках» и все – приложение может получать данные 24/7 и отправлять одной командой – SendBus.
Что для этого было сделано:
- Доработано приложение, чтобы оно всегда было на связи с шиной через WebSocket, более корректно работало с обрывами, держало фоновый сервис и т.д. и т.д. Это еще не предел, в других релизах будут новые оптимизации. Почему WebSocket? Чтобы получать реакцию мгновенно.
- На питоне собрана простенькая шина, которую можно вывесить в интернет и мы получаем внешний эндпоинт, на котором постоянно сидят все клиенты Simple и по мере необходимости по HTTP обращается внешняя система (например, 1С)
- Шина взаимодействует не просто с текущей открытой конфигурацией, а со всеми установленными в репозиторий конфигурациями. Таким образом можно писать "фоновые" драйвера для получения и отправки информации. Например, можно написать драйвер для взаимодействия с SQLite или для того, чтобы отправлять запрос на устройство и сразу получать его координаты GPS или, например, список WIFI-сетей (для контроля местоположения). Это не мешает текущей выполняемой конфигурации. У репо появляется новый смысл. Теперь Simple похож на квази-операционную систему
- Для передачи больших объемов (все-таки WebSocket для коротких сообщений) WebSocket является сигнальным средством, а основная передача осуществляется через HTTP с докачкой, побайтовой скачкой, воркером докачки и прогресс-баром. Simple сам это все делает, разработчику не надо заморачиваться.
Собственно, все описано в новом разделе документации тут (ссылка на Гитхаб - там же): https://uitxt.readthedocs.io/ru/latest/bus.html
Поэтому, статья собственно посвящена описанию примеров, в которых раскрываются возможности данной технологии.
Пример 1: Совместное сканирование товара
Например, несколько пользователей проводят инвентаризацию или это волновая сборка заказа. Все, что сканирует один – сразу же пишется в локальные СУБД Pelican на других ТСД и отображается на экране. Когда пользователь редактирует количество – оно тоже отображается у всех
Устроено так:
1. на экране - табличка-выборка из локальной СУБД (используется NoSQL Pelican, но можно использовать SQL-не суть)
records = pelicans['samples_bus']['wave'].all()
2. когда пользователь сканирует, происходит запись в БД и отправка в шину на подписку #wave
if hashMap.get("listener")=="barcode":
d = {"_id":hashMap.get("barcode"),"barcode":hashMap.get("barcode"),"qty":"","user":str(hashMap.get("BUS_ID"))}
a = pelicans['samples_bus']['wave'].insert(d,upsert=True)
message = {"to":["#wave"],"message":{"operation":"insert", "data": d},"uid":"d24f4b9f96f4411b96a4ed36afc1ccfe"}
hashMap.put("SendBus",json.dumps(message,ensure_ascii=False))
3. при приеме сообщения (общее событие onSimpleBusMessage) данные помещаются в СУБД и вот тут появилась новая команда RestartScreen, в отличии от RefreshScreen она не только перерисовывает экран (как видно команда выполняется из фона, а не из контекста экрана) но и выполняет обработчики onStart/onPostStart
sbmessage = json.loads(hashMap.get("SBMessage"))
message = sbmessage['message']
if "operation" in message:
t= message.get("operation")
if t == "insert":
a = pelicans['samples_bus']['wave'].insert(message['data'],upsert=True)
elif t == "update":
a = pelicans['samples_bus']['wave'].update({"_id":message['data']['_id']},{"qty":message['data']['qty']})
if android.process_started():
hashMap.put("RestartScreen","")
elif android.cv_started():
hashMap.put("RestartCV","")
android.toast('Приняли данные')
Подготовка к примеру:
1) Нужно завести пользователей шины (описано в документации)
2) Установить у них подписку на тег #wave (POST-запросом put_users)
3) Прописать настройки шины в настройках приложения
Пример 2: Контроль сканирования
Продолжение предыдущего примера. Допустим работник хочет проверить – все ли товары просканированы. Для этого от включает ActiveCV и видит синим – товары, которые сканировали другие пользователи, зеленым – то, что сканировал он, серым – то, что еще не обработано
С точки зрения начинки – тут все аналогично, но также появилась новая команда RestartCV – она выполняет обработчик onCreate, таким образом у меня в примере пользователь видит, к у него «в прямом эфире» в камере появляются новые подкрашенные объекты (это другой пользователь сканирует и отправляет в шину)
Пример, кстати, можно усовершенствовать – например, тыкать в «серые», чтобы выходил экранчик с вводом количества, и сразу писать в БД штрихкод и количество. Также если в БД есть названия товаров, можно выводить названия. Но этот пример не по ActiveCV, а по шине, поэтому я остановился на этом.
Подготовка к примеру аналогична предыдущему примеру.
Пример 3: Передача файлов.
В качестве файла будет передаваться фото с камеры. Тут также показано, что из фонового обработчика (а сообщения от шин приходят в фоновый сервис) можно запустить нужный экран и обновлять на нем данные.
Файл тут оправляется запросом HTTP, а не командой передачи в шину.
Подготовка тут аналогична – файл отправляется подписчикам тега #wave
Прочие базовые примеры.
В предыдущих примерах мы взаимодействовали с СУБД в обработчиках сообщений, но можно использовать команду feed у Pelican и передавать запросы пакетно в JSON, получая ответ также в JSON без единой строчки кода. Например, можно отправить запрос из 1С на то, чтобы добавить нужные данные в справочники, получить подтверждение, либо отправить запросы на выборку данных, получить в ответ JSON с данными из коллекций БД устройство. Работает только с Pelican, с SQL не делал. Если надо такую же штуку на SQL, то можно легко написать конфигурацию-драйвет. В чем смысл? Дело в том что шина взаимодействует не только с текущей конфигурацией, но и со всеми целевыми конфигурациями в репозитории, т.е. можно сделать некую конфигурацию, которая умеет принимать-отправлять пакетные запросы SQLite устройства, поставить ее на устройство и поместить в репо (скрепка) и она будет делать то, что вам нужно.
Посмотреть примеры (ui-файлы) можно на https://seditor.ru:1555/ или развернув редактор локально (https://github.com/dvdocumentation/web_simple_editor).
Конечно же, Телеграм-канал проекта, в котором масса всего полезного: https://t.me/devsimpleui