|
本帖最后由 fannifu 于 2022-5-25 23:15 编辑
- s) {, S. q; o6 ~4 u4 ^1 D
2 E. n3 F# {2 R0 a3 m9 j @! y【ZigBee】JN5169 ZigBee3.0设备入网过程
) p5 I2 A% w+ t& S& a- L4 E; X7 ^. w$ O$ G) N
硬件平台:JN5169
+ Q5 t. b- h/ G' p9 Z* e) PSDK:JN-SW-4170
9 t0 y+ g3 @( i+ p参考文档:ZigBee-Base-Device-Behavior-Specification.pdf + j7 H1 K* ~# u
O w4 S4 j0 }8 ~* ?: B概要:分析设备首次入门的流程(bdbNodeIsOnANetwork属性为FALSE),设备入网规范遵循ZigBee-Base-Device-Behavior-Specification 8.3小节
9 f, E% z4 o: C6 W' p h" C% l5 o8 n. p1 p' W
1 节点首先将bdbcommitoningstatus设置为IN_PROGRESS,将vDoPrimaryScan设置为TRUE,将vScanChannels设置为bdbPrimaryChannelSet5 Q1 Q/ ?/ p" d' j9 h8 _
- BDB_PRIMARY_CHANNEL_SET = 0x02108800;
% J- |5 r( i- v# d' \6 b9 T! m - BDB_SECONDARY_CHANNEL_SET = 0x07FFF800 ^ 0x02108800;8 M3 }2 t9 v8 A8 U% U F
- 1 A6 h! Q6 z9 e
- BDB_eNsStartNwkSteering(void)5 I' n/ G, ?/ J2 Y: A; T# [
- { $ ^- M* n7 t$ v& z! I5 x: I
- //有省略
" z. l# d o Z - sBDB.sAttrib.ebdbCommissioningStatus = E_BDB_COMMISSIONING_STATUS_IN_PROGRESS;' F% m2 n% r f0 H6 F
- bDoPrimaryScan = TRUE;0 M9 q: B1 V# C2 F B% U* E& C) C) L: ^
- u32ScanChannels = sBDB.sAttrib.u32bdbPrimaryChannelSet;
2 e4 I9 a7 Z X7 M" w - u8ScanChannel = BDB_CHANNEL_MIN;
; a# F& N6 n2 R( N9 b3 T - bAssociationJoin = FALSE;3 ]/ _: _9 r4 w8 ^% G! C8 k, e
- vNsDiscoverNwk();
3 a5 I; U1 p/ G+ h5 X9 V1 ~5 Q - }
复制代码
; |0 \6 l' n4 f# }9 v% h: ^进入vNsDiscoverNwk()函数后,跳到12步进行判断2 a9 s8 m, X4 I; t& j# w
; o1 a' i4 r+ K6 n2 节点应进行信道扫描,以发现其无线电范围内的一组信道上有哪些网络可用9 U( o7 ~# e7 M7 @$ g, n* r% q9 A
- void vNsDiscoverNwk()
+ l* A. e; K* Z5 Q7 ` M( u; [ - {* q( N+ _) d+ R' K9 z2 W
- //此函数有省略- S& P8 r+ Z4 @: B, G _0 }- w4 {
- eNS_State = E_NS_WAIT_DISCOVERY; //状态机状态,注意) L% ?. P5 |0 T1 u8 e1 o/ x7 V4 {
- ZPS_eAplZdoDiscoverNetworks(u32ScanChannels & (1<<u8ScanChannel));1 \4 @8 O. E( [) U6 m8 X4 I0 J( _
- 8ScanChannel++;4 Q% |: {/ `8 z% x/ Y+ z
- }
复制代码
9 T$ I& R# t$ {& |6 }4 C2 xZPS_eAplZdoDiscoverNetworks()函数调用最终都会在终端设备或路由器上导致生成堆栈事件ZPS_EVENT_NWK_DISCOVERY_COMPLETE
/ K5 C8 L+ q6 d5 g- bdb_taskBDB();
1 V- `) u9 L8 z) N - BDB_vNsStateMachine(&sZpsAfEvent);9 B/ ~& ~5 K/ o! L; z
- case E_NS_WAIT_DISCOVERY: : O+ c2 h# Y$ l6 h0 B9 {1 p' R( n
- case ZPS_EVENT_NWK_DISCOVERY_COMPLETE:! h4 ?- Q i! X: ?: C4 G
- //有省略
复制代码 . O& Q F, \' u+ C. e3 h& X
3 如果NLME-NETWORK-DISCOVERY确认原语的状态参数不等于SUCCESS,表明通道扫描不成功,则节点从步骤2继续。5 l: `1 x& A3 U0 |# k
意思就是判断sStackEvent.uEvent.sNwkDiscoveryEvent.eStatus状态不等于MAC_ENUM_SUCCESS,继续执行下面函数:0 s+ B+ q* h. g; s& a
, e Q4 @7 g& C3 M
1 o6 H0 w% V- e& _1 K9 l4 节点通过分析NetworkCount和NetworkDescriptor参数,判断是否有设置为TRUE的permit join flag合适的网络。3 R, Q8 A; @/ W8 n, i; ~
- eNS_State = E_NS_WAIT_JOIN;6 a$ v: l& U# s3 i( n5 |: ]$ ?4 Q
- vNsTryNwkJoin(TRUE, &(psZpsAfEvent->sStackEvent.uEvent.sNwkDiscoveryEvent));. |6 Q8 i t* e! M. w9 R7 c" L
8 ^( C/ }. r- U- H) C8 G; `- //以下位于vNsTryNwkJoin()函数,有无关代码省略 ^! `8 S4 N6 t+ N0 Y6 L R4 d
- if(
3 y' L' }/ T; P - (pNwkDescr[u8NwkIndex].u8PermitJoining) && \
0 v$ |9 _. H7 v0 |, C: K - (
: {5 M% y' I/ Q$ M; \0 B - (0 == ZPS_psAplAibGetAib()->u64ApsUseExtendedPanid) ||\ . }6 s3 S# t9 S6 S& V; | L
- (pNwkDescr[u8NwkIndex].u64ExtPanId == ZPS_psAplAibGetAib()->u64ApsUseExtendedPanid)7 i7 z; }2 r$ M2 b3 X4 o
- )% @; k9 m0 a/ m* X" |
- ){, w2 Y- V% N2 P, ], h
- eNS_State = E_NS_WAIT_JOIN;( D: ~) \1 q' D9 f. |$ U
- eStatus = ZPS_eAplZdoJoinNetwork(&pNwkDescr[u8NwkIndex]);
( {! }8 M; K- e. _+ d% X2 D - }
复制代码
; F9 E$ z1 ?. {9 x; K, P5 如果在通道扫描中没有找到合适的网络,节点从步骤2继续
+ Q6 T. h/ e& E2 `6 n- vNsTryNwkJoin(TRUE, &(psZpsAfEvent->sStackEvent.uEvent.sNwkDiscoveryEvent));( S4 P$ H7 P7 M+ Y* P5 V
6 I! k$ @1 _. e7 |( E* L- DBG_vPrintf(TRACE_BDB," BDB: No suitable network! Continue Discovery \n");& e' }$ ~/ C6 Y: ~4 t9 D8 M# q
- vNsDiscoverNwk();
复制代码
$ L% G4 M- ^3 W6 节点应尝试加入使用MAC关联发现的网络
6 U) Z- }/ F( a6 @% I. j- vNsTryNwkJoin(TRUE, &(psZpsAfEvent->sStackEvent.uEvent.sNwkDiscoveryEvent));( k; T9 }& y4 L, k. [4 w7 \: v
- ; u+ ~, T2 u, x) L
- //以下位于vNsTryNwkJoin()函数,有无关代码省略 W# }3 h" F" u
- eNS_State = E_NS_WAIT_JOIN;5 x* x- v* h d) r4 ^4 j# h" p4 H9 J
- eStatus = ZPS_eAplZdoJoinNetwork(&pNwkDescr[u8NwkIndex]);
复制代码 * U, t- [' a& T, H5 C3 N
7 允许再次尝试加入同一网络,但每次尝试次数不得超过bdbcmaxsamenetworkretrytrytries次数
3 X! K/ P: X/ s) R- vNsTryNwkJoin(TRUE, &(psZpsAfEvent->sStackEvent.uEvent.sNwkDiscoveryEvent));
g3 C U! j; h# N( V
& h1 v* i4 K/ _- t. j" s- //以下位于vNsTryNwkJoin()函数,有无关代码省略
# N. ?: E% F' p6 J - if(u8RecSameNwkRetryAttempts < BDBC_MAX_SAME_NETWORK_RETRY_ATTEMPTS). V/ Q2 q% v* [; V* E/ {! n
- {4 s: n9 x( p( I- ^3 M) t5 l0 ^
- eNS_State = E_NS_WAIT_JOIN;
" G* k1 f: K c# a - eStatus = ZPS_eAplZdoJoinNetwork(&pNwkDescr[u8NwkIndex]);4 s- c! M0 \: U' N8 Z3 A4 S! Y" ?" P
- }
复制代码
* g+ B& U. ?) Z' x% wZPS_eAplZdoJoinNetwork()函数返回堆栈事件1 l7 F n% R/ Y+ \' d* [3 w ~
//以下代码有省略,请注意
9 [+ a% i. K( V+ s- bdb_taskBDB();
) |9 P. U, A$ s* d - BDB_vNsStateMachine(&sZpsAfEvent);
7 u+ Z/ F9 V# L) x" s$ W4 w - case E_NS_WAIT_JOIN:
# D# ^0 E6 x7 D. w! _5 | - switch(psZpsAfEvent->sStackEvent.eType)7 W; {3 G# _& |1 p" s% R
- {
1 t$ F; U: H* b6 a - case ZPS_EVENT_NWK_FAILED_TO_JOIN:2 h! }+ _' c: L& K8 ?6 r4 u0 h
- break;
8 D9 v1 Y5 K4 l9 H' f# d$ e& ?( L& x - case ZPS_EVENT_NWK_JOINED_AS_ROUTER:
3 o' S3 X5 U6 d I9 s9 [. h. F - case ZPS_EVENT_NWK_JOINED_AS_ENDDEVICE:
4 X5 W. p; N9 n, X7 g$ p0 J' N ? - break;; F/ L, g- |* M$ l" o& m
- }
复制代码
' ^# j' e6 G8 U5 N3 \8 如果是堆栈事件为ZPS_EVENT_NWK_FAILED_TO_JOIN,再次尝试同一网络+ |1 l4 B- X: ^5 Q I
//以下代码有省略,请注意. ?" ]$ _) i/ b" `
- bdb_taskBDB(); 1 U2 j" W9 p8 C: E+ s+ |4 L
- BDB_vNsStateMachine(&sZpsAfEvent);
& B ~4 I5 t! v& N) O - case E_NS_WAIT_JOIN:
) O9 a. q! y' u( q+ ^0 l' D" k* _7 h - switch(psZpsAfEvent->sStackEvent.eType)& ~5 h3 G0 K: l1 z0 G8 ~
- {
$ ]$ \' N3 P0 v+ c8 ?; ] - case ZPS_EVENT_NWK_FAILED_TO_JOIN:
0 I& B) R2 x& C) V9 p - vNsTryNwkJoin(FALSE, NULL);& `2 y8 o, i3 w) j
- break;! g, r% Q1 |& E- M% M5 s! k
I1 M7 I/ M8 D7 B# A$ I- }
复制代码
$ ]- d( |5 t/ ^0 b) z6 k6 m" A9 如果是堆栈事件为ZPS_EVENT_NWK_JOINED_AS_ROUTER或者ZPS_EVENT_NWK_JOINED_AS_ENDDEVICE,应相应地设置bdbNodeJoinLinkKeyType,以指示用于解密接收到的网络密钥的链路密钥类型。
, c) ]/ x$ X0 j' ?" X* f//以下代码有省略,请注意
+ ~: u$ y4 R) R7 }- bdb_taskBDB(); ) O0 k% d, F, t6 e P2 J- I
- BDB_vNsStateMachine(&sZpsAfEvent);
4 x4 p6 J& z ]3 u5 s2 b - case E_NS_WAIT_JOIN:
$ O `' r9 u. T - switch(psZpsAfEvent->sStackEvent.eType)" [1 h9 y4 Q! O _2 ~( a4 k
- {$ W* f( K6 j1 f* ?% {
- case ZPS_EVENT_NWK_FAILED_TO_JOIN:9 }$ a8 m x- L- m, U
- break;
7 J' C6 p8 ~0 i7 J$ d& n - case ZPS_EVENT_NWK_JOINED_AS_ROUTER:2 @1 s. ]4 L9 P4 Q1 ?5 I3 Z
- case ZPS_EVENT_NWK_JOINED_AS_ENDDEVICE:
' G8 l, \6 U( H, \% Y! E+ U2 A+ G - psApsKeyDesc = ZPS_psGetActiveKey(ZPS_u64AplZdoLookupIeeeAddr(psZpsAfEvent->sStackEvent.uEvent.sNwkJoinedEvent.u16Addr), &u32Index);0 b0 n+ z& P- W& m) g
- /*根据接收到的网络密钥的链路密钥类型,相应地设置bdbNodeJoinLinkKeyType*/
. R! s) [3 y3 j4 r) C: k - if(!memcmp(sBDB.pu8DefaultTCLinkKey, &psApsKeyDesc->au8LinkKey[0], ZPS_SEC_KEY_LENGTH))3 R/ T, P7 c. c5 I9 N
- {
9 X b' j) k; x( k4 y# j1 @ - sBDB.sAttrib.u8bdbNodeJoinLinkKeyType = DEFAULT_GLOBAL_TRUST_CENTER_LINK_KEY;8 f: j9 B0 I: [
- }
3 E/ z1 u- ~; T3 o9 X - else if(!memcmp(sBDB.pu8DistributedLinkKey, &psApsKeyDesc->au8LinkKey[0], ZPS_SEC_KEY_LENGTH))
$ N0 J! u& [& i6 [5 s' H" ?, F# K - {5 i- y. r( l3 X) `
- sBDB.sAttrib.u8bdbNodeJoinLinkKeyType = DISTRIBUTED_SECURITY_GLOBAL_LINK_KEY;
Q, V2 J" r8 }) _- w. M - }3 u4 S! b; R! h9 B1 b
- else if(!memcmp(sBDB.pu8TouchLinkKey, &psApsKeyDesc->au8LinkKey[0], ZPS_SEC_KEY_LENGTH))
. ?% v( G' U, i$ r, D2 ] - {
% d, L. {# z5 M5 ?7 F - sBDB.sAttrib.u8bdbNodeJoinLinkKeyType = TOUCHLINK_PRECONFIGURED_LINK_KEY;8 Z5 @& u$ L7 T8 D/ a
- }3 \* t2 U- O0 A. I) m
- else if(!memcmp(sBDB.pu8PreConfgLinkKey, &psApsKeyDesc->au8LinkKey[0], ZPS_SEC_KEY_LENGTH))6 g9 i! n* i! o6 ?6 X8 e* i
- {
) ]0 l Z9 V/ a! \5 j2 y( w% \; f& z - sBDB.sAttrib.u8bdbNodeJoinLinkKeyType = INSTALL_CODE_DERIVED_PRECONFIGURED_LINK_KEY;
2 `. Z4 C) ?2 Q1 t - }
复制代码 7 @& `9 t3 I7 o8 ], W( ?
10 节点将bdbNodeIsOnANetwork设置为TRUE,然后广播Device_annce ZDO命令。如果apsTrustCenterAddress等于0xffffffffffffff,节点应该并从步骤13继续。$ L, [0 \/ n) R7 S
- //以下代码有省略,请注意; }& i0 K/ I3 ]+ V' t
- sBDB.sAttrib.bbdbNodeIsOnANetwork = TRUE;' R$ u* G; U4 T- H
- eNS_State = E_NS_WAIT_AFTER_NWK_JOIN;1 |- @, F/ f8 E6 @' v- N
- ZTIMER_eStart(u8TimerBdbNs, ZTIMER_TIME_MSEC(300)); //启动BDB_vNsTimerCb()任务
/ h& m$ h' m& L - ( w- M. ~* n! Y
- BDB_vNsTimerCb()
$ }1 i/ {% J, a5 u* Z - switch(eNS_State)& g1 p5 v# Q( S6 H+ i) T; o
- {
1 l8 P+ S- B1 }, \ x( P5 L6 ? - case E_NS_WAIT_AFTER_NWK_JOIN:
# N1 o' |- ^3 |# w' d - if(ZPS_psAplAibGetAib()->u64ApsTrustCenterAddress == 0xFFFFFFFFFFFFFFFFULL)
4 N, r% b+ I1 V) I: x - {
) c5 m3 Z5 h; w) w - eNS_State = E_NS_IDLE;: d. x, J* o8 M: ~) T5 S* J# R
- vNsAfterNwkJoin();
; D# \. N* n6 ~1 m' ^- S: x: M - }
6 I: q s3 a% V! S
+ c! m5 W8 A2 B- }
复制代码
- ?: R# H5 A5 T4 {& V11 节点应执行检索新的信任中心链接键的过程(参见子条款10.2.5)。+ J m5 ~9 r" l2 }- \$ a1 K+ u: [
如果过程成功,节点将从步骤13继续。
+ |' |( U: V% T- u9 y2 F8 \, l# X
如果该过程不成功,则节点应在其旧网络上执行休假请求并重置其网络参数。$ A4 y: f' q' U/ F: z2 L2 \
4 I( I; e9 [: L( H8 o% @然后节点将bdbNodeIsOnANetwork设置为FALSE,并将bdbcommitoningstatus设置为TCLK_EX_FAILURE。1 _/ b3 d3 i- T. V. J$ b- x
- \+ F3 W) H" k7 e$ O# I. j
为了执行休假请求,节点发出nlm - leave。向NWK层请求原语,3 F# y3 N- ~" q) P( M3 D
8 k- v5 _+ [- Z4 _& N# G; n2 T$ xDeviceAddress参数设置为NULL, RemoveChildren参数设置为FALSE, Rejoin参数设置为FALSE。在收到我的假期。确认原语,通知节点请求离开网络的状态。
6 K: ~' J5 E7 F H+ y
+ _4 ]! @- x5 P4 D1 y+ s, o节点然后终止7 O! ?0 A- @. ^5 J( o- ~& G
- //以下代码有省略,请注意
( n: _6 i/ v( c: s. F$ Q - sBDB.sAttrib.bbdbNodeIsOnANetwork = TRUE;
1 R% s# ^6 l& g! G% E - eNS_State = E_NS_WAIT_AFTER_NWK_JOIN;
4 j; F/ ^' L: V* P3 Z: Y2 j - ZTIMER_eStart(u8TimerBdbNs, ZTIMER_TIME_MSEC(300)); //启动BDB_vNsTimerCb()任务
6 \1 x( D9 G4 e8 s - 5 E+ n7 n! r! [! \: F9 r
- BDB_vNsTimerCb()7 n! T! `9 b2 H" {" ~
- switch(eNS_State)6 i, j# q. F8 l
- {
% F! z& v5 z6 v; ~0 [% k - case E_NS_WAIT_AFTER_NWK_JOIN: r5 F# F0 v4 `8 i- F4 w' {
- if(ZPS_psAplAibGetAib()->u64ApsTrustCenterAddress == 0xFFFFFFFFFFFFFFFFULL)
* c1 @% F) F, a7 E! T( _& j" | - {7 N/ e% n) B# q$ L- z
- eNS_State = E_NS_IDLE;
" Q% J9 ]- U) E' d# T& ` - vNsAfterNwkJoin();
" p6 R; ]0 I1 E4 C& G O0 P - }; B- Z- x& v) o! M) o) X2 M
- if(0x00 == sBDB.sAttrib.u8bdbTCLinkKeyExchangeMethod)
+ I, ^, g* i. V; [* V - {
O2 {; b6 Z1 e9 M( R - vNsStartTclk();
' t2 D$ N3 G4 R+ T8 l1 ? - }
& U' n' P+ T2 R& G - else //检索新的信任中心链接键的过程,成功4 C+ B0 X `# u! ^) g8 o; f
- {: Q" v5 h; `8 |2 q1 p. O1 V
- DBG_vPrintf(TRACE_BDB,"Only ApsReqKey is supported !\n");
9 I# M1 o" N% P' `) d2 r - eNS_State = E_NS_IDLE;
7 h1 o1 e% U! F - vNsAfterNwkJoin();
( U: E; M& q2 U: c - }' H5 G( I0 Z% j" F/ F1 H
- }
复制代码 5 y) a2 Z: i6 m% D. |, r( ~% u& C
12 如果vDoPrimaryScan等于FALSE或bdbSecondaryChannelSet等于0x00000000,节点将从步骤16继续。
6 |6 ^- s" W& S4 n4 ]5 M+ o' u如果bdbSecondaryChannelSet不等于0x00000000,节点将vDoPrimaryScan设为FALSE,将vScanChannels设为bdbSecondaryChannelSet,从步骤2继续。, ^/ s4 g) j& p3 Z& c: q/ e
- bDoPrimaryScan = FALSE;
8 X$ t F7 F7 q+ [ v4 f - u32ScanChannels = sBDB.sAttrib.u32bdbSecondaryChannelSet;
" h" D& D, a5 b! E" y; R - u8ScanChannel = BDB_CHANNEL_MIN;2 \' e1 G) s) B
- vNsDiscoverNwk();
复制代码 ! V/ Q; Q& m7 @: r: t
13 节点广播Mgmt_Permit_Joining_req ZDO命令,将 PermitDuration 字段至少设置为bdbcMinCommissioningTime,将TC_Significance字段设置为0x01/ W4 d' ^1 d" \ ^$ x0 t! X
J- k! K& K0 W1 v2 C9 b- ^- vNsAfterNwkJoin();! D6 G D5 X. T3 y" l2 {
- vNsSendPermitJoin();
复制代码 7 V4 ]* B ~, {# B
14. 如果节点能够允许新节点加入,则应激活其permit join标志。为此,节点发出nlm - permit - join。将PermitDuration参数设置为至少bdbcmincommission oningtime的request原语。收到NWK层的NLME-PERMIT- .confirm原语后,将通知节点激活许可证连接的请求的状态。0 U. Q, d! E6 P- M8 M" @
- vNsAfterNwkJoin();* I2 x6 Z, x4 @/ Y! C& I& l
- vNsSendPermitJoin();
复制代码 2 W( _2 g- N1 W( [* Q$ ^% z: Z
15 然后节点将bdbcommitoningstatus设置为SUCCESS。如果节点支持touchlink,它将aplFreeNwkAddrRangeBegin、aplFreeNwkAddrRangeEnd、aplFreeGroupID-RangeBegin和aplFreeGroupIDRangeEnd属性的值设置为0x0000(表示节点使用MAC关联加入了网络)。然后,节点应终止对不在网络上的节点的网络指导过程。
8 ~6 @& H0 {% D' n3 Z- sBDB.sAttrib.ebdbCommissioningStatus = E_BDB_COMMISSIONING_STATUS_SUCCESS; G6 E' x! O) X: S$ }2 Z' g7 [/ d
- eNS_State = E_NS_IDLE;
& d& g+ o; e5 u( Q6 M - ZPS_eAplAibSetApsUseExtendedPanId(ZPS_u64NwkNibGetEpid( ZPS_pvAplZdoGetNwkHandle()));
- e [$ c8 } ~. e# r - sBdbEvent.eEventType = BDB_EVENT_NWK_STEERING_SUCCESS;; a r' u7 g0 H/ w G# B! P
- APP_vBdbCallback(&sBdbEvent);5 X6 d1 Q7 s% u* I0 W
- DBG_vPrintf(TRACE_SWITCH_NODE,"GoRunningState!\n");9 W4 @' V: D9 n. G4 F3 |0 m
- vHandleJoinAndRejoin();" G( [- A6 K. j3 H6 [
- sDeviceDesc.eNodeState = E_RUNNING;/ a! @! I) W, v! w9 D2 J; N
- ZTIMER_eStart(u8TimerPoll, POLL_TIME);. J; F9 B4 E; _2 D
- ZTIMER_eStart(u8TimerTick, ZCL_TICK_TIME);
复制代码 - q1 N3 c& z& M* X) m3 x" W1 E
16. 节点可以使用制造商指定的程序重试,或者将bdbcommission oningstatus设置为NO_NETWORK,然后终止不在网络上的节点的网络转向过程。如果尝试制造商特定的过程,bdbcommitoningstatus和bdbNodeIsOnANetwork属性将在其终止时相应地更新,以便调试过程是一致的。* q7 B! x: r! ]' h& i! l
- //有省略
0 a4 l" s3 H0 v: H9 O; e7 t - vNsDiscoverNwk(), Y3 Q) Q7 d2 `. a5 I) u- [
- {
$ n! e8 y! r, ~+ G - if((!u32ScanChannels) || (u8ScanChannel > BDB_CHANNEL_MAX))
* _# W: Y' P# i7 {# L U9 f& \1 v: n - {
2 K9 T- L2 y/ s - if(bDoPrimaryScan == FALSE)0 S! z0 | B. h* b6 \
- {
6 J `) ]8 o P. v9 l - vNsTerminateNwkSteering();
" N0 b& R v% |% G5 ? - return;
4 ]2 ?( B: u' r2 a$ ~1 Z1 ^- G0 p - }
4 i, c. a- Q+ C- w2 o8 m - }
, K3 q- m) u7 ~& F5 f - }
; r0 `! M1 N$ S6 R+ q) c" U* t
复制代码
1 c6 J$ Q7 C; e7 @7 e- m' p; j& X" ^: w. T4 j
|
|