3639
- 收藏
- 点赞
- 分享
- 举报
ZigBee(Z-stack)四种绑定方式的程序实现方法【转】
大家都知道Z-stack有四种绑定方式:1、两个节点分别通过按键机制调用ZDP_EndDeviceBindReq函数; 2、Match方式; 3、ZDP_BindReq和ZDP_UnbindReq方式; 4、手工管理绑定表。很多人明白这四种绑定方式的原理,但具体的程序事项方法可能并不清楚,今天我在这里送上这四种绑定方式具体的程序时序实现方法。
一、两个节点分别通过按键机制调用ZDP_EndDeviceBindReq函数
这种绑定方式必须要有协调器设备存在,两个设备通过按键在一定时间间隔内(默认为15秒)调用ZDP_EndDeviceBindReq函数完成绑定。首先要在初始化程序中注册End_Device_Bind_rsp进程,然后按键绑定请求程序如下:
if(Up_down_mark==1)
{
Up_down_mark=0;
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
// Initiate an End Device Bind Request for the mandatory endpoint
dstAddr.addrMode = Addr16Bit;
dstAddr.addr.shortAddr = 0x0000; // Coordinator
ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
ZG_Serial_Control_epDesc.endPoint,
ZG_Serial_Control_PROFID,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
FALSE );
}
回调处理函数如下:
case End_Device_Bind_rsp:
if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
{
HalLedSet ( HAL_LED_2, HAL_LED_MODE_OFF );
}
break;
二、Match方式
这种绑定方式无需协调器设备存在,可采用按键机制来实现。首先在初始化函数中注册Match_Desc_rsp进程,然后按键请求函数如下:
if(Right_left_mark==1)
{
Right_left_mark=0;
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
// Initiate a Match Description Request (Service Discovery)
dstAddr.addrMode = AddrBroadcast;
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
ZG_Serial_Control_PROFID,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
FALSE );
}
回调处理函数如下:
case Match_Desc_rsp:
{
ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
if ( pRsp )
{
if ( pRsp->status == ZSuccess && pRsp->cnt )
{
ZG_Serial_Control_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
ZG_Serial_Control_DstAddr.addr.shortAddr = pRsp->nwkAddr;
// Take the first endpoint, Can be changed to search through endpoints
ZG_Serial_Control_DstAddr.endPoint = pRsp->epList[0];
// Light LED
HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );
}
osal_mem_free( pRsp );
}
}
break;
三、ZDP_BindReq和ZDP_UnbindReq方式
这种绑定方式需要第三方设备辅助完成,即假如A设备和B设备想进行绑定,A为源设备,B为目标设备,这时需要一个C设备来发起绑定,C设备需要知道A设备和B设备端点号、簇ID号和64位IEEE 地址。首先需要注册Bind_rsp/Unbind_rsp,然后绑定请求函数如下:
destAddr.addrMode = Addr16Bit;
destAddr.addr.shortAddr = BUILD_UINT16( Uart_buf[1], Uart_buf[2] ); //目标设备网络地址
osal_cpyExtAddr(Bind_SourceAddr,&Uart_buf[3]);
devAddr.addrMode = Addr64Bit;
osal_cpyExtAddr( devAddr.addr.extAddr, &Uart_buf[11] );
ZDP_BindReq( &destAddr,
Bind_SourceAddr,
ZG_Serial_Control_ENDPOINT,
ZG_Serial_Control_CLUSTERID,
&devAddr,
ZG_Serial_Control_ENDPOINT,
0 );
回调处理函数如下:
if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )//绑定成功
HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );
四、手工管理绑定表
这种方式是最灵活的方式,不过目前我只实现了子节点对其父节点的绑定,而无法实现对非父节点的绑定,原因尚不清楚,若有朋友清楚还请告诉我,谢谢!
绑定表添加绑定程序:
BindAddr.addrMode = Addr64Bit;
osal_cpyExtAddr( BindAddr.addr.extAddr, &Uart_buf[1] );
bindAddEntry(ZG_Serial_Control_ENDPOINT,
&BindAddr,
ZG_Serial_Control_ENDPOINT,
ZG_Serial_Control_MAX_CLUSTERS,
ZG_Serial_Control_ClusterList);
绑定表删除绑定条目:
BindAddr.addrMode = Addr64Bit;
osal_cpyExtAddr( BindAddr.addr.extAddr, &Uart_buf[1] );
pBindingTable = bindFindExisting( ZG_Serial_Control_ENDPOINT,
&BindAddr,
ZG_Serial_Control_ENDPOINT );
bindRemoveEntry( pBindingTable );
一、两个节点分别通过按键机制调用ZDP_EndDeviceBindReq函数
这种绑定方式必须要有协调器设备存在,两个设备通过按键在一定时间间隔内(默认为15秒)调用ZDP_EndDeviceBindReq函数完成绑定。首先要在初始化程序中注册End_Device_Bind_rsp进程,然后按键绑定请求程序如下:
if(Up_down_mark==1)
{
Up_down_mark=0;
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
// Initiate an End Device Bind Request for the mandatory endpoint
dstAddr.addrMode = Addr16Bit;
dstAddr.addr.shortAddr = 0x0000; // Coordinator
ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
ZG_Serial_Control_epDesc.endPoint,
ZG_Serial_Control_PROFID,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
FALSE );
}
回调处理函数如下:
case End_Device_Bind_rsp:
if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
{
HalLedSet ( HAL_LED_2, HAL_LED_MODE_OFF );
}
break;
二、Match方式
这种绑定方式无需协调器设备存在,可采用按键机制来实现。首先在初始化函数中注册Match_Desc_rsp进程,然后按键请求函数如下:
if(Right_left_mark==1)
{
Right_left_mark=0;
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
// Initiate a Match Description Request (Service Discovery)
dstAddr.addrMode = AddrBroadcast;
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
ZG_Serial_Control_PROFID,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
FALSE );
}
回调处理函数如下:
case Match_Desc_rsp:
{
ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
if ( pRsp )
{
if ( pRsp->status == ZSuccess && pRsp->cnt )
{
ZG_Serial_Control_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
ZG_Serial_Control_DstAddr.addr.shortAddr = pRsp->nwkAddr;
// Take the first endpoint, Can be changed to search through endpoints
ZG_Serial_Control_DstAddr.endPoint = pRsp->epList[0];
// Light LED
HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );
}
osal_mem_free( pRsp );
}
}
break;
三、ZDP_BindReq和ZDP_UnbindReq方式
这种绑定方式需要第三方设备辅助完成,即假如A设备和B设备想进行绑定,A为源设备,B为目标设备,这时需要一个C设备来发起绑定,C设备需要知道A设备和B设备端点号、簇ID号和64位IEEE 地址。首先需要注册Bind_rsp/Unbind_rsp,然后绑定请求函数如下:
destAddr.addrMode = Addr16Bit;
destAddr.addr.shortAddr = BUILD_UINT16( Uart_buf[1], Uart_buf[2] ); //目标设备网络地址
osal_cpyExtAddr(Bind_SourceAddr,&Uart_buf[3]);
devAddr.addrMode = Addr64Bit;
osal_cpyExtAddr( devAddr.addr.extAddr, &Uart_buf[11] );
ZDP_BindReq( &destAddr,
Bind_SourceAddr,
ZG_Serial_Control_ENDPOINT,
ZG_Serial_Control_CLUSTERID,
&devAddr,
ZG_Serial_Control_ENDPOINT,
0 );
回调处理函数如下:
if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )//绑定成功
HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );
四、手工管理绑定表
这种方式是最灵活的方式,不过目前我只实现了子节点对其父节点的绑定,而无法实现对非父节点的绑定,原因尚不清楚,若有朋友清楚还请告诉我,谢谢!
绑定表添加绑定程序:
BindAddr.addrMode = Addr64Bit;
osal_cpyExtAddr( BindAddr.addr.extAddr, &Uart_buf[1] );
bindAddEntry(ZG_Serial_Control_ENDPOINT,
&BindAddr,
ZG_Serial_Control_ENDPOINT,
ZG_Serial_Control_MAX_CLUSTERS,
ZG_Serial_Control_ClusterList);
绑定表删除绑定条目:
BindAddr.addrMode = Addr64Bit;
osal_cpyExtAddr( BindAddr.addr.extAddr, &Uart_buf[1] );
pBindingTable = bindFindExisting( ZG_Serial_Control_ENDPOINT,
&BindAddr,
ZG_Serial_Control_ENDPOINT );
bindRemoveEntry( pBindingTable );
我来回答
回答0个
时间排序
认可量排序
暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2018-07-06 11:48:26
-
2018-07-06 11:50:15
-
2010-06-03 00:05:10
-
2020-11-22 16:06:20
-
2013-08-28 13:47:26
-
2020-03-28 10:10:02
-
2013-08-29 23:48:54
-
2013-11-16 11:22:01
-
2020-12-04 14:04:52
-
2018-12-31 12:52:21
-
2018-12-27 16:21:20
-
2013-08-09 15:19:44
-
2013-08-29 23:47:53
-
2013-08-28 12:17:38
-
2016-08-04 14:49:10
-
2016-10-14 14:02:39
-
2020-12-04 14:03:48
-
2021-01-13 11:35:59
-
2013-08-29 23:46:29
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认