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