This commit is contained in:
sergienko.v5 2020-09-27 15:25:34 +04:00
Коммит def453617d
6 изменённых файлов: 188 добавлений и 0 удалений

6
.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,6 @@
*.zip
*.7z
.idea/*
tmp*
~*
*.exe

12
README.md Normal file
Просмотреть файл

@ -0,0 +1,12 @@
# Пример создания, отправки, получения и декодирования QR кода
(с) softland (softlandia@gmail.com)
2020-09-27
## qr-send-recieve
Пример по работе с QR
Два сервака, один (qr-server) принимает post запросы с json, генерирует QR и отправляет обратно.
Второй (qr-tester) пример обращения: готовит и отправляет post запрос к qr-server, в ответе получает QR код, декодирует его и выводит в log

44
qr-send-recieve/README.md Normal file
Просмотреть файл

@ -0,0 +1,44 @@
# Пример создания, отправки, получения и декодирования QR кода
(с) softland (softlandia@gmail.com)
2020-09-27
## qr-server
Слушает :8080. Обрабатывает post обращение по адресу /qr
body должно содержать json формата
```bash
{
`json:"employeeID"` // uint64
`json:"officeID"` // uint64
`json:"date"` // 2009-11-10 23:00:00 +0000 UTC
}
```
В качестве ответе отправляется png изображение QR кода с закодированным json
Например на входе
```bash
{
"employeeID":1,
"officeID":911,
"date":2009-11-10 23:00:00 +0000 UTC
}
```
на выходе будет QR со строкой
```bash
{"employeeID":1,"officeID":911,"date":2009-11-10 23:00:00 +0000 UTC}
```
## qr-tester
Слушает :8081. Обрабатывает get обращение по адресу /getQR
Формирует json и отправляет post запрос к qr-server
Получает ответом png с QR кодом, декодирует его и выводит строку в log

Просмотреть файл

@ -0,0 +1,46 @@
package main
import (
"bytes"
"encoding/json"
"fmt"
"image/png"
"io"
"io/ioutil"
"log"
"github.com/boombuler/barcode"
"github.com/boombuler/barcode/qr"
"github.com/gin-gonic/gin"
)
func writeQR(s string, w io.Writer) {
qrCode, _ := qr.Encode(s, qr.L, qr.Auto)
qrCode, _ = barcode.Scale(qrCode, 512, 512)
png.Encode(w, qrCode)
}
func main() {
router := gin.Default()
router.POST("/qr", qrGenerate)
router.Run(":8080")
}
func qrGenerate(c *gin.Context) {
type qrRequest struct {
EmployeeID uint64 `json:"employeeID"` // идентификатор сотрудника
OfficeID uint64 `json:"officeID"` // идентификатор склада
Date string `json:"date"` // дата выхода
}
body, _ := ioutil.ReadAll(c.Request.Body)
q := qrRequest{}
_ = json.Unmarshal(body, &q)
log.Println(q)
dataString := fmt.Sprintf(`{\n"employeeID":%d,\n"officeID":%d,\n"date":%s\n}`, q.EmployeeID, q.OfficeID, q.Date)
qrCode, _ := qr.Encode(dataString, qr.L, qr.Auto)
qrCode, _ = barcode.Scale(qrCode, 512, 512)
b := bytes.NewBuffer([]byte{})
png.Encode(b, qrCode)
c.Data(200, "png", b.Bytes())
}

Просмотреть файл

@ -0,0 +1,6 @@
<h1>{{.Title}}</h1>
<div>Please enter the string you want to QRCode.</div>
<form action="generator/" method=post>
<input type="text" name="dataString">
<input type="submit" value="Submit">
</form>

Просмотреть файл

@ -0,0 +1,74 @@
package main
import (
"bytes"
"fmt"
"image"
"image/png"
_ "image/png"
"log"
"net/http"
"text/template"
"github.com/boombuler/barcode"
"github.com/boombuler/barcode/qr"
"github.com/makiuchi-d/gozxing"
"github.com/makiuchi-d/gozxing/qrcode"
)
// Page -
type Page struct {
Title string
}
/*
подразумеваем,
что обращаются по адресу: /getQR
в теле шлют:
{
userID: uint64,
officeID: uint64,
date: 2020-11-28
}
в ответ получают png файл с картинкой
*/
func main() {
http.HandleFunc("/", homeHandler)
http.HandleFunc("/getQR", getQRHandler)
http.HandleFunc("/generator/", viewCodeHandler)
http.ListenAndServe(":8081", nil)
}
func getQRHandler(w http.ResponseWriter, r *http.Request) {
resp, err := http.Post("http://localhost:8080/qr", "application/json", bytes.NewReader([]byte(`{"employeeID":1,"officeID":2,"date":"2000-02-15"}`)))
if err != nil {
fmt.Fprintf(w, "%v", err)
return
}
/*
b, _ := ioutil.ReadAll(resp.Body)
ioutil.WriteFile("data-resp.png", b, 0644)
buf := bytes.NewBuffer(b)
img, format, _ := image.Decode(buf)
*/
img, format, _ := image.Decode(resp.Body)
log.Printf("img format: '%s'", format)
bmp, _ := gozxing.NewBinaryBitmapFromImage(img)
qrReader := qrcode.NewQRCodeReader()
result, _ := qrReader.Decode(bmp, nil)
log.Println(result)
}
func homeHandler(w http.ResponseWriter, r *http.Request) {
p := Page{Title: "QR Code Generator"}
t, _ := template.ParseFiles("generator.html")
t.Execute(w, p)
}
func viewCodeHandler(w http.ResponseWriter, r *http.Request) {
dataString := r.FormValue("dataString")
qrCode, _ := qr.Encode(dataString, qr.L, qr.Auto)
qrCode, _ = barcode.Scale(qrCode, 512, 512)
png.Encode(w, qrCode)
}