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