|
仔细的研读了一下绑定请求代码
destination.addrMode = Addr16Bit;
destination.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
if ( ZDO_AnyClusterMatches( 1, &commandId, sapi_epDesc.simpleDesc->AppNumOutClusters,
sapi_epDesc.simpleDesc->pAppOutClusterList ) )
{
// Try to match with a device in the allow bind mode
ret = ZDP_MatchDescReq( &destination, NWK_BROADCAST_SHORTADDR,
sapi_epDesc.simpleDesc->AppProfId, 1, &commandId, 0, (cId_t *)NULL, 0 );
}
else if ( ZDO_AnyClusterMatches( 1, &commandId, sapi_epDesc.simpleDesc->AppNumInClusters,
sapi_epDesc.simpleDesc->pAppInClusterList ) )
{
ret = ZDP_MatchDescReq( &destination, NWK_BROADCAST_SHORTADDR,
sapi_epDesc.simpleDesc->AppProfId, 0, (cId_t *)NULL, 1, &commandId, 0 );
}
用自然语言来表达就是:首先判断我想绑定的簇ID---也就是commandID对我来说是输出还是输入,如果是输出,则能绑定到的Device的条件是:1. 该Device中的某个EndPoint的ProfId和我的ProfId一致。2. 匹配到的这个EndPoint的输入ID中必须包含有commandID(输出,输入刚好称为一对)
如果是输入,上面第1个条件相同,第2个条件中的输出改为输入即可。
这样看来绑定的关键在于:ProfID相同,并且有相匹配的簇ID。这里并没有去匹配EndPoint号,也就是说即使EndPoint号不同也能绑定。
当然这仅仅是代码分析的结论,实验结果如何后续通知。 |
|