You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

303 lines
7.1 KiB
Go

4 weeks ago
package FLXNetworkController
import (
"flx/Common"
"fmt"
"net"
"strings"
log "github.com/sirupsen/logrus"
)
type FlxNetworkCmdTCPLisen struct {
BufferMaxLength int //最大缓冲长度
SocketID string
TCPConn net.Conn
RecThreadIsWorking bool //是否开始接受
TCPWorking bool
tmpRecDataBuffer []byte //缓冲字节
InvokeOnReviceData func(Compacket) //外部委托
}
// func (para *FlxNetworkCmdTCPLisen) StartTCPListen() {
// // 绑定监听地址
// var err error
// para.TCPlistener, err = net.Listen("tcp", ":9667")
// if err != nil {
// log.Fatal(fmt.Sprintf("listen err: %v", err))
// }
// defer para.TCPlistener.Close()
// log.Println(fmt.Sprintln("bind:start listening..."))
// for {
// // Accept 会一直阻塞直到有新的连接建立或者listen中断才会返回
// conn, err := para.TCPlistener.Accept()
// if err != nil {
// // 通常是由于listener被关闭无法继续监听导致的错误
// log.Fatal(fmt.Sprintf("accept err: %v", err))
// }
// // 开启新的 goroutine 处理该连接
// go para.Handle(conn)
// }
// }
func (para *FlxNetworkCmdTCPLisen) Handle(conn net.Conn) {
defer func() {
if r := recover(); r != nil {
log.Error("Handle:", r)
}
}()
// defer conn.Close()
para.SocketID = Common.GetGUID().Hex()
para.TCPConn = conn
for {
var buf [65535]byte
n, err := conn.Read(buf[:])
if err != nil {
fmt.Println("Read from tcp server failed,err:", err)
break
}
para.ProcessRecvBuff(buf[:n])
}
}
func (para *FlxNetworkCmdTCPLisen) ProcessRecvBuff(RecvBuffer []byte) {
defer func() {
if r := recover(); r != nil {
log.Error("ProcessRecvBuff:", r)
}
}()
startIndex := 0
curIndex := 0
length := 0
//判断是否大于14字节
for curIndex <= len(RecvBuffer)-7 {
//判断是否出现 7E开头
if RecvBuffer[curIndex] == FlxNetworkComPara_CMD_HEAD {
if RecvBuffer[curIndex+3] > 8 {
//System.Windows.Forms.CMessageBox.Show("数据出错!");
curIndex++
continue
}
length = int(RecvBuffer[curIndex+3])*256 + int(RecvBuffer[curIndex+4]) + 7
if length <= len(RecvBuffer)-curIndex {
para.ValidateRecvBuffer(length, RecvBuffer, curIndex)
curIndex = curIndex + length
startIndex = curIndex
} else {
para.tmpRecDataBuffer = append(para.tmpRecDataBuffer, RecvBuffer[curIndex:]...)
startIndex = -1
}
} else {
curIndex++
}
}
if startIndex >= 0 && startIndex < len(RecvBuffer) {
para.tmpRecDataBuffer = append(para.tmpRecDataBuffer, RecvBuffer[curIndex:]...)
}
}
func (para *FlxNetworkCmdTCPLisen) ValidateRecvBuffer(packLen int, RecvBuffer []byte, startIndex int) bool {
defer func() {
if r := recover(); r != nil {
log.Error("ValidateRecvBuffer:", r)
}
}()
PackBuff := make([]byte, packLen)
PackBuff = RecvBuffer[startIndex : startIndex+packLen]
//校验CRC
CRCBuff := CRCCheck12(PackBuff[:packLen-2])
if CRCBuff[0] != PackBuff[packLen-2] || CRCBuff[1] != PackBuff[packLen-1] {
//InvokeOnDataReciveLogHandler(string.Format(FlxNetCCUConstantText.ReciveDataBufferImperfect_Error, "飞利信网口中控机")); //--写日志
return false
} else {
para.InvokeOnReviceData(CreatCMDPack(strings.Split(para.TCPConn.RemoteAddr().String(), ":")[0], PackBuff))
// para.InvokeOnReviceData(CreatCMDPack(PackBuff, packLen-2))
//外发事件。
return true
}
}
func (para *FlxNetworkCmdTCPLisen) SendToClient(dataMsg []byte) {
defer func() {
if r := recover(); r != nil {
log.Error("SendToClient:", r)
}
}()
if dataMsg == nil {
fmt.Printf("不能向远程端口发送空数据!")
return
}
if len(dataMsg) < 5 {
fmt.Printf("不能向远程端口发送不完整的数据5")
return
}
dataMsg = FullCheckSum(dataMsg)
para.TCPConn.Write(dataMsg)
}
// 服务器发送结束会议指令
func (para *FlxNetworkCmdTCPLisen) StopAgenda() {
defer func() {
if r := recover(); r != nil {
log.Error("StopAgenda:", r)
}
}()
var ary = make([]byte, 7)
ary[0] = FlxNetworkComPara_CMD_HEAD
ary[1] = FlxNetworkComPara_Meeting //cmd
ary[2] = FlxNetworkComPara_Meeting_Close
para.SendToClient(ary)
}
// 服务器发送会议状态指令
func (para *FlxNetworkCmdTCPLisen) SendToClientCongresStatus(SoftStatus string) {
defer func() {
if r := recover(); r != nil {
log.Error("SendToClientCongresStatus:", r)
}
}()
sendValue := []byte(SoftStatus)
slen := len(sendValue) + 7
var buff = make([]byte, slen)
buff[0] = FlxNetworkComPara_CMD_HEAD
buff[1] = FlxNetworkComPara_Server_Congress_Status
buff[2] = FlxNetworkComPara_Server_RetStatus
if len(sendValue) > 255 {
buff[3] = (byte)(len(sendValue) / 255)
buff[4] = (byte)(len(sendValue) % 255)
} else {
buff[4] = (byte)(len(sendValue))
}
buff = insertSlice(5, sendValue, buff)
para.SendToClient(buff)
}
// 服务器发送开始报到指令
func (para *FlxNetworkCmdTCPLisen) StartCheckInStart() {
defer func() {
if r := recover(); r != nil {
log.Error("StartCheckInStart:", r)
}
}()
var ary = make([]byte, 7)
ary[0] = FlxNetworkComPara_CMD_HEAD
ary[1] = FlxNetworkComPara_Main_Start_Register //cmd
ary[2] = 0
para.SendToClient(ary)
}
// 服务器发送开始报到指令
func (para *FlxNetworkCmdTCPLisen) ServerSendToClientStartCheckIn(ClientIP string) {
defer func() {
if r := recover(); r != nil {
log.Error("ServerSendToClientStartCheckIn:", r)
}
}()
var ary = make([]byte, 7)
ary[0] = FlxNetworkComPara_CMD_HEAD
ary[1] = FlxNetworkComPara_Main_Start_Register //cmd
ary[2] = 0
para.SendToClient(ary)
}
// 服务器发送结束报到指令
func (para *FlxNetworkCmdTCPLisen) StartCheckInStop() {
defer func() {
if r := recover(); r != nil {
log.Error("StartCheckInStop:", r)
}
}()
var ary = make([]byte, 7)
ary[0] = FlxNetworkComPara_CMD_HEAD
ary[1] = FlxNetworkComPara_Main_Stop_Register //cmd
ary[2] = 0
para.SendToClient(ary)
}
// 服务器发送人员报到指令
func (para *FlxNetworkCmdTCPLisen) SendToClientPersonCheckIn(AP_ID string) {
defer func() {
if r := recover(); r != nil {
log.Error("SendToClientPersonCheckIn:", r)
}
}()
sendValue := []byte(AP_ID)
slen := len(sendValue) + 7
var buff = make([]byte, slen)
buff[0] = FlxNetworkComPara_CMD_HEAD
buff[1] = FlxNetworkComPara_Un_Register
buff[2] = FlxNetworkComPara_CheckIn_Sub_Signed
if len(sendValue) > 255 {
buff[3] = (byte)(len(sendValue) / 255)
buff[4] = (byte)(len(sendValue) % 255)
} else {
buff[4] = (byte)(len(sendValue))
}
buff = insertSlice(5, sendValue, buff)
para.SendToClient(buff)
}
// 服务器发送人员消报指令
func (para *FlxNetworkCmdTCPLisen) SendToClientPersonCheckOut(AP_ID string) {
defer func() {
if r := recover(); r != nil {
log.Error("SendToClientPersonCheckOut:", r)
}
}()
sendValue := []byte(AP_ID)
slen := len(sendValue) + 7
var buff = make([]byte, slen)
buff[0] = FlxNetworkComPara_CMD_HEAD
buff[1] = FlxNetworkComPara_Un_Register
buff[2] = FlxNetworkComPara_CheckIn_Sub_Cancel
if len(sendValue) > 255 {
buff[3] = (byte)(len(sendValue) / 255)
buff[4] = (byte)(len(sendValue) % 255)
} else {
buff[4] = (byte)(len(sendValue))
}
buff = insertSlice(5, sendValue, buff)
para.SendToClient(buff)
}