mcp.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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)
  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. if byModuleId != public.BTS_MODULE_DEVICE {
  56. byModuleId = public.BTS_MODULE_DEVICE
  57. }
  58. } else if wCommand >= 0x0100 && wCommand <= 0x01FF { // 网管参数
  59. obj.oamNetworkApi.OamNetrowkQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  60. if byModuleId != public.BTS_MODULE_NETWORK {
  61. byModuleId = public.BTS_MODULE_NETWORK
  62. }
  63. } else if wCommand >= 0x0200 && wCommand <= 0x02FF { // 上报参数
  64. if byModuleId != public.BTS_MCP_REPORT {
  65. byModuleId = public.BTS_MCP_REPORT
  66. }
  67. } else if wCommand >= 0x0300 && wCommand <= 0x03FF { // 增益参数
  68. obj.oamGainApi.OamGainQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  69. if byModuleId != public.BTS_MODULE_GAIN {
  70. byModuleId = public.BTS_MODULE_GAIN
  71. }
  72. } else if wCommand >= 0x0400 && wCommand <= 0x04FF { // 安装参数
  73. obj.oamInstallApi.OamInstallQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  74. if byModuleId != public.BTS_MODULE_INSTALL {
  75. byModuleId = public.BTS_MODULE_INSTALL
  76. }
  77. } else if wCommand >= 0x0500 && wCommand <= 0x05FF { // 同步参数
  78. obj.oamSyncApi.OamSyncQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  79. if byModuleId != public.BTS_MODULE_SYNC {
  80. byModuleId = public.BTS_MODULE_SYNC
  81. }
  82. } else if wCommand >= 0x0600 && wCommand <= 0x06FF { // 基站参数
  83. obj.oamBtsApi.OamBtsQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  84. if byModuleId != public.BTS_MODULE_BTS {
  85. byModuleId = public.BTS_MODULE_BTS
  86. }
  87. } else if wCommand >= 0x0700 && wCommand <= 0x07FF { // RTC参数
  88. obj.rtcApi.OamRtcQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
  89. if byModuleId != public.BTS_MODULE_RTC {
  90. byModuleId = public.BTS_MODULE_RTC
  91. }
  92. } else {
  93. return errors.New("监控命令错误")
  94. }
  95. //数据后移
  96. wCurrentLen += wLtvLen
  97. }
  98. //把数据发送至基站基本参数模块
  99. btsBaseParamModel.ProjectID = stHeadModel.StVpHead.ProjectID
  100. btsBaseParamModel.BtsID = stHeadModel.StVpHead.DeviceID
  101. obj.McpSendRespDataToHttp(stHeadModel, btsBaseParamModel, byModuleId, psmodel.MCP_A_QUERY)
  102. return nil
  103. }
  104. // MCP-A配置响应,要将查询结果反馈给页面模型
  105. // dataList:MCP层数据队列
  106. // wLen:数据队列长度
  107. func (obj *Mcp) McpAUlRespSet(stHeadModel *psmodel.PS_HEAD_T, dataList []byte, wLen int) error {
  108. btsBaseParamModel := new(bparammodel.BtsBaseParam)
  109. var wCurrentLen uint16 = 0
  110. var wLtvLen uint16 = 0
  111. var wCommand uint16 = 0
  112. ltvData := make([]byte, psmodel.PS_MCP_A_DATA_LEN)
  113. var byModuleId uint8 = 0
  114. //遍历数据队列
  115. for {
  116. if wCurrentLen >= uint16(wLen) {
  117. break
  118. }
  119. //组织一个ltv数据
  120. wLtvLen = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen : wCurrentLen+2])) //长度
  121. wCommand = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen+2 : wCurrentLen+4])) //命令
  122. copy(ltvData, dataList[wCurrentLen+4:wCurrentLen+wLtvLen]) //数据
  123. //根据监控命令处理
  124. if wCommand <= 0x00FF { // 设备信息
  125. if byModuleId != public.BTS_MODULE_DEVICE {
  126. byModuleId = public.BTS_MODULE_DEVICE
  127. }
  128. } else if wCommand >= 0x0100 && wCommand <= 0x01FF { // 网管参数
  129. if byModuleId != public.BTS_MODULE_NETWORK {
  130. byModuleId = public.BTS_MODULE_NETWORK
  131. }
  132. } else if wCommand >= 0x0200 && wCommand <= 0x02FF { // 上报参数
  133. if byModuleId != public.BTS_MCP_REPORT {
  134. byModuleId = public.BTS_MCP_REPORT
  135. }
  136. } else if wCommand >= 0x0300 && wCommand <= 0x03FF { // 增益参数
  137. if byModuleId != public.BTS_MODULE_GAIN {
  138. byModuleId = public.BTS_MODULE_GAIN
  139. }
  140. if wCommand == 0x03FF { //保存参数
  141. btsBaseParamModel.SaveParam = ltvData[0] //保存参数结果
  142. }
  143. } else if wCommand >= 0x0400 && wCommand <= 0x04FF { // 安装参数
  144. if byModuleId != public.BTS_MODULE_INSTALL {
  145. byModuleId = public.BTS_MODULE_INSTALL
  146. }
  147. } else if wCommand >= 0x0500 && wCommand <= 0x05FF { // 同步参数
  148. if byModuleId != public.BTS_MODULE_SYNC {
  149. byModuleId = public.BTS_MODULE_SYNC
  150. }
  151. } else if wCommand >= 0x0600 && wCommand <= 0x06FF { // 基站参数
  152. if byModuleId != public.BTS_MODULE_BTS {
  153. byModuleId = public.BTS_MODULE_BTS
  154. }
  155. } else if wCommand >= 0x0700 && wCommand <= 0x07FF { // RTC参数
  156. if byModuleId != public.BTS_MODULE_RTC {
  157. byModuleId = public.BTS_MODULE_RTC
  158. }
  159. } else {
  160. return errors.New("监控命令错误")
  161. }
  162. //数据后移
  163. wCurrentLen += wLtvLen
  164. }
  165. //把数据发送至基站基本参数模块
  166. btsBaseParamModel.ProjectID = stHeadModel.StVpHead.ProjectID
  167. btsBaseParamModel.BtsID = stHeadModel.StVpHead.DeviceID
  168. obj.McpSendRespDataToHttp(stHeadModel, btsBaseParamModel, byModuleId, psmodel.MCP_A_CONFIGURE)
  169. return nil
  170. }