by schumi2000

pack_handle.cpp

Committer:
schumi2000
Date:
2016-08-17
Revision:
0:32964091adbf

File content as of revision 0:32964091adbf:

#include "pack_handle.h"
#include "sys.h"

uint16_t packing(const char *str, char *buffer, int ack, uint32_t msgType,uint64_t sequence)
{
        uint16_t len = 0;
      uint16_t len2 = 0;
    
        memset(buffer,0x00,PACKAGE_BUFFER_SIZE);

    //Head
    buffer[0]=0x1f;
    //version
    buffer[1]=0x01;
    //ack
    buffer[2]=ack;
    //encrypt
    buffer[3]=0x00; //不加密
    //serialId
    memcpy(buffer+4,devid,strlen(devid)); 
    
        //printf("packing devid=%s\n",devid);

    //sequence (13位时间戳,占8个字节)
      reverse_u64(&sequence);//大小端转换
    memcpy(buffer+16,(char *)&sequence,8);

    //消息类型
      reverse_u32(&msgType);  //大小端转换
    memcpy(buffer+24,(char *)&msgType,4);
        
    //CRC校验(暂时不完成)
    buffer[28]=0x00;
    buffer[29]=0x00;
    
        //数据长度
        len = strlen(str);
        len2 = len;
        reverse_u16(&len2);
        
    memcpy(buffer+30,(char *)&len2,2);
    
        //数据
    memcpy(buffer+32,str,len);
        
        //HexOutput(buffer,32+len);

    return 32+len;
}

int unpack(char *buffer, unsigned int bufferSize, char *data, uint8_t *ack, uint32_t *msgType, uint64_t *sequence)
{
    uint16_t len=0;
    
    if(buffer[0] ==0x1f || bufferSize <32) //判断包头是否正确
    {
                //printf("unpack devid=%s\n",devid);
        if(memcmp (buffer+4, devid ,strlen(devid)) == 0) //判断是否本设备。
        {
            *ack = buffer[2];
                    
            memcpy((char*)sequence,buffer+16,8);   
                      reverse_u64(sequence);
                    
                        //printf("unpack time=%lld\n",*sequence);

            memcpy(msgType,buffer+24,4);
            reverse_u32(msgType); //进行大小端转换
                        
                        printf("msg type =%u\n",*msgType);
                        
            memcpy((char*)&len,buffer+30,2);
            reverse_u16(&len);
                        
            memcpy(data,buffer+32,len);             
                        printf("revmsg=%s\n",data);

            return len;
        }
    }
    return -1;
}