Недавно занимался задачей распознавания номеров ж/д цистерн, ж/д платформ и номеров танк-контейнеров, расположенных на платформах.
Общее решение распалось на три логических блока: распознавание объектов на изображении с камеры, распознавание номеров и интерфейс с консолидированными данными, где можно было бы видеть, что распознано, и проводилась некоторая дополнительная пост-обработка, например, определение направления движения.
Первых два блока были реализованы на Python, а интерфейс был выполнен на базе самописной конфигурации 1С 8.3. Одной из подзадач было создание механизма передачи обработанных данных из блока, занимающегося распознаванием, в 1С. Точки распознавания могли располагаться удаленно, не имели прямого доступа к общему дисковому пространству с 1С и работали 24/7 с периодичностью обработки кадра с разрешением 2К в 0,15с. Для передачи данных было решено использовать HTTP, а 1С использовать как HTTP сервер.
Для реализации было сделано следующее:
- В 1С был создан HTTP сервис.
- В HTTP сервис добавлен HTTP метод POST.
- Со стороны скрипта Python выполнялся код, похожий на код ниже
import base64
import datetime
import cv2
import requests
curdatetime = datetime.datetime.today()
img = cv2.imread('/home/user/Pictures/P1_1.jpg')
retval, buffer = cv2.imencode('.jpg', img)
bufferserial = base64.b64encode(buffer)
sensor_number =1
jsondata = {'packetname': 'point 1',
'sensornumber': '%s' % sensornumber,
'datetime': curdatetime.strftime("%Y%m%d%H%M%S"),
' bufferserial ': bufferserial}
API1C = 'http://192.168.1.101/1c/hs/aidata'
res = requests.post(url=API1C, data= jsondata)
if res.status_code != 200:
print("Error in Send_Json!!!")
else:
print("Success in Send_Json!!!")
Для отправки все данные упаковываются в словарь и приводятся к типу "Строка".
- Cо стороны 1С принимаются и декодируются пакеты данных.
Функция getaidatapostai(Запрос)
СтрокаВходящегоЗапроса = Запрос.ПолучитьТелоКакСтроку();
Если СтрДлина(СтрокаВходящегоЗапроса) > 0 тогда
СтруктураДанных = ПолучитьСтруктуруИзСтроки(СтрокаВходящегоЗапроса); /*получили данные json в виде структуры*/
ТекДата = Дата(СтруктураДанных.datetime);
ТекСтрока = Строка(ЗаменитьСлужебныеПоследовательности(СтруктураДанных.packetname));
ТекЧисло = Число(СтруктураДанных.sensornumber);
ТекБуферСериал = СтруктураДанных.bufferserial;
// "Чистим" строку и упаковываем данные в хранилище значений, откуда
// затем данные можем записать на диск или же отобразить на форме 1С
Если СтрДлина(ТекБуферСериал) > 0 тогда
ТекБуферСериал = ЗаменитьСлужебныеПоследовательности(ТекБуферСериал);
БинарДанные = Base64Значение(ТекБуферСериал);
ХранилищеБуфераДанных = Новый ХранилищеЗначения(БинарДанные);
КонецЕсли;
// данные ТекДата, ТекСтрока, ТекЧисло, ХранилищеБуфераДанных готовы для дальнейшей обработки
Ответ = Новый HTTPСервисОтвет(200);
Иначе
Ответ = Новый HTTPСервисОтвет(400);
КонецЕсли;
Возврат Ответ;
КонецФункции
//Возвращает данные json, в виде структуры 1С с называниями полей структуры,
//как они были названы в dictionary jsondata скрипта Python
Функция ПолучитьСтруктуруИзСтроки(СтрокаВходящегоЗапроса)
МассивДанных = СтрРазделить(СтрокаВходящегоЗапроса, "&");
СтруктураJSON = Новый Структура;
Для Каждого ТекЭлемент из МассивДанных Цикл
РасшифровкаТекЭлемента = СтрРазделить(ТекЭлемент, "=");
СтруктураJSON.Вставить(РасшифровкаТекЭлемента[0],РасшифровкаТекЭлемента[1]);
КонецЦикла;
Возврат СтруктураJSON;
КонецФункции
//Заменяет служебные последовательности в строке бинарных данных и просто строке
//Последовательности подставляются автоматически при отправке POST из под Линукса
Функция ЗаменитьСлужебныеПоследовательности(СтрДляПреобр)
СтрДляПреобр = СтрЗаменить(СтрДляПреобр,"%2F","/");
СтрДляПреобр = СтрЗаменить(СтрДляПреобр,"%3F","?");
СтрДляПреобр = СтрЗаменить(СтрДляПреобр,"%3D","=");
СтрДляПреобр = СтрЗаменить(СтрДляПреобр,"%26","&");
СтрДляПреобр = СтрЗаменить(СтрДляПреобр,"%2523","#");
СтрДляПреобр = СтрЗаменить(СтрДляПреобр,"%2B","+");
Возврат СтрДляПреобр
КонецФункции
Теперь с "добытыми" данными: ТекСтрока, ТекДата, ТекЧисло и ХранилищеБуфераДанных можно производить действия в 1С, например, заполнить регистр сведений, либо создать какой-нибудь документ или заполнить элемент справочника.
Подобный вариант передачи данных может подойти для сбора консолидированной информации в 1С с различных датчиков или сервисов, где выполняется код на Python, с их последующей пост-обработкой.