예제 #1
0
        public void Test_Sending_Multiple_Data_02()
        {
            InitialiseCRCProvider();
            var tool = new UsePackageToolExample();
            var msg  = GetLongMessage(0);

            var n    = msg.Length / 3;
            var msg1 = new byte[n];
            var msg2 = new byte[n];
            var msg3 = new byte[msg.Length - msg1.Length - msg2.Length];

            Buffer.BlockCopy(msg, 0, msg1, 0, msg1.Length);
            Buffer.BlockCopy(msg, msg1.Length, msg2, 0, msg2.Length);
            Buffer.BlockCopy(msg, msg1.Length + msg2.Length, msg3, 0, msg3.Length);

            tool.Run(msg);
            tool.Results.Count.Should().Be(1);

            tool.Run(msg1);
            tool.Results.Count.Should().Be(1);

            tool.Run(msg2);
            tool.Results.Count.Should().Be(1);

            tool.Run(msg3);
            tool.TrueCount.Should().Be(2);
            tool.TrueAtLastast.Should().BeTrue();
            tool.Results.Count.Should().Be(2);
        }
예제 #2
0
        public void Test_Sending_Multiple_Data_09()
        {
            InitialiseCRCProvider();
            var tool = new UsePackageToolExample();
            var msg1 = new byte[] { 0xAA, 0xEE, 0x04, 0x00 }; //头部是正确的
            var msg2 = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x64, 0x89 };
            var msg3 = new byte[] { 0xCC };

            tool.Run(msg1);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg2);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg3);
            tool.TrueCount.Should().Be(1);
            tool.TrueAtLastast.Should().BeTrue();
            tool.Results.Count.Should().Be(1);
            tool.Results[0].Item1.Should().Be(0xEE);
            tool.Results[0].Item2.Count.Should().Be(4);
            for (int i = 0; i < tool.Results[0].Item2.Count; i++)
            {
                tool.Results[0].Item2[i].Should().Be((byte)(i + 1));
            }
        }
예제 #3
0
        public void Test_Impurities_InTheFrontAndBack_2()
        {
            InitialiseCRCProvider();
            var tool = new UsePackageToolExample();

            var msg1 = new byte[] { 0xAA }; //只有起始字符
            var msg2 = new byte[] { 0xEE, 0x04, 0x00, 0x01, 0x02 };
            var msg3 = new byte[] { 0x03, 0x04, 0x64, 0x89, 0xCC };

            tool.Run(Guid.NewGuid().ToByteArray());//杂质
            tool.Results.Count.Should().Be(0);

            tool.Run(msg1);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg2);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg3);
            tool.Results.Count.Should().Be(1);
            tool.TrueCount.Should().Be(1);
            tool.TrueAtLastast.Should().BeTrue();

            tool.Run(Guid.NewGuid().ToByteArray());//杂质
            tool.Results.Count.Should().Be(1);
            tool.Results[0].Item1.Should().Be(0xEE);
            tool.Results[0].Item2.Count.Should().Be(4);
            for (int i = 0; i < tool.Results[0].Item2.Count; i++)
            {
                tool.Results[0].Item2[i].Should().Be((byte)(i + 1));
            }
        }
        public void Test_01()
        {
            InitialiseCRCProvider();
            var tool  = new UsePackageToolExample();
            var msg01 = new byte[] { 0xFF, 0xAA };
            var msg02 = new byte[] { 0xEE };
            var msg03 = new byte[] { 0x04 };
            var msg04 = new byte[] { 0x00 };
            var msg05 = new byte[] { 0x01 };
            var msg06 = new byte[] { 0x02 };
            var msg07 = new byte[] { 0x03 };
            var msg08 = new byte[] { 0x04 };
            var msg09 = new byte[] { 0x64 };
            var msg10 = new byte[] { 0x89 };
            var msg11 = new byte[] { 0xCC, 0xBB };

            tool.Run(msg01);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg02);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg03);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg04);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg05);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg06);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg07);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg08);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg09);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg10);
            tool.Results.Count.Should().Be(0);

            tool.Run(msg11);
            tool.Results.Count.Should().Be(1);

            tool.TrueCount.Should().Be(1);
            tool.TrueAtLastast.Should().BeTrue();
            tool.Results[0].Item1.Should().Be(0xEE);
            tool.Results[0].Item2.Count.Should().Be(4);
            for (int i = 0; i < tool.Results[0].Item2.Count; i++)
            {
                tool.Results[0].Item2[i].Should().Be((byte)(i + 1));
            }
        }
        public void Test_Full_06()
        {
            var msg = new byte[]
            {
                0xAA,
                0xFE,       //命令字
                0x02, 0x00, //数据域长度
                0x88, 0x89, //数据域
                0x97, 0xDB, //CRC
                0xCC,
                //
                0xAA,
                0xCD,       //命令字
                0x02, 0x00, //数据域长度
                0x77, 0x78, //数据域
                0x13, 0xAB, //CRC
                0xCC
            };

            var tool = new UsePackageToolExample();

            tool.Run(msg);
            tool.Results.Count.Should().Be(2);

            var result0 = tool.Results[0];

            result0.Item1.Should().Be(0xFE);
            var pk1 = result0.Item2;

            pk1.Count.Should().Be(2);
            pk1[0].Should().Be(0x88);
            pk1[1].Should().Be(0x89);

            var result1 = tool.Results[1];

            result1.Item1.Should().Be(0xCD);
            var pk2 = result1.Item2;

            pk2.Count.Should().Be(2);
            pk2[0].Should().Be(0x77);
            pk2[1].Should().Be(0x78);
        }
예제 #6
0
        public void Test_Multithreading_01()
        {
            InitialiseCRCProvider();
            const int COUNT = 100;
            var       tool  = new UsePackageToolExample();

            for (int i = 0; i < COUNT; i++)
            {
                var msg = GetAnIndexInTheDataFieldForMessage(i);
                tool.Run(msg);
                Thread.Sleep(_Random.Next(3, 8));
            }

            tool.Results.Count.Should().Be(COUNT);
            for (int i = 0; i < COUNT; i++)
            {
                var n = BitConverter.ToInt32(tool.Results[i].Item2);
                n.Should().Be(i);
            }
        }
        //https://www.cnblogs.com/myzony/p/10897895.html

        /*
         *  FE FE FE FE 68 10 44 33 22 11 00 33 78 81 16 1F 90 00 00 77 66 55 2C 00 77 66 55 2C 31 01 22 11 05 15 20 21 84 08 16
         *  说明如下:
         *      FE FE FE FE >--->协议头(1-4组)。
         *      68 >------------>帧起始符。
         *      10 >------------>仪表类型。
         *      44 33 22 11 00 >>倒序为0011223344(以BCD码形式看待),表示表号。
         *      33 78 >--------->倒序为7833 (以BCD码形式看待),表示厂家代码。
         *      81 >------------>实际为控制码+80,我们可以简单认为只有81正确,非81均为异常,不进行解析。
         *      16 >------------>数据域长度,为十进制22,表示后面有22个有效数据。
         *      1F 90 >--------->数据标识 (固定)。
         *      00 >------------>序列号(固定)。
         *      00 77 66 55 >--->倒序为556677.00 (以BCD码形式看待),表示 累计用量。
         *      2C >------------>立方米,其它单位见附1。
         *      00 77 66 55 >--->倒序为556677.00 (以BCD码形式看待),表示 本月用量。
         *      2C >------------>立方米,其它单位见附1。
         *      31 01 22 11 05 15 20:2015-05-11 22:01:31,表示实时时间。
         *      21 84 >--------->状态,两字节,第1字节定义如下,第2字节由厂家自定义。
         *      68:累加和,68+10+44+33+22+11+00+33+78+81+16+1F+90+00+00+77+66+55+2C+00+77+66+55+2C+31+01+22+11+05+15+20+21+84=08
         *      16;结束符。
         */

        private static UsePackageToolExample GetTool()
        {
            var upte = new UsePackageToolExample();

            //下面是比较复杂的情况。在可能的出现的情况下最完整的协议。
            upte.FieldConfig = new FieldConfig(
                new byte[] { 0xFE, 0xEE, 0xFE, 0xEE, 0x68 }, //起始符
                new byte[] { 0x16 },                         //结尾符
                CRCProviderMode.CRC32,
                Endianness.BigEndian,
                1024 * 8,
                (0, 5),  //起始符
                (5, 1),  //属性
                (6, 7),  //地址
                (13, 1), //命令字
                (14, 1), //数据长度
                1,       //CRC
                1        //结尾符//CRC
                );
            return(upte);
        }
        private static UsePackageToolExample GetTool()
        {
            var upte = new UsePackageToolExample();

            //下面是比较复杂的情况。在可能的出现的情况下最完整的协议。
            upte.FieldConfig = new FieldConfig(
                new byte[] { 0xFE, 0xEE, 0xFE, 0xEE }, //起始符
                new byte[] { 0xCC, 0xDD },             //结尾符
                CRCProviderMode.CRC32,
                Endianness.BigEndian,
                1024 * 8,
                (0, 4),  //起始符
                (4, 2),  //属性
                (6, 2),  //地址
                (8, 2),  //命令字
                (10, 4), //数据长度
                4,       //CRC
                2        //结尾符//CRC
                );
            return(upte);
        }