by schumi2000
pack_handle.cpp@0:32964091adbf, 2016-08-17 (annotated)
- Committer:
- schumi2000
- Date:
- Wed Aug 17 06:28:57 2016 +0000
- Revision:
- 0:32964091adbf
by schumi2000
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
schumi2000 | 0:32964091adbf | 1 | #include "pack_handle.h" |
schumi2000 | 0:32964091adbf | 2 | #include "sys.h" |
schumi2000 | 0:32964091adbf | 3 | |
schumi2000 | 0:32964091adbf | 4 | uint16_t packing(const char *str, char *buffer, int ack, uint32_t msgType,uint64_t sequence) |
schumi2000 | 0:32964091adbf | 5 | { |
schumi2000 | 0:32964091adbf | 6 | uint16_t len = 0; |
schumi2000 | 0:32964091adbf | 7 | uint16_t len2 = 0; |
schumi2000 | 0:32964091adbf | 8 | |
schumi2000 | 0:32964091adbf | 9 | memset(buffer,0x00,PACKAGE_BUFFER_SIZE); |
schumi2000 | 0:32964091adbf | 10 | |
schumi2000 | 0:32964091adbf | 11 | //Head |
schumi2000 | 0:32964091adbf | 12 | buffer[0]=0x1f; |
schumi2000 | 0:32964091adbf | 13 | //version |
schumi2000 | 0:32964091adbf | 14 | buffer[1]=0x01; |
schumi2000 | 0:32964091adbf | 15 | //ack |
schumi2000 | 0:32964091adbf | 16 | buffer[2]=ack; |
schumi2000 | 0:32964091adbf | 17 | //encrypt |
schumi2000 | 0:32964091adbf | 18 | buffer[3]=0x00; //不加密 |
schumi2000 | 0:32964091adbf | 19 | //serialId |
schumi2000 | 0:32964091adbf | 20 | memcpy(buffer+4,devid,strlen(devid)); |
schumi2000 | 0:32964091adbf | 21 | |
schumi2000 | 0:32964091adbf | 22 | //printf("packing devid=%s\n",devid); |
schumi2000 | 0:32964091adbf | 23 | |
schumi2000 | 0:32964091adbf | 24 | //sequence (13位时间戳,占8个字节) |
schumi2000 | 0:32964091adbf | 25 | reverse_u64(&sequence);//大小端转换 |
schumi2000 | 0:32964091adbf | 26 | memcpy(buffer+16,(char *)&sequence,8); |
schumi2000 | 0:32964091adbf | 27 | |
schumi2000 | 0:32964091adbf | 28 | //消息类型 |
schumi2000 | 0:32964091adbf | 29 | reverse_u32(&msgType); //大小端转换 |
schumi2000 | 0:32964091adbf | 30 | memcpy(buffer+24,(char *)&msgType,4); |
schumi2000 | 0:32964091adbf | 31 | |
schumi2000 | 0:32964091adbf | 32 | //CRC校验(暂时不完成) |
schumi2000 | 0:32964091adbf | 33 | buffer[28]=0x00; |
schumi2000 | 0:32964091adbf | 34 | buffer[29]=0x00; |
schumi2000 | 0:32964091adbf | 35 | |
schumi2000 | 0:32964091adbf | 36 | //数据长度 |
schumi2000 | 0:32964091adbf | 37 | len = strlen(str); |
schumi2000 | 0:32964091adbf | 38 | len2 = len; |
schumi2000 | 0:32964091adbf | 39 | reverse_u16(&len2); |
schumi2000 | 0:32964091adbf | 40 | |
schumi2000 | 0:32964091adbf | 41 | memcpy(buffer+30,(char *)&len2,2); |
schumi2000 | 0:32964091adbf | 42 | |
schumi2000 | 0:32964091adbf | 43 | //数据 |
schumi2000 | 0:32964091adbf | 44 | memcpy(buffer+32,str,len); |
schumi2000 | 0:32964091adbf | 45 | |
schumi2000 | 0:32964091adbf | 46 | //HexOutput(buffer,32+len); |
schumi2000 | 0:32964091adbf | 47 | |
schumi2000 | 0:32964091adbf | 48 | return 32+len; |
schumi2000 | 0:32964091adbf | 49 | } |
schumi2000 | 0:32964091adbf | 50 | |
schumi2000 | 0:32964091adbf | 51 | int unpack(char *buffer, unsigned int bufferSize, char *data, uint8_t *ack, uint32_t *msgType, uint64_t *sequence) |
schumi2000 | 0:32964091adbf | 52 | { |
schumi2000 | 0:32964091adbf | 53 | uint16_t len=0; |
schumi2000 | 0:32964091adbf | 54 | |
schumi2000 | 0:32964091adbf | 55 | if(buffer[0] ==0x1f || bufferSize <32) //判断包头是否正确 |
schumi2000 | 0:32964091adbf | 56 | { |
schumi2000 | 0:32964091adbf | 57 | //printf("unpack devid=%s\n",devid); |
schumi2000 | 0:32964091adbf | 58 | if(memcmp (buffer+4, devid ,strlen(devid)) == 0) //判断是否本设备。 |
schumi2000 | 0:32964091adbf | 59 | { |
schumi2000 | 0:32964091adbf | 60 | *ack = buffer[2]; |
schumi2000 | 0:32964091adbf | 61 | |
schumi2000 | 0:32964091adbf | 62 | memcpy((char*)sequence,buffer+16,8); |
schumi2000 | 0:32964091adbf | 63 | reverse_u64(sequence); |
schumi2000 | 0:32964091adbf | 64 | |
schumi2000 | 0:32964091adbf | 65 | //printf("unpack time=%lld\n",*sequence); |
schumi2000 | 0:32964091adbf | 66 | |
schumi2000 | 0:32964091adbf | 67 | memcpy(msgType,buffer+24,4); |
schumi2000 | 0:32964091adbf | 68 | reverse_u32(msgType); //进行大小端转换 |
schumi2000 | 0:32964091adbf | 69 | |
schumi2000 | 0:32964091adbf | 70 | printf("msg type =%u\n",*msgType); |
schumi2000 | 0:32964091adbf | 71 | |
schumi2000 | 0:32964091adbf | 72 | memcpy((char*)&len,buffer+30,2); |
schumi2000 | 0:32964091adbf | 73 | reverse_u16(&len); |
schumi2000 | 0:32964091adbf | 74 | |
schumi2000 | 0:32964091adbf | 75 | memcpy(data,buffer+32,len); |
schumi2000 | 0:32964091adbf | 76 | printf("revmsg=%s\n",data); |
schumi2000 | 0:32964091adbf | 77 | |
schumi2000 | 0:32964091adbf | 78 | return len; |
schumi2000 | 0:32964091adbf | 79 | } |
schumi2000 | 0:32964091adbf | 80 | } |
schumi2000 | 0:32964091adbf | 81 | return -1; |
schumi2000 | 0:32964091adbf | 82 | } |