LINUX.ORG.RU

Эмуляция COM-порта у сканера-штрихкода bluetooth в Linux

 , , , ,


0

1

Имеется сканер-штрихкода подключенный к USB свистку в CentOS 6.10.
В Windows для подключения этого сканера к 1С используется эмуляция COM-порта. Т.е. подключаем сканер через специальную программу, которая как я понимаю пробрасывает данные с подключенного к «свистку» по bluetooth сканера на созданный этой програмкой COM-порт и обратно, а 1С уже работает с данным COM-портом.

Вопрос такой. Как подобное сделать в Linux?
Сканер по bluetooth подключается.

"Частичное" решение проблемы полученное общими усильями (за что Всем огромное спасибо):

Эмуляция COM-порта у сканера-штрихкода bluetooth в Linux (комментарий)



Последнее исправление: zhukovia (всего исправлений: 2)

Во всех сканнерах, которые мне попадались в руки, эмуляция ком-порта включалась в самом сканнере. Бралась сервисная книжка с баркодами, считывался баркод переводящий сканнер в режим настройки, потом считывался баркод включающий эмуляцию и затем считывался баркод сохраняющий настройки. Погугли по марке сканнера, может он тоже таким образом программируется.

imul ★★★★★
()

ну подключил, теперь rfcomm на него и будет com порт

irton ★★★★★
()

"популярное пояснение"

подключаем сканер через специальную программу, которая как я понимаю пробрасывает данные с подключенного к «свистку» по bluetooth сканера на созданный этой програмкой COM-порт и обратно, а 1С уже работает с данным COM-портом.

у тебя сложились неверные представления. com-порт «создает» ОС (точнее драйвер устройства; но эти детали тебе не нужны). программа работает с устройством через этот виртуальный com-порт. Как там и что делал в windows в связке программа <-> 1C не так важно сейчас для тебя.

В linux
После сопряжения сканера и адаптера bluetooth создаётся устройство /dev/rfcomm0 (это не точно). Посмотреть как именно называется sdptool browse <адрес твоего устройства> или сразу после сопряжения искать в выхлопе dmesg|tail

для использования сканера необходимо ПО под linux (его нет?) или описание системы команд/протокола для обмена через com-порт для написания такого ПО (ну или скриптов). Если такой документации нет (производитель/продавец же не предоставляет?), то возможно поискать в открытом ПО для сканеров (есть такое?)... На крайний случай wine (такое возможно?) или реверсинженеринг ПО из windows...

anonymous
()

Как уже писали выше, с точки зрения linux сканер это COM-порт к которому подключено некое устройство. Все что нужно это читать данные из этого порта.

1С в linux может работать c этими данными только через внешнею компоненту(ВК) с типом Native.

В стандартных конфигурациях есть такая Драйвер1СУстройстваВводаNative. См там должны быть два SO, например: ScanOPOSNativeLin64_8_1_9_1.so ScanOPOSNativeLin32_8_1_9_1.so

Goldfinch
()
Ответ на: комментарий от Goldfinch

Нашел такую конфигурацию БПО (библиотека подключаемого оборудования) буду через неё пробовать. Там есть такой драйвер оборудования как «1С:Сканеры штрихкода (NativeApi)», попробую его.

zhukovia
() автор топика
Ответ на: "популярное пояснение" от anonymous

Вообщем настроил следующим образом

/etc/bluetooth/hcid.conf

options {
    autoinit yes;
    security auto
    pairing multi;
    passkey "0000";
}
device {
    name "%h-%d";
    class 0x4a010c;
    iscan enable; pscan enable;
    lm accept, master;
    lp rswitch,hold,sniff,park;
}

/etc/bluetooth/rfcomm.conf

rfcomm0 {
    bind yes;
    device 00:20:e0:7f:43:0a;
    channel 1;
    comment "SF51 Bluetooth device";
}

У меня появился файл /dev/rfcomm0.
Потом я удалил /dev/ttyS3 и сделал Линк с /dev/rfcomm0 на /dev/ttyS3

ln -s /dev/rfcomm0 /dev/ttyS3
В 1С выбираю COM 4.
Все вроде работает но есть одна проблема, при подключении сканера в 1С он ативируется, но после сканирования хотя бы одного штрих-кода он еще работает секунд 10, а потом отваливается и надо снова подключать его. А если не сканировать ничего то висит достаточно долго.
В чем может быть причина?

zhukovia
() автор топика
Ответ на: комментарий от zhukovia

Это поведение соответствует заявленному производителем? Режим энергосбережения или что-то похожее.

lp rswitch,hold,sniff,park;

мне тут подсказывают, что возможно нужно убрать park

anymouze ★★
()
Ответ на: комментарий от anymouze

мне тут подсказывают, что возможно нужно убрать park

Убрал, но ничего не изменилось, все так же отключается. Причем в Windows с той же конфигурацией 1С и сканером, такого не наблюдается. Какие еще настройки могут на это влиять?
И еще вопрос. Можно как то сделать чтобы сканер сам подключался на ttyS3? А то приходится каждый раз вручную делать симлинк с rfcomm0.
И rfcomm0 почему то появляется только после ручного

rfcomm bind rfcomm0
Пришлось написать вот такой скрипт. Это так и должно быть или я что то делаю не так?
#!/bin/sh
rfcomm bind rfcomm0
rm /dev/ttyS3
ln -s /dev/rfcomm0 /dev/ttyS3

zhukovia
() автор топика

Есть преобразователи USB<>bluetooth последовательного порта. Они появляются как /dev/ttyUSBx. Возможно, как раз то, что надо. Около двух-трех баксов на али.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от zhukovia

мне тут подсказывают, что возможно нужно убрать park

Убрал, но ничего не изменилось, все так же отключается.

Вот по этому ману получается, что это никак не отключается — бред, наверное я не разобрался. Также sniff, как я понял, может быть причиной; но как это изменить непонятно. Есть идея добавить discovto 0 — хотя, это вроде бы «о другом»; я бы попробовал... На крайний случай придётся «костылять» некий сервис, который будет проверять наличие порта и если его нет подключать сканер автоматически — мне такое не нравится. Но если, через конфиг не получится, я не вижу других средств...

А действительно необходимо держать сканер постоянно соединённым с ПК?

Можно как то сделать чтобы сканер сам подключался на ttyS3? А то приходится каждый раз вручную делать симлинк с rfcomm0.

Да, через правила udev. Опять же я бы

  • сначала посмотрел что происходит при спаривании сканера и ПК в dmesg
  • посмотрел текущие правил для сканера в /etc/udev/rules.d/
  • создал/модифицировал правило

И rfcomm0 почему то появляется только после ручного

про rfcomm0 я по памяти писал, возможно это и необязательно. Но мне это странно, может же быть несколько устройств с rfcomm и с разными настройками... Решается через правило udev

anymouze ★★
()
Ответ на: комментарий от Legioner

А чего, этот сканер клавиатурой не умеет работать?

Умеет, но как мне кажется это более медленный и менее надежный способ.

zhukovia
() автор топика
Ответ на: комментарий от Eddy_Em

Есть преобразователи USB<>bluetooth последовательного порта. Они появляются как /dev/ttyUSBx. Возможно, как раз то, что надо. Около двух-трех баксов на али.

Т.е.поставить преобразователь с Али, а в него уже «свисток» пихать? Чего то фигня какая то получается, Будет ли вообще такая связка работать?

zhukovia
() автор топика
Ответ на: комментарий от zhukovia

Почему это? Драйвер клавиатуры простой и оттестированный. Какие-то непонятные драйверы фиг пойми кем писанные - явно хуже. Я бы использовал как клавиатуру и не заморачивался.

Legioner ★★★★★
()
Ответ на: комментарий от Eddy_Em

«Свисток» в данном случае не понадобится. Будет эмуляция последовательного порта на bluetooth

Я может не понимаю чего, можно ссылку? Поискал и не могу понять о чем речь.

zhukovia
() автор топика
Ответ на: комментарий от Legioner

А как спаривание делать, вручную? При com порте происходит автоматически при обращении к нему (вроде бы).

zhukovia
() автор топика
Ответ на: комментарий от anymouze

Вот по этому ману получается, что это никак не отключается — бред, наверное я не разобрался. Также sniff, как я понял, может быть причиной; но как это изменить непонятно. Есть идея добавить discovto 0 — хотя, это вроде бы «о другом»; я бы попробовал...

Добавил, но ничего не произошло. А может как то влиять постфикс приходящего со сканера? У меня после кода идет 'CR'+'LF' на win, а на Линуксе, почему-то, 'LF'+'LF'.

А действительно необходимо держать сканер постоянно соединённым с ПК?

Мне он не нужен постоянно подключенный, логика такая. Когда 1С лезет в COM порт происходит подключение самого сканера, а когда отключается то соединение рвется, по крайней мере в Windows было так. Тут же получается что устройства rfcomm0 не видно вообще пока не сделаешь

rfcomm bind rfcomm0
или
rfcomm connect 0
Только тогда файл появляется. К тому же 1С видит только устройства /dev/ttyS* но это можно решить созданием симлинка.

Решается через правило udev

Сейчас как раз ковыряю его. Пока сделал через скрипт при старте.

zhukovia
() автор топика
Ответ на: комментарий от Eddy_Em

При помощи AT-команд модуль настраивается как мастер и подключается к заданной железке. Далее он просто проксирует поток между синезубом и виртуальным портом.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А, блин, да: к модулю понадобится usb-ttl, что-то я ступил!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от zhukovia

Добавил, но ничего не произошло.

Это ожидаемый результат :(, но ведь проверить надо было...

меня после кода идет 'CR'+'LF' на win, а на Линуксе, почему-то, 'LF'+'LF'.

Думаю «да», это влияет. Про сканер не скажу, а модемы «вешаются» если не получают 'CR'+'LF'. Для модемов понимающих AT-команды (и windows-а) комбинация 'CR'+'LF' разделяет строки. В линуксе принято просто 'LF'. А где ты наблюдаешь эти коды?

ут же получается что устройства rfcomm0 не видно вообще пока не сделаешь

для USB-модемов (да и не только) создаются устройства /dev/ttyUSB<цифра> (или /dev/ttyACM<цифра>; есть ещё варианты). А вот для виртуального порта через Bluetooth разрабы отчего-то приняли просто rfcomm (мне вот непонятно). Если других виртуальных портов через Bluetooth у тебя не предвидится, то можешь не создавать rfcomm0 — сразу rfcomm привязывай к /dev/ttyS*

anymouze ★★
()
Ответ на: комментарий от zhukovia

Хочется уточнить проблемы именно при работе через 1C?

если работать с этим портом через терминал (например CuteCOM) проблема есть?

Goldfinch
()
Ответ на: комментарий от anymouze

Ничего уже не понимаю. :( После запуска minicom, он тут же крашится.. НО зато после этого сканер ведет себя так как нужно, на конце 'CR'+'LF' и не отваливается.
Не понимаю в чем проблема, возможно при старте minicom что то донастраивает, а вот что и где посмотреть пока непонятно. Ну не запускать же его при старте системы..

zhukovia
() автор топика

Нет только, например если сделать

cat /dev/ttyS5

то тоже вылетает через 5 сек. По выводу видно что передается два 'LF'

[root@lserver]# cat /dev/ttyS5
92A23013D38

92A23013D38

а должно быть
[root@lserver]# cat /dev/ttyS5
92A23013D38
92A23013D38

zhukovia
() автор топика
Ответ на: комментарий от zhukovia

Да, вот этот момент как-то ускользнул от внимания. Вероятно, просто привязать rfcomm* к ttyS* мало, нужна и «наладка»... Если не ошибаюсь, то параметры порта можно подсмотреть в inf-файле его виндового драйвера. В скрипт, который «дергается» правилом udev для rfcomm добавить команду настройки через stty.

anymouze ★★
()
Ответ на: комментарий от Eddy_Em

Разобрался.
До запуска minicom

[root@lserver]# stty --file=/dev/ttyS5
speed 9600 baud; line = 0;
min = 1; time = 0;
-brkint -imaxbel
-icanon
после запуска minicom
[root@lserver]# stty --file=/dev/ttyS5
speed 9600 baud; line = 0;
min = 1; time = 5;
ignbrk -brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
И какие выводы из этого можно сделать?

zhukovia
() автор топика
Ответ на: комментарий от zhukovia

Нашел какие два ключа были нужны

-icrnl -echo
Подскажите, а куда их запихать чтобы при старте системы они устанавливались на нужное мне устройство?

Погуглив вроде это файл, rc.serial. Но у меня в CentOS нет такого, а его создание ни к чему не приводит.

zhukovia
() автор топика
Ответ на: комментарий от anymouze

Нашел какие два ключа были нужны

-icrnl -echo
Подскажите, а куда их запихать чтобы при старте системы они устанавливались на нужное мне устройство? Погуглив вроде это файл, rc.serial. Но у меня в CentOS нет такого, а его создание ни к чему не приводит.

zhukovia
() автор топика
Ответ на: комментарий от zhukovia

после привязки rfcomm* к /dev/ttyS3 выполни

 stty -icrnl -echo </dev/ttyS3
и проверь что, всё работает нормально. Если поможет добавишь* в свой скрипт.

anymouze ★★
()
Последнее исправление: anymouze (всего исправлений: 2)
Ответ на: комментарий от anymouze
stty -icrnl -echo </dev/ttyS3

Да так работает, но при этом происходит активация сканера и он пищит. А нельзя это как то без спаривания сделать? Ну типа правил udev.

zhukovia
() автор топика
Ответ на: комментарий от zhukovia

я и подразумевал (после проверки) добавить эту команду в правило udev: настройка бы выполнялась при подключении сканера.

anymouze ★★
()
Ответ на: комментарий от anymouze

Чего то не выходит у меня. Я правильно понял, что правило типа такого?

KERNEL=="rfcomm0", SUBSYSTEM=="tty", ATTR{address}=="00:20:E0:7F:43:0A", ATTR{ch
annel}=="1", SYMLINK+="ttyS5", RUN+="/etc/bluetooth/stty_SF51.sh"
Скрипт /etc/bluetooth/stty_SF51.sh такой код
#!/bin/sh
stty -icrnl -echo -F /dev/ttyS5
Не применяются эти параметры почему то. Хотя если отдельно скрипт запустить, то применяются параметры.

Может в другое место надо запихать?

zhukovia
() автор топика
Ответ на: комментарий от anymouze

Но если сделать скрипт таким то все работает, правда выглядит как костыль.

#!/bin/sh
sleep 2
stty -icrnl -echo -F /dev/rfcomm0
Как я понял нужно к порту нужна пауза и тогда команда проходит. Причем если сканер находится в энергосберегающем режиме то вообще ничего не получается. И к тому же происходит активация сканера и он пищит. Может все таки можно как то более красиво сделать?

zhukovia
() автор топика
Ответ на: комментарий от zhukovia

KERNEL==«rfcomm0», SUBSYSTEM==«tty», ATTR{address}==«00:20:E0:7F:43:0A», ATTR{ch annel}==«1», SYMLINK+=«ttyS5», RUN+=«/etc/bluetooth/stty_SF51.sh»

да, примерно так оно и должно выглядеть. разве что, я бы добавил ACTION=="add"

KERNEL=="rfcomm0", SUBSYSTEM=="tty", ATTR{address}=="00:20:E0:7F:43:0A", ATTR{ch
annel}=="1",  ACTION=="add", SYMLINK+="ttyS5", RUN+="/etc/bluetooth/stty_SF51.sh"
(и если в скрипте только одна команда её можно прямо в атрибут RUN записать с полным путём — но это «косметика» :)

Не срабатывает скорее всего потому, что на момент выполнения команды порт ещё не связан с симлинком — т.е. нет устройства /dev/ttyS5. Я уже обращал твоё внимание, что команда должна применяться после появления устройства в /dev/ttyS5. Или добавить ACTION=="add" в правило или модифицировать скрипт. Например, как ты поставить задержку или вот так как-то

#!/bin/sh
while [ "$RES" != "0" ]
do
  if [ "$ACTION" == "add" ]
  then RES=`stty -icrnl -echo -F /dev/ttyS5`
 fi
done
но это уже переусложнение (и я не проверял работоспособность этого «кода»)

Причем если сканер находится в энергосберегающем режиме то вообще ничего не получается. И к тому же происходит активация сканера и он пищит. Может все таки можно как то более красиво сделать?

Всё дело в том, что американцы программы «тупые». Сканер и так скорее всего находиться в требуемом режиме, но stty делает ему принудительную настройку, причём при каждом его появлении в системе. Хотя нам этого как бы и не нужно. По умолчанию последовательный порт в линукс имеет установки отличающиеся от настроек в сканере (коряво сказал) — тебе бы только «принимающий» интерфейс настроить, а там мы настраиваем всю цепочку. Вот не знаю можно ли такое сделать. Точнее сказать: не знаю как это сделать.

P.S. Ты же взаимодействуешь со сканером через какие-то компоненты 1С? Там нет конфигов для настройки портов/устройств?

anymouze ★★
()
Последнее исправление: anymouze (всего исправлений: 2)
Ответ на: комментарий от zhukovia

1с может читать с fifo? Сделай fifo, да отформатируй выхлоп туда. Что ему вообще надо? Может через xdotool накостылись можно.

crutch_master ★★★★★
()
Ответ на: комментарий от zhukovia

Но если сделать скрипт таким то все работает, правда выглядит как костыль.

У меня был скрипт типа такого, он до сих пор там работает. Сканер штрихкодов штука тупая. Он просто передаёт код и endline в конце. Я его просто замыкал на xdotool и все были счастливы. Я из треда не понял кто кому что передаёт, опиши весь процесс еще раз.

crutch_master ★★★★★
()
Ответ на: комментарий от anymouze
#!/bin/sh
while [ "$RES" != "0" ]
do
  if [ "$ACTION" == "add" ]
  then RES=`stty -icrnl -echo -F /dev/ttyS5`
 fi
done

Не знаю что с этим кодом не так но у меня при старте сканер вошел в бесконечный цикл (включался-выключался) и система при попытке перегрузится наглухо висла, помогало только по питанию выключить.

Добавление ACTION==«add» ничего не меняет все равно нужен sleep 1

Сканер и так скорее всего находиться в требуемом режиме, но stty делает ему принудительную настройку, причём при каждом его появлении в системе.

Да вроде как достаточно только один раз сделать, а потом само работает.

P.S. Ты же взаимодействуешь со сканером через какие-то компоненты 1С? Там нет конфигов для настройки портов/устройств?

Да вроде нет стандартных, но буду что то колхозть тогда. :)

zhukovia
() автор топика
Ответ на: комментарий от crutch_master

Я из треда не понял кто кому что передаёт, опиши весь процесс еще раз.

Если я правильно понял, то примерно так. Сканер bluetooth Подключается к USB-bluetooth, создается порт /dev/rfcomm0 на который создается линк /dev/ttyS5. А 1С, через драйвер NativeAPI подключается к COM6. Или не так?

zhukovia
() автор топика
Ответ на: комментарий от zhukovia

Не знаю что с этим кодом не так но у меня при старте сканер вошел в бесконечный цикл (включался-выключался) и система при попытке перегрузится наглухо висла, помогало только по питанию выключить.

ну так аффтар «перла» как бы намекал

я не проверял работоспособность этого «кода»
«кода»

anonymous
()
Ответ на: комментарий от anonymous

Сообщаю для тех кто может тоже захотеть попробовать. :)

zhukovia
() автор топика
Ответ на: комментарий от anymouze
kernel: usb 1-4: new full speed USB device number 23 using ohci_hcd
kernel: usb 1-4: device descriptor read/64, error -62
kernel: usb 1-4: device descriptor read/64, error -62
kernel: usb 1-4: new full speed USB device number 24 using ohci_hcd
kernel: usb 1-4: device descriptor read/64, error -62
kernel: usb 1-4: device descriptor read/64, error -62
kernel: usb 1-4: new full speed USB device number 25 using ohci_hcd
kernel: usb 1-4: device not accepting address 25, error -62
kernel: usb 1-4: new full speed USB device number 26 using ohci_hcd
kernel: usb 1-4: device not accepting address 26, error -62
kernel: hub 1-0:1.0: unable to enumerate USB device on port 4

Еще одна проблема нарисовалась. Если вытащить «свисток», а потом его снова поставить то подключиться к сканеру уже не получается, только перезагрузка. Что может быть за проблемма?

zhukovia
() автор топика

Опишу еще раз чего удалось достичь.
Сканер Intermec SF51, свисток BU-2050-J, система CentOS 6.10, 1C 8.3.11-3133.i386 (БиблиотекаПодключаемогоОборудования 2.1.1.22)

/etc/bluetooth/hcid.conf

# HCI daemon configuration file.
options {
    autoinit yes;
    security auto
    pairing multi;
    passkey "0000";
}
device {
    name "%h-%d";
    class 0x4a010c;
    iscan enable; pscan enable;
    lm accept, master;
    lp hold,sniff;
    discovto 0;
}

/etc/bluetooth/rfcomm.conf

# RFCOMM configuration file.
rfcomm0 {
    bind yes;
    device 00:20:e0:7f:43:0a;
    channel 1;
    comment "SF51 Scanner 0020e07f430a";
}

/etc/bluetooth/stty_SF51.sh

Этот файл нужен для передачи настроек в терминал для правильной передачи постфикса. Было 'LF'+'LF', а надо 'CR'+'LF'. Иначе сканер отключается при первом жа считывании.
Не знаю на всех так сканерах или нет, но у меня по другому не работало.

#!/bin/sh
sleep 1
stty -icrnl -echo -F /dev/rfcomm0

/etc/udev/rules.d/97-bluetooth-scaner-SF51.rules

Этот файл задает правило UDEV, чтобы при создании порта создавался и link на /dev/ttyS5 (COM6), т.к. 1С может видеть через NativeAPI только COM порты, а система создает rfcomm.

KERNEL=="rfcomm0", SUBSYSTEM=="tty", ATTR{address}=="00:20:E0:7F:43:0A", ATTR{channel}=="1", ACTION=="add", SYMLINK+="ttyS5", RUN+="/etc/bluetooth/stty_SF51.sh"
Мак адреса, естественно, у всех свои. :)

После всех этих манипуляций, просто выбираем в 1С COM6 и сканер подключается. Единственный момент в том что при старте системы сканер не должен быть в режиме энергосбережения, иначе не применятся настройки для порта и надо будет вручную (или из 1С) запустить скрипт

/etc/bluetooth/stty_SF51.sh

zhukovia
() автор топика
Ответ на: комментарий от zhukovia

Это проблема «плохого контакта» обычно бывает с USB-устройствами подключаемыми с помощью кабеля. Переподключение обычно помогает. В поисковой выдаче встречаются сообщения о «программном» переподключении — не пробовал, не проверял.

Про скрипт: да, моя вина — неверное условие проверки, скрипт зацикливается...

За итоги/решение отдельное спасибо! Если можешь добавь в стартовое сообщение ссылку с описанием на то сообщение.

anymouze ★★
()
Ответ на: комментарий от anymouze

«Программно» переподключить несложно, у меня на гитхабе образец кода где-то был. Если надо, могу вечером поискать. А то с утра за ноутом сидеть - врач ругаться будет...

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.