123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- #include "xBeeAppEscapingMode.h"
- //需要转义的数据
- #define ESCAPING_DATA1 0x7E
- #define ESCAPING_DATA2 0x7D
- #define ESCAPING_DATA3 0x11
- #define ESCAPING_DATA4 0x13
- #define XBEE_APP2_ESCAP_LENGTH 150//数组长度
- unsigned char xA2EsArray[XBEE_APP2_ESCAP_LENGTH];//保存转义完成后的数据
- #define XBEE_APP2_MAKEFRAME_LENGTH 150//makeFrame数组长度
- unsigned char xA2MakeFrame[XBEE_APP2_MAKEFRAME_LENGTH];//makeFrame保存转义完成后的数据
- #define XBEE_APP2_UNMAKEFRAME_LENGTH 150//解析makeFrame数组长度
- unsigned char xA2UnMakeFrame[XBEE_APP2_UNMAKEFRAME_LENGTH];//保存解析makeFrame完成后的数据
- #define XBEE_APP2_REMOTE_LENGTH 150//远程命令
- unsigned char xA2RemoteCommandFrame[XBEE_APP2_REMOTE_LENGTH];//远程命令数组
- fRameFORMAT_t userSendFrame_t;//发送时候帧格式初始化
- fRAME_0x90_RECEIVE_FORMAT_t comeFromWhom0x90Frame_t;//接收0x90时候帧格式
- fRAME_0x91_RECEIVE_FORMAT_t comeFromWhom0x91Frame_t;//接收0x91时候帧格式
- fRAME_0x17_REMOTE_FORMAT_t atRemoteCommand0x17Frame_t;//远程命令帧
- void xBeeFrameFormatInit()//发送时候的帧结构初始化
- {
- userSendFrame_t.frameHead = 0x7E;//帧头
- userSendFrame_t.frameLen = 0;//数据长度Number of bytes between length and checksum fields.
- userSendFrame_t.frameType = 0x10;//帧类型,Transmit Request
- userSendFrame_t.frameID = 0x01;
- userSendFrame_t.des64DeviceAdd[0] = 0x00;//器件ID 高
- userSendFrame_t.des64DeviceAdd[1] = 0x00;//器件ID |
- userSendFrame_t.des64DeviceAdd[2] = 0x00;//器件ID |
- userSendFrame_t.des64DeviceAdd[3] = 0x00;//器件ID |
- userSendFrame_t.des64DeviceAdd[4] = 0x00;//器件ID |
- userSendFrame_t.des64DeviceAdd[5] = 0x00;//器件ID |
- userSendFrame_t.des64DeviceAdd[6] = 0xFF;//器件ID |
- userSendFrame_t.des64DeviceAdd[7] = 0xFF;//器件ID 低
- userSendFrame_t.des16NetAdd = 0xFFFE ;//网络ID
- userSendFrame_t.broadcastRadius = 0x00;//广播半径
- }
- /*******************************************************************************
- 函数名:xBeeApp2EscapingMode
- 功 能:处理数据中需要转义后发送的数据
- data bytes which need escaping: 0x7E, 0x7D, 0x11, 0x13
- 参 数:buf,原始数据数组的首地址,len数组长度
- 返回值:处理后的数组地址
- 编 写:
- 时 间:2016-01-20
- *******************************************************************************/
- void xBeeApp2EscapingMode(unsigned char* buf)//返回一个处理完成后的数组的首地址
- {
- unsigned char l = 0,xLen = 1;
- xA2EsArray[xLen++] = buf[1];
- for(l = 2; l <= buf[0]; l++)
- {
- if(buf[l] == ESCAPING_DATA1 || buf[l] == ESCAPING_DATA2 || buf[l] == ESCAPING_DATA3 || buf[l] == ESCAPING_DATA4)
- {
- xA2EsArray[xLen++] = 0x7D;
- xA2EsArray[xLen++] = buf[l]^0x20;//XOR
- }
- else
- xA2EsArray[xLen++] = buf[l];
- }
- xA2EsArray[0] = xLen - 1;//数据长度
- for(l = 0; l <= xLen; l++)
- buf[l] = xA2EsArray[l];//数据长度
- }
- /*******************************************************************************
- 函数名:xBeeApp2MakeFrame
- 功 能:
- 参 数:
- 返回值:
- 编 写:
- 时 间:2016-01-20
- *******************************************************************************/
- unsigned char* xBeeApp2MakeFrame(fRameFORMAT_t *sendFrameFormat,unsigned char* buf)//返回一个处理完成后的数组的首地址
- {
- unsigned char len = buf[0];
- unsigned char l;
- unsigned char xLen = 1;//处理后的数组长度,放在数组的第一位
- unsigned char sumCheck = 0;//校验和
- sendFrameFormat->frameLen = len + 14;//总的数据长度
- xA2MakeFrame[xLen++] = sendFrameFormat->frameHead;//帧头0x7E
- xA2MakeFrame[xLen++] = sendFrameFormat->frameLen >> 8;//数据长度高八位
- xA2MakeFrame[xLen++] = sendFrameFormat->frameLen;//数据长度低八位
- xA2MakeFrame[xLen++] = sendFrameFormat->frameType;//帧类型,Transmit Request
- sumCheck += xA2MakeFrame[xLen - 1];
- xA2MakeFrame[xLen++] = sendFrameFormat->frameID;//
- sumCheck += xA2MakeFrame[xLen - 1];
- for(l = 0; l < 8; l++) //目标器件64位地址
- {
- xA2MakeFrame[xLen++] = sendFrameFormat->des64DeviceAdd[l];
- sumCheck += xA2MakeFrame[xLen - 1];
- }
- xA2MakeFrame[xLen++] = sendFrameFormat->des16NetAdd >> 8;//16位网络ID 高八位
- sumCheck += xA2MakeFrame[xLen - 1];
- xA2MakeFrame[xLen++] = sendFrameFormat->des16NetAdd;//16位网络ID 低八位
- sumCheck += xA2MakeFrame[xLen - 1];
- xA2MakeFrame[xLen++] = sendFrameFormat->broadcastRadius;//广播半径
- sumCheck += xA2MakeFrame[xLen - 1];
- xA2MakeFrame[xLen++] = sendFrameFormat->transmitOptions;//选项
- sumCheck += xA2MakeFrame[xLen - 1];
- //RFData
- for(l = 1; l < len + 1; l++)
- {
- xA2MakeFrame[xLen++] = buf[l];
- sumCheck += xA2MakeFrame[xLen - 1];
- }
- xA2MakeFrame[xLen++] = 0xFF - sumCheck;
- xA2MakeFrame[0] = xLen - 1;
- xBeeApp2EscapingMode(xA2MakeFrame);
- return xA2MakeFrame;//返回最终数组
- }
- /*******************************************************************************
- *******************************************************************************/
- /*******************************************************************************
- *******************************************************************************/
- /*******************************************************************************
- *******************************************************************************/
- /*******************************************************************************
- 函数名:xBeeApp2UnEscaping0x90Mode
- 功 能:接收指示,接收到0x91类型帧时的解析
- 参 数:buf,原始数据数组的首地址
- 返回值:处理后的数组地址
- 编 写:
- 时 间:2016-01-20
- *******************************************************************************/
- //if(buf[0] == 7E && buf[3] == 0x90);//
- unsigned char* xBeeApp2UnEscaping0x90Mode(unsigned char* buf)//返回一个处理完成后的数组的首地址
- {
- unsigned char l = 0;
- unsigned int frameDatLen;//帧中的数据长度字段
- unsigned int datLen,datLength;//帧中包含的数据长度
- //重新定义了一个与发送端相同的结构体,用来保存发送者的帧信息 comeFromWhoFrame_t
- comeFromWhom0x90Frame_t.frameHead = buf[0];//帧头
- comeFromWhom0x90Frame_t.frameLen = buf[1];//高八位
- comeFromWhom0x90Frame_t.frameLen <<= 8;
- comeFromWhom0x90Frame_t.frameLen |= buf[2];//低八位
- comeFromWhom0x90Frame_t.frameType = buf[3];//帧类型,Transmit Request,应该是0x90
- comeFromWhom0x90Frame_t.frameID = buf[4];//协议中,frameID是64位地址的最高位,所以最高位也是buf[4]
- comeFromWhom0x90Frame_t.source64DeviceAdd[0] = buf[5];//器件ID 高
- comeFromWhom0x90Frame_t.source64DeviceAdd[1] = buf[6];//器件ID |
- comeFromWhom0x90Frame_t.source64DeviceAdd[2] = buf[7];//器件ID |
- comeFromWhom0x90Frame_t.source64DeviceAdd[3] = buf[8];//器件ID |
- comeFromWhom0x90Frame_t.source64DeviceAdd[4] = buf[9];//器件ID |
- comeFromWhom0x90Frame_t.source64DeviceAdd[5] = buf[10];//器件ID |
- comeFromWhom0x90Frame_t.source64DeviceAdd[6] = buf[11];//器件ID |
- comeFromWhom0x90Frame_t.source64DeviceAdd[7] = buf[12];//器件ID 低
- comeFromWhom0x90Frame_t.source16NetAdd = buf[13] ;//网络ID
- comeFromWhom0x90Frame_t.source16NetAdd <<= 8 ;//网络ID
- comeFromWhom0x90Frame_t.source16NetAdd |= buf[14] ;//网络ID
- comeFromWhom0x90Frame_t.receiveOptions = buf[15];//接收选项
- frameDatLen = comeFromWhom0x90Frame_t.frameLen;//帧中标识的数据长度
- datLen = frameDatLen - 12;//负载数据长度
- datLength = 0;//真实数据长度
- for(l = 1; l < datLen + 1; l++) //取出帧中的负载数据
- {
- if(buf[l + 15] == 0x7D)
- {
- l++;//指向下一个
- xA2UnMakeFrame[datLength+1] = buf[l + 15] ^ 0x20;
- datLen++;
- }
- else
- xA2UnMakeFrame[datLength+1] = buf[l + 15];
- datLength++;//真实数据长度
- }
- xA2UnMakeFrame[0] = datLength;
- return xA2UnMakeFrame;//返回处理完成后的数组
- }
- /*******************************************************************************
- 函数名:xBeeApp2UnEscaping0x91Mode
- 功 能:接收指示,接收到0x91类型帧时的解析
- 参 数:buf,原始数据数组的首地址
- 返回值:处理后的数组地址
- 编 写:
- 时 间:2016-01-20
- *******************************************************************************/
- //if(buf[0] == 7E && buf[3] == 0x91);//
- unsigned char* xBeeApp2UnEscaping0x91Mode(unsigned char* buf)//返回一个处理完成后的数组的首地址
- {
- unsigned char l = 0;
- unsigned int frameDatLen;//帧中的数据长度字段
- unsigned int datLen,datLength;//帧中包含的数据长度
- //重新定义了一个与发送端相同的结构体,用来保存发送者的帧信息 comeFromWhoFrame_t
- comeFromWhom0x91Frame_t.frameHead = buf[0];//帧头
- comeFromWhom0x91Frame_t.frameLen = buf[1];//高八位
- comeFromWhom0x91Frame_t.frameLen <<= 8;
- comeFromWhom0x91Frame_t.frameLen |= buf[2];//低八位
- comeFromWhom0x91Frame_t.frameType = buf[3];//帧类型,Transmit Request,应该是0x90
- comeFromWhom0x91Frame_t.source64DeviceAdd[0] = buf[4];//器件ID 高
- comeFromWhom0x91Frame_t.source64DeviceAdd[1] = buf[5];//器件ID |
- comeFromWhom0x91Frame_t.source64DeviceAdd[2] = buf[6];//器件ID |
- comeFromWhom0x91Frame_t.source64DeviceAdd[3] = buf[7];//器件ID |
- comeFromWhom0x91Frame_t.source64DeviceAdd[4] = buf[8];//器件ID |
- comeFromWhom0x91Frame_t.source64DeviceAdd[5] = buf[9];//器件ID |
- comeFromWhom0x91Frame_t.source64DeviceAdd[6] = buf[10];//器件ID |
- comeFromWhom0x91Frame_t.source64DeviceAdd[7] = buf[11];//器件ID 低
- comeFromWhom0x91Frame_t.source16NetAdd = buf[12] ;//网络ID
- comeFromWhom0x91Frame_t.source16NetAdd <<= 8 ;//网络ID
- comeFromWhom0x91Frame_t.source16NetAdd |= buf[13] ;//网络ID
- comeFromWhom0x91Frame_t.sourceEndpoint = buf[14] ;//Source endpoint.
- comeFromWhom0x91Frame_t.destinationEndpoint = buf[15] ;//Destination Endpoint
- comeFromWhom0x91Frame_t.clusterID = buf[16] ;//Cluster ID
- comeFromWhom0x91Frame_t.clusterID <<= 8 ;//
- comeFromWhom0x91Frame_t.clusterID |= buf[17] ;//
- comeFromWhom0x91Frame_t.proFileID = buf[18] ;//proFileID
- comeFromWhom0x91Frame_t.proFileID <<= 8;//
- comeFromWhom0x91Frame_t.proFileID = buf[19] ;//
- comeFromWhom0x91Frame_t.receiveOptions = buf[20];//接收选项
- frameDatLen = comeFromWhom0x91Frame_t.frameLen;//帧中标识的数据长度
- datLen = frameDatLen - 18;//负载数据长度
- datLength = 0;//真实数据长度
- for(l = 1; l < datLen + 1; l++) //取出帧中的负载数据
- {
- if(buf[l + 22] == 0x7D)
- {
- l++;//指向下一个
- xA2UnMakeFrame[datLength+1] = buf[l + 22] ^ 0x20;
- datLen++;
- }
- else
- xA2UnMakeFrame[datLength+1] = buf[l + 22];
- datLength++;//真实数据长度
- }
- xA2UnMakeFrame[0] = datLength;
- return xA2UnMakeFrame;//返回处理完成后的数组
- }
- /*******************************************************************************
- 函数名:xBeeApp2RemoteFrame
- 功 能:
- 参 数:
- 返回值:
- 编 写:
- 时 间:2016-01-20
- *******************************************************************************/
- unsigned char* xBeeApp2RemoteFrame(void)////远程命令付值,返回赋值后的数组
- {
- unsigned char sumCheck = 0;
- unsigned char xLen = 1;
- atRemoteCommand0x17Frame_t.frameHead = 0x7e;//帧头
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.frameHead;
- atRemoteCommand0x17Frame_t.frameLen = 0x0010;//
- xA2RemoteCommandFrame[xLen++] = (atRemoteCommand0x17Frame_t.frameLen >> 8);
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.frameLen;
- atRemoteCommand0x17Frame_t.frameType = 0x17;//帧类型
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.frameType;
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.frameID = 0x01;//帧ID
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.frameID;
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.des64DeviceAdd[0] = 0;//器件ID 高
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.des64DeviceAdd[0];
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.des64DeviceAdd[1] = 0;//器件ID |
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.des64DeviceAdd[1];
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.des64DeviceAdd[2] = 0;//器件ID |
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.des64DeviceAdd[2];
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.des64DeviceAdd[3] = 0;//器件ID |
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.des64DeviceAdd[3];
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.des64DeviceAdd[4] = 0;//器件ID |
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.des64DeviceAdd[4];
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.des64DeviceAdd[5] = 0;//器件ID |
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.des64DeviceAdd[5];
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.des64DeviceAdd[6] = 0xFF;//器件ID |
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.des64DeviceAdd[6];
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.des64DeviceAdd[7] = 0xFF;//器件ID 低
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.des64DeviceAdd[7];
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.des16NetAdd = 0xFFFE ;//网络ID
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.des16NetAdd >> 8;
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.des16NetAdd;
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.remoteCommandOptions = 0x02 ;//命令选项
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.remoteCommandOptions;
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.ATCommand = 0x4248 ;//命令
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.ATCommand >> 8;
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.ATCommand;
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- atRemoteCommand0x17Frame_t.commandParameter = 0x01 ;//命令参数
- xA2RemoteCommandFrame[xLen++] = atRemoteCommand0x17Frame_t.commandParameter;
- sumCheck += xA2RemoteCommandFrame[xLen - 1];
- sumCheck = 0xFF - sumCheck;
- xA2RemoteCommandFrame[xLen++] = sumCheck;
- xA2RemoteCommandFrame[0] = xLen - 1;
- return xA2RemoteCommandFrame;
- }
|