|
@@ -3,7 +3,7 @@ package initialize
|
|
|
import (
|
|
|
"encoding/hex"
|
|
|
"fmt"
|
|
|
- "log"
|
|
|
+ "io"
|
|
|
"net"
|
|
|
"os"
|
|
|
"runtime"
|
|
@@ -42,9 +42,8 @@ func InitInductanceTCP() {
|
|
|
if err != nil {
|
|
|
logger.Get().Println(err)
|
|
|
} else {
|
|
|
- logger.Get().Println(lis)
|
|
|
model.InductanceTCP = lis
|
|
|
- logger.Get().Println("inductanceTCP启动成功")
|
|
|
+ logger.Get().Printf("inductanceTCP启动成功 %v \n", lis)
|
|
|
}
|
|
|
go StartInductanceTCP()
|
|
|
}
|
|
@@ -56,53 +55,43 @@ func StartInductanceTCP() {
|
|
|
logger.Get().Println("进入InductanceTCP循环")
|
|
|
conn, err := model.InductanceTCP.Accept()
|
|
|
if err != nil {
|
|
|
- log.Println(err)
|
|
|
+ logger.Get().Println(err)
|
|
|
}
|
|
|
+
|
|
|
remoteAddr := conn.RemoteAddr().String()
|
|
|
logger.Get().Printf("lis Accept conn = %s\n", remoteAddr)
|
|
|
|
|
|
- model.Mutex.Lock()
|
|
|
-
|
|
|
- deviceId, err := GetDeviceId(conn)
|
|
|
+
|
|
|
+ addr, err := net.ResolveTCPAddr("tcp", remoteAddr)
|
|
|
if err != nil {
|
|
|
- log.Println("Error getting device ID:", err)
|
|
|
-
|
|
|
- model.Mutex.Unlock()
|
|
|
- continue
|
|
|
+
|
|
|
+ logger.Get().Errorf("解析错误 conn = %s\n", addr.IP.String())
|
|
|
}
|
|
|
|
|
|
- model.ConnectionMap1.Store(deviceId, conn)
|
|
|
+ model.ConnectionMap1.Store(addr.IP.String(), conn)
|
|
|
+
|
|
|
+
|
|
|
+ service.DeviceAdjustment(addr.IP.String())
|
|
|
|
|
|
- model.Mutex.Unlock()
|
|
|
|
|
|
- if conn1, ok := model.ConnectionMap1.Load(deviceId); ok {
|
|
|
+ if conn1, ok := model.ConnectionMap1.Load(addr.IP.String()); ok {
|
|
|
|
|
|
netConn := conn1.(net.Conn)
|
|
|
|
|
|
- go handler.ReadAndHandle(netConn, deviceId)
|
|
|
+ go handler.ReadAndHandle(netConn, addr.IP.String())
|
|
|
go handler.Handler()
|
|
|
} else {
|
|
|
|
|
|
- log.Printf("Connection for key %s not found", deviceId)
|
|
|
+ logger.Get().Printf("启动 Connection for key %s not found", addr.IP.String())
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func GetDeviceId(conn net.Conn) (id string, err error) {
|
|
|
-
|
|
|
-
|
|
|
- data, err := utils.WriteAndReadDevice(modbus.ReadDeviceId, conn, 9, 2)
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- return string(data), err
|
|
|
-}
|
|
|
-
|
|
|
-func (o *ModbusHandler) ReadAndHandle(conn net.Conn, deviceId string) {
|
|
|
+func (o *ModbusHandler) ReadAndHandle(conn net.Conn, remoteAddr string) {
|
|
|
for {
|
|
|
buffer := make([]byte, 1024)
|
|
|
n, err := conn.Read(buffer)
|
|
|
- if err != nil {
|
|
|
+ if err != nil && err != io.EOF {
|
|
|
if isConnReset(err) {
|
|
|
logger.Get().Error("连接被远程主机强制关闭")
|
|
|
} else if os.IsTimeout(err) {
|
|
@@ -111,10 +100,11 @@ func (o *ModbusHandler) ReadAndHandle(conn net.Conn, deviceId string) {
|
|
|
|
|
|
logger.Get().Errorf("读取错误: %s\n", err)
|
|
|
}
|
|
|
+ defer conn.Close()
|
|
|
return
|
|
|
}
|
|
|
queueData := model.QueueData{
|
|
|
- Id: deviceId,
|
|
|
+ Ip: remoteAddr,
|
|
|
Value: buffer[:n],
|
|
|
}
|
|
|
ok, cnt := o.queue.Put(&queueData)
|
|
@@ -176,12 +166,13 @@ func (o *ModbusHandler) Handler() interface{} {
|
|
|
}
|
|
|
|
|
|
func parseData(data *model.QueueData) {
|
|
|
- reg, dev, err := utils.GetDataByDeviceId(data.Id)
|
|
|
+ reg, dev, err := utils.GetDataByDeviceIP(data.Ip)
|
|
|
if err != nil {
|
|
|
logger.Get().Errorln("Error getting register and device:", err)
|
|
|
return
|
|
|
}
|
|
|
toString := hex.EncodeToString(data.Value)
|
|
|
+ logger.Get().Infof("deviceIP: %s, value: %s", data.Ip, toString)
|
|
|
switch toString[0:2] {
|
|
|
case "fe":
|
|
|
switch toString[2:8] {
|
|
@@ -194,7 +185,7 @@ func parseData(data *model.QueueData) {
|
|
|
dev.DeviceLoops[relyId].State = 1
|
|
|
}
|
|
|
for i, device := range reg.Devices {
|
|
|
- if device.Sn == data.Id {
|
|
|
+ if device.Ip == data.Ip {
|
|
|
reg.Devices[i] = dev
|
|
|
}
|
|
|
}
|
|
@@ -205,9 +196,8 @@ func parseData(data *model.QueueData) {
|
|
|
return
|
|
|
}
|
|
|
case "0f0000":
|
|
|
-
|
|
|
OperationCommand := hex.EncodeToString(modbus.OperationCommand)
|
|
|
- logger.Get().Infof("deviceId: %s, value: %s", data.Id, OperationCommand)
|
|
|
+ logger.Get().Infof("deviceId: %s, value: %s", data.Ip, OperationCommand)
|
|
|
if OperationCommand[14:16] == "00" {
|
|
|
for i, loop := range dev.DeviceLoops {
|
|
|
loop.State = 0
|
|
@@ -220,7 +210,7 @@ func parseData(data *model.QueueData) {
|
|
|
}
|
|
|
}
|
|
|
for i, device := range reg.Devices {
|
|
|
- if device.Sn == data.Id {
|
|
|
+ if device.Sn == data.Ip {
|
|
|
reg.Devices[i] = dev
|
|
|
}
|
|
|
}
|
|
@@ -247,7 +237,7 @@ func parseData(data *model.QueueData) {
|
|
|
binStr += fmt.Sprintf("%08b", b)
|
|
|
}
|
|
|
for i, device := range reg.Devices {
|
|
|
- if device.Sn == data.Id {
|
|
|
+ if device.Ip == data.Ip {
|
|
|
reg.Devices[i].State = 1
|
|
|
reg.Devices[i].OnlineTime = time.Now()
|
|
|
if len(device.DeviceLoops) == 8 {
|
|
@@ -256,7 +246,7 @@ func parseData(data *model.QueueData) {
|
|
|
}
|
|
|
} else {
|
|
|
for j := len(device.DeviceLoops) - 1; j >= 0; j-- {
|
|
|
- reg.Devices[i].DeviceLoops[3-j].State = int(binStr[j+3] - '0')
|
|
|
+ reg.Devices[i].DeviceLoops[3-j].State = int(binStr[j+4] - '0')
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -295,23 +285,31 @@ func parseData(data *model.QueueData) {
|
|
|
|
|
|
if float64(batteryVoltage)/100 < 5 {
|
|
|
data1 := modbus.DeviceSwitch(8, 1)
|
|
|
- if conn1, ok := model.ConnectionMap1.Load(data.Id); ok {
|
|
|
+ if conn1, ok := model.ConnectionMap1.Load(data.Ip); ok {
|
|
|
|
|
|
netConn := conn1.(net.Conn)
|
|
|
- utils.WriteDevice(data1, netConn)
|
|
|
+ err := utils.WriteDevice(data1, netConn)
|
|
|
+ if err != nil {
|
|
|
+ logger.Get().Errorf("电池符合控制 写命令错误: %s -- conn: %v", err, netConn.RemoteAddr().String())
|
|
|
+ return
|
|
|
+ }
|
|
|
} else {
|
|
|
|
|
|
- logger.Get().Printf("Connection for key %s not found", data.Id)
|
|
|
+ logger.Get().Printf("电池符合控制Connection for key %s not found", data.Ip)
|
|
|
}
|
|
|
} else {
|
|
|
data1 := modbus.DeviceSwitch(8, 0)
|
|
|
- if conn1, ok := model.ConnectionMap1.Load(data.Id); ok {
|
|
|
+ if conn1, ok := model.ConnectionMap1.Load(data.Ip); ok {
|
|
|
|
|
|
netConn := conn1.(net.Conn)
|
|
|
- utils.WriteDevice(data1, netConn)
|
|
|
+ err := utils.WriteDevice(data1, netConn)
|
|
|
+ if err != nil {
|
|
|
+ logger.Get().Errorf("电池符合控制 写命令错误: %s -- conn: %v", err, netConn.RemoteAddr().String())
|
|
|
+ return
|
|
|
+ }
|
|
|
} else {
|
|
|
|
|
|
- logger.Get().Printf("Connection for key %s not found", data.Id)
|
|
|
+ logger.Get().Printf("电池符合控制Connection for key %s not found", data.Ip)
|
|
|
}
|
|
|
}
|
|
|
}
|