Explorar o código

编写相机拍照代码

niujiuru hai 3 semanas
pai
achega
de44c99749
Modificáronse 3 ficheiros con 69 adicións e 2 borrados
  1. 7 2
      go.mod
  2. 6 0
      go.sum
  3. 56 0
      reporter/takephoto.go

+ 7 - 2
go.mod

@@ -2,17 +2,22 @@ module hnyfkj.com.cn/rtu/xy_v
 
 go 1.24.2
 
-require hnyfkj.com.cn/rtu/linux v0.0.0
+require (
+	gopkg.in/ini.v1 v1.67.0
+	hnyfkj.com.cn/rtu/linux v0.0.0
+)
 
 require (
 	github.com/alexflint/go-filemutex v1.3.0 // indirect
 	github.com/beevik/ntp v1.5.0 // indirect
+	github.com/hashicorp/errwrap v1.0.0 // indirect
+	github.com/hashicorp/go-multierror v1.1.1 // indirect
+	github.com/jlaffaye/ftp v0.2.0 // indirect
 	github.com/sirupsen/logrus v1.9.3 // indirect
 	github.com/vishvananda/netlink v1.3.1 // indirect
 	github.com/vishvananda/netns v0.0.5 // indirect
 	golang.org/x/net v0.44.0 // indirect
 	golang.org/x/sys v0.36.0 // indirect
-	gopkg.in/ini.v1 v1.67.0 // indirect
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
 )
 

+ 6 - 0
go.sum

@@ -5,6 +5,12 @@ github.com/beevik/ntp v1.5.0/go.mod h1:mJEhBrwT76w9D+IfOEGvuzyuudiW9E52U2BaTrMOY
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/jlaffaye/ftp v0.2.0 h1:lXNvW7cBu7R/68bknOX3MrRIIqZ61zELs1P2RAiA3lg=
+github.com/jlaffaye/ftp v0.2.0/go.mod h1:is2Ds5qkhceAPy2xD6RLI6hmp/qysSoymZ+Z2uTnspI=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=

+ 56 - 0
reporter/takephoto.go

@@ -1 +1,57 @@
 package reporter
+
+import (
+	"context"
+	"fmt"
+	"os"
+	"path/filepath"
+	"time"
+
+	"hnyfkj.com.cn/rtu/linux/baseapp"
+	camera1 "hnyfkj.com.cn/rtu/linux/mvs_u_takephoto"
+	"hnyfkj.com.cn/rtu/linux/utils/ftpclient"
+	mcu "hnyfkj.com.cn/rtu/xy_v/mcu_ctrl_board"
+)
+
+const (
+	PhotoTimeout = 5 * 60 // 拍照超时时间, 单位: 秒
+)
+
+func TakePhotoAndUpToFtp(ctx context.Context) (string, error) {
+	// 1, 开始执行拍照任务
+	mcu.GlobalWorkState.Add(mcu.PhotoCapturing)
+	baseapp.Logger.Infof("[%s] 拍照中, 稍后...", MODULE_NAME)
+
+	now := time.Now()
+	imgFile := filepath.Join(baseapp.IMG_DIR, fmt.Sprintf("%s.jpg", now.Format("2006-01-02_15-04-05.000")))
+	_, err := camera1.TakePhoto(camera1.IMG_TYPE_JPG, imgFile, PhotoTimeout)
+	if err != nil {
+		baseapp.Logger.Errorf("[%s] 拍照失败: %v!!", MODULE_NAME, err)
+		mcu.GlobalWorkState.Remove(mcu.PhotoCapturing)
+		return "", err
+	}
+	elapsed := time.Since(now).Milliseconds()
+	baseapp.Logger.Infof("[%s] 拍照完成, 输出到本地文件: %q, 用时: %d毫秒", MODULE_NAME, imgFile, elapsed)
+	mcu.GlobalWorkState.Remove(mcu.PhotoCapturing)
+
+	// 2, 上传照片到服务器
+	ftpclient.FileUploader.Lock() // 上传锁定(多个上传任务并发时, 保证串行执行)
+	defer ftpclient.FileUploader.Unlock()
+
+	mcu.GlobalWorkState.Add(mcu.PhotoUploading)
+	now = time.Now()
+	baseapp.Logger.Infof("[%s] 正在上传照片文件%q到服务器...", MODULE_NAME, imgFile)
+
+	remoteFile, err := ftpclient.UploadFileToFtp(ctx, imgFile, CfgServers.Img2Ftp.Address, CfgServers.Img2Ftp.Username, CfgServers.Img2Ftp.Password, ftpclient.DefaultUploadTimeout)
+	if err != nil {
+		baseapp.Logger.Errorf("[%s] 照片文件%q上传失败: %v!!", MODULE_NAME, imgFile, err)
+		mcu.GlobalWorkState.Remove(mcu.PhotoUploading)
+	} else {
+		os.Remove(imgFile)
+		elapsed = time.Since(now).Milliseconds()
+		baseapp.Logger.Infof("[%s] 照片文件上传成功, 用时: %d毫秒, 本地文件: %q已删除", MODULE_NAME, elapsed, imgFile)
+		mcu.GlobalWorkState.Remove(mcu.PhotoUploading)
+	}
+
+	return remoteFile, err
+}