{
/* Device can join any network , associate with
* first coordinator from which beacon is received */
devInfoBlock.panID = pData->panDesc.coordPanId;
panIdMatch = true;
}
/* Check the incoming PAN ID to see if it's a valid coordinator */
else if (devInfoBlock.panID == pData->panDesc.coordPanId)
{
panIdMatch = true;
}
devInfoBlock.coordShortAddr = pData->panDesc
.coordAddress.addr.shortAddr;
if(APIMAC_SFS_BEACON_ORDER( pData->panDesc.superframeSpec)
!= JDLLC_BEACON_ORDER_NON_BEACON)
{
devInfoBlock.beaconOrder = APIMAC_SFS_BEACON_ORDER(
pData->panDesc.superframeSpec);
devInfoBlock.superframeOrder =
APIMAC_SFS_SUPERFRAME_ORDER(
pData->panDesc.superframeSpec);
}
if(devInfoBlock.beaconOrder == JDLLC_BEACON_ORDER_NON_BEACON)
{
parentFound = true;
#ifdef FREQ_2_4G
ApiMac_srcMatchEnable();
#endif
Ssf_stopScanBackoffClock();
}
Alvin Chen:
static void beaconNotifyIndCb(ApiMac_mlmeBeaconNotifyInd_t *pData)
这是Beacon Notification callback.
这里有个Ssf_findBlackListIndex 可以作为管理使用。
user5322468:
回复 Alvin Chen:
这个只是从NV中匹配是否黑名单,我不可能把所有的网络黑名单都加入进去。
A,B,C三个网络,sensor这个时候想去连接A网络,可是扫描过来的却是B网络,然而例子中判断
if(devInfoBlock.panID == JDLLC_INVALID_PAN)
else if (devInfoBlock.panID == pData->panDesc.coordPanId)
如果都不满足,还是会把devInfoBlock.channel = pData->panDesc.logicalChannel;devInfoBlock.coordShortAddr = pData->panDesc.coordAddress.addr.shortAddr;
信道和地址保存起来,难道不会出现if和elseif都不满足的情况?
如果我想连接A网络,此处的改动应该是?
user5322468:
回复 Alvin Chen:
上述的有点不同,请解释下
Alvin Chen:
回复 user5322468:
你可以通过不同的PANID来做区分。
只有当panIdMatch成功匹配才会进行ASSOCIATE_REQ
static void scanCnfCb(ApiMac_mlmeScanCnf_t *pData)
{if(pData->status == ApiMac_status_success){if(pData->scanType == ApiMac_scantype_active){/* Only send association requests for a matching PAN */if(panIdMatch){/* Set event to send Association Request */Util_setEvent(&Jdllc_events, JDLLC_ASSOCIATE_REQ_EVT);}
user5322468:
回复 Alvin Chen:
我的意思是:panIdMatch=true
在beaconNotifyIndCb中的
devInfoBlock.channel = pData->panDesc.logicalChannel;
devInfoBlock.coordShortAddr = pData->panDesc.coordAddress.addr.shortAddr;这行代码是在
if(devInfoBlock.panID == JDLLC_INVALID_PAN)
else if (devInfoBlock.panID == pData->panDesc.coordPanId)
之后,没有条件限制,只要进来,都会把devInfoBlock.channel和devInfoBlock.coordShortAddr赋值,如果if-elseif都不满足,岂不是出错饿。不懂
Alvin Chen:
回复 user5322468:
请参考:
if(devInfoBlock.panID == JDLLC_INVALID_PAN){/* Device can join any network , associate with* first coordinator from which beacon is received */devInfoBlock.panID = pData->panDesc.coordPanId;panIdMatch = true;}/* Check the incoming PAN ID to see if it's a valid coordinator */else if (devInfoBlock.panID == pData->panDesc.coordPanId){panIdMatch = true;}只有panIdMatch=true 才会进行ASSOCIATE_REQ ,后面虽然填充了,但是除了devInfoBlock.beaconOrder == JDLLC_BEACON_ORDER_NON_BEACON都不会设置panIdMatch = true;
也是无法触发的ASSOCIATE_REQ 的
user5322468:
回复 Alvin Chen:
那就是说,只有devInfoBlock.panID等于空和当前扫描的panid,才会关联咯,我刚刚改代码,首先启动A,B网络,入网许可都打开,连接A,先发送分离,然后在分离中把devInfoBlock.panID=B网络panid,然后switchstate(scanActive),beaconNotifyIndCb回调直接跳过。是我代码环节错误,还是思路不对?
Alvin Chen:
回复 user5322468:
你要等sensor 进入jdllcDisassocIndCb ,然后会Ssf_clearNetworkInfo,之后再设置新的devInfoBlock.panID。我的理解是这样的,你试试看。
user5322468:
回复 Alvin Chen:
我在sensor通讯中,把当前连接的collector关闭,sensor抓包信息如图下:正常通讯,发送的地址变成FFFF,这是为什么呀?
YiKai Chen:
回复 user5322468:
0xFFFF是廣播訊息,beacon request是你的sensor在找網路重連
TI中文支持网

