字节指令的解析

字节指令的格式

字节

字节 1

字节 2

字节 3

字节 4

字节 5

含义

7F

指令长度

指令码

数据位

校验和

各字节定义如下:

字节 1 :指令首字节 始终为 7FH

字节 2 :指令长度

字节 3 :指令码

字节 4 :校验和

字节 5 :校验码,为前面的第 2 3 字节的算术和的低 8 位,即算术和对 256 取模后的结果;

字节 5= (字节 2+ 字节 3+ 字节 4 %256

字节

字节 1

字节 2

字节 3

10 字节数组

字节 7

含义

7F

01

指令码

时间数据

校验和

各字节定义如下:

字节 1 :指令首字节 始终为 7FH

字节 2 :指令长度

字节 3 :指令码

10 字节数组:日期数据

字节 7 :校验码,为前面的第 2 3 字节的算术和的低 8 位,即算术和对 256 取模后的结果;

字节 5= (字节 2+ 字节 3+10 字节数组) %256

字节

字节 1

字节 2

字节 3

20 字节数组

字节 7

含义

7F

01

指令码

重命名数据

重设密码

校验和

各字节定义如下:

字节 1 :指令首字节 始终为 7FH

字节 2 :指令长度

字节 3 :指令码

20 字节数组: wifi 名字或密码

字节 7 :校验码,为前面的第 2 3 字节的算术和的低 8 位,即算术和对 256 取模后的结果;

字节 5= (字节 2+ 字节 3+20 字节数组) %256

解析

void CClientConnect::ParseByteData(UChar *pBuf, UInt iLen)
{
    for(int i = 0;i < iLen;i++)
    {
        if(0x7F == pBuf[i])
        {
            if(iLen > 1)
            {
                m_iDataLen = pBuf[i+1];
            }
            m_iRemaLen   = iLen-i;
            if(m_iRemaLen < m_iDataLen || m_iRemaLen == 1)
            {
                memcpy(m_pCmdControlBuf,&pBuf[i],m_iRemaLen);
                m_pCmdControlBuf[m_iRemaLen] = 0;
                break;
            }
            UChar *pData = NULL;
            pData = new UChar[m_iDataLen];
            memcpy(pData,&pBuf[i],m_iDataLen);
            if(CheckCode(pData,m_iDataLen))  //检验校验和
            {
                ParseCmdData(pData);         //解析指令
                memset(pData,0,m_iDataLen);
            }
            if(pData)
            {
                delete pData;
                pData = NULL;
            }
            i += (m_iDataLen-1);
            m_iRemaLen = 0;
            m_iDataLen = 0;
            continue;
        }else    //拼接上次接收不完整的指令
        {
            if(m_iRemaLen == 1)
            {
                m_iDataLen = pBuf[0];
            }
            m_pCmdControlBuf[m_iRemaLen] = pBuf[i];
            m_iRemaLen++;
            if(0x7F == m_pCmdControlBuf[0] && CheckCode(m_pCmdControlBuf,m_iDataLen))
            {
                UChar *pData = NULL;
                pData = new UChar[m_iDataLen];
                memcpy(pData,m_pCmdControlBuf,m_iDataLen);
 
                ParseCmdData(pData);
                memset(m_pCmdControlBuf,0,PRO_LEN);
 
                if(pData)
                {
                    delete pData;
                    pData = NULL;
                }
            }
            if(m_iRemaLen == m_iDataLen)
            {
                memset(m_pCmdControlBuf,0,PRO_LEN);
                m_iRemaLen = 0;
                m_iDataLen = 0;
            }
 
        }
    }
}
 







版权声明:本文为panchunliang420原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。