Browse Source

优化修改有线/4G/无网络三种状态切换时的代码逻辑

niujiuru 1 month ago
parent
commit
23ab244eea
7 changed files with 86 additions and 77 deletions
  1. 7 12
      air720u/air720u.go
  2. 17 11
      air720u/eth2net.go
  3. 1 0
      ec200u/ec200u.c
  4. 7 12
      ec200u/en200u.go
  5. 17 11
      ec200u/usb0net.go
  6. 17 10
      netmgrd/eth0net.go
  7. 20 21
      netmgrd/netmgrd.go

+ 7 - 12
air720u/air720u.go

@@ -89,6 +89,13 @@ openOK:
 	}
 	baseapp.Logger.Infof("[%s] 模块IMEI: %s", MODULE_NAME, imei)
 
+	bReady, _ = air720U_IsSimCardReady()
+	baseapp.Logger.Infof("[%s] SIM卡状态: %v", MODULE_NAME, bReady)
+
+	if !bReady {
+		goto initOK
+	}
+
 	for range 30 { // 等待模块完成蜂窝网络注册, 否则RSSI读取不到, 网也不可能不去
 		if baseapp.IsExit1() {
 			air720U_ComExit()
@@ -109,18 +116,6 @@ openOK:
 	}
 	baseapp.Logger.Infof("[%s] 模块RSSI: %s", MODULE_NAME, rssi)
 
-	bReady, err = air720U_IsSimCardReady()
-	if err != nil {
-		air720U_ComExit()
-		baseapp.Logger.Errorf("[%s] 错误: %v!!", MODULE_NAME, err)
-		return false
-	}
-	baseapp.Logger.Infof("[%s] SIM卡状态: %v", MODULE_NAME, bReady)
-
-	if !bReady { // 未插入SIM卡, 也不影响初始化成功, 可等待之后的热插入
-		goto initOK
-	}
-
 	iccid, err = air720U_GetSimICCID()
 	if err != nil {
 		air720U_ComExit()

+ 17 - 11
air720u/eth2net.go

@@ -224,22 +224,28 @@ func isInterfaceUp(name string) (bool, error) {
 	return link.Attrs().Flags&net.FlagUp != 0, nil
 }
 
+func waitEth2Carrier(timeoutMs int) (bool, error) {
+	interval, elapsed := 50, 0
+
+	for elapsed < timeoutMs {
+		data, err := os.ReadFile("/sys/class/net/eth2/carrier")
+		if err == nil && strings.TrimSpace(string(data)) == "1" {
+			return true, nil
+		}
+		time.Sleep(time.Millisecond * time.Duration(interval))
+		elapsed += interval
+	}
+
+	return false, fmt.Errorf("eth2 carrier not up after %d ms", timeoutMs)
+}
+
 func Is4GCableConnected() (bool, error) {
-	if up, _ := isInterfaceUp("eth2"); !up { // 管理状态
+	if up, _ := isInterfaceUp("eth2"); !up {
 		err := enableEth2()
 		if err != nil {
 			return false, err
 		}
 	}
 
-	if data, err := os.ReadFile("/sys/class/net/eth2/carrier"); err == nil { // 物理状态
-		return strings.TrimSpace(string(data)) == "1", nil
-	}
-
-	link, err := netlink.LinkByName("eth2")
-	if err != nil {
-		return false, err
-	}
-
-	return link.Attrs().OperState == netlink.OperUp, nil // 操作状态
+	return waitEth2Carrier(2000)
 }

+ 1 - 0
ec200u/ec200u.c

@@ -205,6 +205,7 @@ int EC200U_ComInit()
     sw_log_error("[%s] failed to configure USB network mode!!", MODULE_NAME);
     EC200U_ComExit(); return -3+ret;
   }
+  sw_thrd_delay(2000); // 等待USB网络模式激活, 否则后续拨号指令可能会失败, ERROR 50
 
   memset(&trans, 0, sizeof(SATCmdTrans));
   strcpy(trans.cmd.data, AT_QCFG_CMD2); trans.cmd.len = strlen(trans.cmd.data);

+ 7 - 12
ec200u/en200u.go

@@ -89,6 +89,13 @@ openOK:
 	}
 	baseapp.Logger.Infof("[%s] 模块IMEI: %s", MODULE_NAME, imei)
 
+	bReady, _ = ec200U_IsSimCardReady()
+	baseapp.Logger.Infof("[%s] SIM卡状态: %v", MODULE_NAME, bReady)
+
+	if !bReady {
+		goto initOK
+	}
+
 	for range 30 { // 等待模块完成蜂窝网络注册, 否则RSSI读取不到, 网也不可能不去
 		if baseapp.IsExit1() {
 			ec200U_ComExit()
@@ -109,18 +116,6 @@ openOK:
 	}
 	baseapp.Logger.Infof("[%s] 模块RSSI: %s", MODULE_NAME, rssi)
 
-	bReady, err = ec200U_IsSimCardReady()
-	if err != nil {
-		ec200U_ComExit()
-		baseapp.Logger.Errorf("[%s] 错误: %v!!", MODULE_NAME, err)
-		return false
-	}
-	baseapp.Logger.Infof("[%s] SIM卡状态: %v", MODULE_NAME, bReady)
-
-	if !bReady { // 未插入SIM卡, 也不影响初始化成功, 可等待之后的热插入
-		goto initOK
-	}
-
 	iccid, err = ec200U_GetSimICCID()
 	if err != nil {
 		ec200U_ComExit()

+ 17 - 11
ec200u/usb0net.go

@@ -224,22 +224,28 @@ func isInterfaceUp(name string) (bool, error) {
 	return link.Attrs().Flags&net.FlagUp != 0, nil
 }
 
+func waitUSB0Carrier(timeoutMs int) (bool, error) {
+	interval, elapsed := 50, 0
+
+	for elapsed < timeoutMs {
+		data, err := os.ReadFile("/sys/class/net/usb0/carrier")
+		if err == nil && strings.TrimSpace(string(data)) == "1" {
+			return true, nil
+		}
+		time.Sleep(time.Millisecond * time.Duration(interval))
+		elapsed += interval
+	}
+
+	return false, fmt.Errorf("usb0 carrier not up after %d ms", timeoutMs)
+}
+
 func Is4GCableConnected() (bool, error) {
-	if up, _ := isInterfaceUp("usb0"); !up { // 管理状态
+	if up, _ := isInterfaceUp("usb0"); !up {
 		err := enableUSB0()
 		if err != nil {
 			return false, err
 		}
 	}
 
-	if data, err := os.ReadFile("/sys/class/net/usb0/carrier"); err == nil { // 物理状态
-		return strings.TrimSpace(string(data)) == "1", nil
-	}
-
-	link, err := netlink.LinkByName("usb0")
-	if err != nil {
-		return false, err
-	}
-
-	return link.Attrs().OperState == netlink.OperUp, nil // 操作状态
+	return waitUSB0Carrier(2000)
 }

+ 17 - 10
netmgrd/eth0net.go

@@ -185,21 +185,28 @@ func isInterfaceUp(name string) (bool, error) {
 	return link.Attrs().Flags&net.FlagUp != 0, nil
 }
 
+func waitEth0Carrier(timeoutMs int) (bool, error) {
+	interval, elapsed := 50, 0
+
+	for elapsed < timeoutMs {
+		data, err := os.ReadFile("/sys/class/net/eth0/carrier")
+		if err == nil && strings.TrimSpace(string(data)) == "1" {
+			return true, nil
+		}
+		time.Sleep(time.Millisecond * time.Duration(interval))
+		elapsed += interval
+	}
+
+	return false, fmt.Errorf("eth0 carrier not up after %d ms", timeoutMs)
+}
+
 func isEth0CableConnected() (bool, error) {
-	if up, _ := isInterfaceUp("eth0"); !up { // 管理状态
+	if up, _ := isInterfaceUp("eth0"); !up {
 		err := enableEth0()
 		if err != nil {
 			return false, err
 		}
 	}
 
-	if data, err := os.ReadFile("/sys/class/net/eth0/carrier"); err == nil { // 物理状态
-		return strings.TrimSpace(string(data)) == "1", nil
-	}
-
-	link, err := netlink.LinkByName("eth0")
-	if err != nil {
-		return false, err
-	}
-	return link.Attrs().OperState == netlink.OperUp, nil // 操作状态
+	return waitEth0Carrier(2000)
 }

+ 20 - 21
netmgrd/netmgrd.go

@@ -37,11 +37,11 @@ const (
 func (n NetType) String() string {
 	switch n {
 	case NetEth:
-		return "有线"
+		return "有线"
 	case NetLTE:
-		return "蜂窝"
+		return "蜂窝"
 	default:
-		return "无网络"
+		return "未知"
 	}
 }
 
@@ -70,7 +70,7 @@ func serviceRun() {
 			if eth0CableOK && curNetType != NetEth { // 有线插入 && 当前不是有线
 				baseapp.Logger.Warnf("[%s] 检测到有线接入,切换到有线网络...", MODULE_NAME)
 				openNetwork()
-			} else if !eth0CableOK && curNetType != NetLTE { // 有线拔出 && 当前不是蜂窝
+			} else if !eth0CableOK && curNetType == NetEth { // 有线拔出 && 当前还是有线
 				baseapp.Logger.Warnf("[%s] 检测到有线断开,切换到蜂窝网络...", MODULE_NAME)
 				openNetwork()
 			}
@@ -109,7 +109,15 @@ func serviceRun() {
 			}
 
 			if offlineDuration() >= (time.Duration(60) * time.Second) {
-				baseapp.Logger.Warnf("[%s] 网络长时间的断开, 正在重新连接...", MODULE_NAME)
+				baseapp.Logger.Warnf("[%s] 网络长时间的断开, 尝试重新激活...", MODULE_NAME)
+				switch curModemType {
+				case Air720U: //重启合宙4G调制解调器
+					modem1.ModuleExit()
+					modem1.ModuleInit(true)
+				case EC200U: // 重启移远4G调制解调器
+					modem2.ModuleExit()
+					modem2.ModuleInit(true)
+				}
 				openNetwork()
 				offlineStartTs.Store(time.Now().UnixNano()) // 重置离线开始时间
 			}
@@ -245,29 +253,20 @@ func openNetwork() {
 	}
 
 	start4GNetwork := func() bool {
+		startOK := false
 		switch curModemType {
 		case Air720U: //合宙4G调制解调器
 			if eth2CableOK, _ := modem1.Is4GCableConnected(); eth2CableOK {
-				if modem1.Start4GNetwork() {
-					return true
-				}
-				// 4G模组重新上电初始化后重试
-				modem1.ModuleExit()
-				modem1.ModuleInit(true)
-				return modem1.Start4GNetwork()
+				startOK = modem1.Start4GNetwork()
+				enableEth0() // 恢复有线网口
 			}
 		case EC200U: // 移远4G调制解调器
 			if usb0CableOK, _ := modem2.Is4GCableConnected(); usb0CableOK {
-				if modem2.Start4GNetwork() {
-					return true
-				}
-				// 4G模组重新上电初始化后重试
-				modem2.ModuleExit()
-				modem2.ModuleInit(true)
-				return modem2.Start4GNetwork()
+				startOK = modem2.Start4GNetwork()
+				enableEth0() // 恢复有线网口
 			}
 		}
-		return false
+		return startOK
 	}
 
 	if start4GNetwork() {
@@ -277,7 +276,7 @@ func openNetwork() {
 	}
 
 	curNetType = NetNone
-	baseapp.Logger.Warnf("[%s] ⚠️ 注意: 当前无可用网络", MODULE_NAME)
+	baseapp.Logger.Warnf("[%s] 当前无可用网络接口(有线/蜂窝均不可用)!", MODULE_NAME)
 }
 
 // 得到当前联网类型: 有线、蜂窝