index.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package stc
  2. import (
  3. "bufio"
  4. "bytes"
  5. "encoding/binary"
  6. "fmt"
  7. "log"
  8. "net"
  9. "os"
  10. stc "pbx-api-gin/internal/app/stc/operation"
  11. "syscall"
  12. "time"
  13. )
  14. // Protocol 定义协议数据结构
  15. type Protocol struct {
  16. StartBytes [3]byte // 协议开始符
  17. SourceID uint8 // 源设备号
  18. DestinationID uint8 // 目的设备号
  19. MessageID uint8 // 消息号
  20. DataLength uint16 // 数据长度
  21. Data []byte // 数据
  22. Checksum uint8 // 异或校验码
  23. EndByte uint8 // 协议结束符
  24. }
  25. // NewProtocol 创建一个新的 Protocol 实例
  26. func NewProtocol() *Protocol {
  27. return &Protocol{
  28. StartBytes: [3]byte{0x7F, 0x8E, 0x9D},
  29. EndByte: 0xFE,
  30. }
  31. }
  32. func ConnectStc(ServerAddr string, Port int) {
  33. //=================================================
  34. // connect server
  35. conn := connectServer(ServerAddr, Port)
  36. defer conn.Close()
  37. //read msg
  38. go func(conn net.Conn) {
  39. readMsg(conn)
  40. }(conn)
  41. // send msg
  42. sendMsg(conn)
  43. }
  44. func connectServer(ServerAddr string, Port int) net.Conn {
  45. // connect server
  46. conn, err := net.DialTCP("tcp", &net.TCPAddr{
  47. IP: net.ParseIP("0.0.0.0"),
  48. Port: 0,
  49. }, &net.TCPAddr{
  50. IP: net.ParseIP(ServerAddr),
  51. Port: Port,
  52. })
  53. if err != nil {
  54. fmt.Println("Error conn server:", err)
  55. log.Fatal(err)
  56. }
  57. fileDesc, _ := conn.File()
  58. fd := fileDesc.Fd()
  59. syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
  60. return conn
  61. }
  62. func Sendheartbeat(conn net.Conn) {
  63. var count uint8
  64. //init heartbeat data
  65. protocol := NewProtocol()
  66. protocol.SourceID = 0x02
  67. protocol.DestinationID = 0x01
  68. protocol.MessageID = 0x21
  69. protocol.DataLength = 0x04
  70. ticker := time.NewTicker(2 * time.Second)
  71. defer ticker.Stop()
  72. for range ticker.C {
  73. count = count + 1
  74. protocol.Data = []byte{count, 0x00, 0x00, 0x00}
  75. encoded, errEn := protocol.Encode()
  76. if errEn != nil {
  77. fmt.Println("Encode error:", errEn)
  78. return
  79. }
  80. _, err := conn.Write(encoded)
  81. if err != nil {
  82. fmt.Println("send heartbeat err:", err)
  83. return
  84. }
  85. }
  86. }
  87. func readMsg(conn net.Conn) {
  88. for {
  89. buffer := make([]byte, 1024)
  90. n, err := conn.Read(buffer)
  91. if err != nil {
  92. fmt.Println("Error reading from server:", err)
  93. return
  94. }
  95. fmt.Println("Received from server:", string(buffer[:n]))
  96. switch buffer[5] {
  97. case 0x01: //heartbeat
  98. case 0x02: //STN
  99. stc.StationAnn([4]byte{buffer[8], buffer[9], buffer[10], buffer[11]})
  100. case 0x03: //ACTIVE
  101. stc.Active([1]byte{buffer[8]})
  102. case 0x05: //SPC
  103. stc.SpecialAnn([4]byte{buffer[8], buffer[9], buffer[10], buffer[11]})
  104. case 0x06: //EMG
  105. stc.EmgMsg([4]byte{buffer[8], buffer[9], buffer[10], buffer[11]})
  106. case 0x07: //STOP
  107. stc.AnnStop([4]byte{buffer[8], buffer[9], buffer[10], buffer[11]})
  108. case 0x08: //DCS
  109. stc.DcsAnn([4]byte{buffer[8], buffer[9], buffer[10], buffer[11]})
  110. case 0x09: //SELF CHECK
  111. stc.SelfCheck([4]byte{buffer[8], buffer[9], buffer[10], buffer[11]})
  112. case 0x0a: //
  113. stc.AlarmHandle([4]byte{buffer[8], buffer[9], buffer[10], buffer[11]})
  114. case 0x0b: //
  115. stc.AlarmResetAll([4]byte{buffer[8], buffer[9], buffer[10], buffer[11]})
  116. case 0x0c: //
  117. stc.RecordStorageConf([4]byte{buffer[8], buffer[9], buffer[10], buffer[11]})
  118. }
  119. }
  120. }
  121. func sendMsg(conn net.Conn) {
  122. //heartbeat
  123. go func(conn net.Conn) {
  124. Sendheartbeat(conn)
  125. }(conn)
  126. scanner := bufio.NewScanner(os.Stdin)
  127. for scanner.Scan() {
  128. text := scanner.Text()
  129. _, err := conn.Write([]byte(text + "\n"))
  130. if err != nil {
  131. fmt.Println("send msg err:", err)
  132. return
  133. }
  134. }
  135. }
  136. // Encode 将 Protocol 结构体编码为字节切片
  137. func (p *Protocol) Encode() ([]byte, error) {
  138. // 初始化字节缓冲区
  139. var buf bytes.Buffer // 写入协议开始符
  140. buf.Write(p.StartBytes[:])
  141. // 写入源设备号、目的设备号和消息号
  142. binary.Write(&buf, binary.BigEndian, p.SourceID)
  143. binary.Write(&buf, binary.BigEndian, p.DestinationID)
  144. binary.Write(&buf, binary.BigEndian, p.MessageID)
  145. // 写入数据长度
  146. binary.Write(&buf, binary.BigEndian, p.DataLength)
  147. // 写入数据
  148. buf.Write(p.Data[:])
  149. // 计算校验码
  150. checksum := p.CalculateChecksum()
  151. p.Checksum = checksum // 写入校验码
  152. binary.Write(&buf, binary.BigEndian, p.Checksum)
  153. // 写入协议结束符
  154. binary.Write(&buf, binary.BigEndian, p.EndByte)
  155. return buf.Bytes(), nil
  156. }
  157. // CalculateChecksum 计算校验码
  158. func (p *Protocol) CalculateChecksum() uint8 {
  159. // 初始化校验码
  160. checksum := uint8(0)
  161. // 跳过协议开始符
  162. data := append([]byte{byte(p.SourceID), byte(p.DestinationID), byte(p.MessageID)},
  163. append([]byte{byte(p.DataLength >> 8), byte(p.DataLength)}, p.Data...)...)
  164. // 计算校验码
  165. for _, b := range data {
  166. checksum ^= b
  167. }
  168. return checksum
  169. }
  170. // Decode 解码字节切片为 Protocol 结构体
  171. func Decode(data []byte) (*Protocol, error) {
  172. if len(data) < 10 { // 最小长度:3(StartBytes) +1(SourceID) +1(DestinationID) +1(MessageID) +2(DataLength) +1(Checksum) +1(EndByte)
  173. return nil, fmt.Errorf("data too short")
  174. }
  175. p := NewProtocol()
  176. // 读取协议开始符
  177. copy(p.StartBytes[:], data[:3])
  178. // 读取源设备号、目的设备号和消息号
  179. p.SourceID = data[3]
  180. p.DestinationID = data[4]
  181. p.MessageID = data[5]
  182. // 读取数据长度
  183. p.DataLength = binary.BigEndian.Uint16(data[6:8])
  184. // 读取数据
  185. dataLength := int(p.DataLength)
  186. if len(data) < 10+dataLength {
  187. return nil, fmt.Errorf("data length mismatch")
  188. }
  189. p.Data = data[8 : 8+dataLength]
  190. // 读取校验码
  191. p.Checksum = data[8+dataLength]
  192. // 读取协议结束符
  193. p.EndByte = data[9+dataLength]
  194. // 验证校验码
  195. if p.Checksum != p.CalculateChecksum() {
  196. return nil, fmt.Errorf("checksum mismatch")
  197. }
  198. return p, nil
  199. }