Всем привет! Хочу поделиться тем, что возможно кому-то пригодится.
Захотелось, для разнообразия, что-нибудь несложное реализовать на Go, и тут параллельно были прочтены статьи на хабре про Telegram-ботов, а на работе проект по интеграции штрих-кодирования и 1С, ну вот и было решено совместить приятное с полезным и реализовать импровизированный считыватель штрих-кодов для тестирования и на пощупать как в 1С это работает.
Решил использовать Telegram-бота как мобильный клиент, боту шлют фото баркодов (QR кодов), а он распознает и шлет все это дело в 1С.
1) Реализуем telegram бота, берем первый попавшийся пакет “Syfaro/telegram-bot-api” для работы с api telegram, а для распознавания штрих-кодов “barcode.v0”. В целом реализация проста, можно взять кусок когда из примера на github — вот бот и готов.
Приведу кусок кода, который отвечает за работу с изображением:
2) Теперь перейдем к eth2com(не путать с аналогичной программой) тут используем это и это.
Собственно весь обмен с 1С через com это «последовательность информации+CR»
(принимаются как последовательности цифр баркода, так и сложные строки зашифрованные в QR, но не забываем про символ переноса строки)
С другой стороны, для соединение eth2com c 1C я использовал программу com0com. В итоге вышла такая схема:
Пользователь -> Telegram bot -> eth2com -> COM3->(com0com)->COM4->1C.
Со стороны 1С все достаточно просто: в настройках сканера ШК указываем COM4 и скорость обмена, символ переноса строки, готово! Для поиграться можно взять конфу 1С “Библиотека подключаемого оборудования”.
P.S. Реализация наколеночная без обработки нюансов, статья первая, прошу сильно не пинать. Спасибо!
Захотелось, для разнообразия, что-нибудь несложное реализовать на 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. Реализация наколеночная без обработки нюансов, статья первая, прошу сильно не пинать. Спасибо!