<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Совместимость с какими версиями Android? Интересует работа на старых версиях 2.3.х
(1) Я писал под 4.0.3. Если нужно — могу понизить версию.
(1) добавил, можно попробовать. Но работу не гарантирую, так как девайса с 2.3 нету
Небольшое замечание. Там в описании (жирным шрифтом) — опечатка — «Поддержка заКуска/»
(4) Автор ушел за остальным к закуске. Вернется — исправит. 🙂
(5)очень остроумно, спасибо)
Добрый день коллеги! В поисках решения своей проблемы наткнулся на вашу статью, за что автору огромное спасибо. Я правильно понимаю, чтобы работала данная утилита НЕ НУЖНО! «потрашить, допиливать» платформу как это делал dewersiahttp://infostart.blog-buh.ru/public/547851 . Утилита работает на типовой мобильной платформе 1с?
я вот на еще один способ наткнулся можно сразу с dev0 читать т.е. с потока. щас работаю над этим если все получиться то выложу тут исходники глянете как сделал.
(7) Привет! правильно, в платформе ничего менять не нужно. Сервис живёт сам по себе, управляется из кода 1С. А можно Вашу проблему в ЛС? Может я подобное уже решал)
Здравствуйте, коллеги. Можно ли подключить USB сканер к планшету на Android с помощью этого приложения. Если да, то какова последовательность действий. Объясните чайнику )))
(10) С таким не сталкивался на практике, но думаю что реально. Нужно только знать какое сообщение бродкастом рассылается от подключенного сканера. Как узнать? Да много вариантов. Самый простой — анализlogcat к примеру.
(11) Если переключить сканер в режим эмуляции клавиатуры — видна посылка штрих кода посимвольно (во вложении), в других режимах никаких событий нет ((
Спасибо очень помогло, ТСД зажил новой жизнью.
(13) Рад за полезность 🙂
Какое именно у Вас устройство ТСД?
Спасибо, то что нужно. Возможно ли еще получать оповещения от нажатия клавиатурных клавиш?
Добрый день, скачал оба файла и ни один не запустился. Версия API 18. Ошибка следующего характера
флажок на установку из неизвестных источник стоит, флажок Проверять приложения — снят. Устройство — ТСД Urovo sq42. Другие apk не из маркета ставятся без проблем
(16) проблему решил, передал apk с пк на тсд, все установилось. До этого качал апк с почты. Странное поведение ОС )
(15) Попробую реализовать и данный механизм когда будет посвободнее время. Спасибо за идею)
Поделюсь своим опытом работы с опубликованным выше сервисом и ТСД Urovo sq42:
1. обязательно нужно указывать верный источник броадкаста (как посмотреть автор написал)
2. сканер должен быть настроен не в разрыв клавиатуры, в моем случае в стандартных настройках были настройки сканера, там есть возможность указать режим.
После этого все взлетело, автору спасибо!
(12) Удалось отловить событие?
Поделюсь своим опытом работы с опубликованным выше сервисом наТСД Newland:
Все норм работает
Даже на других конфигурациях пробовал
Удалось отловить событие
(20)
да
(22) как ? Я уже все перепробывал…
У тебя Есть Пример конфигурации с работы Acode?
(24) от куда скачать можно?
Держиhttps://www.dropbox.com/s/4lxm8zq1r8629t1/AcodeTools.CF?dl=0
Это пример Конфи там в макете есть и Acode tools apk и Примеры использования
это xml Для Андроид Приложения
(28) Спасибо за конфигурацию, поставил, но так сканер и не получилось заставить работать. У меня сканер подключен к телефону через USB otg host, в блокнот сканирует без проблем, так вот заставить работать через уведомления так как в этой статье так и не получается, куда копать? как перевести «не в разрыв клавиатуры», нигде настроек нет никаких.
(29) Боюсь что никак. Для телефона он просто OTG клавиатура.
По крайне мере мне не известны случаи успешного применения USB не в разрыв клавиатуры
нзш
(18) Дмитрий, ну что, получилось реализовать? В данный момент занимаюсь аналогичной задачей. Думаю многим будет интересно посмотреть на реализацию данного действия. Информации в интернете по этому поводу — NULL.
(32) нет, не занимался этим. Свободного времени нет пока. Да и практических задач тоже.
(21) А у Вас на Newland имя бродкаст сообщения какое, «scan.rcv.message»?
А как узнать «ServiceBarCodeField» и «ServiceSCAN_MESSAGE»?
Попался на руки китайский ТСД qunsuo pda401, в родное демо приложение сканирует, а сюда не хочет. Декомпилировал приложение, но не могу найти какой броадкаст он ловит.
(35) А чем декомпилировали? Может не всё разложилось?
Выложите где-то на шару это приложение и скиньте ссылку. Я посмотрю.
(36)Да вроде все. В манифесте посмотрел интент фильтр, попробовал по нему, и по другим событиям, но мне кажется я не то поле указал, в котором лежит штрихкод.
Здесь и само приложение, и исходники к нему (нашел на сайте производителя)
Попробовал события:
ismart.intent.scandown
com.qs.scancode
com.zkc.scancode
с полем code, и barocode
Но безрезультатно.
У меня ТСД Motorola Symbol MC3200. Сканер штрихкода в разрыв клавиатуры. Acode не взлетели. Эта утилита может работать?
И как узнать какой бродкаст прописывать для моей модели? Гугл в ответе не помог.
Спасибо!
Прошу прощения, не заметил сразу сообщения про logcat. Завтра попробую
Спасибо за программу! Удалось установить взаимодействие с 1С на ТСД Атол Smart Droid.
заработало с такими установками:
ServiceSCAN_MESSAGE = DATA_SCAN
что странно независимо от того, что указываешь в ServiceBarCodeField все равно вызывает событие в 1С 🙂
Dmitry Po.
Вопрос:
Пользуюсь ТСД Motorola Symbol MC9200
Настроил при сканировании штрих-кода отсылать его как эммуляцию ввода с клавиатуры и broadcast intent
подключил adb. Смотрю logcat чтоб понять какой бродкаст ловить. Вот изменения logcatа после сканирования штрихкода:
Показать
Отсканированный штрихкод 120717109704 (EAN13)
Не вижу в логкате ни имени бродкаста, ни чего-либо похожего на отсканированный штрихкод.
Подскажите куда копать? Как определить имя бродкаста?
Заранее большое спасибо!
(42) Это блютуз сканер? «com.hht.emdk.datawedge.data_string» не подходит?
Есть ли утилита внутренняя для настройки сканера? Я обычно разбираю её чтоб глянуть.
(43) Dmitry Po,
Спасибо за ответ!
сканер встроенный в терминал сбора данных
В настройках есть «Scanner selection». В этом меню есть пункт «Bluetooth Scanner disconnected». Если выбрать его, то при запуске 1С ругается что блютуз сканер не подключен.
у меня выбран пункт «Scanner selection» = «Auto (2D Barcode Imager)».
Из моего ответа можно понять блютуз сканер или нет?
прописал бродкаст «com.hht.emdk.datawedge.data_string»
ОбработкаОповещения не возникла.
Внутренняя утилита для настройки сканера есть. Называется DataWedge. В ней редактирую профили сканирования. Об этой утилите Вы спрашивали? Как ее можно разобрать?
Кстати, база 1с у меня не скомпилированный apk, а запускается как конфигурация из мобильной платформы, установленной на терминале. Это может влиять на результат?
Конфигурация у меня одна поэтому в параметре «ServiceBase_Name» оставил «».
Dmitry Po,
И еще:
НовЗП.ДополнительныеДанные.Добавить(«ServiceBarCodeField»,»barocode»)
у Вас написано: //в каком поле сканер возвращает штрих-код (если не задавать — по умолчанию barocode, что в большинстве случаев оно так)
«в большинстве случаев так, а в моем конкретном случае это не может отличаться?
(26) Добрый день,
Не сталкивались с проблемой что при установки приложения на ТСД выскакивает «Cannot call synchronous methods on the client»?
Заранее спасибо!
Блютуз сканер Zebra DS6878-SR будет работать? В режиме HID ?
(47) Если есть в устройстве утилита от сканера, которая генерит бродкас сообщения — теоретически возможно. На практике таким не занимался.
Подскажите, вы какие-нибудь другие блютус сканеры подключали? И в каком режиме?
(49) Внизу публикации указано что добавлено в версию 1.1. Делал это вспелую для коллеги по инфостарту. По его словам всё заработало. Сканер должен быть НЕ в разрыв клавиатуры.
(22) Присоединяюсь к вопросу
нет внешнего события, только зря потратил деньги, исходников APK автор не выложил неизвестно почему не работает.
(52) и Вы думаете, что у всех кто скачал тоже нет внешнего события?… и даже те, кто выражал благодарность в комментариях — фейковые? А может нужно причину поискать у Вас на стороне, а не сразу жалеть потраченные копейки? И автор не обязан выкладывать исходники для утилиты за 1 стармани в статусе «как есть». Не нравится — сделайте свою и лучше, выложите на Инфостарт и вернете «зря потраченные деньги»! Хорошего дня!
Добрый день!
Подскажите, пожалуйста, какое значение нужно задавать для ServiceSCAN_MESSAGE? Пробовал те, что указаны в настройках сканера (на фото), уведомление в 1с не приходит. Logcat тоже прикрепил. Нажатие кнопки сканера в строках 10117-10229 (первые строки тоже оставил, вдруг там какая-то нужная информация). Сканер DataLogic DL-Axist.
Подскажите по ПолучитьИДБазы(). Если например у меня в мобильном приложении несколько баз? Что я должен сюда передавать?
(56)
Не помню уже где это нашел, но писали очень хорошие люди, им спасибо!
Я получаю и записываю значение в константу.
На форме с константой, в НачалоВыбора пишем:
Показать
(57) Спасибо. Понял.
А кто-нибудь на АТОЛ Smart.Droid смог запустить? Уже несколько дней вожусь. Функция ЗапуститьКомпонентуСканирования отрабатывает. Ошибок нет. Результат =77. Сканер пищит, что отсканировал, но до 1с не доходит…
(59)
У формы
Показать
что-то подобное прописано?
И ПриНачалеРаботыСистемы всё ли правильно описано?
проверьте ещё раз
(40)
Спасибо!
Заработало.
Вот так нужно сделать:
НовЗП.ДополнительныеДанные.Добавить(«ServiceSCAN_MESSAGE»,»DATA_SCAN»);
День добрый.
Кто может подсказать, а какой Broadcast ServiceSCAN_MESSAGE у ТСД CipherLab RS30 / RS50?
(62) Есть встроенная утилита для управления сканером?
Если да — то в ней должно быть какое-то поле для тестирования что сканер работает.
Если да — то эта утилита является слушателем бродкаста и соответственно в ней прописано какой именно слушается.
Остается только достать эту утилиту с устройства (apk-файл), разобрать его и посмотреть.
З.Ы. Как разобрать — это уже другая тема.
Спасибо. Поизучаем
(63)
Добрый день.
http://dropmefiles.com/gnrhx) не могу разобраться что именно искать.
Подскажите пожалуйста, как можно определить параметры «ServiceSCAN_MESSAGE» И «scan.rcv.message».
Разобрал apk родной утилиты (
Терминал SunLux XL-868.
Добрый вечер коллеги .
Скачал данное ПО .
Возникло несколько вопросов :
1) мобильное приложение в апк файл конвертировать не обязательно?
2)ни кто не знает какой бродкаст и поле со штрих кодом у Honeywell ScanPal EDA50K ?
(66) хотя с 1 вопросом чет не подумал, отпадает, в противном случае нафиг идентификатор базы)
(68) (66) наконец разобрался, что к чему , поле с байтовым значением кода «dataBytes» , а интент в данном случае, я задаю сам в настройках сканера,
и я указал scan.rcv.message, т.о сканер перестал сканировать в разрыв клавиатура и посылает сообщение по данному интенту , однако ПО по какой-то причине не перехватывает его.
Показать
в чем может быть дело?
Версия мобильной платформы 8.3.9.74 —— программа запускается через типовую мобильной платформу 1с(т.е не apk файл) .
Вопрос решился. данная модель , хотя и передает байтовое поле «dataBytes», но по какой то причине оно не преобразует его в строку для отправки в 1с.
Решался вопрос следующим образом: обработка была переписана на прием поле data в котором передается уже строковое представление штрих кода.
Для работы сканера данного устройства необходимы следующие настройки:
Меню Настройки->scanning->Internal Scanner-> тут либо в «default profile» делаете настройки, либо создаете новый профиль для 1с -> data processing settings-> тут нас интересуют следующие поля:
1)Scan to intent ставим галочку
2)Data intent ставим галочку , и проваливаемся в настройки данного поля.
настройки Data intent :
Action(поле отвечающие за наименование интента которое отправит сканер ) — тут я прописал scan.rcv.message .
остальные поля я не заполнял.
если кому интересно в коде андроид приложения я замел следующую строку :
public void onReceive(Context context, Intent intent) {
byte[] barcode = intent.getByteArrayExtra(«barocode»);———>String barcode=intent.getStringExtra(«data»);
int lng = intent.getIntExtra(«length», 0);
this.barcodeStr = new String(barcode, 0, lng);——> this.barcodeStr =barcode;
if (lng > 0) { /// данное условие в принципе должно работать, но у себя я его убрал, т.к сканер либо передает данные если считал все хорошо, либо нет.
Intent intentFor1C = new Intent(«com.google.android.c2dm.intent.RECEIVE»);
intentFor1C.putExtra(«text», BCService.EventID);
intentFor1C.putExtra(«title», «1C»);
intentFor1C.putExtra(«data», this.barcodeStr);
if (BCService.BaseName != null || BCService.BaseName != «») {
intentFor1C.putExtra(«base», BCService.BaseName);
}
context.sendBroadcast(intentFor1C);
}
}
Добрый день.
При запуске приложения перехвата из 1С оно возвращает 0, не подскажите что означает код возврата 0?
(71) Значит не запустилось. Проверьте правильность запуска.
Корректный старт делает выход по инструкции
setResult(77);
иначе — всё что угодно, но не 77
(72) Это может быть связано с неправильными передаваемыми параметрами в сервис? или же это проблема моего устройства?
(73) Напишите как вы передаете параметры, какое устройство, версия Android?
Поподробнее пожалуйста)
(74)ТСД:
zebra tc700h
android 4.4.3
На устройстве есть предустановленное приложение datawedge в нем можно настроить имя и категорию интента.
1С мобильная платформа 8.3.11.57.
Запускаю ваше приложение кодом взятым из этой темы. При запуске без ИД базы т.е. параметр ServiceBase_Name = «» приложение возвращает 0, если же указать ИД базы то оно запускается возвращает 77, но сообщения сканера не ловит.
Показать
это уже было описанно в данной теме Dmitry Po (DMon) ( за что ему спасибо)
Подскажите что делать если сканер возвращает
(String)intent.getStringExtra(«EXTRA_BARCODE_DECODED_DATA»)
(78) по идее это будет ServiceBarCodeField
НовЗП.ДополнительныеДанные.Добавить(«ServiceBarCodeField»,»EXTRA_BARCODE_DECODED_DATA»); //в каком поле сканер возвращает штрих-код
(78)
попробуй мою обработку
это у мобил байза такой интент и у хоновела похожий маунал, однако в итоге оказалось, что сам интент настраивается в настройках , а поле которое возвращается data типа srting
собери всю информацию что я писал выше и попробуй, или просто попробуй установить обработку в комментариях мою
Спасибо
получилась такая модификация
if (BCService.TypeBarCodeField.equalsIgnoreCase(«string»))
{
barcodeStr=paramIntent.getStringExtra(BCService.BarCodeField);
//»EXTRA_BARCODE_DECODED_DATA»
lng = paramIntent.getIntExtra(«EXTRA_BARCODE_DECODED_SYMBOLE», -1)+1; }
else
{
byte[] barcode = paramIntent.getByteArrayExtra(BCService.BarCodeField);
lng = paramIntent.getIntExtra(«length», 0);
barcodeStr = new String(barcode, 0, lng);
}
Дмитрий,
спасибо за проделанную работу, но мы пока так и не смогли заставить работать сканер.
Вот в документации от Zebra написано о параметрах в Intent:http://techdocs.zebra.com/datawedge/6-2/guide/setup/#decoderelateddata
Можно ли что-то сделать, чтобы сервис заработал?
Пробовали:
НовЗП.ДополнительныеДанные.Добавить(«ServiceBarCodeField»,»data_string»);
и
НовЗП.ДополнительныеДанные.Добавить(«ServiceBarCodeField»,»com.symbol.datawedge.data_string»);
Добрый день коллеги. Подскажите, все таки сканер должен работать в режиме эмуляции клавиатуры или в режиме эмуляции COM?
(83) в режиме эмуляции COM
(84)Сканер symbol ls2208. Подключаю к планшету через usb otg переходник. Сканер настроен в режиме cdc. Logcat молчит как партизан. Что делать?
(85) Сложно сказать не имея оборудование под рукой. Компонента для ТСД, а не внешних сканеров.
Надо только экспериментировать.
(70) Добрый день!
Нам тоже привезли ТСД Honeywell. Не могли бы вы прислать переделанное андроид приложение?
(98) Добрый вечер. оно есть в этой теме в 76 сообщении
8.3.10.51 это работало
на 8.3.12.67 больше не прокатывает
Intent intentFor1C = new Intent(«com.google.android.c2dm.intent.RECEIVE»);
intentFor1C.putExtra(«text», BCService.EventID);
intentFor1C.putExtra(«title», «1C»);
intentFor1C.putExtra(«data», this.barcodeStr);
изминили манифест разработчики, 1с, непонятно теперь как отдать платформе ШК
(76)
Добрый день.
При запуске компоненты сканирования (BarcodeAndroid_1.3.apk)
отображается картинка с роботом и заголовком «BarcodeAndroid»
Как её убрать ?
(107)
Нажать на клавиатуре андроид(Navigation bar) назад, или закрыть как обычное приложение, на работу повлиять не должно, т.к оно работает и в офф-лайн режиме .
в моем случае мне необходимо его установить 1 раз для 1 базы(иногда переключить на другую, но редко), поэтому я особо не заморачивался с серверной регистрацией в по (другими словами с регистрацией без вызова интерфейса ).
(108)
Да, на работу не влияет.
Только на нервы действует )
(109)
Ну если часто переключаться между базами, то да)) тут лучше подойдет решение DMon , если просто то в андроид студии , есть механизмы похожие на 1с в упр. приложении , где ты можешь поместить во временное хранилище данные под уникальный идентификатор формы — делаю приблизительно тоже самое , только данные не исчезают после закрытия формы . Влом было разбираться как сохранить по другому и так андроид программирование с 0 изучал под текущую задачу) мб, когда появится время или перейду на стадию модернизации приложения, которое пишу, улучшу и драйвер до более юзабильного вида)
(63)А можно по подробнее об этой теме, есть какой то мануал?
(118) У гугла спросить как разобрать apk )
(119)APK то разобрал, но как определить ServiceSCAN_MESSAGE в исходных файлах? Смотрел манифест, думал брать имя receiver . Но так и не получилось.
(70)
что если перебрать поля вот этим кодом:
Bundle extras = intent.getExtras();
Set<String> ks = extras.keySet();
Iterator<String> iterator = ks.iterator();
while (iterator.hasNext()) {
Log.d(«MyActivity», iterator.next());
}
у меня результат:
dataBytes — > необходимый массив
data —> штрих код в String
timestamp
aimId
version
charset
scanner
int lng = intent.getIntExtra(«length», 0); //работать не будет т.к. поля нет
использовать int barocodelen = barocode.length;
если вычислить имя массива dataBytes останиться только указать в настройках имя интента «scan.rcv.message» и должно работать на всех ТСД
(121)
Спасибо, полезная информация, когда то до этого сам доходил, но уже забыл.
Как раз собирался вспомнить как получить все поля интента )
(110)а подскажите по каким источникам изучали андроид программирование?))
(186)
ютуб-Старт андроид + база университета по java минимальная ))) , а дальше под конкретную задачу гугл в помощь)