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