SimpleApp和GenericApp实例绑定程序流程.docx
- 文档编号:18182491
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:22
- 大小:27.25KB
SimpleApp和GenericApp实例绑定程序流程.docx
《SimpleApp和GenericApp实例绑定程序流程.docx》由会员分享,可在线阅读,更多相关《SimpleApp和GenericApp实例绑定程序流程.docx(22页珍藏版)》请在冰豆网上搜索。
SimpleApp和GenericApp实例绑定程序流程
SimpleApp和GenericApp实例绑定程序流程
(2011-03-1110:
41:
34)
转载▼
标签:
杂谈
使用的协议栈版本及例子信息:
ZigBee2006\ZStack-1.4.3-1.2.1个人注释版_5.24\Projects\zstack\Samples\SimpleApp\CC2430DB
ZigBee2006\ZStack-1.4.3-1.2.1个人注释版_5.24\Projects\zstack\Samples\GenericApp\CC2430DB
记录下个人对这两个例程绑定的理解:
两个例程:
SimpleApp和GenericApp,其中SimpleApp分两个实验:
灯开关实验,温度传感器实验
建立一个绑定表格有3种方式:
(1)ZDO绑定请求:
一个试运转的工具能告诉这个设备制作一个绑定报告
(2)ZDO终端设备绑定请求:
设备能告诉协调器他们想建立绑定表格报告。
该协调器将使协调并在这两个设备上创建绑定表格条目。
(3)设备应用:
在设备上的应用能建立或管理一个绑定表格。
SimpleApp例程默认使用方法1,GenericApp可以使用方法1或2.
-------------------------------------
灯开关实验:
Switch.c
switch开关设备:
作为终端节点
按K1则作为终端启动;设备类型确定后再按K1则发送绑定请求命令
按K2则作为终端启动;设备类型确定后再按K2则发送灯toggle命令
按K3,删除所有绑定
Controller.c
controller灯设备:
作为协调器或路由器
按K1则作为协调器启动;设备类型确定后再按K1则初始化设备允许绑定模式
按K2则作为路由器启动;
-------------------------------------
温度传感器实验
Sensor.c
sensor传感器设备:
作为终端节点
按K1则作为终端启动;
按K2则作为终端启动;
Collector.c 作为协调器或路由器
Collector中心收集设备:
按K1作为协调器启动;设备类型确定后再按K1则初始化设备允许绑定模式
按K2作为路由器启动;设备类型确定后再按K2则禁止允许绑定模式
-------------------------------------
GenericApp实验:
设备按K2发送终端设备绑定请求(这个说法待定)
设备按K4发送描述符匹配请求
*********************************************************************************************************************
*********************************************************************************************************************
*********************************************************************************************************************
1、灯开关实验绑定流程
1.1、按键处理函数
Controller管理器(灯)设备,其zb_HandleKeys()按键处理函数:
if(myAppState==APP_INIT )
{
…………
logicalType=ZG_DEVICETYPE_COORDINATOR;//协调器
…………
}
else
{
//Initiateabinding
zb_AllowBind(myAllowBindTimeout); //默认为10S,myAllowBindTimeout=10
}
}
//--------------------------
if(keys&HAL_KEY_SW_2)
{
…………
logicalType=ZG_DEVICETYPE_ROUTER; //路由器
…………
}
//--------------------------
…………
}
}
osal_start_timerEx(sapi_TaskID,MY_REPORT_TEMP_EVT,myTempReportPeriod);
}
if(event&MY_REPORT_BATT_EVT) //电池电量报告
{
//Readbatteryvalue
//Ifbatterylevellow,reportbatteryvalue
pData[0]=BATTERY_REPORT; //0x02(用来指示这是电池能量数据)
pData[1]= myApp_ReadBattery();
zb_SendDataRequest(0xFFFE,SENSOR_REPORT_CMD_ID,2,pData,0,AF_ACK_REQUEST,0);
osal_start_timerEx(sapi_TaskID,MY_REPORT_BATT_EVT,myBatteryCheckPeriod);
}
if(event&MY_FIND_COLLECTOR_EVT)
{
//Findandbindtoacollectordevice
zb_BindDevice(TRUE,SENSOR_REPORT_CMD_ID,(uint8*)NULL);
}
}
************************************
可以看到最终调用zb_BindDevice(TRUE,SENSOR_REPORT_CMD_ID,(uint8*)NULL),是未知扩展地址的绑定,故接下来的流程参见<协议栈simpleApp例程中两种绑定机制>这篇记录.
流程:
当传感器设备和中心收集设备逻辑类型确定,网络建立完成后,collector中心收集设备按K1进入允许绑定模式.sensor传感器设备自动发送绑定请求(默认未知扩展地址的绑定).
2.3、关于sensor传感器设备进入zb_StartConfirm()的流程.
事实上这部分个人还是很模糊,好多细节不理解,大概记录下.
看下SAPI_Init()函数:
************************************
voidSAPI_Init(bytetask_id)
{
uint8startOptions;
sapi_TaskID=task_id;
sapi_bindInProgress=0xffff; //不允许绑定过程
sapi_epDesc.endPoint=zb_SimpleDesc.EndPoint; //0x02
sapi_epDesc.task_id=&sapi_TaskID;
sapi_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&zb_SimpleDesc;
sapi_epDesc.latencyReq=noLatencyReqs;
//Registertheendpoint/interfacedescriptionwiththeAF注册终端
afRegister(&sapi_epDesc);
//Turnoffmatchdescriptorresponsebydefault
afSetMatch(sapi_epDesc.simpleDesc->EndPoint,FALSE); //关闭匹配描述符响应
//RegistercallbackevetnsfromtheZDApp //从ZDApp登记返回事件
ZDO_RegisterForZDOMsg(sapi_TaskID,NWK_addr_rsp);
ZDO_RegisterForZDOMsg(sapi_TaskID,Match_Desc_rsp);
#if(definedHAL_KEY)&&(HAL_KEY==TRUE)
//RegisterforHALevents
RegisterForKeys(sapi_TaskID); //登记按键事件
if(HalKeyRead()==HAL_KEY_SW_1)
{
//IfSW5ispressedandheldwhilepowerup,forceauto-startandnv-restoreoffandreset
startOptions=ZCD_STARTOPT_CLEAR_STATE|ZCD_STARTOPT_CLEAR_CONFIG; //复位启动状态和配置
//ZCD_NV_STARTUP_OPTION作为默认启动项配置,存到&startOptions中
//ZCD_NV_STARTUP_OPTION在按键时便赋值为ZCD_STARTOPT_AUTO_START
//这里关系到对事件ZB_ENTRY_EVENT的处理,顺利的话就发送一个启动协议栈请求
zb_WriteConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
zb_SystemReset(); //复位系统(更新启动项配置后,重启设备)
}
#endif //HAL_KEY
#ifdefLCD_SUPPORTED
Print8(HAL_LCD_LINE_2,20,"Simple",1);
#endif
//Setaneventtostarttheapplication
osal_set_event(task_id,ZB_ENTRY_EVENT); //设置事件,启动应用
}
************************************
SAPI_Init()中初始化startOptions为:
startOptions=ZCD_STARTOPT_CLEAR_STATE|ZCD_STARTOPT_CLEAR_CONFIG;//复位启动状态和配置
然后通过zb_WriteConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions)把ZCD_NV_STARTUP_OPTION赋给startOptions,而ZCD_NV_STARTUP_OPTION在按键处理函数中都被赋值为ZCD_STARTOPT_AUTO_START.因此这里startOptions最终为ZCD_STARTOPT_AUTO_START.
SAPI_Init()最后有句:
osal_set_event(task_id,ZB_ENTRY_EVENT);
来看SAPI_ProcessEvent()对ZB_ENTRY_EVENT事件的处理:
************************************
SAPI_ProcessEvent()
{
if(events&ZB_ENTRY_EVENT) //0x1000
{
uint8startOptions;
//Giveindicationtoapplicationofdevicestartup
zb_HandleOsalEvent(ZB_ENTRY_EVENT);
//LEDoffcancelsHOLD_AUTO_STARTblinksetinthestack
HalLedSet(HAL_LED_4,HAL_LED_MODE_OFF);
//读配置
zb_ReadConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
if(startOptions&ZCD_STARTOPT_AUTO_START) //自动启动
{
zb_StartRequest(); //发送协议栈启动请求
}
else
{
//blinkledsandwaitforexternalinputtoconfigandrestart
//等待外部输入来配置和重启
HalLedBlink(HAL_LED_2,0,50,500);
#ifdefinedSENSOR //如果是传感器设备
logicalType=ZG_DEVICETYPE_ENDDEVICE;
zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);
//Domoreconfigurationifnecessaryandthenrestartdevicewithauto-startbitset
zb_ReadConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
startOptions=ZCD_STARTOPT_AUTO_START;
zb_WriteConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
zb_SystemReset();
#endif
}
//-------------------(本小段更新于2010.6.03)
//Thismustbethelasteventtobeprocessed
//应用事件events:
//而ZB_USER_EVENTS=0x00FF;以上应用事件和ZB_USER_EVENTS相与都不为0,因此这些
//应用事件事实上都是通过ZB_USER_EVENTS进入zb_HandleOsalEvent()进行处理的!
if(events&(ZB_USER_EVENTS))
{
//Usereventsarepassedtotheapplication
zb_HandleOsalEvent(events);
//Donotreturnhere,return0later
}
//-------------------
}
************************************
一、MY_FIND_COLLECTOR_EVT事件是在哪里联系到ZB_ENTRY_EVENT事件,从而通过ZB_ENTRY_EVENT事件调用zb_HandleOsalEvent()进行处理?
?
?
(不是通过ZB_ENTRY_EVENT,因为ZB_ENTRY_EVENT=0x1000;MY_FIND_COLLECTOR_EVT=0x0008,两者相与为0不会执行这里if内的程序,而是通过下面的ZB_USER_EVENTS=0x00FF,和MY_FIND_COLLECTOR_EVT相与不为0再执行zb_HandleOsalEvent().事实上本例所有用户应用事件都是通过ZB_USER_EVENTS被处理的!
)
二、其实我在zb_HandleOsalEvent()并没看到事件ZB_ENTRY_EVENT,位运算也不对,这里怎么回事?
?
?
(估计就是没什么处理,不同类型节点的zb_HandleOsalEvent定义是不同的,simpleApp例子有些类型节点对这个函数也没有定义,个人觉得主要还是根据用户实际情况进行添加.比如开启后就开始触发一些事件等…)
三、如果startOptions为ZCD_STARTOPT_AUTO_START,则调用zb_StartRequest(),则必然会有个zb_StartConfirm().在每种类型设备的按键函数中都可以找到:
startOptions=ZCD_STARTOPT_AUTO_START;也就是通过外部按键来改变了startOptions.当然这里还有一种情况,如上面函数中#ifdefinedSENSOR,下面也有startOptions=ZCD_STARTOPT_AUTO_START;也就是说如果传感器设备迟迟没有按键按下来确定设备类型重启,这里将自动完成配置,事实上传感器节点无论按K1/2都作为终端启动.
设备的每次重启zb_SystemReset(),都将进行全部初始化,包括SAPI_Init().
因此大概流程如下:
(这里我自己都认为不怎么准确,仅供参考)
设备启动,外部按键选择设备类型,startOptions为ZCD_STARTOPT_AUTO_START——SAPI_Init()触发ZB_ENTRY_EVENT事件启动应用——SAPI_ProcessEvent()处理ZB_ENTRY_EVENT事件——startOptions为ZCD_STARTOPT_AUTO_START,发送协议栈启动请求zb_StartRequest()——协议栈启动响应zb_StartConfirm(),如果启动成功,即入网成功则启动软定时器osal_start_timerEx(sapi_TaskID,MY_FIND_COLLECTOR_EVT,myBindRetryDelay)——溢出则触发MY_FIND_COLLECTOR_EVT事件发送绑定请求.
*********************************************************************************************************************
*********************************************************************************************************************
*********************************************************************************************************************
3、GenericApp实验
3.1、按键函数
先来看下按键函数:
************************************
void GenericApp_HandleKeys(byteshift,bytekeys)
{
…………
{
…………
if(keys&HAL_KEY_SW_2)
{
HalLedSet(HAL_LED_4,HAL_LED_MODE_OFF);
//InitiateanEndDeviceBindRequestforthemandatoryendpoint
dstAddr.addrMode=Addr16Bit;
dstAddr.addr.shortAddr=0x0000; //Coordinator
ZDP_EndDeviceBindReq(&dstAddr,NLME_GetShortAddr(),
GenericApp_epDesc.endPoint,
GENERICAPP_PROFID,
GENERICAPP_MAX_CLUSTERS,(cId_t*)GenericApp_ClusterList,
GENERICAPP_MAX_CLUSTERS,(cId_t*)GenericApp_ClusterList,
FALSE);
}
…………
if(keys&HAL_KEY_SW_4)
{
HalLedSet(HAL_LED_4,HAL_LED_MODE_OFF);
//InitiateaMatchDescriptionRequest(ServiceDiscovery)
dstAddr.addrMode=AddrBroadcast; //广播传输
dstAddr.addr.shortAddr=NWK_BROADCAST_SHORTADDR; //0xFFFF
ZDP_MatchDescReq(&dstAddr,NWK_BROADCAST_SHORTADDR,
GENERICAPP_PROFID,
GENERICAPP_MAX_CLUSTERS,(cId_t*)GenericApp_ClusterList,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SimpleApp GenericApp 实例 绑定 程序 流程