socketsend.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // socket发送模块
  2. // 秒寻科技
  3. // zt 2024-09-30
  4. package socketsend
  5. import (
  6. "errors"
  7. "fmt"
  8. "ipsomc/core/dao/redis/redisapi"
  9. "ipsomc/module/socket/socketmodel"
  10. "ipsomc/public"
  11. "net"
  12. "strconv"
  13. "sync"
  14. "time"
  15. )
  16. // 定义全局变量
  17. var gSocket_UdpConn *net.UDPConn = nil // UDP句柄
  18. var GSocket_mapTcpConn = make(map[string]*net.TCPConn) //TCP连接map
  19. var mapMutex sync.RWMutex
  20. type SocketSend struct {
  21. }
  22. // udp连接句柄
  23. func (obj *SocketSend) SaveUdpConnHandle(udpConn *net.UDPConn) {
  24. mapMutex.Lock()
  25. defer mapMutex.Unlock()
  26. gSocket_UdpConn = udpConn
  27. }
  28. // 保存TCP连接句柄
  29. func (obj *SocketSend) SaveTcpConnHandle(tcpConn *net.TCPConn, address string) {
  30. mapMutex.Lock()
  31. defer mapMutex.Unlock()
  32. GSocket_mapTcpConn[address] = tcpConn
  33. }
  34. // 删除TCP连接句柄
  35. func (obj *SocketSend) DeleteTcpConnHandle(address string) {
  36. mapMutex.Lock()
  37. defer mapMutex.Unlock()
  38. delete(GSocket_mapTcpConn, address)
  39. }
  40. // 发送数据到基站
  41. func (obj *SocketSend) SendDataToBts(projectId int, btsId int, apDataFrame []byte, wLen uint16) error {
  42. var redisObj redisapi.RedisApi
  43. udpClientAddr := &net.UDPAddr{}
  44. var udpClientAddrModel socketmodel.ClientAddr //客户端地址
  45. //组织redis建值,并查询客户端IP与端口
  46. redisKey := fmt.Sprintf("%08X", int(projectId)) + "-" + fmt.Sprintf("%08X", int(btsId)) //KEY
  47. if err := redisObj.GetModelData(redisKey, &udpClientAddrModel); err != nil {
  48. //删除map中的一个元素
  49. public.PublicHeartMapDeleteOneItem(redisKey)
  50. return errors.New("该链接已过期")
  51. }
  52. //组织客户端地址
  53. ip := make(net.IP, net.IPv4len) // 创建一个长度为4的切片,对应于 IPv4 地址
  54. copy(ip, udpClientAddrModel.IP[:]) // 复制字节到切片
  55. udpClientAddr.IP = ip
  56. udpClientAddr.Port = udpClientAddrModel.Port
  57. udpClientAddr.Zone = udpClientAddrModel.Zone
  58. //把数据发送至基站
  59. _, err := gSocket_UdpConn.WriteToUDP(apDataFrame, udpClientAddr)
  60. if err != nil {
  61. return err
  62. }
  63. println("send data to bts", apDataFrame[0], apDataFrame[len(apDataFrame)-1], len(apDataFrame))
  64. return nil
  65. }
  66. // 发送数据到基站
  67. func (obj *SocketSend) SendDataToBtsTcp(projectId int, btsId int, apDataFrame []byte, wLen uint16) error {
  68. var redisObj redisapi.RedisApi
  69. var clientAddrModel socketmodel.ClientAddr //客户端地址
  70. //组织redis建值,并查询客户端IP与端口
  71. var maxRetries = 3
  72. var existFlag = 0
  73. redisKey := fmt.Sprintf("%08X", int(projectId)) + "-" + fmt.Sprintf("%08X", int(btsId)) //KEY
  74. for i := 0; i < maxRetries; i++ {
  75. if err := redisObj.GetModelData(redisKey, &clientAddrModel); err == nil {
  76. existFlag = 1 //找到了
  77. break
  78. }
  79. time.Sleep(1 * time.Second)
  80. }
  81. //若不存在
  82. if existFlag == 0 {
  83. public.PublicHeartMapDeleteOneItem(redisKey) //删除map中的一个元素
  84. return errors.New("该链接已过期")
  85. }
  86. //获得tcp的连接
  87. conn, exist := GSocket_mapTcpConn[clientAddrModel.Address]
  88. if exist {
  89. //把数据发送至基站
  90. _, err := conn.Write(apDataFrame)
  91. if err != nil {
  92. return err
  93. }
  94. //获得系统工作模式
  95. sysWorkMode := public.PublicSysWorkModeGet()
  96. if sysWorkMode == 0 {
  97. text := "Send " + strconv.Itoa(len(apDataFrame)) + " bytes to " + clientAddrModel.Address
  98. println(text)
  99. }
  100. }
  101. return nil
  102. }