123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- // 协议栈下行模块模块
- // 秒寻科技
- // zt 2024-11-12
- package psdl
- import (
- "bytes"
- "encoding/binary"
- "ipsomc/module/ps/ap"
- "ipsomc/module/ps/psmodel"
- "ipsomc/module/socket/socketsend"
- )
- type PsDl struct {
- apApi ap.Ap
- socketSendApi socketsend.SocketSend
- }
- // 协议栈下行应答模块
- func (obj *PsDl) PsDlResp(stHeadModel *psmodel.PS_HEAD_T, dataList []byte) error {
- //组织数据
- projectId := stHeadModel.StVpHead.ProjectID
- btsId := stHeadModel.StVpHead.DeviceID
- byVpFlag := psmodel.VP_RESP
- byMcpType := stHeadModel.StVpHead.McpType
- byMcpCmd := stHeadModel.StMcpHead.Comd
- byMcpResp := psmodel.MCP_RESP_SUCC
- dataFrame := obj.PsDlOrganizeDlFrame(projectId, btsId, uint8(byVpFlag), byMcpType, byMcpCmd, uint8(byMcpResp), dataList)
- //AP层数据处理
- apDataFrame, wLen, err := obj.apApi.ApDl(dataFrame, len(dataFrame))
- if err != nil {
- return err
- }
- //将数据发送至socket模块
- //if err := obj.socketSendApi.SendDataToBts(projectId, btsId, apDataFrame, uint16(wLen)); err != nil {
- if err := obj.socketSendApi.SendDataToBtsTcp(projectId, btsId, apDataFrame, uint16(wLen)); err != nil {
- return err
- }
- return nil
- }
- // 组织下行数据帧
- // projectId:项目编号
- // btsId:基站编号
- // byVpFlag:VP层标识符
- // byMcpType:MCP协议类型
- // byMcpCmd:MCP命令
- // dataList:载荷
- // 返回值:AP层数据帧
- func (obj *PsDl) PsDlOrganizeDlFrame(projectId int, btsId int, byVpFlag uint8, byMcpType uint8, byMcpCmd uint8, byMcpResp uint8, dataList []byte) []byte {
- var frameData bytes.Buffer
- var wCrc uint16 = 0
- //协议头
- binary.Write(&frameData, binary.LittleEndian, uint8(psmodel.PS_AP_END_FLAG))
- //VP层
- binary.Write(&frameData, binary.LittleEndian, int32(projectId)) //项目ID
- binary.Write(&frameData, binary.LittleEndian, uint8(128)) //通信包号
- binary.Write(&frameData, binary.LittleEndian, int32(btsId)) //基站ID
- binary.Write(&frameData, binary.LittleEndian, byVpFlag) //VP层标识符
- binary.Write(&frameData, binary.LittleEndian, byMcpType) //MCP协议
- //MCP层
- binary.Write(&frameData, binary.LittleEndian, byMcpCmd) //MCP命令
- binary.Write(&frameData, binary.LittleEndian, byMcpResp) //MCP应答
- //数据
- binary.Write(&frameData, binary.LittleEndian, dataList)
- //添加CRC校验码
- tmpList := frameData.Bytes()
- wCrc = obj.apApi.ApGenCrc16(tmpList[1:], uint16(len(tmpList)-1), 0)
- binary.Write(&frameData, binary.LittleEndian, wCrc) //CRC校验码
- //协议尾
- binary.Write(&frameData, binary.LittleEndian, uint8(psmodel.PS_AP_END_FLAG))
- return frameData.Bytes()
- }
- // 把网管中心的数据发送给基站(命令)
- func (obj *PsDl) PsDlSendOamDataToBts(projectId int, btsId int, byMcpType uint8, byMcpCmd uint8, payload []byte) error {
- //生成帧
- frameData := obj.PsDlOrganizeDlFrame(projectId, btsId, psmodel.VP_CMMD, byMcpType, byMcpCmd, psmodel.MCP_CMD, payload)
- //ap层处理
- apDataFrame, wLen, err := obj.apApi.ApDl(frameData, len(frameData))
- if err != nil {
- return err
- }
- //发送数据到基站
- //if err := obj.socketSendApi.SendDataToBts(projectId, btsId, apDataFrame, uint16(wLen)); err != nil {
- if err := obj.socketSendApi.SendDataToBtsTcp(projectId, btsId, apDataFrame, uint16(wLen)); err != nil {
- return err
- }
- return nil
- }
|