Przeglądaj źródła

优化修改代码, 加入AT+CGMM指令,识别4G模组型号,自动适配使用

niujiuru 1 miesiąc temu
rodzic
commit
be517e92ba
7 zmienionych plików z 117 dodań i 20 usunięć
  1. 13 2
      air720u/air720u.c
  2. 1 1
      air720u/air720u.go
  3. 13 2
      ec200u/ec200u.c
  4. 1 1
      ec200u/en200u.go
  5. 2 3
      main.go
  6. 56 0
      netmgrd/modem.go
  7. 31 11
      netmgrd/netmgrd.go

+ 13 - 2
air720u/air720u.c

@@ -10,7 +10,9 @@ static const char MODULE_NAME[] = "Air720U";
 #define R_SILENT_TIMEOUT 50    // 应答静默超时时间ms
 
 // 关闭命令回显模式
-static const char *AT_USE_ECHO   = "ATE0"    ;
+static const char *AT_ECHO_OFF   = "ATE0"    ;
+// 获取4G模块的型号
+static const char *AT_GET_CGMM   = "AT+CGMM" ;
 // 获取模块的IMEI号
 static const char *AT_GET_IMEI   = "AT+CGSN" ;
 // 查看网络注册状态
@@ -175,7 +177,7 @@ int Air720U_ComInit()
   }
 
   SATCmdTrans trans; memset(&trans, 0, sizeof(SATCmdTrans));
-  strcpy(trans.cmd.data, AT_USE_ECHO); trans.cmd.len = strlen(trans.cmd.data);
+  strcpy(trans.cmd.data, AT_ECHO_OFF); trans.cmd.len = strlen(trans.cmd.data);
   int ret = comio_doCmd(&trans, WAIT_ACK_TIMEOUT);
   if(!(ret > 0 && strstr(trans.ack.data, ATOK)))
   {
@@ -183,6 +185,15 @@ int Air720U_ComInit()
     Air720U_ComExit(); return -2+ret;
   }
 
+  memset(&trans, 0, sizeof(SATCmdTrans));
+  strcpy(trans.cmd.data, AT_GET_CGMM); trans.cmd.len = strlen(trans.cmd.data);
+  ret = comio_doCmd(&trans, WAIT_ACK_TIMEOUT);
+  if(!(ret > 0 && strstr(trans.ack.data, ATOK) && xstrcasestr(trans.ack.data, "left", MODULE_NAME)))
+  {
+    if(ret != 0) sw_log_error("[%s] failed to get module model!!", MODULE_NAME);
+    Air720U_ComExit(); return -99+ret;
+  }
+
   return 0;
 }
 

+ 1 - 1
air720u/air720u.go

@@ -47,7 +47,7 @@ func ModuleInit(bForceRepower bool /*是否强制重启*/) bool {
 		}
 		switch ret {
 		case -1, -3: // -1: 串口被占用或不存在(驱动有问题时)
-			// -3: 设备无应答(初始化时会发送一条关闭回显的指令)
+			// -3: 设备无应答(初始化时会发送的两条关键配置指令)
 			if ret == -1 {
 				freeTTYUSB0()
 			}

+ 13 - 2
ec200u/ec200u.c

@@ -10,7 +10,9 @@ static const char MODULE_NAME[] = "EC200U";
 #define R_SILENT_TIMEOUT 50    // 应答静默超时时间ms
 
 // 关闭命令回显模式
-static const char *AT_USE_ECHO   = "ATE0"    ;
+static const char *AT_ECHO_OFF   = "ATE0"    ;
+// 获取4G模块的型号
+static const char *AT_GET_CGMM   = "AT+CGMM" ;
 // 获取模块的IMEI号
 static const char *AT_GET_IMEI   = "AT+CGSN" ;
 // 查看网络注册状态
@@ -178,7 +180,7 @@ int EC200U_ComInit()
   }
 
   SATCmdTrans trans; memset(&trans, 0, sizeof(SATCmdTrans));
-  strcpy(trans.cmd.data, AT_USE_ECHO); trans.cmd.len = strlen(trans.cmd.data);
+  strcpy(trans.cmd.data, AT_ECHO_OFF); trans.cmd.len = strlen(trans.cmd.data);
   int ret = comio_doCmd(&trans, WAIT_ACK_TIMEOUT);
   if(!(ret > 0 && strstr(trans.ack.data, ATOK)))
   {
@@ -187,6 +189,15 @@ int EC200U_ComInit()
   }
 
   memset(&trans, 0, sizeof(SATCmdTrans));
+  strcpy(trans.cmd.data, AT_GET_CGMM); trans.cmd.len = strlen(trans.cmd.data);
+  ret = comio_doCmd(&trans, WAIT_ACK_TIMEOUT);
+  if(!(ret > 0 && strstr(trans.ack.data, ATOK) && xstrcasestr(trans.ack.data, "left", MODULE_NAME)))
+  {
+    if(ret != 0) sw_log_error("[%s] failed to get module model!!", MODULE_NAME);
+    EC200U_ComExit(); return -99+ret;
+  }
+
+  memset(&trans, 0, sizeof(SATCmdTrans));
   strcpy(trans.cmd.data, AT_QCFG_CMD1); trans.cmd.len = strlen(trans.cmd.data);
   ret = comio_doCmd(&trans, WAIT_ACK_TIMEOUT);
   if(!(ret > 0 && strstr(trans.ack.data, ATOK)))

+ 1 - 1
ec200u/en200u.go

@@ -47,7 +47,7 @@ func ModuleInit(bForceRepower bool /*是否强制重启*/) bool {
 		}
 		switch ret {
 		case -1, -3, -4, -5: // -1: 串口被占用或不存在(驱动有问题时)
-			// -3, -4, -5: 设备无应答(初始化时会发送的条关键配置指令)
+			// -3, -4, -5: 设备无应答(初始化时会发送的条关键配置指令)
 			if ret == -1 {
 				freeTTYUSB0()
 			}

+ 2 - 3
main.go

@@ -5,7 +5,6 @@ import (
 	"time"
 
 	gps "hnyfkj.com.cn/rtu/linux/air530z"
-	modem "hnyfkj.com.cn/rtu/linux/air720u"
 	baseapp "hnyfkj.com.cn/rtu/linux/baseapp"
 	camera1 "hnyfkj.com.cn/rtu/linux/mvs_u_takephoto" // 海康U口相机
 	netmgrd "hnyfkj.com.cn/rtu/linux/netmgrd"
@@ -31,7 +30,7 @@ func main() {
 	gps.ModuleInit()
 
 	// 02, 初始化4G调制解调器
-	if !modem.ModuleInit(false) {
+	if !netmgrd.ModemInit() {
 		goto end_p
 	}
 
@@ -53,7 +52,7 @@ func main() {
 
 	// 08, 退出程序并释放资源
 end_p:
-	modem.ModuleExit()
+	netmgrd.ModemExit()
 	gps.ModuleExit()
 
 	baseapp.Logger.Info("程序退出")

+ 56 - 0
netmgrd/modem.go

@@ -0,0 +1,56 @@
+package netmgrd
+
+import (
+	modem1 "hnyfkj.com.cn/rtu/linux/air720u"
+	modem2 "hnyfkj.com.cn/rtu/linux/ec200u"
+)
+
+type ModemType int
+
+const (
+	Unknown ModemType = iota
+	Air720U           // 合宙4G调制解调器
+	EC200U            // 移远4G调制解调器
+)
+
+var (
+	curModemType ModemType
+)
+
+func (m ModemType) String() string {
+	switch m {
+	case Air720U:
+		return "合宙"
+	case EC200U:
+		return "移远"
+	default:
+		return "未知"
+	}
+}
+
+func ModemInit() bool {
+	if modem1.ModuleInit(false) {
+		curModemType = Air720U
+		return true
+	}
+
+	if modem2.ModuleInit(false) {
+		curModemType = EC200U
+		return true
+	}
+
+	return false
+}
+
+func ModemExit() {
+	switch curModemType {
+	case Air720U:
+		modem1.ModuleExit()
+	case EC200U:
+		modem2.ModuleExit()
+	}
+}
+
+func GetCurModemType() ModemType {
+	return curModemType
+}

+ 31 - 11
netmgrd/netmgrd.go

@@ -7,8 +7,10 @@ import (
 	"sync/atomic"
 	"time"
 
-	modem "hnyfkj.com.cn/rtu/linux/air720u"
 	"hnyfkj.com.cn/rtu/linux/baseapp"
+
+	modem1 "hnyfkj.com.cn/rtu/linux/air720u"
+	modem2 "hnyfkj.com.cn/rtu/linux/ec200u"
 )
 
 const MODULE_NAME = "NetworkManager"
@@ -227,7 +229,12 @@ func closeEth0Net() {
 // 打开连接网络
 func openNetwork() {
 	closeEth0Net()
-	modem.Stop4GNetwork()
+	switch curModemType {
+	case Air720U:
+		modem1.Stop4GNetwork()
+	case EC200U:
+		modem2.Stop4GNetwork()
+	}
 
 	eth0CableOK, _ := isEth0CableConnected()
 	if eth0CableOK && openEth0Net() {
@@ -236,20 +243,33 @@ func openNetwork() {
 		return
 	}
 
-	tryOpenLTE := func() bool {
-		if eth2CableOK, _ := modem.Is4GCableConnected(); eth2CableOK {
-			if modem.Start4GNetwork() {
-				return true
+	start4GNetwork := func() bool {
+		switch curModemType {
+		case Air720U:
+			if eth2CableOK, _ := modem1.Is4GCableConnected(); eth2CableOK {
+				if modem1.Start4GNetwork() {
+					return true
+				}
+				// 4G模组重新上电初始化后重试
+				modem1.ModuleExit()
+				modem1.ModuleInit(true)
+				return modem1.Start4GNetwork()
+			}
+		case EC200U:
+			if usb0CableOK, _ := modem2.Is4GCableConnected(); usb0CableOK {
+				if modem2.Start4GNetwork() {
+					return true
+				}
+				// 4G模组重新上电初始化后重试
+				modem2.ModuleExit()
+				modem2.ModuleInit(true)
+				return modem2.Start4GNetwork()
 			}
-			// 4G模组重新上电初始化后重试
-			modem.ModuleExit()
-			modem.ModuleInit(true)
-			return modem.Start4GNetwork()
 		}
 		return false
 	}
 
-	if tryOpenLTE() {
+	if start4GNetwork() {
 		curNetType = NetLTE
 		baseapp.Logger.Infof("[%s] ✅ 蜂窝网络已连接", MODULE_NAME)
 		return