mcp.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // 协议栈模块
  2. // 秒寻科技
  3. // zt 2024-09-14
  4. package mcp
  5. import (
  6. "encoding/binary"
  7. "errors"
  8. "fmt"
  9. "ipsomc/module/bparam/bparammodel"
  10. "ipsomc/module/oam"
  11. "ipsomc/module/ps/psmodel"
  12. "ipsomc/public"
  13. )
  14. type Mcp struct {
  15. oamDeviceApi oam.OamDevice
  16. oamNetworkApi oam.OamNetwork
  17. oamGainApi oam.OamGain
  18. oamSyncApi oam.OamSync
  19. oamBtsApi oam.OamBts
  20. oamInstallApi oam.OamInstall
  21. rtcApi oam.OamRtc
  22. }
  23. // 将响应发送到http模块
  24. func (obj *Mcp) McpSendRespDataToHttp(stHeadModel *psmodel.PS_HEAD_T, dataModel *bparammodel.BtsBaseParam, byModuleId uint8, byMcpCmd uint8) {
  25. //生成http请求id
  26. requestIdStr := fmt.Sprintf("%08X", int(stHeadModel.StVpHead.ProjectID)) + "-" + fmt.Sprintf("%08X", stHeadModel.StVpHead.DeviceID) + "-" + fmt.Sprintf("%d", byMcpCmd) + "-" + fmt.Sprintf("%d", byModuleId)
  27. //从map中查找通道
  28. chanRespData, exist := public.Gpub_mapChan[requestIdStr]
  29. if exist { //通道存在
  30. chanRespData <- dataModel //发送数据
  31. }
  32. }
  33. // MCP-A查询响应,要将查询结果反馈给页面模型
  34. // dataList:MCP层数据队列
  35. // wLen:数据队列长度
  36. func (obj *Mcp) McpAUlRespQuery(stHeadModel *psmodel.PS_HEAD_T, dataList []byte, wLen int) error {
  37. btsBaseParamModel := new(bparammodel.BtsBaseParam)
  38. var wCurrentLen uint16 = 0
  39. var wLtvLen uint16 = 0
  40. var wCommand uint16 = 0
  41. ltvData := make([]byte, psmodel.PS_MCP_A_DATA_LEN)
  42. var byModuleId uint8 = 0
  43. //遍历数据队列
  44. for {
  45. if wCurrentLen >= uint16(wLen) {
  46. break
  47. }
  48. //组织一个ltv数据
  49. wLtvLen = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen : wCurrentLen+2])) //长度
  50. wCommand = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen+2 : wCurrentLen+4])) //命令
  51. copy(ltvData, dataList[wCurrentLen+4:wCurrentLen+wLtvLen]) //数据
  52. //根据监控命令处理
  53. if wCommand <= 0x00FF { // 设备信息
  54. obj.oamDeviceApi.OamDeviceQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  55. byModuleId = public.BTS_MODULE_DEVICE
  56. } else if wCommand >= 0x0100 && wCommand <= 0x01FF { // 网管参数
  57. obj.oamNetworkApi.OamNetrowkQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  58. byModuleId = public.BTS_MODULE_NETWORK
  59. } else if wCommand >= 0x0200 && wCommand <= 0x02FF { // 上报参数
  60. byModuleId = public.BTS_MCP_REPORT
  61. } else if wCommand >= 0x0300 && wCommand <= 0x03FF { // 增益参数
  62. obj.oamGainApi.OamGainQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  63. byModuleId = public.BTS_MODULE_GAIN
  64. } else if wCommand >= 0x0400 && wCommand <= 0x04FF { // 安装参数
  65. obj.oamInstallApi.OamInstallQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  66. byModuleId = public.BTS_MODULE_INSTALL
  67. } else if wCommand >= 0x0500 && wCommand <= 0x05FF { // 同步参数
  68. obj.oamSyncApi.OamSyncQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  69. byModuleId = public.BTS_MODULE_SYNC
  70. } else if wCommand >= 0x0600 && wCommand <= 0x06FF { // 基站参数
  71. obj.oamBtsApi.OamBtsQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  72. byModuleId = public.BTS_MODULE_BTS
  73. } else if wCommand >= 0x0700 && wCommand <= 0x07FF { // RTC参数
  74. obj.rtcApi.OamRtcQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  75. byModuleId = public.BTS_MODULE_RTC
  76. } else {
  77. return errors.New("监控命令错误")
  78. }
  79. //数据后移
  80. wCurrentLen += wLtvLen
  81. }
  82. //把数据发送至基站基本参数模块
  83. btsBaseParamModel.ProjectID = stHeadModel.StVpHead.ProjectID
  84. btsBaseParamModel.BtsID = stHeadModel.StVpHead.DeviceID
  85. obj.McpSendRespDataToHttp(stHeadModel, btsBaseParamModel, byModuleId, psmodel.MCP_A_QUERY)
  86. return nil
  87. }
  88. // MCP-A配置响应,要将查询结果反馈给页面模型
  89. // dataList:MCP层数据队列
  90. // wLen:数据队列长度
  91. func (obj *Mcp) McpAUlRespSet(stHeadModel *psmodel.PS_HEAD_T, dataList []byte, wLen int) error {
  92. btsBaseParamModel := new(bparammodel.BtsBaseParam)
  93. var wCurrentLen uint16 = 0
  94. var wLtvLen uint16 = 0
  95. var wCommand uint16 = 0
  96. ltvData := make([]byte, psmodel.PS_MCP_A_DATA_LEN)
  97. var byModuleId uint8 = 0
  98. //遍历数据队列
  99. for {
  100. if wCurrentLen >= uint16(wLen) {
  101. break
  102. }
  103. //组织一个ltv数据
  104. wLtvLen = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen : wCurrentLen+2])) //长度
  105. wCommand = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen+2 : wCurrentLen+4])) //命令
  106. copy(ltvData, dataList[wCurrentLen+4:wCurrentLen+wLtvLen]) //数据
  107. //根据监控命令处理
  108. if wCommand <= 0x00FF { // 设备信息
  109. byModuleId = public.BTS_MODULE_DEVICE
  110. } else if wCommand >= 0x0100 && wCommand <= 0x01FF { // 网管参数
  111. byModuleId = public.BTS_MODULE_NETWORK
  112. } else if wCommand >= 0x0200 && wCommand <= 0x02FF { // 上报参数
  113. byModuleId = public.BTS_MCP_REPORT
  114. } else if wCommand >= 0x0300 && wCommand <= 0x03FF { // 增益参数
  115. byModuleId = public.BTS_MODULE_GAIN
  116. if wCommand == 0x03FF { //保存参数
  117. btsBaseParamModel.SaveParam = ltvData[0] //保存参数结果
  118. }
  119. } else if wCommand >= 0x0400 && wCommand <= 0x04FF { // 安装参数
  120. byModuleId = public.BTS_MODULE_INSTALL
  121. } else if wCommand >= 0x0500 && wCommand <= 0x05FF { // 同步参数
  122. byModuleId = public.BTS_MODULE_SYNC
  123. } else if wCommand >= 0x0600 && wCommand <= 0x06FF { // 基站参数
  124. byModuleId = public.BTS_MODULE_BTS
  125. } else if wCommand >= 0x0700 && wCommand <= 0x07FF { // RTC参数
  126. byModuleId = public.BTS_MODULE_RTC
  127. } else {
  128. return errors.New("监控命令错误")
  129. }
  130. //数据后移
  131. wCurrentLen += wLtvLen
  132. }
  133. //把数据发送至基站基本参数模块
  134. btsBaseParamModel.ProjectID = stHeadModel.StVpHead.ProjectID
  135. btsBaseParamModel.BtsID = stHeadModel.StVpHead.DeviceID
  136. obj.McpSendRespDataToHttp(stHeadModel, btsBaseParamModel, byModuleId, psmodel.MCP_A_CONFIGURE)
  137. return nil
  138. }