mcp.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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. }
  22. // 将响应发送到http模块
  23. func (obj *Mcp) McpSendRespDataToHttp(stHeadModel *psmodel.PS_HEAD_T, dataModel *bparammodel.BtsBaseParam, byModuleId uint8, byMcpCmd uint8) {
  24. //生成http请求id
  25. requestIdStr := fmt.Sprintf("%08X", int(stHeadModel.StVpHead.ProjectID)) + "-" + fmt.Sprintf("%08X", stHeadModel.StVpHead.DeviceID) + "-" + fmt.Sprintf("%d", byMcpCmd)
  26. //从map中查找通道
  27. chanRespData, exist := public.Gpub_mapChan[requestIdStr]
  28. if exist { //通道存在
  29. chanRespData <- dataModel //发送数据
  30. }
  31. }
  32. // MCP-A查询响应,要将查询结果反馈给页面模型
  33. // dataList:MCP层数据队列
  34. // wLen:数据队列长度
  35. func (obj *Mcp) McpAUlRespQuery(stHeadModel *psmodel.PS_HEAD_T, dataList []byte, wLen int) error {
  36. btsBaseParamModel := new(bparammodel.BtsBaseParam)
  37. var wCurrentLen uint16 = 0
  38. var wLtvLen uint16 = 0
  39. var wCommand uint16 = 0
  40. ltvData := make([]byte, psmodel.PS_MCP_A_DATA_LEN)
  41. var byModuleId uint8 = 0
  42. //遍历数据队列
  43. for {
  44. if wCurrentLen >= uint16(wLen) {
  45. break
  46. }
  47. //组织一个ltv数据
  48. wLtvLen = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen : wCurrentLen+2])) //长度
  49. wCommand = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen+2 : wCurrentLen+4])) //命令
  50. copy(ltvData, dataList[wCurrentLen+4:wCurrentLen+wLtvLen]) //数据
  51. //根据监控命令处理
  52. if wCommand <= 0x00FF { // 设备信息
  53. obj.oamDeviceApi.OamDeviceQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  54. if byModuleId != public.BTS_MODULE_DEVICE {
  55. byModuleId = public.BTS_MODULE_DEVICE
  56. }
  57. } else if wCommand >= 0x0100 && wCommand <= 0x01FF { // 网管参数
  58. obj.oamNetworkApi.OamNetrowkQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  59. if byModuleId != public.BTS_MODULE_NETWORK {
  60. byModuleId = public.BTS_MODULE_NETWORK
  61. }
  62. } else if wCommand >= 0x0200 && wCommand <= 0x02FF { // 上报参数
  63. if byModuleId != public.BTS_MCP_REPORT {
  64. byModuleId = public.BTS_MCP_REPORT
  65. }
  66. } else if wCommand >= 0x0300 && wCommand <= 0x03FF { // 增益参数
  67. obj.oamGainApi.OamGainQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  68. if byModuleId != public.BTS_MODULE_GAIN {
  69. byModuleId = public.BTS_MODULE_GAIN
  70. }
  71. } else if wCommand >= 0x0400 && wCommand <= 0x04FF { // 安装参数
  72. obj.oamInstallApi.OamInstallQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  73. if byModuleId != public.BTS_MODULE_INSTALL {
  74. byModuleId = public.BTS_MODULE_INSTALL
  75. }
  76. } else if wCommand >= 0x0500 && wCommand <= 0x05FF { // 同步参数
  77. obj.oamSyncApi.OamSyncQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  78. if byModuleId != public.BTS_MODULE_SYNC {
  79. byModuleId = public.BTS_MODULE_SYNC
  80. }
  81. } else if wCommand >= 0x0600 && wCommand <= 0x06FF { // 基站参数
  82. obj.oamBtsApi.OamBtsQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  83. if byModuleId != public.BTS_MODULE_BTS {
  84. byModuleId = public.BTS_MODULE_BTS
  85. }
  86. } else {
  87. return errors.New("监控命令错误")
  88. }
  89. //数据后移
  90. wCurrentLen += wLtvLen
  91. }
  92. //把数据发送至基站基本参数模块
  93. btsBaseParamModel.ProjectID = stHeadModel.StVpHead.ProjectID
  94. btsBaseParamModel.BtsID = stHeadModel.StVpHead.DeviceID
  95. obj.McpSendRespDataToHttp(stHeadModel, btsBaseParamModel, byModuleId, psmodel.MCP_A_QUERY)
  96. return nil
  97. }
  98. // MCP-A配置响应,要将查询结果反馈给页面模型
  99. // dataList:MCP层数据队列
  100. // wLen:数据队列长度
  101. func (obj *Mcp) McpAUlRespSet(stHeadModel *psmodel.PS_HEAD_T, dataList []byte, wLen int) error {
  102. btsBaseParamModel := new(bparammodel.BtsBaseParam)
  103. var wCurrentLen uint16 = 0
  104. var wLtvLen uint16 = 0
  105. var wCommand uint16 = 0
  106. ltvData := make([]byte, psmodel.PS_MCP_A_DATA_LEN)
  107. var byModuleId uint8 = 0
  108. //遍历数据队列
  109. for {
  110. if wCurrentLen >= uint16(wLen) {
  111. break
  112. }
  113. //组织一个ltv数据
  114. wLtvLen = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen : wCurrentLen+2])) //长度
  115. wCommand = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen+2 : wCurrentLen+4])) //命令
  116. copy(ltvData, dataList[wCurrentLen+4:wCurrentLen+wLtvLen]) //数据
  117. //根据监控命令处理
  118. if wCommand <= 0x00FF { // 设备信息
  119. if byModuleId != public.BTS_MODULE_DEVICE {
  120. byModuleId = public.BTS_MODULE_DEVICE
  121. }
  122. } else if wCommand >= 0x0100 && wCommand <= 0x01FF { // 网管参数
  123. if byModuleId != public.BTS_MODULE_NETWORK {
  124. byModuleId = public.BTS_MODULE_NETWORK
  125. }
  126. } else if wCommand >= 0x0200 && wCommand <= 0x02FF { // 上报参数
  127. if byModuleId != public.BTS_MCP_REPORT {
  128. byModuleId = public.BTS_MCP_REPORT
  129. }
  130. } else if wCommand >= 0x0300 && wCommand <= 0x03FF { // 增益参数
  131. if byModuleId != public.BTS_MODULE_GAIN {
  132. byModuleId = public.BTS_MODULE_GAIN
  133. }
  134. if wCommand == 0x03FF { //保存参数
  135. btsBaseParamModel.SaveParam = ltvData[0] //保存参数结果
  136. }
  137. } else if wCommand >= 0x0400 && wCommand <= 0x04FF { // 安装参数
  138. if byModuleId != public.BTS_MODULE_INSTALL {
  139. byModuleId = public.BTS_MODULE_INSTALL
  140. }
  141. } else if wCommand >= 0x0500 && wCommand <= 0x05FF { // 同步参数
  142. if byModuleId != public.BTS_MODULE_SYNC {
  143. byModuleId = public.BTS_MODULE_SYNC
  144. }
  145. } else if wCommand >= 0x0600 && wCommand <= 0x06FF { // 基站参数
  146. if byModuleId != public.BTS_MODULE_BTS {
  147. byModuleId = public.BTS_MODULE_BTS
  148. }
  149. } else {
  150. return errors.New("监控命令错误")
  151. }
  152. //数据后移
  153. wCurrentLen += wLtvLen
  154. }
  155. //把数据发送至基站基本参数模块
  156. btsBaseParamModel.ProjectID = stHeadModel.StVpHead.ProjectID
  157. btsBaseParamModel.BtsID = stHeadModel.StVpHead.DeviceID
  158. obj.McpSendRespDataToHttp(stHeadModel, btsBaseParamModel, byModuleId, psmodel.MCP_A_CONFIGURE)
  159. return nil
  160. }