Просмотр исходного кода

优化air720u.go, 拆分开4g拨号上网和读取imei、iccid号的逻辑, 使其逻辑更合理, 为后面加入有线网络的支持做准备

niujiuru 1 месяц назад
Родитель
Сommit
aef122fb61
1 измененных файлов с 102 добавлено и 72 удалено
  1. 102 72
      air720u/air720u.go

+ 102 - 72
air720u/air720u.go

@@ -18,36 +18,24 @@ var (
 	rssi  string // Air720U模块当前信号强度(RSSI)
 	iccid string // Air720U模块插入SIM卡的ICCID号
 
-	mu                sync.Mutex
-	isRunning         bool
-	healthCheckExitCh chan struct{}
-	wg                sync.WaitGroup
+	mu1, mu2, mu3          sync.Mutex
+	isRunning1, isRunning2 bool
+	exitCh1, exitCh2       chan struct{}
+	wg1, wg2               sync.WaitGroup
 )
 
 // 初始化4G网络模块
 func ModuleInit(bForceRepower bool /*是否强制重启*/) bool {
-	mu.Lock()
-	defer mu.Unlock()
+	mu1.Lock()
+	defer mu1.Unlock()
 
-	if isRunning {
+	if isRunning1 {
 		return true
 	}
 
 	var err error
 	var ret int
-	var bExists bool
-
-	killAllUdhcpc()
-	err = disableEthBut2()
-	if err != nil {
-		baseapp.Logger.Errorf("[%s] 错误: %v!!", MODULE_NAME, err)
-		return false
-	}
-
-	bExists, _ = udhcpcEth2Exists()
-	if bExists {
-		killEth2Udhcpc()
-	}
+	var bExists, bReady bool
 
 	_, statErr := os.Stat("/dev/ttyUSB0")
 	bExists = (statErr == nil)
@@ -55,10 +43,10 @@ func ModuleInit(bForceRepower bool /*是否强制重启*/) bool {
 	if bExists && !bForceRepower {
 		ret, err = air720U_ComInit()
 		if err == nil {
-			goto initOK
+			goto openOK
 		}
 		switch ret {
-		case -1: // 串口被占用(或不存在, 这里只能是被占用的情况)
+		case -1: // 串口被占用(或不存在, 正常情况下只能是被占用)
 			freeTTYUSB0()
 		case -3: // 设备无应答(初始化时会发送一条关闭回显的指令)
 			air720U_Repower() // 重新上电
@@ -90,7 +78,7 @@ func ModuleInit(bForceRepower bool /*是否强制重启*/) bool {
 		return false
 	}
 
-initOK:
+openOK:
 	imei, err = air720U_GetIMEI()
 	if err != nil {
 		air720U_ComExit()
@@ -119,16 +107,16 @@ initOK:
 	}
 	baseapp.Logger.Infof("[%s] 模块RSSI: %s", MODULE_NAME, rssi)
 
-	bOK, err := air720U_IsSimCardReady()
+	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, bOK)
+	baseapp.Logger.Infof("[%s] SIM卡状态: %v", MODULE_NAME, bReady)
 
-	if !bOK {
-		return false
+	if !bReady { // 未插入SIM卡, 也不影响初始化成功, 可等待之后的热插入
+		goto initOK
 	}
 
 	iccid, err = air720U_GetSimICCID()
@@ -139,95 +127,137 @@ initOK:
 	}
 	baseapp.Logger.Infof("[%s] SIM卡ICCID: %s", MODULE_NAME, iccid)
 
-	err = dialupEth2()
-	if err != nil {
-		baseapp.Logger.Errorf("[%s] 拨号连接\"eth2\"时发生错误: %v!!", MODULE_NAME, err)
-		return false
-	}
-	ipv4, mask, err := getEth2Addr()
-	if err != nil {
-		baseapp.Logger.Errorf("[%s] 读取\"eth2\"地址时发生错误: %v!!", MODULE_NAME, err)
-		return false
-	}
-	baseapp.Logger.Infof("[%s] \"eth2\"分配的地址: %s/%s", MODULE_NAME, ipv4, mask)
-
-	healthCheckExitCh = make(chan struct{})
-	wg.Add(1)
-	go func() { // 启动携程守护"eth2"网卡上的"udhcpc"后台服务进程
-		defer wg.Done()
-		monitorEth2Udhcpc(healthCheckExitCh)
-	}()
-	wg.Add(1)
+initOK:
+	exitCh1 = make(chan struct{})
+	wg1.Add(1)
 	go func() { // 启动携程循环读取4G模块的信号强度和ICCID号等信息
-		defer wg.Done()
-		monitorAir720UInfo(healthCheckExitCh)
+		defer wg1.Done()
+		monitorAir720uInfo(exitCh1)
 	}()
 
-	isRunning = true
-	return isRunning
+	isRunning1 = true
+	return isRunning1
 }
 
 // 4G调制解调器退出
 func ModuleExit() {
-	mu.Lock()
-	defer mu.Unlock()
+	mu1.Lock()
+	defer mu1.Unlock()
 
-	if !isRunning {
+	if !isRunning1 {
 		return
 	}
 
-	close(healthCheckExitCh)
-	wg.Wait() // 等待守护"udhcpc"的携程退出
-
-	bExists, _ := udhcpcEth2Exists()
-	if bExists {
-		killEth2Udhcpc()
-	}
+	close(exitCh1)
+	wg1.Wait() // 等待循环读取4G模块的信号强度和ICCID号等信息的携程退出
 
 	air720U_ComExit()
 	imei, rssi, iccid = "", "", ""
-	isRunning = false
+	isRunning1 = false
 }
 
 // 获取模块的标识号
 func GetIMEI() string {
-	mu.Lock()
-	defer mu.Unlock()
+	mu2.Lock()
+	defer mu2.Unlock()
 	return imei
 }
 
 // 获取当前信号强度
 func GetRSSI() string {
-	mu.Lock()
-	defer mu.Unlock()
+	mu2.Lock()
+	defer mu2.Unlock()
 	return rssi
 }
 
 // 获取电话卡标识号
 func GetSimICCID() string {
-	mu.Lock()
-	defer mu.Unlock()
+	mu2.Lock()
+	defer mu2.Unlock()
 	return iccid
 }
 
-// 间隔读取刷新信息
-func monitorAir720UInfo(exitCh <-chan struct{}) {
+// 循环读取刷新信息
+func monitorAir720uInfo(exitCh <-chan struct{}) {
 	t := time.NewTicker(time.Duration(5) * time.Second)
 	defer t.Stop()
-
 	for {
 		select {
 		case <-t.C:
-			mu.Lock()
+			mu2.Lock()
 			rssi, _ = air720U_GetRSSIFromCSQ()
 			if bOK, _ := air720U_IsSimCardReady(); bOK {
 				iccid, _ = air720U_GetSimICCID()
 			} else {
 				iccid = ""
 			}
-			mu.Unlock()
+			mu2.Unlock()
 		case <-exitCh:
 			return
 		} // select end
 	} // for end
 }
+
+// 打卡连接到4G网络
+func OpenEth2Net() bool {
+	mu3.Lock()
+	defer mu3.Unlock()
+
+	if isRunning2 {
+		return true
+	}
+
+	killAllUdhcpc()
+	err := disableEthBut2()
+	if err != nil {
+		baseapp.Logger.Errorf("[%s] 错误: %v!!", MODULE_NAME, err)
+		return false
+	}
+
+	bExists, _ := udhcpcEth2Exists()
+	if bExists {
+		killEth2Udhcpc()
+	}
+
+	err = dialupEth2()
+	if err != nil {
+		baseapp.Logger.Errorf("[%s] 拨号连接\"eth2\"时发生错误: %v!!", MODULE_NAME, err)
+		return false
+	}
+	ipv4, mask, err := getEth2Addr()
+	if err != nil {
+		baseapp.Logger.Errorf("[%s] 读取\"eth2\"地址时发生错误: %v!!", MODULE_NAME, err)
+		return false
+	}
+	baseapp.Logger.Infof("[%s] \"eth2\"分配的地址: %s/%s", MODULE_NAME, ipv4, mask)
+
+	exitCh2 = make(chan struct{})
+	wg2.Add(1)
+	go func() { // 启动携程守护"eth2"网卡上的 "udhcpc"后台服务进程
+		defer wg2.Done()
+		monitorEth2Udhcpc(exitCh2)
+	}()
+
+	isRunning2 = true
+	return isRunning2
+}
+
+// 从4G网络断开连接
+func CloseEth2Net() {
+	mu3.Lock()
+	defer mu3.Unlock()
+
+	if !isRunning2 {
+		return
+	}
+
+	close(exitCh2)
+	wg2.Wait() // 等待守护"eth2"网卡上的 "udhcpc"后台服务进程的携程退出
+
+	bExists, _ := udhcpcEth2Exists()
+	if bExists {
+		killEth2Udhcpc()
+	}
+
+	isRunning2 = false
+}