//TODO LIST:获取所有在线的设备列表
        private List <DeviceDTO> getOnlineCasicDev()
        {
            List <DeviceDTO> devices = new List <DeviceDTO>();

            var server = bootstrap.GetServerByName(CASIC_SERVER_NAME);

            if (server == null)
            {
                return(devices);
            }
            CasicServer casicServer = server as CasicServer;

            //    CasicSession session = casicServer.GetAllSessions() as CasicSession;
            foreach (CasicSession session in casicServer.GetAllSessions())
            {
                String sessionId = session.SessionID;
                //casic的设备一个session中,可能存在集中器,噪声、液位传感器都多种数据信息
                foreach (KeyValuePair <string, CasicSession.DeviceDTO> kvp in session.devMaps)
                {
                    String devInfo             = kvp.Key;
                    CasicSession.DeviceDTO dto = kvp.Value;
                    String devType             = dto.DevType;
                    String devID = dto.DevCode;

                    DeviceDTO devDto = new DeviceDTO();
                    devDto.SessionId  = sessionId;
                    devDto.Company    = "203所";
                    devDto.TypeName   = devType;
                    devDto.Name       = devID;
                    devDto.Tag        = dto.Detail;
                    devDto.Status     = "在线";
                    devDto.ServerName = "CasicServer";

                    devices.Add(devDto);
                }
            }


            return(devices);
        }
        /**
         * 发送203所自研设备:渗漏预警仪、液位监测仪、井盖传感器的配置信息
         * **/
        private bool sendCasicConfig(DeviceDTO dto, Dictionary <String, String> settings)
        {
            //判断设备是否已经唤醒
            //TODO LIST:获取会话信息,发送数据

            /*
             * var server0 = bootstrap.GetServerByName(CASIC_SERVER_NAME);
             * CasicServer casicServer0 = server0 as CasicServer;
             * CasicSession session0 = casicServer0.GetSessionByID(dto.SessionId) as CasicSession;
             * CasicSession.DeviceDTO dev = session0.devMaps[dto.Name];
             * if (!dev.IsWakeUp && dev.DevType!="集中器")
             * {
             *  return false;
             * }
             * */

            String[] parameters = dto.Tag.Split(',');

            //TODO: construct the receving casic data
            String preamble   = parameters[0];
            byte   btpreamble = byte.Parse(preamble, System.Globalization.NumberStyles.HexNumber);

            String version   = parameters[1];
            byte   btVersion = byte.Parse(version, System.Globalization.NumberStyles.HexNumber);

            String deviceId = parameters[3];//6个字节

            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   = parameters[4];
            byte   btRouteFlag = byte.Parse(routeFlag, System.Globalization.NumberStyles.HexNumber);

            String dstNodeAddr = parameters[5];//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 seq   = parameters[7];
            byte   btSeq = byte.Parse(seq, System.Globalization.NumberStyles.HexNumber);

            byte[] btPdu = new byte[2];; //2个字节
            byte[] tag   = null;

            switch (dto.TypeName)
            {
            case "渗漏预警仪":
                btPdu[0] = 0x03;
                btPdu[1] = 0x82;
                tag      = this.getNosieTag(settings);
                break;

            case "液位监测仪":
                btPdu[0] = 0x03;
                btPdu[1] = 0x87;
                tag      = this.getYWTag(settings);
                break;

            case "集中器":
                btPdu[0] = 0x03;
                btPdu[1] = 0x85;
                tag      = this.getHubTag(settings);
                break;

            case "温度压力监测仪":
                btPdu[0] = 0x03;
                btPdu[1] = 0x88;
                tag      = this.getTempTag(settings);
                break;

            /*
             * case "压力计":
             * btPdu[0] = 0x03;
             * btPdu[1] = 0x89;
             * tag = this.getPressTag(settings);
             * break;
             * */
            case "远传水表":
                btPdu[0] = 0x03;
                btPdu[1] = 0x8A;
                tag      = this.getWaterMeterTag(settings);
                break;

            case "井盖传感器":
                btPdu[0] = 0x03;
                btPdu[1] = 0x86;
                break;

            default:
                break;
            }

            int totalLen = 6 + 1 + 2 + 2 + 1 + tag.Length;

            byte[] btLens  = new byte[2];
            byte[] btlens0 = BitConverter.GetBytes(totalLen);
            btLens[0] = btlens0[1];
            btLens[1] = btlens0[0];

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


            //  session.Logger.Info("CRC校验前数据:" + BitConverter.ToString(result));

            //增加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);

            //TODO LIST:获取会话信息,发送数据
            var          server      = bootstrap.GetServerByName(CASIC_SERVER_NAME);
            CasicServer  casicServer = server as CasicServer;
            CasicSession session     = casicServer.GetSessionByID(dto.SessionId) as CasicSession;

            session.Logger.Info("手动下发渗漏噪声配置信息:" + BitConverter.ToString(afcrc));
            session.Send(afcrc, 0, afcrc.Length);
            return(true);
        }
        public void wakeUpCasicDev(DeviceDTO dto)
        {
            //判断当前是够已经唤醒,如果已经唤醒则不再下发配置信息
            //判断设备是否已经唤醒
            //TODO LIST:获取会话信息,发送数据
            var          server0      = bootstrap.GetServerByName(CASIC_SERVER_NAME);
            CasicServer  casicServer0 = server0 as CasicServer;
            CasicSession session0     = casicServer0.GetSessionByID(dto.SessionId) as CasicSession;

            CasicSession.DeviceDTO dev = session0.devMaps[dto.Name];
            if (dev.IsWakeUp || dev.DevType == "集中器")
            {
                return;
            }

            String[] parameters = dto.Tag.Split(',');

            //TODO: construct the receving casic data
            String preamble   = parameters[0];
            byte   btpreamble = byte.Parse(preamble, System.Globalization.NumberStyles.HexNumber);

            String version   = parameters[1];
            byte   btVersion = byte.Parse(version, System.Globalization.NumberStyles.HexNumber);

            String deviceId = parameters[3];//6个字节

            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   = parameters[4];
            byte   btRouteFlag = byte.Parse(routeFlag, System.Globalization.NumberStyles.HexNumber);

            String dstNodeAddr = parameters[5];//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 sPtuType  = parameters[6];//2个字节
            Int16  btpduType = Int16.Parse(sPtuType, System.Globalization.NumberStyles.HexNumber);
            Int16  opearType = (Int16)(btpduType & 0x7F);
            Int16  pdu       = (Int16)(2688 + opearType); //0X0A80

            byte[] btPdu0 = BitConverter.GetBytes(pdu);
            byte[] btPdu  = { btPdu0[1], btPdu0[0] };

            //  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 seq   = parameters[7];
            byte   btSeq = byte.Parse(seq, System.Globalization.NumberStyles.HexNumber);

            byte[] tag = { 0x60, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00 };

            byte[] totoalLen = { 0x00, 0x13 };

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

            //增加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);

            //TODO LIST:获取会话信息,发送数据
            var          server      = bootstrap.GetServerByName(CASIC_SERVER_NAME);
            CasicServer  casicServer = server as CasicServer;
            CasicSession session     = casicServer.GetSessionByID(dto.SessionId) as CasicSession;

            session.Logger.Info("下发唤醒信息:" + "设备编号:" + deviceId + "" + BitConverter.ToString(afcrc));
            session.Send(afcrc, 0, afcrc.Length);
        }