123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- // 协议栈模块
- // 秒寻科技
- // zt 2024-09-14
- package mcp
- import (
- "encoding/binary"
- "errors"
- "fmt"
- "ipsomc/module/bparam/bparammodel"
- "ipsomc/module/oam"
- "ipsomc/module/ps/psmodel"
- "ipsomc/public"
- )
- type Mcp struct {
- oamDeviceApi oam.OamDevice
- oamNetworkApi oam.OamNetwork
- oamGainApi oam.OamGain
- oamSyncApi oam.OamSync
- oamBtsApi oam.OamBts
- oamInstallApi oam.OamInstall
- rtcApi oam.OamRtc
- }
- // 将响应发送到http模块
- func (obj *Mcp) McpSendRespDataToHttp(stHeadModel *psmodel.PS_HEAD_T, dataModel *bparammodel.BtsBaseParam, byModuleId uint8, byMcpCmd uint8) {
- //生成http请求id
- requestIdStr := fmt.Sprintf("%08X", int(stHeadModel.StVpHead.ProjectID)) + "-" + fmt.Sprintf("%08X", stHeadModel.StVpHead.DeviceID) + "-" + fmt.Sprintf("%d", byMcpCmd) + "-" + fmt.Sprintf("%d", byModuleId)
- //从map中查找通道
- chanRespData, exist := public.Gpub_mapChan[requestIdStr]
- if exist { //通道存在
- chanRespData <- dataModel //发送数据
- }
- }
- // MCP-A查询响应,要将查询结果反馈给页面模型
- // dataList:MCP层数据队列
- // wLen:数据队列长度
- func (obj *Mcp) McpAUlRespQuery(stHeadModel *psmodel.PS_HEAD_T, dataList []byte, wLen int) error {
- btsBaseParamModel := new(bparammodel.BtsBaseParam)
- var wCurrentLen uint16 = 0
- var wLtvLen uint16 = 0
- var wCommand uint16 = 0
- ltvData := make([]byte, psmodel.PS_MCP_A_DATA_LEN)
- var byModuleId uint8 = 0
- //遍历数据队列
- for {
- if wCurrentLen >= uint16(wLen) {
- break
- }
- //组织一个ltv数据
- wLtvLen = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen : wCurrentLen+2])) //长度
- wCommand = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen+2 : wCurrentLen+4])) //命令
- copy(ltvData, dataList[wCurrentLen+4:wCurrentLen+wLtvLen]) //数据
- //根据监控命令处理
- if wCommand <= 0x00FF { // 设备信息
- obj.oamDeviceApi.OamDeviceQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
- byModuleId = public.BTS_MODULE_DEVICE
- } else if wCommand >= 0x0100 && wCommand <= 0x01FF { // 网管参数
- obj.oamNetworkApi.OamNetrowkQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
- byModuleId = public.BTS_MODULE_NETWORK
- } else if wCommand >= 0x0200 && wCommand <= 0x02FF { // 上报参数
- byModuleId = public.BTS_MCP_REPORT
- } else if wCommand >= 0x0300 && wCommand <= 0x03FF { // 增益参数
- obj.oamGainApi.OamGainQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
- byModuleId = public.BTS_MODULE_GAIN
- } else if wCommand >= 0x0400 && wCommand <= 0x04FF { // 安装参数
- obj.oamInstallApi.OamInstallQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
- byModuleId = public.BTS_MODULE_INSTALL
- } else if wCommand >= 0x0500 && wCommand <= 0x05FF { // 同步参数
- obj.oamSyncApi.OamSyncQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
- byModuleId = public.BTS_MODULE_SYNC
- } else if wCommand >= 0x0600 && wCommand <= 0x06FF { // 基站参数
- obj.oamBtsApi.OamBtsQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
- byModuleId = public.BTS_MODULE_BTS
- } else if wCommand >= 0x0700 && wCommand <= 0x07FF { // RTC参数
- obj.rtcApi.OamRtcQueryResp(btsBaseParamModel, wCommand, ltvData, wLtvLen-4)
- byModuleId = public.BTS_MODULE_RTC
- } else {
- return errors.New("监控命令错误")
- }
- //数据后移
- wCurrentLen += wLtvLen
- }
- //把数据发送至基站基本参数模块
- btsBaseParamModel.ProjectID = stHeadModel.StVpHead.ProjectID
- btsBaseParamModel.BtsID = stHeadModel.StVpHead.DeviceID
- obj.McpSendRespDataToHttp(stHeadModel, btsBaseParamModel, byModuleId, psmodel.MCP_A_QUERY)
- return nil
- }
- // MCP-A配置响应,要将查询结果反馈给页面模型
- // dataList:MCP层数据队列
- // wLen:数据队列长度
- func (obj *Mcp) McpAUlRespSet(stHeadModel *psmodel.PS_HEAD_T, dataList []byte, wLen int) error {
- btsBaseParamModel := new(bparammodel.BtsBaseParam)
- var wCurrentLen uint16 = 0
- var wLtvLen uint16 = 0
- var wCommand uint16 = 0
- ltvData := make([]byte, psmodel.PS_MCP_A_DATA_LEN)
- var byModuleId uint8 = 0
- //遍历数据队列
- for {
- if wCurrentLen >= uint16(wLen) {
- break
- }
- //组织一个ltv数据
- wLtvLen = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen : wCurrentLen+2])) //长度
- wCommand = uint16(binary.LittleEndian.Uint16(dataList[wCurrentLen+2 : wCurrentLen+4])) //命令
- copy(ltvData, dataList[wCurrentLen+4:wCurrentLen+wLtvLen]) //数据
- //根据监控命令处理
- if wCommand <= 0x00FF { // 设备信息
- byModuleId = public.BTS_MODULE_DEVICE
- } else if wCommand >= 0x0100 && wCommand <= 0x01FF { // 网管参数
- byModuleId = public.BTS_MODULE_NETWORK
- } else if wCommand >= 0x0200 && wCommand <= 0x02FF { // 上报参数
- byModuleId = public.BTS_MCP_REPORT
- } else if wCommand >= 0x0300 && wCommand <= 0x03FF { // 增益参数
- byModuleId = public.BTS_MODULE_GAIN
- if wCommand == 0x03FF { //保存参数
- btsBaseParamModel.SaveParam = ltvData[0] //保存参数结果
- }
- } else if wCommand >= 0x0400 && wCommand <= 0x04FF { // 安装参数
- byModuleId = public.BTS_MODULE_INSTALL
- } else if wCommand >= 0x0500 && wCommand <= 0x05FF { // 同步参数
- byModuleId = public.BTS_MODULE_SYNC
- } else if wCommand >= 0x0600 && wCommand <= 0x06FF { // 基站参数
- byModuleId = public.BTS_MODULE_BTS
- } else if wCommand >= 0x0700 && wCommand <= 0x07FF { // RTC参数
- byModuleId = public.BTS_MODULE_RTC
- } else {
- return errors.New("监控命令错误")
- }
- //数据后移
- wCurrentLen += wLtvLen
- }
- //把数据发送至基站基本参数模块
- btsBaseParamModel.ProjectID = stHeadModel.StVpHead.ProjectID
- btsBaseParamModel.BtsID = stHeadModel.StVpHead.DeviceID
- obj.McpSendRespDataToHttp(stHeadModel, btsBaseParamModel, byModuleId, psmodel.MCP_A_CONFIGURE)
- return nil
- }
|