Beispiel #1
0
        public int decode_package(char[] buffer, ref IoT_Package packageInfo)
        {
            int    i = 0, offset = 0;
            UInt32 sum         = 0;
            UInt16 receive_sum = 0;

            char[] str_head_len = new char[5];
            char[] str_data_len = new char[5];

            this.decode_only_header(buffer, ref packageInfo);

            //data
            offset           = packageInfo.header_length;
            packageInfo.data = new char[packageInfo.data_length];

            for (i = 0; i < packageInfo.data_length; i++)
            {
                packageInfo.data[i] = buffer[offset];
                offset++;
            }

            //checksum
            for (i = 0; i < offset; i++)
            {
                sum += (byte)buffer[i];
            }

            while ((sum >> 16) > 0)
            {
                sum = (sum & 0xFFFF) + (sum >> 16);
            }

            receive_sum  = (byte)buffer[offset];
            receive_sum  = (UInt16)(receive_sum << 8);
            receive_sum |= (byte)buffer[offset + 1];

            if (receive_sum == sum)
            {
                return(1);
            }
            else
            {
                //Console.WriteLine("Checksum Error!");
                //throw new Exception("Checksum error!");
                return(0);
            }

            //packageInfo->data[i] = '\0';
            //int a = 10;
        }
Beispiel #2
0
        public void create_package(ref IoT_Package package, string sor_ip, string des_ip, char[] data, int data_length)
        {
            int header_length = 0;

            char[] str_header_length = new char[10];
            string str_data_length;

            package.ver         = CurrentVersion;
            package.ver_length  = package.ver.Length;
            package.sor_ip.ip   = sor_ip;
            package.des_ip.ip   = des_ip;
            package.data_length = data_length;
            package.data        = data;

            header_length += package.ver_length;
            header_length++; //for split symbol
            header_length += package.sor_ip.ip.Length;
            header_length++; //for split symbol
            header_length += package.des_ip.ip.Length;
            header_length++; //for split symbol
            str_data_length = data_length.ToString();
            header_length  += str_data_length.Length;
            header_length++; //for split symbol

            if (header_length <= 8)
            {
                header_length += 1;
            }
            else if (header_length <= 97)
            {
                header_length += 2;
            }
            else
            {
                header_length += 3;
            }
            header_length++; //for split symbol
            package.header_length = header_length;
        }
Beispiel #3
0
        public recv_result getCompletedPackage(char[] buffer, ref int buffer_length, ref IoT_Package packageInfo)
        {
            if (buffer_length < CurrentVersion.Length)
            {
                return(recv_result.NOERROR);
            }
            //if the package is not valid, just drop it
            else if (!isVaildPackage(buffer, buffer_length))
            {
                //memset(buffer, '\0', *buffer_length);
                Array.Clear(buffer, 0, buffer.Length);
                buffer_length = 0;
                return(recv_result.INVALID_PACKAGE);
            }

            int  i = 0;
            bool headerCompleted = this.isCompleteHeader(buffer);

            if (headerCompleted)
            {
                //IoT_Package iot_pack = generate_iot_package();
                decode_only_header(buffer, ref packageInfo);
                int package_total_len = packageInfo.header_length + packageInfo.data_length;
                if (buffer_length >= package_total_len)
                {
                    if (decode_package(buffer, ref packageInfo) == 1)
                    {
                        int another_package_len = buffer_length - package_total_len;
                        int idx = package_total_len;
                        for (i = 0; i < another_package_len; i++)
                        {
                            buffer[i] = buffer[idx];
                            idx++;
                        }
                        for (; i < buffer_length; i++)
                        {
                            buffer[i] = '\0';
                        }
                        buffer_length = another_package_len;
                        return(recv_result.COMPLETED);
                    }
                    else
                    {
                        Array.Clear(buffer, 0, buffer_length);
                        buffer_length = 0;
                        return(recv_result.CHECKSUM_ERROR);
                    }

                    /*
                     * if (strcmp(packageInfo->data, "Ready") != 0)
                     * {
                     *  puts("In Completed:\n");
                     *  printAllChar(buffer, package_total_len);
                     *  puts("\n");
                     * }
                     */

                    /*
                     * if (*buffer_length > 0)
                     * {
                     *  puts("Left data:\n");
                     *  printAllChar(buffer, *buffer_length);
                     * }
                     */
                }
            }

            return(recv_result.NOERROR);
        }
Beispiel #4
0
        public void decode_only_header(char[] buffer, ref IoT_Package packageInfo)
        {
            const int tempBufferSize = 200;
            int       i = 0, idx = 0;

            char[] temp = new char[tempBufferSize];
            //version
            i = 0;
            //memset(temp, '\0', tempBufferSize);
            while (buffer[idx] != splitSymble)
            {
                temp[i] = buffer[idx];
                idx++;
                i++;
            }
            packageInfo.ver        = this.jsParser.getFixString(temp);
            packageInfo.ver_length = i;

            //header length
            idx++;
            i = 0;
            Array.Clear(temp, 0, tempBufferSize);
            while (buffer[idx] != splitSymble)
            {
                temp[i] = buffer[idx];
                idx++;
                i++;
            }
            packageInfo.header_length = int.Parse(this.jsParser.getFixString(temp));

            //data length
            idx++;
            i = 0;
            Array.Clear(temp, 0, tempBufferSize);
            while (buffer[idx] != splitSymble)
            {
                temp[i] = buffer[idx];
                idx++;
                i++;
            }
            packageInfo.data_length = int.Parse(this.jsParser.getFixString(temp));

            //source ip
            idx++;
            i = 0;
            Array.Clear(temp, 0, tempBufferSize);
            while (buffer[idx] != splitSymble)
            {
                temp[i] = buffer[idx];
                idx++;
                i++;
            }

            packageInfo.sor_ip.ip = this.jsParser.getFixString(temp);

            /*
             * packageInfo.sor_ip.ip = (char*)malloc(sizeof(char)*i + 1);
             * packageInfo->sor_ip.ipLength = i;
             * memcpy(packageInfo->sor_ip.ip, temp, i + 1);
             */

            //destination ip
            idx++;
            i = 0;
            Array.Clear(temp, 0, tempBufferSize);
            while (buffer[idx] != splitSymble)
            {
                temp[i] = buffer[idx];
                idx++;
                i++;
            }

            packageInfo.des_ip.ip = this.jsParser.getFixString(temp);

            /*
             * packageInfo->des_ip.ip = (char*)malloc(sizeof(char)*i + 1);
             * packageInfo->des_ip.ipLength = i;
             * memcpy(packageInfo->des_ip.ip, temp, i + 1);
             */
        }
Beispiel #5
0
        public int encode_package(char[] buffer, IoT_Package packageInfo)
        {
            int    i = 0, idx = 0;
            UInt32 sum = 0;
            string str_head_len;
            string str_data_len;

            //version
            for (i = 0; i < packageInfo.ver_length; i++)
            {
                buffer[idx] = packageInfo.ver[i];
                idx++;
            }
            buffer[idx] = splitSymble;
            idx++;

            //header length
            //sprintf(str_head_len, "%d", packageInfo.header_length);
            str_head_len = packageInfo.header_length.ToString();

            for (i = 0; i < str_head_len.Length; i++)
            {
                buffer[idx] = str_head_len[i];
                idx++;
            }
            buffer[idx] = splitSymble;
            idx++;

            //data length
            //sprintf(str_data_len, "%d", packageInfo->data_length);

            str_data_len = packageInfo.data_length.ToString();
            for (i = 0; i < str_data_len.Length; i++)
            {
                buffer[idx] = str_data_len[i];
                idx++;
            }
            buffer[idx] = splitSymble;
            idx++;

            //source ip
            IoTIp sor_ip = packageInfo.sor_ip;

            for (i = 0; i < sor_ip.ip.Length; i++)
            {
                buffer[idx] = sor_ip.ip[i];
                idx++;
            }
            buffer[idx] = splitSymble;
            idx++;

            //destination ip
            IoTIp des_ip = packageInfo.des_ip;

            for (i = 0; i < des_ip.ip.Length; i++)
            {
                buffer[idx] = des_ip.ip[i];
                idx++;
            }
            buffer[idx] = splitSymble;
            idx++;

            //buffer[idx] = splitSymble;
            //data
            for (i = 0; i < packageInfo.data_length; i++)
            {
                buffer[idx] = packageInfo.data[i];
                idx++;
            }

            //checksum
            for (i = 0; i < idx; i++)
            {
                sum += (byte)buffer[i];
            }

            while ((sum >> 16) > 0)
            {
                sum = (sum & 0xFFFF) + (sum >> 16);
            }


            byte sendByte = 0;

            sendByte    = (byte)(sum >> 8);
            buffer[idx] = (char)sendByte;
            idx++;

            sendByte    = (byte)sum;
            buffer[idx] = (char)sendByte;
            idx++;

            /*
             * UInt16 receive_sum = 0;
             * receive_sum |= (byte)buffer[idx-2];
             * receive_sum = (UInt16)(receive_sum << 8);
             * receive_sum |= (byte)buffer[idx-1];
             */
            return(idx);
        }