예제 #1
0
        private bool IsValid(byte[] buff)
        {
            if (buff == null || buff.Length <= InfoSize)
            {
                ErrorCode = (int)Errors.ERR_INVALID_DATA;
                ErrorMsg  = string.Format("Invalid msg: null or too short: {0}", buff != null ? buff.Length : 0);
                Log.Debug(ErrorMsg + ":" + ValueHelper.BytesToHexStr(buff));
                return(false);
            }
            if (buff[0] != ByteHead || buff[buff.Length - 1] != ByteTail)
            {
                ErrorCode = (int)Errors.ERR_INVALID_DATA;
                ErrorMsg  = string.Format("Invalid TranMsg format: HEAD/TAIL error: len={0}, H={1},T={2}", buff.Length,
                                          buff[0], buff[buff.Length - 1]);
                Log.DebugFormat(ErrorMsg);
                return(false);
            }
            byte crc8 = ValueHelper.CheckCRC8(buff, 0, buff.Length - 3);

            if (crc8 != buff[buff.Length - 2])
            {
                ErrorCode = (int)Errors.ERR_INVALID_DATA;
                ErrorMsg  = string.Format("CRC Error: {0}!={1}", crc8, buff[buff.Length - 2]);
                Log.DebugFormat(ErrorMsg);
                return(false);
            }
            ErrorCode = (int)Errors.SUCCESS;
            return(true);
        }
예제 #2
0
        private const int IDX_FRAMEL    = 31; // 去:0xCF,回:0xDF

        /// <summary>
        /// 编码: PC -> Sensor
        /// </summary>
        /// <param name="sensor"></param>
        /// <returns></returns>
        public void Request(ref SensorAcqResult sensorAcq)
        {
            try
            {
                if (sensorAcq.Sensor.ModuleNo > ushort.MaxValue)
                {
                    sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE;
                    sensorAcq.Request   = null;
                    return;
                }
                byte[] buff = new byte[32];
                buff[IDX_FrameH]  = 0xFC;
                buff[IDX_DevType] = 0x01;
                ValueHelper.WriteUShort_BE(buff, IDX_DevId, (ushort)sensorAcq.Sensor.ModuleNo);
                buff[IDX_ORDER]     = 0x01;
                buff[IDX_CRC8]      = ValueHelper.CheckCRC8(buff, 1, 29);
                buff[IDX_FRAMEL]    = 0xCF;
                sensorAcq.ErrorCode = (int)Errors.SUCCESS;
                sensorAcq.Request   = buff;
            }
            catch
            {
                sensorAcq.Request   = null;
                sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW;
            }
        }
예제 #3
0
 public int IsValid(byte[] data)
 {
     if (data == null || data.Length != 32)
     {
         return((int)Errors.ERR_INVALID_DATA);
     }
     if (@data[IDX_FrameH] != 0xFD || @data[IDX_DevType] != 0x01 || @data[IDX_FRAMEL] != 0xDF)
     {
         return((int)Errors.ERR_INVALID_DATA);
     }
     if (data[IDX_CRC8] == ValueHelper.CheckCRC8(data, 1, 29))
     {
         return((int)Errors.SUCCESS);
     }
     return((int)Errors.ERR_CRC);
 }
예제 #4
0
        public byte[] Marshall()
        {
            int size = Data.Length + InfoSize;

            byte[] buff = new byte[size];
            buff[0] = ByteHead;
            buff[1] = ID;
            buff[2] = (byte)Type;
            buff[3] = PackageIndex;
            buff[4] = PackageCount;
            ValueHelper.WriteShort(buff, 5, (short)LoadSize); // 5,6
            buff[7] = 0xFF;
            Array.Copy(Data, 0, buff, LoadOffset, Data.Length);
            // XOR
            buff[size - 2] = ValueHelper.CheckCRC8(buff, 0, size - 3);
            buff[size - 1] = ByteTail;
            return(buff);
        }
예제 #5
0
        public void TestParseTempHumidityResponse()
        {
            DbAccessorHelper.Init(new MsDbAccessor(connstr)); // 配置
            TempHumiditySensorAdapter ci = new TempHumiditySensorAdapter();
            string bs = "FD0100230000";                       //0-5

            bs += "01";                                       // 命令号 6=01
            bs += "000055";                                   // Hum: 7-9: 01 H L  = 85
            bs += "41CC0000";                                 // Temp 10-13,float, = 25.5
            bs += "000000000000000000000000000000005EDF";
            byte[] buff = ValueHelper.ToBytes(bs);
            byte   crc  = ValueHelper.CheckCRC8(buff, 1, 29);

            buff[30] = crc;
            SensorAcqResult r = new SensorAcqResult
            {
                Response = buff,
                Sensor   = new Sensor()
                {
                    ModuleNo    = 35,
                    ChannelNo   = 1,
                    TableColums = "Humidity,Temperature"
                }
            };

            ci.ParseResult(ref r);
            var data = r.Data;

            Assert.IsNotNull(data);

            Assert.AreEqual(25.50, data.RawValues[0]);
            Assert.AreEqual(0.85, data.RawValues[1]);
            bs         = "Fc0100230000"; //0-5
            bs        += "01";           // 命令号 6=01
            bs        += "000055";       // Hum: 7-9: 01 H L  = 85
            bs        += "41CC0000";     // Temp 10-13,float, = 25.5
            bs        += "000000000000000000000000000000005EDF";
            buff       = ValueHelper.ToBytes(bs);
            crc        = ValueHelper.CheckCRC8(buff, 1, 29);
            buff[30]   = crc;
            r.Response = buff;
            ci.ParseResult(ref r);
            Assert.AreEqual((int)Errors.ERR_INVALID_DATA, r.ErrorCode);
        }