Преглед изворни кода

上传gnss服务模块代码

niujiuru пре 2 месеци
родитељ
комит
7203ea2c2e
4 измењених фајлова са 218 додато и 3 уклоњено
  1. 10 3
      Makefile
  2. 171 0
      gnss.service/main.go
  3. 18 0
      gnss.service/rpc_handlers.go
  4. 19 0
      gnss.service/test.txt

+ 10 - 3
Makefile

@@ -33,23 +33,30 @@ D_LIBS2 += -L$(RTU_LINUX_MODULES_PATH)/dh_takephoto/lib/armv7hf -lMVSDK -liImage
 D_LIBS2 += -L$(RTU_LINUX_MODULES_PATH)/dh_takephoto/lib/armv7hf/GenICam/bin -lGCBase_gcc483_v3_0 -lGenApi_gcc483_v3_0 -lLog_gcc483_v3_0 -llog4cpp_gcc483_v3_0 -lMathParser_gcc483_v3_0 -lNodeMapData_gcc483_v3_0 -lXmlParser_gcc483_v3_0
 
 # 编译的目标
-all: networkd timesyncd
+all: networkd timesyncd gnss
 
 # 可执行程序
-LK_LIBS := $(S_LIBS0) $(S_LIBS1) $(D_LIBS0)
+networkd : LK_LIBS = $(S_LIBS0) $(S_LIBS1) $(D_LIBS0)
 networkd : libswapi.a libair720u.a libec200u.a
 	mkdir -p ./build
 	$(GO) mod tidy
 	$(SETGO_ENV) CGO_LDFLAGS="$(LK_LIBS)" $(GO_BUILD) $(GO_FLAGS) -o $@  ./networkd.service/*.go
 	cp -rf $@ ./build/ && cp -rf $@ ./build/$(basename $@)_$(DATE)$(suffix $@) && rm -rf $@
 
-LK_LIBS := $(S_LIBS0) $(S_LIBS1) $(D_LIBS0)
+timesyncd : LK_LIBS = $(S_LIBS0) $(S_LIBS1) $(D_LIBS0)
 timesyncd : libswapi.a libair720u.a libec200u.a
 	mkdir -p ./build
 	$(GO) mod tidy
 	$(SETGO_ENV) CGO_LDFLAGS="$(LK_LIBS)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./timesyncd.service/*.go
 	cp -rf $@ ./build/ && cp -rf $@ ./build/$(basename $@)_$(DATE)$(suffix $@) && rm -rf $@
 
+gnss : LK_LIBS = $(S_LIBS0) $(S_LIBS3) $(D_LIBS0)
+gnss : libswapi.a libair530z.a
+	mkdir -p ./build
+	$(GO) mod tidy
+	$(SETGO_ENV) CGO_LDFLAGS="$(LK_LIBS)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./gnss.service/*.go
+	cp -rf $@ ./build/ && cp -rf $@ ./build/$(basename $@)_$(DATE)$(suffix $@) && rm -rf $@
+
 # 静态库模块
 libswapi.a :
 	$(MAKE) -C $(RTU_LINUX_MODULES_PATH)/swapi        target=armv7hf $@

+ 171 - 0
gnss.service/main.go

@@ -1 +1,172 @@
 package main
+
+import (
+	"context"
+	"errors"
+	"flag"
+	"fmt"
+	"net/http"
+	"os"
+	"rtu_linux_services/servicelib"
+	"time"
+
+	"github.com/kardianos/service"
+	gnss "hnyfkj.com.cn/rtu/linux/air530z"
+	"hnyfkj.com.cn/rtu/linux/baseapp"
+	"hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
+)
+
+var (
+	Version   = "0.0.0.1"
+	BuildTime = ""
+)
+
+const (
+	network    = "tcp" // http -> tcp
+	listenAddr = "127.0.0.1:7002"
+)
+
+type program struct {
+	name        string
+	core_server *jsonrpc2.RPCServer
+	http_server *http.Server
+}
+
+// Start should not block. Do the actual work async.
+func (p *program) Start(s service.Service) error {
+	logCfgFile, err := servicelib.EnsureDefaultLogConfig()
+	if err != nil {
+		return err
+	}
+
+	baseapp.InitLogger(logCfgFile)
+	baseapp.Logger.Infof("App Version: %s, Build Time: %s", Version, BuildTime)
+
+	err = gnss.ModuleInit2()
+	if err != nil {
+		return err
+	}
+
+	p.core_server, err = jsonrpc2.NewRPCServer(p.name, baseapp.Logger)
+	if err != nil {
+		return err
+	}
+
+	methods := make(jsonrpc2.MethodMap)
+
+	//////////////////////////////////////////////////////////
+	_getBuildVer := servicelib.MakeGetBuildVer(
+		Version, BuildTime)
+	methods["basic.getBuildVer"] = _getBuildVer // 获取软件版本
+	_getLogLevel := servicelib.GetLogLevel
+	methods["basic.getLogLevel"] = _getLogLevel // 获取日志级别
+	_setLogLevel := servicelib.SetLogLevel
+	methods["basic.setLogLevel"] = _setLogLevel // 设置日志级别
+	_saveLogConf := servicelib.SaveLogConf
+	methods["basic.saveLogConf"] = _saveLogConf // 保存日志设置
+	//////////////////////////////////////////////////////////
+	methods["core.getLocationInfo"] = getLocationInfo
+
+	err = p.core_server.RegisterMethods(methods)
+	if err != nil {
+		return err
+	}
+
+	mux := http.NewServeMux()
+	mux.Handle("/rpc", p.core_server)
+
+	p.http_server = &http.Server{
+		Addr:    listenAddr,
+		Handler: mux,
+	}
+
+	go p.run()
+
+	return nil
+}
+
+// Do work here
+func (p *program) run() {
+	baseapp.Logger.Infof(
+		"[%s] Http server starting on %s...",
+		p.name,
+		p.http_server.Addr,
+	)
+
+	err := p.http_server.ListenAndServe() // 同步阻塞
+
+	if err != nil && !errors.Is(err, http.ErrServerClosed) {
+		baseapp.Logger.Errorf("[%s] Start http server error: %v!!", p.name, err)
+		return
+	}
+}
+
+// Stop should not block. Return with a few seconds.
+func (p *program) Stop(s service.Service) error {
+	if p.core_server != nil {
+		p.core_server.Stop()
+	}
+
+	if p.http_server != nil {
+		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+		defer cancel()
+
+		_ = p.http_server.Shutdown(ctx)
+	}
+
+	gnss.ModuleExit()
+	baseapp.ExitLogger()
+	return nil
+}
+
+func main() {
+	baseapp.SetOptDirs(true, false, false, false)
+	baseapp.InitPath()
+
+	svcFlag := flag.String("service", "", "Control the system service.")
+	flag.Parse()
+
+	svcConfig := &service.Config{
+		Name:        "yfkj-gnss",
+		DisplayName: "yfkj-gnss",
+		Description: "Location acquisition",
+		Option: map[string]any{
+			"Restart": "always", // 无条件重启
+		},
+	}
+
+	servicelib.WriteVersionFile(baseapp.EXEC_DIR, Version) //-> for 升级
+
+	prg := &program{
+		name: "GNSS",
+	}
+
+	svc, err := service.New(prg, svcConfig)
+	if err != nil {
+		fmt.Printf("%s.service creation failed: %v\n",
+			svcConfig.Name, err)
+		os.Exit(1)
+	}
+
+	if len(*svcFlag) != 0 {
+		err := service.Control(svc, *svcFlag)
+		if err != nil {
+			fmt.Printf("%v\n Valid actions: %q\n", err, service.ControlAction)
+		}
+		os.Exit(0)
+	}
+
+	if servicelib.IsAddrInUse(network, listenAddr) { // 查询端口占用,避免运行多份实例
+		fmt.Printf(
+			"%s.service start failed: listen addr %s already in use\n",
+			svcConfig.Name, listenAddr,
+		)
+		os.Exit(1)
+	}
+
+	if err := svc.Run(); err != nil {
+		fmt.Printf("%s.service run failed: %v\n",
+			svcConfig.Name, err)
+		os.Exit(1)
+	}
+}

+ 18 - 0
gnss.service/rpc_handlers.go

@@ -1 +1,19 @@
 package main
+
+import (
+	"context"
+
+	gnss "hnyfkj.com.cn/rtu/linux/air530z"
+	"hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
+)
+
+func getLocationInfo(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
+	lat, lon, _ := gnss.Get2DPosition()
+
+	result := map[string]string{
+		"lat": lat,
+		"lon": lon,
+	}
+
+	return jsonrpc2.BuildResponse(req, result, nil)
+}

+ 19 - 0
gnss.service/test.txt

@@ -0,0 +1,19 @@
+接口测试:
+
+// ping联通测试
+curl -s -X POST http://127.0.0.1:7002/rpc -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"ping","params":{},"id":1}'
+
+// 获取软件版本
+curl -s -X POST http://127.0.0.1:7002/rpc -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"basic.getBuildVer","params":{},"id":2}'
+
+// 获取日志级别
+curl -s -X POST http://127.0.0.1:7002/rpc -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"basic.getLogLevel","params":{},"id":3}'
+
+// 设置日志级别
+curl -s -X POST http://127.0.0.1:7002/rpc -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"basic.setLogLevel","params":{"log_level":"trace"},"id":4}'
+
+// 保存日志设置
+curl -s -X POST http://127.0.0.1:7002/rpc -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"basic.saveLogConf","params":{},"id":5}'
+
+// 获取位置信息
+curl -s -X POST http://127.0.0.1:7002/rpc -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"core.getLocationInfo","params":{},"id":6}'