Newer
Older
SensorHub / SensorHub.Servers / Commands / CASICCommands / RealtimeCmd.cs
root on 17 Sep 2021 4 KB first commit
using System;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketBase.Command;
using SensorHub.Utility;

namespace SensorHub.Servers.Commands.CASICCommands
{
    public abstract class RealtimeCmd : CommandBase<CasicSession, StringRequestInfo>
    {
        protected byte[] tag { get; set; }

        public override void ExecuteCommand(CasicSession session, StringRequestInfo requestInfo)
        {
            //TODO: construct the receving realtime data
            session.Logger.Info("实时数据已接收:" + requestInfo.Body);

            String hubAddr = requestInfo.Parameters[0];
            String deviceId = requestInfo.Parameters[1];
            String control = requestInfo.Parameters[2];

            String preamble = "A3";
            byte btpreamble = byte.Parse(preamble, System.Globalization.NumberStyles.HexNumber);

            String version = "20";
            byte btVersion = byte.Parse(version, System.Globalization.NumberStyles.HexNumber);

            byte[] btDevId = new byte[6];
            btDevId[0] = byte.Parse(deviceId.Substring(0, 2), System.Globalization.NumberStyles.HexNumber);
            btDevId[1] = byte.Parse(deviceId.Substring(2, 2), System.Globalization.NumberStyles.HexNumber);
            btDevId[2] = byte.Parse(deviceId.Substring(4, 2), System.Globalization.NumberStyles.HexNumber);
            btDevId[3] = byte.Parse(deviceId.Substring(6, 2), System.Globalization.NumberStyles.HexNumber);
            btDevId[4] = byte.Parse(deviceId.Substring(8, 2), System.Globalization.NumberStyles.HexNumber);
            btDevId[5] = byte.Parse(deviceId.Substring(10, 2), System.Globalization.NumberStyles.HexNumber);

            String routeFlag = "5";
            byte btRouteFlag = byte.Parse(routeFlag, System.Globalization.NumberStyles.HexNumber);

            String dstNodeAddr = deviceId.Substring(8);//2个字节
            byte[] btDstNode = new byte[2];
            btDstNode[0] = byte.Parse(dstNodeAddr.Substring(0, 2), System.Globalization.NumberStyles.HexNumber);
            btDstNode[1] = byte.Parse(dstNodeAddr.Substring(2, 2), System.Globalization.NumberStyles.HexNumber);

            String devType = deviceId.Substring(0, 2);
            byte[] btPdu = new byte[2]; //2个字节
            switch (devType)
            {
                case "72":
                    //灯箱控制器
                    btPdu[0] = 0x01;
                    btPdu[1] = 0x91;
                    break;
                case "73":       
                case "74":
                    //单灯控制器(单路)
                    //单灯控制器(双路)
                    btPdu[0] = 0x01;
                    btPdu[1] = 0x90;
                    break;
            }

            String seq = "1";
            byte btSeq = byte.Parse(seq, System.Globalization.NumberStyles.HexNumber);

            byte btControl;
            //byte[] tag = { 0x50, 0x00, 0x00, 0x01, 0x00, 0x01 };
            btControl = byte.Parse(control, System.Globalization.NumberStyles.HexNumber);
            byte[] totoalLen = { 0x00, 0x13 };

            //wrap the whole data
            byte[] data = new byte[1 + 1 + 2 + 6 + 1 + 2 + 2 + 1 + 7];//23
            data[0] = btpreamble;
            data[1] = btVersion;
            totoalLen.CopyTo(data, 2);
            btDevId.CopyTo(data, 4);
            data[10] = btRouteFlag;
            btDstNode.CopyTo(data, 11);
            btPdu.CopyTo(data, 13);
            data[15] = btSeq;
            tag.CopyTo(data, 16);
            data[22] = btControl;
            byte[] result = data;

            //增加CRC校验
            String strCrc = StringUtil.To16HexString(String.Format("{0:X}", (int)CodeUtils.CRC16_AD(result)));
            byte[] btcrc = { CodeUtils.String2Byte(strCrc.Substring(0, 2)), CodeUtils.String2Byte(strCrc.Substring(2, 2)) };
            byte[] afcrc = new byte[result.Length + 2];
            result.CopyTo(afcrc, 0);
            btcrc.CopyTo(afcrc, result.Length);
            session.Logger.Info("路灯监测仪下发实时数据:" + "集中器编号:" + hubAddr + ",设备编号:" + deviceId + ",下发数据:" + BitConverter.ToString(afcrc));

            foreach(CasicSession cs in session.AppServer.GetAllSessions())
            {
                if (cs.HubAddr == hubAddr)
                {
                    cs.Send(afcrc, 0, afcrc.Length);
                }                  
            } 
        }
    }
}