| 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;
 
- }
 
 
  |