socketsend.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. )
  13. // 定义全局变量
  14. var gSocket_UdpConn *net.UDPConn = nil // UDP句柄
  15. var GSocket_mapTcpConn = make(map[string]*net.TCPConn) //TCP连接map
  16. type SocketSend struct {
  17. }
  18. // udp连接句柄
  19. func (obj *SocketSend) SaveUdpConnHandle(udpConn *net.UDPConn) {
  20. gSocket_UdpConn = udpConn
  21. }
  22. // 保存TCP连接句柄
  23. func (obj *SocketSend) SaveTcpConnHandle(tcpConn *net.TCPConn, address string) {
  24. GSocket_mapTcpConn[address] = tcpConn
  25. }
  26. // 删除TCP连接句柄
  27. func (obj *SocketSend) DeleteTcpConnHandle(address string) {
  28. delete(GSocket_mapTcpConn, address)
  29. }
  30. // 发送数据到基站
  31. func (obj *SocketSend) SendDataToBts(projectId int, btsId int, apDataFrame []byte, wLen uint16) error {
  32. var redisObj redisapi.RedisApi
  33. udpClientAddr := &net.UDPAddr{}
  34. var udpClientAddrModel socketmodel.ClientAddr //客户端地址
  35. //组织redis建值,并查询客户端IP与端口
  36. redisKey := fmt.Sprintf("%08X", int(projectId)) + "-" + fmt.Sprintf("%08X", int(btsId)) //KEY
  37. if err := redisObj.GetModelData(redisKey, &udpClientAddrModel); err != nil {
  38. //删除map中的一个元素
  39. public.PublicDeleteOneItem(redisKey)
  40. return errors.New("该链接已过期")
  41. }
  42. //组织客户端地址
  43. ip := make(net.IP, net.IPv4len) // 创建一个长度为4的切片,对应于 IPv4 地址
  44. copy(ip, udpClientAddrModel.IP[:]) // 复制字节到切片
  45. udpClientAddr.IP = ip
  46. udpClientAddr.Port = udpClientAddrModel.Port
  47. udpClientAddr.Zone = udpClientAddrModel.Zone
  48. //把数据发送至基站
  49. _, err := gSocket_UdpConn.WriteToUDP(apDataFrame, udpClientAddr)
  50. if err != nil {
  51. return err
  52. }
  53. println("send data to bts", apDataFrame[0], apDataFrame[len(apDataFrame)-1], len(apDataFrame))
  54. return nil
  55. }
  56. // 发送数据到基站
  57. func (obj *SocketSend) SendDataToBtsTcp(projectId int, btsId int, apDataFrame []byte, wLen uint16) error {
  58. var redisObj redisapi.RedisApi
  59. var clientAddrModel socketmodel.ClientAddr //客户端地址
  60. //组织redis建值,并查询客户端IP与端口
  61. redisKey := fmt.Sprintf("%08X", int(projectId)) + "-" + fmt.Sprintf("%08X", int(btsId)) //KEY
  62. if err := redisObj.GetModelData(redisKey, &clientAddrModel); err != nil {
  63. //删除map中的一个元素
  64. public.PublicDeleteOneItem(redisKey)
  65. return errors.New("该链接已过期")
  66. }
  67. //获得tcp的连接
  68. conn, exist := GSocket_mapTcpConn[clientAddrModel.Address]
  69. if exist {
  70. //把数据发送至基站
  71. _, err := conn.Write(apDataFrame)
  72. if err != nil {
  73. return err
  74. }
  75. println("send data to bts", apDataFrame[0], apDataFrame[len(apDataFrame)-1], len(apDataFrame))
  76. }
  77. return nil
  78. }