by schumi2000
Embed:
(wiki syntax)
Show/hide line numbers
pack_handle.cpp
00001 #include "pack_handle.h" 00002 #include "sys.h" 00003 00004 uint16_t packing(const char *str, char *buffer, int ack, uint32_t msgType,uint64_t sequence) 00005 { 00006 uint16_t len = 0; 00007 uint16_t len2 = 0; 00008 00009 memset(buffer,0x00,PACKAGE_BUFFER_SIZE); 00010 00011 //Head 00012 buffer[0]=0x1f; 00013 //version 00014 buffer[1]=0x01; 00015 //ack 00016 buffer[2]=ack; 00017 //encrypt 00018 buffer[3]=0x00; //不加密 00019 //serialId 00020 memcpy(buffer+4,devid,strlen(devid)); 00021 00022 //printf("packing devid=%s\n",devid); 00023 00024 //sequence (13位时间戳,占8个字节) 00025 reverse_u64(&sequence);//大小端转换 00026 memcpy(buffer+16,(char *)&sequence,8); 00027 00028 //消息类型 00029 reverse_u32(&msgType); //大小端转换 00030 memcpy(buffer+24,(char *)&msgType,4); 00031 00032 //CRC校验(暂时不完成) 00033 buffer[28]=0x00; 00034 buffer[29]=0x00; 00035 00036 //数据长度 00037 len = strlen(str); 00038 len2 = len; 00039 reverse_u16(&len2); 00040 00041 memcpy(buffer+30,(char *)&len2,2); 00042 00043 //数据 00044 memcpy(buffer+32,str,len); 00045 00046 //HexOutput(buffer,32+len); 00047 00048 return 32+len; 00049 } 00050 00051 int unpack(char *buffer, unsigned int bufferSize, char *data, uint8_t *ack, uint32_t *msgType, uint64_t *sequence) 00052 { 00053 uint16_t len=0; 00054 00055 if(buffer[0] ==0x1f || bufferSize <32) //判断包头是否正确 00056 { 00057 //printf("unpack devid=%s\n",devid); 00058 if(memcmp (buffer+4, devid ,strlen(devid)) == 0) //判断是否本设备。 00059 { 00060 *ack = buffer[2]; 00061 00062 memcpy((char*)sequence,buffer+16,8); 00063 reverse_u64(sequence); 00064 00065 //printf("unpack time=%lld\n",*sequence); 00066 00067 memcpy(msgType,buffer+24,4); 00068 reverse_u32(msgType); //进行大小端转换 00069 00070 printf("msg type =%u\n",*msgType); 00071 00072 memcpy((char*)&len,buffer+30,2); 00073 reverse_u16(&len); 00074 00075 memcpy(data,buffer+32,len); 00076 printf("revmsg=%s\n",data); 00077 00078 return len; 00079 } 00080 } 00081 return -1; 00082 }
Generated on Tue Aug 23 2022 22:33:31 by 1.7.2