近来事情比较多,忙着答辩,忙着去应酬,尤其是同学之间的感情需要喝酒来加深,以至于没什么时间看书写码。所以就没什么空看书写码了。
今天把绑定的实验重新做了一遍,但是觉得通过按键来绑定是手动实现的,过程很麻烦。所以就琢磨着用自动的方式实现。下面就讲讲实现自动绑定的过程了。
BTW,把我在这次实验的过程中失败经验也介绍一下,希望大家一下。在开始的过程中,我在初始化中添加了自己的事件MY_EVENT,然后在事件中读取设备的类型,如果是协调器就允许绑定,绑定时间无限制,如果是终端就发送绑定请求。但是始终失败了,而且设备在不断的重启。甚是烦恼,不知道什么原因。
希望遇到类似问题的童鞋们可以和我讲解一下。
ok,如正题吧。估计大家已经不赖烦了要喷我了。
1、要保证设备的自动启动。在原来的程序中,设备的类型是依据不同按键进行设置的,也就是说按下不同的按键,其将该节点按照特定的设备进行启动。
首先屏蔽掉在初始化程序中的按键部分。因为这部分关闭了自动启动模式。
/*
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
if ( HalKeyRead () == HAL_KEY_SW_1)
{
// If SW1 is pressed and held while powerup, force auto-start and nv-restore off and reset
startOptions = 0;
zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
zb_SystemReset();
}
#endif // HAL_KEY
*/
初始化函数的结束部分添加如下代码:
startOptions = ZCD_STARTOPT_AUTO_START;
zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
ZDOInitDevice(0);
设备自动启动以后,会向任务发送一个设备状态改变的消息,在任务处理函数中对应如下的部分:
case ZDO_STATE_CHANGE:
// If the device has started up, notify the application
if (pMsg->status == DEV_END_DEVICE ||
pMsg->status == DEV_ROUTER ||
pMsg->status == DEV_ZB_COORD )
{
SAPI_StartConfirm( ZB_SUCCESS );
}
break;
当设备进行确认状态发生变化的时候,这个时候我们开始来允许设备进行绑定,或是发送绑定请求。
具体代码见SAPI_StartConfirm( ZB_SUCCESS );这个函数。
void SAPI_StartConfirm( uint8 status )
{
#if defined ( MT_SAPI_CB_FUNC )
/* First check if MT has subscribed for this callback. If so , pass it as
a event to MonitorTest and return control to calling function after that */
if ( SAPICB_CHECK( SPI_CB_SAPI_START_CNF ) )
{
zb_MTCallbackStartConfirm( status );
}
else
#endif //MT_SAPI_CB_FUNC
{
zb_StartConfirm( status );
}
}
在最后一个函数中我们来添加自己的代码。
void zb_StartConfirm( uint8 status )
{
// If the device sucessfully started, change state to running
if ( status == ZB_SUCCESS )
{
myAppState = APP_START;
uint8 type;
zb_ReadConfiguration( ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &type );
if(type==ZG_DEVICETYPE_COORDINATOR)
zb_AllowBind(0xff);
else
{
zb_BindDevice(TRUE, TOGGLE_LIGHT_CMD_ID, NULL);
}
}
else
{
// Try again later with a delay
osal_start_timer( MY_START_EVT, myStartRetryDelay );
}
}
首先读取设备的类型,如果为协调器,则允许设备进行绑定,注意绑定时间为0xff,意味着在所有时刻都允许设备进行绑定。如果为其他设备类型,则发送设备绑定请求。 经过上电后,发现设备能自动加入网络并且能进行自动绑定,当我们再次拨动开关设备上的灯控制按键的时候,协调器上对应的灯状态则发送翻转。因此,可以证明自动绑定实现了。