|
|
@@ -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
|
|
|
+}
|