Всем привет! Хочу поделиться тем, что возможно кому-то пригодится.
Захотелось, для разнообразия, что-нибудь несложное реализовать на Go, и тут параллельно были прочтены статьи на хабре про Telegram-ботов, а на работе проект по интеграции штрих-кодирования и 1С, ну вот и было решено совместить приятное с полезным и реализовать импровизированный считыватель штрих-кодов для тестирования и на пощупать как в 1С это работает.
Решил использовать Telegram-бота как мобильный клиент, боту шлют фото баркодов (QR кодов), а он распознает и шлет все это дело в 1С.
1) Реализуем telegram бота, берем первый попавшийся пакет “Syfaro/telegram-bot-api” для работы с api telegram, а для распознавания штрих-кодов “barcode.v0”. В целом реализация проста, можно взять кусок когда из примера на github — вот бот и готов.
Приведу кусок кода, который отвечает за работу с изображением:
for update:=range updates {
if update.Message == nil {
continue
}
log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)
cmd:=update.Message.Text
if update.Message.Photo!=nil{ //Тут мы проверяем, а не прислали ли нам изображение
photo :=*update.Message.Photo
log.Print(photo[1].FileID)//нам доступно 2 изображение одно маленькое иконка, другое полноразмерное, берем полноразмерное
resp, err :=bot.GetFile(tgbotapi.FileConfig{photo[1].FileID})
r, err := http.Get("https://api.telegram.org/file/bot"+telegram_token+"/"+resp.FilePath) //загружаем изображение с сервера telegram
if err!=nil{
log.Print(err)
}
defer r.Body.Close()
src, _ := jpeg.Decode(r.Body) //конвертируем io.Reader в image.Image
img:=barcode.NewImage(src)
scanner := barcode.NewScanner().SetEnabledAll(true)
re, err := scanner.ScanImage(img) //распознаем то что нам прислали
if err!=nil{
log.Print(err)
}
for _, s := range re {
fmt.Println(s.Type.Name(), s.Data)
msg := tgbotapi.NewMessage(update.Message.Chat.ID, s.Data)
msg.ReplyToMessageID = update.Message.MessageID
bot.Send(msg)
//тут мы отправляем то что мы распознали прослойке между нашим ботом и 1С (что то вроде eth2com, так как 1С и бот на разных серверах)
r, err := http.Get("http://192.168.0.2:7070/"+s.Data) //отправляем как параметр
if err!=nil{
log.Print(err)
}
defer r.Body.Close()
}
}
2) Теперь перейдем к eth2com(не путать с аналогичной программой) тут используем это и это.
Собственно весь обмен с 1С через com это «последовательность информации+CR»
(принимаются как последовательности цифр баркода, так и сложные строки зашифрованные в QR, но не забываем про символ переноса строки)
func main(){
e:=echo.New()
c := &serial.Config{Name: "COM3", Baud: 115200}
s, err := serial.OpenPort(c) //поключаемся к COM3
if err != nil {
log.Fatal(err)
}
e.GET("/:code", func(c echo.Context) error { //ждем GET запрос с расшифровкой, в теории сюда можно слать откуда угодно
log.Print(c.Param("code"))
_, err := s.Write([]byte(c.Param("code")+"r"))//шлем в COM порт и обязательно r иначе 1С не поймет
if err != nil {
log.Fatal(err)
}
return c.String(http.StatusOK,c.Param("code"))
})
e.Logger.Fatal(e.Start(":7070"))
}
С другой стороны, для соединение eth2com c 1C я использовал программу com0com. В итоге вышла такая схема:
Пользователь -> Telegram bot -> eth2com -> COM3->(com0com)->COM4->1C.
Со стороны 1С все достаточно просто: в настройках сканера ШК указываем COM4 и скорость обмена, символ переноса строки, готово! Для поиграться можно взять конфу 1С “Библиотека подключаемого оборудования”.
P.S. Реализация наколеночная без обработки нюансов, статья первая, прошу сильно не пинать. Спасибо!
Автор: Bogomoltsev Denis