123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- package psul
- import (
- "encoding/binary"
- "errors"
- "fmt"
- "ipsomc/core/dao/redis/redisapi"
- "ipsomc/module/oam"
- "ipsomc/module/ps/ap"
- "ipsomc/module/ps/mcp"
- "ipsomc/module/ps/mcpb"
- "ipsomc/module/ps/psdl"
- "ipsomc/module/ps/psmodel"
- "ipsomc/module/socket/socketmodel"
- "ipsomc/util"
- "net"
- )
- type PsUl struct {
- psDlApi psdl.PsDl
- apApi ap.Ap
- mcpApi mcp.Mcp
- mcpbApi mcpb.McpB
- oamReportApi oam.OamReport
- }
- func (obj *PsUl) PsUl(udpAddress *net.UDPAddr, dataList []byte, dataListLen int) error {
- var dwLen int = dataListLen
- var wStopIndex = 0
- var redisObj redisapi.RedisApi
- var clientAddr socketmodel.ClientAddr
-
- pstHeadModel, pstTailModel, err := obj.apApi.ApUl(dataList, &dwLen)
- if err != nil {
- return err
- }
-
- myViper := util.GetViper()
- expireTime := myViper.GetInt("token.pc_expire")
- if expireTime <= 0 {
- expireTime = 10
- }
-
- redisKey := fmt.Sprintf("%08X", int(pstHeadModel.StVpHead.ProjectID)) + "-" + fmt.Sprintf("%08X", int(pstHeadModel.StVpHead.DeviceID))
- ip := udpAddress.IP
- clientAddr.IP = append(clientAddr.IP, ip[0])
- clientAddr.IP = append(clientAddr.IP, ip[1])
- clientAddr.IP = append(clientAddr.IP, ip[2])
- clientAddr.IP = append(clientAddr.IP, ip[3])
- clientAddr.Port = udpAddress.Port
- clientAddr.Zone = udpAddress.Zone
- redisObj.SetModelData(redisKey, &clientAddr, uint16(expireTime))
-
- wStopIndex = dwLen - 3
- if err := obj.VpUl(pstHeadModel, pstTailModel, dataList[14:wStopIndex], dwLen-psmodel.PS_FRAME_MIN_LEN); err != nil {
- return err
- }
- return nil
- }
- func (obj *PsUl) PsUlTcp(clientAddress string, dataList []byte, dataListLen int) error {
- var dwLen int = dataListLen
- var wStopIndex = 0
- var redisObj redisapi.RedisApi
- var clientAddr socketmodel.ClientAddr
-
- pstHeadModel, pstTailModel, err := obj.apApi.ApUl(dataList, &dwLen)
- if err != nil {
- return err
- }
-
- myViper := util.GetViper()
- expireTime := myViper.GetInt("token.pc_expire")
- if expireTime <= 0 {
- expireTime = 10
- }
-
- redisKey := fmt.Sprintf("%08X", int(pstHeadModel.StVpHead.ProjectID)) + "-" + fmt.Sprintf("%08X", int(pstHeadModel.StVpHead.DeviceID))
- clientAddr.Address = clientAddress
- redisObj.SetModelData(redisKey, &clientAddr, uint16(expireTime))
-
- wStopIndex = dwLen - 3
- if err := obj.VpUl(pstHeadModel, pstTailModel, dataList[14:wStopIndex], dwLen-psmodel.PS_FRAME_MIN_LEN); err != nil {
- return err
- }
- return nil
- }
- func (obj *PsUl) VpUl(stHeadModel *psmodel.PS_HEAD_T, stTailModel *psmodel.PS_TAIL_T, dataList []byte, dwLen int) error {
- vpModel := &stHeadModel.StVpHead
-
- if vpModel.McpType == psmodel.MCP_A {
- switch vpModel.VpFlag {
- case psmodel.VP_CMMD:
- if err := obj.McpUlCmdA(stHeadModel, stTailModel, dataList, dwLen); err != nil {
- return err
- }
- case psmodel.VP_RESP:
- obj.McpUlRespA(stHeadModel, dataList, dwLen)
- default:
- return errors.New("VP层格式错误")
- }
- } else if vpModel.McpType == psmodel.MCP_B {
- if vpModel.VpFlag == psmodel.VP_RESP {
- obj.mcpbApi.McpUlRespB(stHeadModel, dataList, dwLen)
- }
- } else {
- return errors.New("MCP层格式错误")
- }
- return nil
- }
- func (obj *PsUl) McpUlCmdA(stHeadModel *psmodel.PS_HEAD_T, stTailModel *psmodel.PS_TAIL_T, dataList []byte, wLen int) error {
- var wCurrentLen uint16 = 0
- var wLtvLen uint16 = 0
- var wCommand uint16 = 0
- ltvData := make([]byte, psmodel.PS_MCP_A_DATA_LEN)
- var byRespFlag uint8 = 0
-
- for {
- if wCurrentLen >= uint16(wLen) {
- break
- }
-
- 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 >= 0x0201 && wCommand <= 0x02FF {
- obj.oamReportApi.OamReportCmd(stHeadModel, wCommand, ltvData, wLtvLen-4)
- byRespFlag = 1
- }
-
- wCurrentLen += wLtvLen
- }
-
- if byRespFlag == 1 {
- if err := obj.psDlApi.PsDlResp(stHeadModel, dataList); err != nil {
- return err
- }
- }
- return nil
- }
- func (obj *PsUl) McpUlRespA(stHeadModel *psmodel.PS_HEAD_T, dataList []byte, dwLen int) error {
- mcpModel := stHeadModel.StMcpHead
-
- if mcpModel.Resp != psmodel.MCP_RESP_SUCC {
- return errors.New("响应消息失败")
- }
-
- switch mcpModel.Comd {
- case psmodel.MCP_A_REPORT:
- case psmodel.MCP_A_QUERY:
- obj.mcpApi.McpAUlRespQuery(stHeadModel, dataList, dwLen)
- case psmodel.MCP_A_CONFIGURE:
- obj.mcpApi.McpAUlRespSet(stHeadModel, dataList, dwLen)
- default:
- return errors.New("MCP命令类型错误")
- }
- return nil
- }
|