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); } } } } }