Explorar el Código

1, 修改优化代码,测试有线/4G网络的切换, 有线优先, 已通过测试; 2,优化shell脚本

niujiuru hace 1 mes
padre
commit
487e85b2bf
Se han modificado 8 ficheros con 63 adiciones y 93 borrados
  1. 8 1
      .vscode/settings.json
  2. 17 9
      air720u/eth2net.go
  3. 1 1
      main.go
  4. 0 1
      netmgrd/eth0net.go
  5. 22 72
      netmgrd/netmgrd.go
  6. 0 8
      scripts/set_env
  7. 9 0
      scripts/start
  8. 6 1
      scripts/stop

+ 8 - 1
.vscode/settings.json

@@ -1,5 +1,12 @@
 {
+  "workbench.editor.showTabs": "multiple",
+  "workbench.editor.wrapTabs": true,
+  "workbench.editor.tabSizing": "shrink",
   "files.associations": {
-    "mvcameracontrol.h": "c"
+    "*.c": "c",
+    "*.h": "c",
+    "*.go": "go",
+    "*.sh": "shellscript",
+    "*.md": "markdown",
   }
 }

+ 17 - 9
air720u/eth2net.go

@@ -44,20 +44,28 @@ func disableEthBut2() error {
 	return nil
 }
 
+// 启动"eth2"网口, 使其变可用
+func EnableEth2() error {
+	cmd := exec.Command("ip", "link", "set", "dev", "eth2", "up")
+	cmd.Stdout = baseapp.Logger.WriterLevel(logrus.DebugLevel)
+	cmd.Stderr = baseapp.Logger.WriterLevel(logrus.ErrorLevel)
+	if err := cmd.Run(); err != nil {
+		return fmt.Errorf("启动网口\"eth2\"失败: %w", err)
+	}
+	return nil
+}
+
 // 启动DHCP客户端, 请求IP地址
 func dialupEth2() error {
-	cmd1 := exec.Command("ip", "link", "set", "dev", "eth2", "up")
-	cmd1.Stdout = baseapp.Logger.WriterLevel(logrus.DebugLevel)
-	cmd1.Stderr = baseapp.Logger.WriterLevel(logrus.ErrorLevel)
-	if err := cmd1.Run(); err != nil {
-		return fmt.Errorf("启动网口\"eth2\"失败: %w", err)
+	if err := EnableEth2(); err != nil {
+		return err
 	}
 
 	eth2pid := baseapp.RUN_DIR + "/udhcpc.eth2.pid"
-	cmd2 := exec.Command("udhcpc", "-b", "-i", "eth2", "-p", eth2pid)
-	cmd2.Stdout = baseapp.Logger.WriterLevel(logrus.DebugLevel)
-	cmd2.Stderr = baseapp.Logger.WriterLevel(logrus.ErrorLevel)
-	if err := cmd2.Run(); err != nil {
+	cmd := exec.Command("udhcpc", "-b", "-i", "eth2", "-p", eth2pid)
+	cmd.Stdout = baseapp.Logger.WriterLevel(logrus.DebugLevel)
+	cmd.Stderr = baseapp.Logger.WriterLevel(logrus.ErrorLevel)
+	if err := cmd.Run(); err != nil {
 		return fmt.Errorf("\"eth2\"请求地址失败: %w", err)
 	}
 

+ 1 - 1
main.go

@@ -49,7 +49,7 @@ func main() {
 	// 06, 后台服务器业务交互, Todo: 根据项目不同, 实现具体的业务逻辑协议都不同, 具体看情况
 
 	// 07, 阻塞等待退出信号量
-	baseapp.IsExit2()
+	<-baseapp.IsExit2()
 
 	// 08, 退出程序并释放资源
 end_p:

+ 0 - 1
netmgrd/eth0net.go

@@ -47,7 +47,6 @@ func enableEth0() error {
 	if err := cmd.Run(); err != nil {
 		return fmt.Errorf("启动网口\"eth0\"失败: %w", err)
 	}
-
 	return nil
 }
 

+ 22 - 72
netmgrd/netmgrd.go

@@ -5,10 +5,8 @@ import "C"
 import (
 	"sync"
 	"sync/atomic"
-	"syscall"
 	"time"
 
-	"github.com/vishvananda/netlink"
 	modem "hnyfkj.com.cn/rtu/linux/air720u"
 	"hnyfkj.com.cn/rtu/linux/baseapp"
 )
@@ -48,23 +46,24 @@ func serviceRun() {
 	// 1, 首次连接网络
 	openNetwork()
 
-	// 2, 监控拔插网线
-	eth0PlugCycleCh := make(chan bool, 1)
-	done := make(chan struct{})
-	defer close(done)
-	go monitorEth0PlugCycle(eth0PlugCycleCh, done)
-
-	// 3, 监控联网状态
+	// 2, 监控联网状态
 	t := time.NewTimer(interval1)
 	defer t.Stop()
 	for {
 		select {
 		case <-t.C:
-			// 3.1, 联网检测-看结果
+			// 3.1 切换网络-看情况
+			eth0CableOK, _ := isEth0CableConnected()
+			if (eth0CableOK && curNetType != NetEth) || (!eth0CableOK && curNetType != NetLTE) {
+				baseapp.Logger.Warnf("[%s] 网络环境变化, 正在尝试切换网络...", MODULE_NAME)
+				openNetwork()
+			}
+
+			// 3.2, 联网检测-看结果
 			dnsOK, pingOK, tcpOK, httpOK := CheckNetwork()
 			baseapp.Logger.Infof("[%s] 联网检测: DNS OK=%v, PING OK=%v, TCP OK=%v, HTTP OK=%v", MODULE_NAME, dnsOK, pingOK, tcpOK, httpOK)
 
-			// 3.2, 联网成功-在线时
+			// 3.3, 联网成功-在线时
 			if dnsOK && pingOK && tcpOK {
 				isOnline.Store(true)
 				offlineStartTs.Store(0)
@@ -87,22 +86,19 @@ func serviceRun() {
 				}
 			}
 
-			// 3.3, 联网失败-离线时
+			// 3.4, 联网失败-离线时
 			if isOnline.Load() { // 状态由"1"变为"0"
 				isOnline.Store(false)
 				offlineStartTs.Store(time.Now().UnixNano()) // 记录离线开始时间
 			}
 
 			if offlineDuration() >= (time.Duration(60) * time.Second) {
-				baseapp.Logger.Warnf("[%s] 检测到网络长时间断开, 将重新尝试连接网络!", MODULE_NAME)
+				baseapp.Logger.Warnf("[%s] 网络长时间断开, 正在重新连接...", MODULE_NAME)
 				openNetwork()
 				offlineStartTs.Store(time.Now().UnixNano()) // 重置离线开始时间
 			}
 
 			t.Reset(interval1)
-		case <-eth0PlugCycleCh: // 当监听到拔插网线时, 触发重新(切换)连接网络
-			openNetwork()
-			continue
 		case <-baseapp.IsExit2():
 			return
 		} // select end
@@ -221,13 +217,18 @@ func openNetwork() {
 	modem.CloseEth2Net()
 
 	eth0CableOK, _ := isEth0CableConnected()
-	if eth0CableOK && curNetType != NetEth && openEth0Net() {
+	if eth0CableOK && openEth0Net() {
 		curNetType = NetEth
 		baseapp.Logger.Infof("[%s] ✅ 有线网络已连接", MODULE_NAME)
 		return
 	}
 
 	tryOpenLTE := func() bool {
+		err := modem.EnableEth2()
+		if err != nil {
+			baseapp.Logger.Errorf("[%s] 启用\"eth2\"网卡时发生错误: %v!!", MODULE_NAME, err)
+			return false
+		}
 		if eth2CableOK, _ := modem.IsEth2CableConnected(); eth2CableOK {
 			if modem.OpenEth2Net() {
 				return true
@@ -242,7 +243,10 @@ func openNetwork() {
 
 	if tryOpenLTE() {
 		curNetType = NetLTE
-		enableEth0() // 重新启用"eth0", 否则无法监听拔插网线
+		err := enableEth0() // 重新启用"eth0", 否则无法监听拔插网线
+		if err != nil {
+			baseapp.Logger.Errorf("[%s] 启用\"eth0\"网卡时发生错误: %v!!", MODULE_NAME, err)
+		}
 		baseapp.Logger.Infof("[%s] ✅ 蜂窝网络已连接", MODULE_NAME)
 		return
 	}
@@ -251,60 +255,6 @@ func openNetwork() {
 	baseapp.Logger.Warnf("[%s] 没有可用的网络连接!", MODULE_NAME)
 }
 
-// 监控拔插网线
-func monitorEth0PlugCycle(plugCycle chan bool, done chan struct{}) error {
-	updates := make(chan netlink.LinkUpdate)
-	if err := netlink.LinkSubscribe(updates, done); err != nil {
-		return err
-	}
-
-	link, err := netlink.LinkByName("eth0")
-	if err != nil {
-		return err
-	}
-
-	isUp := link.Attrs().Flags&syscall.IFF_RUNNING != 0
-	waitingForPlug := false
-
-	const debounce = 1000 * time.Millisecond
-	var lastChange time.Time
-
-	ticker := time.NewTicker(500 * time.Millisecond)
-	defer ticker.Stop()
-
-	for {
-		select {
-		case u := <-updates:
-			if u.Link.Attrs().Name != "eth0" {
-				continue
-			}
-			newUp := u.IfInfomsg.Flags&syscall.IFF_RUNNING != 0
-			if newUp == isUp {
-				continue
-			}
-			isUp = newUp
-			lastChange = time.Now()
-
-			if !isUp {
-				baseapp.Logger.Warnf("[%s] ❌ eth0 cable unplugged!", MODULE_NAME)
-				waitingForPlug = true
-			}
-		case <-ticker.C:
-			if waitingForPlug && isUp && time.Since(lastChange) >= debounce {
-				baseapp.Logger.Infof("[%s] ✅ eth0 cable plugged in", MODULE_NAME)
-				select {
-				case plugCycle <- true:
-				case <-done:
-					return nil
-				}
-				waitingForPlug = false
-			}
-		case <-done:
-			return nil
-		}
-	}
-}
-
 // 得到当前联网类型: 有线、蜂窝
 func GetCurrentNetType() NetType {
 	return curNetType

+ 0 - 8
scripts/set_env

@@ -5,11 +5,3 @@ export APPRUNS_PATH="${APPHOME_PATH}/status"
 
 # 导出运行时库
 export LD_LIBRARY_PATH=${APPLIBS_PATH}
-
-# 重置海康相机(1200W海康U口相机在RTU板子上冷启动时, 需要先重置相机, 才能正常工作)
-HKCAM_RESET="${APPBINS_PATH}/hkcam_reset.out"
-if [ -e "$HKCAM_RESET" ]; then
-  chmod a+x "$HKCAM_RESET"
-  "$HKCAM_RESET"
-  sleep 5
-fi

+ 9 - 0
scripts/start

@@ -6,6 +6,15 @@
 . $(dirname $0)/modules/funcs/functions.sh
 export_env
 
+# 重置海康相机(1200W海康U口相机在RTU板子上冷启动时, 需要先重置相机, 才能正常工作)
+HKCAM_RESET="${APPBINS_PATH}/hkcam_reset.out"
+if [ -e "$HKCAM_RESET" ]; then
+  chmod a+x "$HKCAM_RESET"
+  "$HKCAM_RESET"
+  sleep 5
+fi
+
+# 启动主应用程序模块
 ORDER="
 rtu_linux_modules
 daemon

+ 6 - 1
scripts/stop

@@ -2,6 +2,7 @@
 # script that runs on system stop
 # 2013-09-26 09:50 created by niujiuru
 
+. $(dirname $0)/set_env
 . $(dirname $0)/modules/funcs/functions.sh
 export_env
 
@@ -14,5 +15,9 @@ for m in ${ORDER}
 do
   echo ":: stopping $m"
   call_module "$m" stop
-  rm -rf ${APPRUNS_PATH}/*.lock
 done
+
+if [ -d "${APPRUNS_PATH}" ]; then
+  echo ":: removing all files from ${APPRUNS_PATH}"
+  rm -f ${APPRUNS_PATH}/* 2>/dev/null
+fi