字节指令的格式
| 字节 | 字节 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;
} } } }