资源描述
Zigbee 协议栈学习之串口透明传输实验(SerialApp)流程分析 第一个功能:协调器的组网,终端设备和路由设备发现网络以及加入网络/第一步:Z-Stack 由 main()函数开始执行,main()函数共做了 2 件事:一是系统初始化,另外一件是开始执行轮转查询式操作系统 int main(void)./Initialize the operating system osal_init_system();/第二步,操作系统初始化.osal_start_system();/初始化完系统任务事件后,正式开始执行操作系统 ./第二步,进入 osal_init_system()函数,执行操作系统初始化 uint8 osal_init_system(void)/初始化操作系统,其中最重要的是,初始化操作系统的任务 /Initialize the Memory Allocation System osal_mem_init();/Initialize the message queue osal_qHead=NULL;/Initialize the timers osalTimerInit();/Initialize the Power Management System osal_pwrmgr_init();/Initialize the system tasks.osalInitTasks();/第三步,执行操作系统任务初始化函数 /Setup efficient search for the first free block of heap.osal_mem_kick();return(SUCCESS);/第三步,进入 osalInitTasks()函数,执行操作系统任务初始化 void osalInitTasks(void)/第三步,初始化操作系统任务 uint8 taskID=0;tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16)*tasksCnt);osal_memset(tasksEvents,0,(sizeof(uint16)*tasksCnt);/任务优先级由高向低依次排列,高优先级对应 taskID 的值反而小 macTaskInit(taskID+);/不需要用户考虑 nwk_init(taskID+);/不需要用户考虑 Hal_Init(taskID+);/硬件抽象层初始化,需要我们考虑#if defined(MT_TASK)MT_TaskInit(taskID+);#endif APS_Init(taskID+);/不需要用户考虑#if defined(ZIGBEE_FRAGMENTATION)APSF_Init(taskID+);#endif ZDApp_Init(taskID+);/第四步,ZDApp 层,初始化 ,执行 ZDApp_init 函数后,如果是协调器将建立网络,如果是终端设备将加入网络。#if defined(ZIGBEE_FREQ_AGILITY)|defined(ZIGBEE_PANID_CONFLICT)ZDNwkMgr_Init(taskID+);#endif SerialApp_Init(taskID);/应用层 SerialApp 层初始化,需要用户考虑 在此处设置了一个按键触发事件,/当有按键按下的时候,产生一个系统消息 /第四步,进入 ZDApp_init()函数,执行 ZDApp 层初始化/The first step void ZDApp_Init(uint8 task_id)/The first step,ZDApp 层初始化。/Save the task ID ZDAppTaskID=task_id;/Initialize the ZDO global device short address storage ZDAppNwkAddr.addrMode=Addr16Bit;ZDAppNwkAddr.addr.shortAddr=INVALID_NODE_ADDR;(void)NLME_GetExtAddr();/Load the saveExtAddr pointer./Check for manual Hold Auto Start ZDAppCheckForHoldKey();/Initialize ZDO items and setup the device-type of device to create.ZDO_Init();/Register the endpoint description with the AF /This task doesnt have a Simple description,but we still need /to register the endpoint.afRegister(endPointDesc_t*)&ZDApp_epDesc);#if defined(ZDO_USERDESC_RESPONSE)ZDApp_InitUserDesc();#endif/ZDO_USERDESC_RESPONSE /Start the device?if(devState!=DEV_HOLD)/devState 初值为 DEV_INIT,所以在初始化 ZDA 层时,就执行该条件语句 ZDOInitDevice(0);/The second step,接着转到 ZDOInitDevice()函数,执行 The third step;else /Blink LED to indicate HOLD_START HalLedBlink(HAL_LED_4,0,50,500);ZDApp_RegisterCBs();/*ZDApp_Init()*/The third step,执行 ZDOInitDevice()函数,执行设备初始化 uint8 ZDOInitDevice(uint16 startDelay)/The third step,ZDO 层初始化设备,./Trigger the network start ZDApp_NetworkInit(extendedDelay);/网络初始化,跳到相应的函数里头,执行 The fourth step ./The fouth step,执行 ZDApp_NetWorkInit()函数 void ZDApp_NetworkInit(uint16 delay)/The fourth step,网络初始化 if(delay)/Wait awhile before starting the device osal_start_timerEx(ZDAppTaskID,ZDO_NETWORK_INIT,delay);/发 送 ZDO_NETWORK_INIT(网络初始化)消息到 ZDApp 层,转到 /ZDApp 层,执行 The fifth step ,ZDApp_event_loop()函数 else osal_set_event(ZDAppTaskID,ZDO_NETWORK_INIT);/The fifth step,转到 ZDApp_event_loop()函数 UINT16 ZDApp_event_loop(uint8 task_id,UINT16 events)if(events&ZDO_NETWORK_INIT)/The fivth step,网络初始化事件处理 /Initialize apps and start the network devState=DEV_INIT;/设备逻辑类型,启动模式,信标时间,超帧长度,接着转到 The sixth step,去启动设备,接着执行 The sixth step,转到 ZDO_StartDevice()ZDO_StartDevice(uint8)ZDO_Config_Node_Descriptor.LogicalType,devStartMode,DEFAULT_BEACON_ORDER,DEFAULT_SUPERFRAME_ORDER);/Return unprocessed events return(events ZDO_NETWORK_INIT);/The sixth step,执行 ZDO_StartDevice()函数,启动设备 void ZDO_StartDevice(byte logicalType,devStartModes_t startMode,byte beaconOrder,byte superframeOrder)/The sixth step .if(ZG_BUILD_COORDINATOR_TYPE&logicalType=NODETYPE_COORDINATOR)/当设备作为协调器时,执行这个条件语句。if(startMode=MODE_HARD)devState=DEV_COORD_STARTING;/向网络层发送网络形成请求。当网络层执行 NLME_NetworkFormationRequest()建立网络后,将给予 ZDO 层反馈信息。/接着转到 The seventh step,去执行 ZDApp 层的 ZDO_NetworkFormationConfirmCB()函数 ret=NLME_NetworkFormationRequest(zgConfigPANID,zgApsUseExtendedPANID,zgDefaultChannelList,zgDefaultStartingScanDuration,beaconOrder,superframeOrder,false);if(ZG_BUILD_JOINING_TYPE&(logicalType=NODETYPE_ROUTER|logicalType=NODETYPE_DEVICE)/当为终端设备或路由时 if(startMode=MODE_JOIN)|(startMode=MODE_REJOIN)devState=DEV_NWK_DISC;/zgDefaultChannelList 与协调器形成网络的通道号匹配。网络发现请求。/继而转到 ZDO_NetworkDiscoveryConfirmCB()函数 ret=NLME_NetworkDiscoveryRequest(zgDefaultChannelList,zgDefaultStartingScanDuration);./The seventh step,分两种情况,1.协调器 2.路由器或终端设备 1)协调器 void ZDO_NetworkFormationConfirmCB(ZStatus_t Status)/The seventh step,给予 ZDO 层网络形成反馈信息(协调器)osal_set_event(ZDAppTaskID,ZDO_NETWORK_START);/发送网络启动事件 到 ZDApp 层,接着转到ZDApp_event_loop()函数 .UINT16 ZDApp_event_loop(uint8 task_id,UINT16 events).if(events&ZDO_NETWORK_START)/网络启动事件 ZDApp_NetworkStartEvt();/网络启动事件,接着跳转到 The ninth step,执行 ZDApp_NetworkStartEvt()函数 .void ZDApp_NetworkStartEvt(void)/处理网络启动事件 .osal_pwrmgr_device(PWRMGR_ALWAYS_ON);/电源总是上电 osal_set_event(ZDAppTaskID,ZDO_STATE_CHANGE_EVT);/设置网络状态改变事件,发送到 ZDApp 层,转到 The tenth step,去 ./ZDApp_event_loop()函数,找到相对应的网络改变事件。2)路由器或终端设备/The seventh step(终端设备),当发现有网络存在时,网络层将给予 ZDO 层发现网络反馈信息 ZStatus_t ZDO_NetworkDiscoveryConfirmCB(uint8 ResultCount,networkDesc_t*NetworkList)./把网络发现这个反馈消息,发送到 ZDA 层,转到 ZDApp_ProcessOSALMsg(),执行 ZDApp_SendMsg(ZDAppTaskID,ZDO_NWK_DISC_CNF,sizeof(ZDO_NetworkDiscoveryCfm_t),(uint8*)&msg);void ZDApp_ProcessOSALMsg(osal_event_hdr_t*msgPtr).case ZDO_NWK_DISC_CNF:/(终端设备),网络发现响应。./当发现有网络存在时,网络层将给予 ZDO 层发现网络反馈信息。然后由网络层发起加入网络请求,/如加入网络成功,则网络层将给予 ZDO 层加入网络反馈,执行 NLME_JoinRequest()函数。然后转到 /The ninth step,执行 ZDO_JoinConfirmCB()函数 if(NLME_JoinRequest(ZDO_NetworkDiscoveryCfm_t*)msgPtr)-extendedPANID,BUILD_UINT16(ZDO_NetworkDiscoveryCfm_t*)msgPtr)-panIdLSB,(ZDO_NetworkDiscoveryCfm_t*)msgPtr)-panIdMSB),(ZDO_NetworkDiscoveryCfm_t*)msgPtr)-logicalChannel,ZDO_Config_Node_Descriptor.CapabilityFlags)!=ZSuccess)ZDApp_NetworkInit(uint16)(NWK_START_DELAY +(uint16)(osal_rand()&EXTENDED_JOINING_RANDOM_MASK);.void ZDO_JoinConfirmCB(uint16 PanId,ZStatus_t Status)/The ninth step(终端设备),终端设备加入网络响应。./将 ZDO_NWK_JOIN_IND 事件发送到 ZDA 层,执行 ZDApp_ProcessOSALMsg()函数。ZDApp_SendMsg(ZDAppTaskID,ZDO_NWK_JOIN_IND,sizeof(osal_event_hdr_t),(byte*)NULL);void ZDApp_ProcessOSALMsg(osal_event_hdr_t*msgPtr).case ZDO_NWK_JOIN_IND:/终端设备,加入网络反馈信息事件。if(ZG_BUILD_JOINING_TYPE&ZG_DEVICE_JOINING_TYPE)ZDApp_ProcessNetworkJoin();/转到 ZDApp_ProcessNetworkJoin(),执行 ZDApp_ProcessNetworkJoin()函数。break;.在执行 ZDApp_ProcessNetworkJoin()函数的时候,要分两种情况,一种是终端设备,一种是路由器:3)终端设备:void ZDApp_ProcessNetworkJoin(void)/处理网络加入事件。.if(nwkStatus=ZSuccess)/设置 ZDO_STATE_CHANGE_EVT,发送到 ZDA 层,执行 ZDApp_event_loop()函数。osal_set_event(ZDAppTaskID,ZDO_STATE_CHANGE_EVT);.4)路由器:void ZDApp_ProcessNetworkJoin(void).if(ZSTACK_ROUTER_BUILD)/NOTE:first two parameters are not used,see NLMEDE.h for details if(ZDO_Config_Node_Descriptor.LogicalType!=NODETYPE_DEVICE)NLME_StartRouterRequest(0,0,false);/路由启动请求 .void ZDO_StartRouterConfirmCB(ZStatus_t Status)nwkStatus=(byte)Status;.osal_set_event(ZDAppTaskID,ZDO_ROUTER_START);UINT16 ZDApp_event_loop(uint8 task_id,UINT16 events)if(events&ZDO_ROUTER_START)if(nwkStatus=ZSuccess)if(devState=DEV_END_DEVICE)devState=DEV_ROUTER;/设备状态变成路由器 osal_pwrmgr_device(PWRMGR_ALWAYS_ON);else /remain as end device!osal_set_event(ZDAppTaskID,ZDO_STATE_CHANGE_EVT);/设置 ZDO 状态改变事件 /Return unprocessed events return(events ZDO_ROUTER_START);/The eighth step,执行 ZDO 状态改变事件 UINT16 ZDApp_event_loop(uint8 task_id,UINT16 events).if(events&ZDO_STATE_CHANGE_EVT)/The eighth step,网络改变事件,这个事件就是在设备加入网络成功后,/并在网络中的身份确定后产生的一个事件 ZDO_UpdateNwkStatus(devState);/更新网络状态,转到 The eleventh step,执行 ZDO_UpdateNwkStatus()函数。./The ninth step,执行 ZDO_UpdateNwkStatus()函数,完成网络状态更新 void ZDO_UpdateNwkStatus(devStates_t state)/The ninth step,更新网络状态 .zdoSendStateChangeMsg(state,*(pItem-epDesc-task_id);/发送状态改变消息到 zdo 层,这是 The tenth step,转到 /zdoSendStateChangeMsg()函数.ZDAppNwkAddr.addr.shortAddr=NLME_GetShortAddr();/调用 NLME_GetShortAddr()函数,获得 16 位短地址。(void)NLME_GetExtAddr();/Load the saveExtAddr pointer./获得 64 位的 IEEE 地址。/The tenth step,执行 zdoSendStateChangeMsg()函数 static void zdoSendStateChangeMsg(uint8 state,uint8 taskId)/The tenth step,osal_event_hdr_t*pMsg=(osal_event_hdr_t*)osal_msg_find(taskId,ZDO_STATE_CHANGE);if(NULL=pMsg)if(NULL=(pMsg=(osal_event_hdr_t*)osal_msg_allocate(sizeof(osal_event_hdr_t)/Upon failure to notify any EndPoint of the state change,re-set the ZDO event to /try again later when more Heap may be available.osal_set_event(ZDAppTaskID,ZDO_STATE_CHANGE_EVT);/如果 ZDO 状态没有任何改变,再一次,跳到 /ZDO_STATE_CHANGE_EVT 事件处理函数。else pMsg-event=ZDO_STATE_CHANGE;/如果 ZDO 状态改变了 了,把 ZDO_STATE_CHANGE 这个消息保存到 pMsg pMsg-status=state;(void)osal_msg_send(taskId,(uint8*)pMsg);/转到 MT_TASK.C,去执行 The eleven step,MT_ProcessIncomingCommand()函数 ./The eleventh step,去执行 MT_ProcessIncomingCommand()函数 void MT_ProcessIncomingCommand(mtOSALSerialData_t*msg).case ZDO_STATE_CHANGE:/The thirteenth step,接着跳到 MT_ZdoStateChangeCB()函数。/自此,协调器组网形成(终端设备成功加入网络)MT_ZdoStateChangeCB(osal_event_hdr_t*)msg);break;./第五步,/初始化玩系统任务事件后,正是开始执行操作系统,此时操作系统不断的检测有没有任务事件发生,一旦检测到有事件发生,就转/到相应的处理函数,进行处理。void osal_start_system(void)/第五步,正式执行操作系统#if!defined(ZBIT)&!defined(UBIT)for(;)/Forever Loop /死循环#endif uint8 idx=0;osalTimeUpdate();Hal_ProcessPoll();/This replaces MT_SerialPoll()and osal_check_timer().do if(tasksEventsidx)/Task is highest priority that is ready.break;/得到待处理的最高优先级任务索引号 idx while(+idx tasksCnt);if(idx state,(keyChange_t*)MSGpkt)-keys);/接着跳到相应的按键处理函数去执行 break;.ZDO 终端设备绑定请求:设备能告诉协调器他们想建立绑定表格报告。该协调器将使协调并在这两个设备上创建绑定表格条目。在这里是以 SerialApp 例子为例。void SerialApp_HandleKeys(uint8 shift,uint8 keys).if(keys&HAL_KEY_SW_2)/Joystick right HalLedSet(HAL_LED_4,HAL_LED_MODE_OFF);/终端设备绑定请求 /Initiate an End Device Bind Request for the mandatory endpoint dstAddr.addrMode=Addr16Bit;dstAddr.addr.shortAddr=0 x0000;/Coordinator 地址 ZDP_EndDeviceBindReq(&dstAddr,NLME_GetShortAddr(),/终端设备绑定请求 SerialApp_epDesc.endPoint,SERIALAPP_PROFID,SERIALAPP_MAX_CLUSTERS,(cId_t*)SerialApp_ClusterList,SERIALAPP_MAX_CLUSTERS,(cId_t*)SerialApp_ClusterList,FALSE);.if(keys&HAL_KEY_SW_4)HalLedSet(HAL_LED_4,HAL_LED_MODE_OFF);/Initiate a Match Description Request(Service Discovery)dstAddr.addrMode=AddrBroadcast;/广播地址 dstAddr.addr.shortAddr=NWK_BROADCAST_SHORTADDR;ZDP_MatchDescReq(&dstAddr,NWK_BROADCAST_SHORTADDR,/描述符匹配请求 这也是两不同匹配方式,使用的按键不同 SERIALAPP_PROFID,SERIALAPP_MAX_CLUSTERS,(cId_t*)SerialApp_ClusterList,SERIALAPP_MAX_CLUSTERS,(cId_t*)SerialApp_ClusterList,FALSE);说明:从上面可以看到,SW2 是发送终端设备绑定请求方式,SW4 是发送描述符匹配请求方式。如果按下 SW2 的话,使用终端设备绑定请求方式,这里是要通过终端告诉协调器他们想要建立绑定表格,协调器将协调这两个请求的设备,在两个设备上建立绑定表格条目。(1)终端设备向协调器发送终端设备绑定请求 调用 ZDP_EndDeviceBindReq()函数发送绑定请求。ZDP_EndDeviceBindReq(&dstAddr,/目的地址设为 0 x0000;NLME_GetShortAddr(),SerialApp_epDesc.endPoint,/EP 号 SERIALAPP_PROFID,/Profile ID SERIALAPP_MAX_CLUSTERS,/输入簇的数目 (cId_t*)SerialApp_ClusterList,/输入簇列表 SERIALAPP_MAX_CLUSTERS,/输出簇数目 (cId_t*)SerialApp_ClusterList,/输出簇列表 FALSE);该函数实际调用无线发送函数将绑定请求发送给协调器节点:默认 clusterID 为 End_Device_Bind_req,最后通过 AF_DataRequest()发送出去.fillAndSend(&ZDP_TransID,dstAddr,End_Device_Bind_req,len);最后通过 AF_DataRequest()发送出去,这里的&afAddr,是目的地址;&ZDApp_epDesc,是端口号;clusterID,是簇号;len+1,是数据的长度;/ZDP_TmpBuf-1,是数据的内容;transSeq,是数据的顺序号;ZDP_TxOptions,是发射的一个选项;AF_DEFAULT_RADIUS,是一个默认的半径(跳数)。AF_DataRequest(&afAddr,&ZDApp_epDesc,clusterID,(uint16)(len+1),(uint8*)(ZDP_TmpBuf-1),transSeq,ZDP_TxOptions,AF_DEFAULT_RADIUS);(2)协调器收到终端设备绑定请求 End_Device_Bind_req 这个信息会传送到 ZDO 层,在 ZDO 层的事件处理函数中,调用 ZDApp_ProcessOSALMsg(osal_event_hdr_t*)msg_ptr);UINT16 ZDApp_event_loop(byte task_id,UINT16 events)uint8*msg_ptr;if(events&SYS_EVENT_MSG)while(msg_ptr=osal_msg_receive(ZDAppTaskID)ZDApp_ProcessOSALMsg(osal_event_hdr_t*)msg_ptr);/Release the memory osal_msg_deallocate(msg_ptr);/Return unprocessed events return(events SYS_EVENT_MSG);void ZDApp_ProcessOSALMsg(osal_event_hdr_t*msgPtr)/Data Confirmation message fields byte sentEP;/This should always be 0 byte sentStatus;afDataConfirm_t*afDataConfirm;switch(msgPtr-event)/Incoming ZDO Message case AF_INCOMING_MSG_CMD:ZDP_IncomingData(afIncomingMSGPacket_t*)msgPtr);break;在 ZDP_IncomingData(afIncomingMSGPacket_t*)msgPtr);函数中 void ZDP_IncomingData(afIncomingMSGPacket_t*pData)uint8 x=0;uint8 handled;zdoIncomingMsg_t inMsg;/解析 clusterID 这个消息 inMsg.srcAddr.addrMode=Addr16Bit;inMsg.srcAddr.addr.shortAddr=pData-srcAddr.addr.shortAddr;inMsg.wasBroadcast=pData-wasBroadcast;inMsg.clusterID=pData-clusterId;/这个 clusterID,在这里指的是,终端设备发送过来的 End_Device_Bind_req 这个消息 inMsg.SecurityUse=pData-SecurityUse;inMsg.asduLen=pData-cmd.DataLength-1;inMsg.asdu=pData-cmd.Data+1;inMsg.TransSeq=pData-cmd.Data0;handled=ZDO_SendMsgCBs(&inMsg);#if defined(MT_ZDO_FUNC)MT_ZdoRsp(&inMsg);#endif while(zdpMsgProcsx.clusterID!=0 xFFFF)if(zdpMsgProcsx.clusterID=inMsg.clusterID)/在 zdpMsgProcs中,查找,看看有没有跟 End_Device_Bind_req 相匹配的描述符。zdpMsgProcsx.pFn(&inMsg);return;x+;/Handle unhandled messages if(!handled)ZDApp_InMsgCB(&inMsg);因 为 ZDO 信息处理表 zdpMsgProcs 没有对应的 End_Device_Bind_req 簇,因此没有调用 ZDO 信息处理表中的处理函数,但是前面的ZDO_SendMsgCBs()会把这 个终端设备绑定请求发送到登记过这个 ZDO 信息的任务中去。那这个登记注册的程序在哪里呢?对于协调器来说,由于在 void ZDApp_Init(byte task_id)函数中调用了 ZDApp_RegisterCBs();面的函数。进行注册了终端绑定请求信息。void ZDApp_RegisterCBs(void)#if defined(ZDO_IEEEADDR_REQUEST)|defined(REFLECTOR)ZDO_RegisterForZDOMsg(ZDAppTaskID,IEEE_addr_rsp);#endif#if defined(ZDO_NWKADDR_REQUEST)|defined(REFLECTOR)ZDO_RegisterForZDOMsg(ZDAppTaskID,NWK_addr_rsp);#endif#if defined(ZDO_COORDINATOR)ZDO_RegisterForZDOMsg(ZDAppTaskID,Bind_rsp);ZDO_RegisterForZDOMsg(ZDAppTaskID,Unbind_rsp);ZDO_RegisterForZDOMsg(ZDAppTaskID,End_Device_Bind_req);#endif#if defined(REFLECTOR)ZDO_RegisterForZDOMsg(ZDAppTaskID,Bind_req);ZDO_RegisterForZDOMsg(ZDAppTaskID,Unbind_req);#endif 因此,协调器节点的 ZDApp 接收到外界输入的数据后,由于注册了 ZDO 反馈消息,即 ZDO_CB_MSG,ZDApp 层任务事件处理函数将进行处理:也就是调用下面的程序。UINT16 ZDApp_event_loop(byte task_id,UINT16 events)uint8*msg_ptr;if(events&SYS_EVENT_MSG)while(msg_ptr=osal_msg_receive(ZDAppTaskID)ZDApp_ProcessOSALMsg(osal_event_hdr_t*)msg_ptr);/Release the memory osal_msg_deallocate(msg_ptr);/Return unprocessed events return(events SYS_EVENT_MSG);在这里调用函数 ZDApp_ProcessOSALMsg(osal_event_hdr_t*)msg_ptr);在这个函数中我们可以看到对 ZDO_CB_MSG 事件的处理 void ZDApp_ProcessOSALMsg(osal_event_hdr_t*msgPtr)/Data Confirmation message fields byte sentEP;/This should always be 0 byte sentStatus;afDataConfirm_t*afDataConfirm;switch(msgPtr-event)/Incoming ZDO Message case AF_INCOMING_MSG_CMD:ZDP_IncomingData(afIncomingMSGPacket_t*)msgPtr);break;case ZDO_CB_MSG:ZDApp_ProcessMsgCBs(zdoIncomingMsg_t*)msgPtr);break;调用 ZDApp_ProcessMsgCBs()函数。在这个函数中根据 ClusterID(这里是 End_Device_Bind_req)选择相对应的匹配描述符处理函数,void ZDApp_ProcessMsgCBs(zdoIncomingMsg_t*inMsg).case End_Device_Bind_req:ZDEndDeviceBind_t bindReq;ZDO_ParseEndDeviceBindReq(inMsg,&bindReq);/解析绑定请求信息 ZDO_MatchEndDeviceBind(&bindReq);/然后向发送绑定请求的节点发送绑定响应消息:/Freeing the cluster lists-if allocated.if(bindReq.numInClusters)osal_mem_free(bindReq.inClusters);if(bindReq.numOutClusters)osal_mem_free(bindReq.outClusters);break;#endif 下面是 ZDO_MatchEndDeviceBind()函数的源代码 void ZDO_MatchEndDeviceBind(ZDEndDeviceBind_t*bindReq)zAddrType_t dstAddr;uint8 sendRsp=FALSE;uint8 status;/Is
展开阅读全文