Импровизированный считыватель штрих кодов для 1С через Telegram на Go

в 12:30, , рубрики: 1c, barcode, bot, Go, golang, telegram, Программирование, Разработка систем передачи данных, Системы обмена сообщениями

Всем привет! Хочу поделиться тем, что возможно кому-то пригодится.

Захотелось, для разнообразия, что-нибудь несложное реализовать на 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

Источник

Поделиться

* - обязательные к заполнению поля