commit def453617df0924b546c461571c6a6641d1b4fda Author: sergienko.v5 Date: Sun Sep 27 15:25:34 2020 +0400 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f8426a5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.zip +*.7z +.idea/* +tmp* +~* +*.exe \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7e914a0 --- /dev/null +++ b/README.md @@ -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 diff --git a/qr-send-recieve/README.md b/qr-send-recieve/README.md new file mode 100644 index 0000000..df771c5 --- /dev/null +++ b/qr-send-recieve/README.md @@ -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 diff --git a/qr-send-recieve/qr-server/main.go b/qr-send-recieve/qr-server/main.go new file mode 100644 index 0000000..0af2dd1 --- /dev/null +++ b/qr-send-recieve/qr-server/main.go @@ -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()) +} diff --git a/qr-send-recieve/qr-tester/generator.html b/qr-send-recieve/qr-tester/generator.html new file mode 100644 index 0000000..c259bbf --- /dev/null +++ b/qr-send-recieve/qr-tester/generator.html @@ -0,0 +1,6 @@ +

{{.Title}}

+
Please enter the string you want to QRCode.
+
+ + +
\ No newline at end of file diff --git a/qr-send-recieve/qr-tester/main.go b/qr-send-recieve/qr-tester/main.go new file mode 100644 index 0000000..de22570 --- /dev/null +++ b/qr-send-recieve/qr-tester/main.go @@ -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) +}