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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)
}