Prechádzať zdrojové kódy

1, 完成networkd.service服务代码; 2, 调整项目代码结构, 新增upgrade.service占位; 3,其它优化

niujiuru 1 mesiac pred
rodič
commit
c283ac741d

+ 71 - 0
Makefile

@@ -0,0 +1,71 @@
+.PHONY: all clean
+
+# C&GO编译器
+CC := arm-linux-gnueabihf-gcc
+GO := go
+GO_BUILD := $(GO) build
+GO_FLAGS := -ldflags "-s -w -X main.BuildTime=$(shell date +%Y-%m-%dT%H:%M:%S)"
+
+# GO编译环境
+SETGO_ENV = \
+	GOOS=linux \
+	GOARCH=arm \
+	GOARM=7 \
+	CC=$(CC) \
+	CGO_ENABLED=1
+
+# 日期和时间
+DATE := $(shell date +%Y%m%d_%H%M%S)
+
+# 依赖库路径
+RTU_LINUX_MODULES_PATH := $(shell pwd)/../rtu_linux_modules
+
+# 依赖静态库
+S_LIBS0 := -Wl,-Bstatic -L$(RTU_LINUX_MODULES_PATH)/swapi -lswapi
+S_LIBS1 := -L$(RTU_LINUX_MODULES_PATH)/ec200u -lec200u -L$(RTU_LINUX_MODULES_PATH)/air720u -lair720u
+S_LIBS2 := -L$(RTU_LINUX_MODULES_PATH)/hk_takephoto -lhk_takephoto -L$(RTU_LINUX_MODULES_PATH)/dh_takephoto -ldh_takephoto
+S_LIBS3 := -L$(RTU_LINUX_MODULES_PATH)/air530z -lair530z
+
+# 依赖动态库
+D_LIBS0 := -Wl,-Bdynamic -lc -lm -ldl -lpthread
+D_LIBS2 := -L$(RTU_LINUX_MODULES_PATH)/hk_takephoto/lib/armv7hf/. -lMvCameraControl
+D_LIBS2 += -L$(RTU_LINUX_MODULES_PATH)/dh_takephoto/lib/armv7hf -lMVSDK -liImageProcessing -lImageConvert -llog4cpp -lMvLSCProcess
+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: yfkj-networkd
+
+# 可执行程序
+LK_LIBS := $(S_LIBS0) $(S_LIBS1) $(D_LIBS0)
+yfkj-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/config.go ./networkd.service/main.go
+	@cp $@ ./build/$(basename $@)_$(DATE)$(suffix $@)
+
+# 静态库模块
+libswapi.a :
+	$(MAKE) -C $(RTU_LINUX_MODULES_PATH)/swapi        target=armv7hf $@
+
+libec200u.a :
+	$(MAKE) -C $(RTU_LINUX_MODULES_PATH)/ec200u       target=armv7hf $@
+
+libair720u.a :
+	$(MAKE) -C $(RTU_LINUX_MODULES_PATH)/air720u      target=armv7hf $@
+
+libair530z.a :
+	$(MAKE) -C $(RTU_LINUX_MODULES_PATH)/air530z      target=armv7hf $@
+
+libhk_takephoto.a :
+	$(MAKE) -C $(RTU_LINUX_MODULES_PATH)/hk_takephoto target=armv7hf $@
+
+libdh_takephoto.a :
+	$(MAKE) -C $(RTU_LINUX_MODULES_PATH)/dh_takephoto target=armv7hf $@
+
+# 编译的清理
+clean:
+	@for m in swapi hk_takephoto dh_takephoto ec200u air720u air530z; do \
+		$(MAKE) -C $(RTU_LINUX_MODULES_PATH)/$$m clean || true; \
+	done
+
+	rm -rf yfkj-networkd build

+ 0 - 0
camera-capture.service/Makefile


+ 0 - 0
gnss.service/Makefile


+ 22 - 0
go.mod

@@ -0,0 +1,22 @@
+module rtu_linux_services
+
+go 1.24.2
+
+require (
+	github.com/kardianos/service v1.2.4
+	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/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
+)
+
+replace hnyfkj.com.cn/rtu/linux => ../rtu_linux_modules

+ 39 - 0
go.sum

@@ -0,0 +1,39 @@
+github.com/alexflint/go-filemutex v1.3.0 h1:LgE+nTUWnQCyRKbpoceKZsPQbs84LivvgwUymZXdOcM=
+github.com/alexflint/go-filemutex v1.3.0/go.mod h1:U0+VA/i30mGBlLCrFPGtTe9y6wGQfNAWPBTekHQ+c8A=
+github.com/beevik/ntp v1.5.0 h1:y+uj/JjNwlY2JahivxYvtmv4ehfi3h74fAuABB9ZSM4=
+github.com/beevik/ntp v1.5.0/go.mod h1:mJEhBrwT76w9D+IfOEGvuzyuudiW9E52U2BaTrMOYow=
+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/kardianos/service v1.2.4 h1:XNlGtZOYNx2u91urOdg/Kfmc+gfmuIo1Dd3rEi2OgBk=
+github.com/kardianos/service v1.2.4/go.mod h1:E4V9ufUuY82F7Ztlu1eN9VXWIQxg8NoLQlmFe0MtrXc=
+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=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
+github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
+github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0=
+github.com/vishvananda/netlink v1.3.1/go.mod h1:ARtKouGSTGchR8aMwmkzC0qiNPrrWO5JS/XMVl45+b4=
+github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
+github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
+golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
+golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
+golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 0 - 0
networkd.service/Makefile


+ 75 - 0
networkd.service/config.go

@@ -0,0 +1,75 @@
+package main
+
+import (
+	"os"
+	"path/filepath"
+	"sync"
+
+	"hnyfkj.com.cn/rtu/linux/baseapp"
+)
+
+const defaultCfg = `[Log]
+; 日志级别: trace、debug、info、warn、error、fatal、panic
+Level = info
+; 输出目标: console(控制台)、file(文件)、all(控制台+文件)
+Target = all
+; 每个日志文件的最大大下, 以"MB"为单位
+MaxFileSize = 5
+; 保留的最大备份文件数量
+MaxBackupFileCnts = 1
+`
+
+var (
+	initCfgOnce sync.Once
+	initCfgErr  error
+)
+
+func EnsureDefaultConfig() error {
+	initCfgOnce.Do(func() {
+		initCfgErr = ensureDefaultConfig()
+	})
+
+	return initCfgErr
+}
+
+func ensureDefaultConfig() error {
+	cfgFile := filepath.Join(
+		baseapp.CFG_DIR,
+		"config.ini",
+	)
+
+	if err := os.MkdirAll(
+		baseapp.CFG_DIR,
+		0755,
+	); err != nil {
+		return err
+	}
+
+	f, err := os.OpenFile(
+		cfgFile,
+		os.O_CREATE|os.O_EXCL|os.O_WRONLY,
+		0644,
+	)
+	if err != nil {
+		if os.IsExist(err) {
+			return nil
+		}
+		return err
+	}
+
+	defer func() {
+		_ = f.Close()
+	}()
+
+	if _, err = f.WriteString(defaultCfg); err != nil {
+		_ = os.Remove(cfgFile)
+		return err
+	}
+
+	if err = f.Close(); err != nil {
+		_ = os.Remove(cfgFile)
+		return err
+	}
+
+	return nil
+}

+ 223 - 0
networkd.service/main.go

@@ -0,0 +1,223 @@
+package main
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"net/http"
+	"os"
+	"strconv"
+	"time"
+
+	"github.com/kardianos/service"
+	"hnyfkj.com.cn/rtu/linux/baseapp"
+	netmgrd "hnyfkj.com.cn/rtu/linux/netmgrd"
+	"hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
+)
+
+var (
+	Version   = "0.0.0.1"
+	BuildTime = ""
+)
+
+type program struct {
+	name        string
+	core_server *jsonrpc2.RPCServer
+	rpc_methods jsonrpc2.MethodMap
+	http_server *http.Server
+}
+
+// Start should not block. Do the actual work async.
+func (p *program) Start(s service.Service) error {
+	baseapp.InitPath()
+	if err := EnsureDefaultConfig(); err != nil {
+		return err
+	}
+
+	baseapp.InitLogger("")
+	baseapp.Logger.Infof("App Version: %s, Build Time: %s", Version, BuildTime)
+
+	if !netmgrd.ModemInit() {
+		return errors.New("modem init failed")
+	}
+
+	netmgrd.SetTimeSyncEnabled(false) // 关闭时间同步, 由"timesyncd.service"完成
+	netmgrd.ModuleInit()
+
+	var err error
+	p.core_server, err = jsonrpc2.NewRPCServer(p.name, baseapp.Logger)
+	if err != nil {
+		return err
+	}
+
+	p.rpc_methods = make(jsonrpc2.MethodMap)
+
+	//////////////////////////////////////////////////////////////////
+	p.rpc_methods["basic.getBuildVer"] = p.getBuildVer /// 获取软件版本
+	p.rpc_methods["basic.getLogLevel"] = p.getLogLevel /// 获取日志级别
+	p.rpc_methods["basic.setLogLevel"] = p.setLogLevel /// 设置日志级别
+	p.rpc_methods["basic.saveLogConf"] = p.saveLogConf /// 保存日志设置
+	//////////////////////////////////////////////////////////////////
+	p.rpc_methods["core.getModemInfo"] = p.getModemInfo // IMEI、ICCID
+	p.rpc_methods["core.getNetStatus"] = p.getNetStatus // 联网状态信息
+	//////////////////////////////////////////////////////////////////
+
+	err = p.core_server.RegisterMethods(p.rpc_methods)
+	if err != nil {
+		return err
+	}
+
+	mux := http.NewServeMux()
+	mux.Handle("/rpc", p.core_server)
+
+	p.http_server = &http.Server{
+		Addr:    "127.0.0.1:7000",
+		Handler: mux,
+	}
+
+	go p.run()
+
+	return nil
+}
+
+// Do work here
+func (p *program) run() {
+	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)
+	}
+
+	netmgrd.ModemExit()
+	baseapp.ExitLogger()
+	return nil
+}
+
+func (p *program) getBuildVer(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
+	result := map[string]string{
+		"version":    Version,
+		"build_time": BuildTime,
+	}
+	return jsonrpc2.BuildResponse(req, result, nil)
+}
+
+func (p *program) getLogLevel(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
+	level, _ := baseapp.GetLogLevel()
+	result := map[string]string{
+		"log_level": level,
+	}
+	return jsonrpc2.BuildResponse(req, result, nil)
+}
+
+func (p *program) setLogLevel(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
+	var params map[string]string
+	if err := json.Unmarshal(req.Params, &params); err != nil {
+		return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, err.Error())
+	}
+
+	level, ok := params["log_level"]
+	if !ok || level == "" {
+		return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "missing or empty 'log_level' parameter")
+	}
+
+	err := baseapp.UpdateLogLevel(level)
+	if err != nil {
+		return jsonrpc2.BuildError(req, jsonrpc2.ErrInternal, err.Error())
+	}
+
+	return jsonrpc2.BuildResponse(req, "success", nil)
+}
+
+func (p *program) saveLogConf(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
+	err := baseapp.SaveLogConfig()
+	if err != nil {
+		return jsonrpc2.BuildError(req, jsonrpc2.ErrInternal, err.Error())
+	}
+
+	return jsonrpc2.BuildResponse(req, "success", nil)
+}
+
+func (p *program) getModemInfo(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
+	result := map[string]string{
+		"imei":  netmgrd.GetIMEI(),
+		"iccid": netmgrd.GetSimICCID(),
+		"rssi":  netmgrd.GetRSSI(),
+	}
+	return jsonrpc2.BuildResponse(req, result, nil)
+}
+
+func (p *program) getNetStatus(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
+	result := map[string]string{
+		"net_available": strconv.FormatBool(netmgrd.IsInetAvailable()),
+		"net_type":      netmgrd.GetCurrentNetType().String(),
+	}
+	return jsonrpc2.BuildResponse(req, result, nil)
+}
+
+func main() {
+	if baseapp.IsArgsParam("-h") {
+		help()
+		return
+	}
+
+	if baseapp.IsArgsParam("-v") {
+		fmt.Printf("Version: %s, Build Time: %s\n", Version, BuildTime)
+		return
+	}
+
+	svcConfig := &service.Config{
+		Name:        "yfkj-networkd",
+		DisplayName: "yfkj-networkd",
+		Description: "Network connectivity management",
+		Option: map[string]any{
+			"Restart": "always", // 无条件重启
+		},
+	}
+
+	if baseapp.IsArgsParam("-n") {
+		fmt.Println(svcConfig.Name + ".service")
+		return
+	}
+
+	prg := &program{
+		name: svcConfig.Name,
+	}
+
+	svc, err := service.New(prg, svcConfig)
+	if err != nil {
+		fmt.Printf("%s.service creation failed: %v\n",
+			svcConfig.Name, err)
+		os.Exit(1)
+	}
+
+	if err := svc.Run(); err != nil {
+		fmt.Printf("%s.service run failed: %v\n",
+			svcConfig.Name, err)
+		os.Exit(1)
+	}
+}
+
+func help() {
+	h := `
+-h 显示帮助提示
+-n 显示服务名称
+-v 当前程序版本
+`
+
+	fmt.Println(h)
+}

+ 7 - 5
reademe.txt

@@ -3,11 +3,11 @@
 
 app-install.service         : Install or uninstall applications
                             : 安装或卸载应用程序
-camera-capture.service      : Camera capture service
-                            : 相机拍照与视频采集(当前暂不支持)
-gnss.service                : Local GPS position acquisition
-                            : 本地地理位置信息获取
-local-startup.service       : Local startup tasks
+camera-capture.service      : Camera capture
+                            : 相机图像采集
+gnss.service                : Location acquisition
+                            : 位置信息获取
+local-startup.service       : Local startup task execution
                             : 本地开机启动脚本(开机后运行一次)
                             : 需根据具体硬件需求编写实现并测试
 networkd.service            : Network management
@@ -18,6 +18,8 @@ system-metrics.service      : System metrics collection
                             : 系统信息采集
 timesyncd.service           : System time synchronization
                             : 系统时间同步
+upgrade.service             : YFKJ service upgrade
+                            : 云飞科技服务程序升级
 web-ui.service              : Web user interface
                             : 配置管理界面
 

+ 0 - 0
sshd-mqtt-bridge.service/Makefile


+ 0 - 0
system-metrics.service/Makefile


+ 0 - 0
timesyncd.service/Makefile


app-install.service/Makefile → upgrade.service/reademe.txt


+ 0 - 0
web-ui.service/Makefile