psdl.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // 协议栈下行模块模块
  2. // 秒寻科技
  3. // zt 2024-11-12
  4. package psdl
  5. import (
  6. "bytes"
  7. "encoding/binary"
  8. "ipsomc/module/ps/ap"
  9. "ipsomc/module/ps/psmodel"
  10. "ipsomc/module/socket/socketsend"
  11. )
  12. type PsDl struct {
  13. apApi ap.Ap
  14. socketSendApi socketsend.SocketSend
  15. }
  16. // 协议栈下行应答模块
  17. func (obj *PsDl) PsDlResp(stHeadModel *psmodel.PS_HEAD_T, dataList []byte) error {
  18. //组织数据
  19. projectId := stHeadModel.StVpHead.ProjectID
  20. btsId := stHeadModel.StVpHead.DeviceID
  21. byVpFlag := psmodel.VP_RESP
  22. byMcpType := stHeadModel.StVpHead.McpType
  23. byMcpCmd := stHeadModel.StMcpHead.Comd
  24. byMcpResp := psmodel.MCP_RESP_SUCC
  25. dataFrame := obj.PsDlOrganizeDlFrame(projectId, btsId, uint8(byVpFlag), byMcpType, byMcpCmd, uint8(byMcpResp), dataList)
  26. //AP层数据处理
  27. apDataFrame, wLen, err := obj.apApi.ApDl(dataFrame, len(dataFrame))
  28. if err != nil {
  29. return err
  30. }
  31. //将数据发送至socket模块
  32. //if err := obj.socketSendApi.SendDataToBts(projectId, btsId, apDataFrame, uint16(wLen)); err != nil {
  33. if err := obj.socketSendApi.SendDataToBtsTcp(projectId, btsId, apDataFrame, uint16(wLen)); err != nil {
  34. return err
  35. }
  36. return nil
  37. }
  38. // 组织下行数据帧
  39. // projectId:项目编号
  40. // btsId:基站编号
  41. // byVpFlag:VP层标识符
  42. // byMcpType:MCP协议类型
  43. // byMcpCmd:MCP命令
  44. // dataList:载荷
  45. // 返回值:AP层数据帧
  46. func (obj *PsDl) PsDlOrganizeDlFrame(projectId int, btsId int, byVpFlag uint8, byMcpType uint8, byMcpCmd uint8, byMcpResp uint8, dataList []byte) []byte {
  47. var frameData bytes.Buffer
  48. var wCrc uint16 = 0
  49. //协议头
  50. binary.Write(&frameData, binary.LittleEndian, uint8(psmodel.PS_AP_END_FLAG))
  51. //VP层
  52. binary.Write(&frameData, binary.LittleEndian, int32(projectId)) //项目ID
  53. binary.Write(&frameData, binary.LittleEndian, uint8(128)) //通信包号
  54. binary.Write(&frameData, binary.LittleEndian, int32(btsId)) //基站ID
  55. binary.Write(&frameData, binary.LittleEndian, byVpFlag) //VP层标识符
  56. binary.Write(&frameData, binary.LittleEndian, byMcpType) //MCP协议
  57. //MCP层
  58. binary.Write(&frameData, binary.LittleEndian, byMcpCmd) //MCP命令
  59. binary.Write(&frameData, binary.LittleEndian, byMcpResp) //MCP应答
  60. //数据
  61. binary.Write(&frameData, binary.LittleEndian, dataList)
  62. //添加CRC校验码
  63. tmpList := frameData.Bytes()
  64. wCrc = obj.apApi.ApGenCrc16(tmpList[1:], uint16(len(tmpList)-1), 0)
  65. binary.Write(&frameData, binary.LittleEndian, wCrc) //CRC校验码
  66. //协议尾
  67. binary.Write(&frameData, binary.LittleEndian, uint8(psmodel.PS_AP_END_FLAG))
  68. return frameData.Bytes()
  69. }
  70. // 把网管中心的数据发送给基站(命令)
  71. func (obj *PsDl) PsDlSendOamDataToBts(projectId int, btsId int, byMcpType uint8, byMcpCmd uint8, payload []byte) error {
  72. //生成帧
  73. frameData := obj.PsDlOrganizeDlFrame(projectId, btsId, psmodel.VP_CMMD, byMcpType, byMcpCmd, psmodel.MCP_CMD, payload)
  74. //ap层处理
  75. apDataFrame, wLen, err := obj.apApi.ApDl(frameData, len(frameData))
  76. if err != nil {
  77. return err
  78. }
  79. //发送数据到基站
  80. //if err := obj.socketSendApi.SendDataToBts(projectId, btsId, apDataFrame, uint16(wLen)); err != nil {
  81. if err := obj.socketSendApi.SendDataToBtsTcp(projectId, btsId, apDataFrame, uint16(wLen)); err != nil {
  82. return err
  83. }
  84. return nil
  85. }