[图文]如何使用Z-Stack 热 ★★★ 【字体:小 大】
如何使用Z-Stack
一、如何使用ZStack——网络配置
1.PAN ID 和Channel(f8wConfig.cfg)
ZigBee协议使用一个14位的个域网标志符(PAN ID)来标识一个网络。ZStack允许用两种方式配置PAN ID,当ZDAPP_CONFIG_PAN_ID值不设置为0xFFFF时,那么设备建立或加入网络的PAN ID由ZDAPP_CONFIG_PAN_ID指定;如果设置ZDAPP_CONFIG_PAN_ID为0xFFFF,那么设备就将建立或加入一个“最优”的网络。
//-DZDAPP_CONFIG_PAN_ID=0xFFFF
-DZDAPP_CONFIG_PAN_ID=0x2FFF
IEEE 802.15.4/ZIGBEE规范在2.4G频段上规定了16各频道,用户可以通过选择DEFAULT_CHANLIST不同的值选择不同的频道,协议默认频道为0xB即0x00000800。
//-DDEFAULT_CHANLIST=0x04000000 // 26 - 0x1A
//-DDEFAULT_CHANLIST=0x02000000 // 25 - 0x19
-DDEFAULT_CHANLIST=0x01000000 // 24 - 0x18
//-DDEFAULT_CHANLIST=0x00800000 // 23 - 0x17
//-DDEFAULT_CHANLIST=0x00400000 // 22 - 0x16
//-DDEFAULT_CHANLIST=0x00200000 // 21 - 0x15
//-DDEFAULT_CHANLIST=0x00100000 // 20 - 0x14
//-DDEFAULT_CHANLIST=0x00080000 // 19 - 0x13
//-DDEFAULT_CHANLIST=0x00040000 // 18 - 0x12
//-DDEFAULT_CHANLIST=0x00020000 // 17 - 0x11
//-DDEFAULT_CHANLIST=0x00010000 // 16 - 0x10
//-DDEFAULT_CHANLIST=0x00008000 // 15 - 0x0F
//-DDEFAULT_CHANLIST=0x00004000 // 14 - 0x0E
//-DDEFAULT_CHANLIST=0x00002000 // 13 - 0x0D
//-DDEFAULT_CHANLIST=0x00001000 // 12 - 0x0C
//-DDEFAULT_CHANLIST=0x00000800 // 11 - 0x0B
2.网络结构(nwk_globals.h,nwk_globals.c)
STACK_PROFILE_ID定义为NETWORK_SPECIFIC、 HOME_CONTROLS、BUILDING_AUTOMATION、GENERIC_STAR、GENERIC_TREE中的一个,默认为HOME_CONTROLS,并据此设置MAX_NODE_DEPTH、NWK_MODE等,具体如下:
#define STACK_PROFILE_ID HOME_CONTROLS
#if ( STACK_PROFILE_ID == HOME_CONTROLS )
#define MAX_NODE_DEPTH 5
#define NWK_MODE NWK_MODE_MESH
#define SECURITY_MODE SECURITY_RESIDENTIAL
#if ( SECURE != 0 )
#define USE_NWK_SECURITY 1 // true or false
#define SECURITY_LEVEL 5
#else
#define USE_NWK_SECURITY 0 // true or false
#define SECURITY_LEVEL 0
#endif
网络最大设备数设定:
#if !defined( NWK_MAX_DEVICE_LIST )
#define NWK_MAX_DEVICE_LIST 20 // Maximum number of devices in the
// Assoc/Device list.
#endif
路由器和终端设备数设定:
#if defined ( RTR_NWK )
// change this if using a different stack profile...
// Cskip array
uint16 *Cskip;
#if ( STACK_PROFILE_ID == HOME_CONTROLS )
byte CskipRtrs[MAX_NODE_DEPTH+1] = {6,6,6,6,6,0};
byte CskipChldrn[MAX_NODE_DEPTH+1] = {20,20,20,20,20,0};
#elif ( STACK_PROFILE_ID == GENERIC_STAR )
byte CskipRtrs[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};
byte CskipChldrn[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};
#elif ( STACK_PROFILE_ID == NETWORK_SPECIFIC )
byte CskipRtrs[MAX_NODE_DEPTH+1] = {5,5,5 ,5,5,0};
byte CskipChldrn[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};
#endif // STACK_PROFILE_ID
#endif // RTR_NWK
其中CskipRtrs和CskipChldrn分别为每一级的最大路由器数和最大节点数,前者是后者的子集。
二、如何使用ZStack——广播发送数据
ZStack中广播发送数据只要修改目的地址模式和短地址分别为AddrBroadcast和0xFFFF即可。
afAddrType_t SendDataAddr; //定义地址结构
SendDataAddr.addr.shortAddr = 0xFFFF; //广播地址
SendDataAddr.addrMode = (afAddrMode_t)AddrBroadcast; //广播模式
SendDataAddr.endPoint = wsnAPP_ENDPOINT;
byte pRfData="RfData"; //定义要发送的数据
AF_DataRequest( &SendDataAddr,
&wsnApp_epDesc,
wsnAPP_CLUSTERID,
sizeof(pRfData),
pRfData,
&wsnApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) ;
三、如何使用ZStack——获取RSSI和LQI
CC2430内置接收信号强度指示器(RSSI),其数字值为8位有符号二进制补码,可以从寄存器RSSIL.RSSI_VAL读出。RSSI寄存器值RSSI.RSSI_VAL在RF上涉及的电能P为:P=(RSSI_VAL+RSSI_OFFSET) dBm,式中:RSSI_OFFSET是一个系统开发期间得到的来自前端增益的经验值,RSSI_OFFSET近似值为-45。
ZStack中获得电能P的语句为:
#define MAC_RADIO_RSSI_OFFSET HAL_MAC_RSSI_OFFSET
#define HAL_MAC_RSSI_OFFSET -45
rssiDbm = PROPRIETARY_FCS_RSSI(rxBuf) + MAC_RADIO_RSSI_OFFSET;
链路质量指示(LQI)计量所收到的数据包的强度和质量,可使用接收信号强度指示器(RSSI)软件产生LQI值,尽管这样计算有若干缺点,但ZStack中的确是这样计算的。
#define MAC_RADIO_RECEIVER_SENSITIVITY_DBM -91 /* dBm */
#define MAC_RADIO_RECEIVER_SATURATION_DBM 10 /* dBm */
#define MAC_SPEC_ED_MIN_DBM_ABOVE_RECEIVER_SENSITIVITY 10
#define ED_RF_POWER_MIN_DBM (MAC_RADIO_RECEIVER_SENSITIVITY_DBM + MAC_SPEC_ED_MIN_DBM_ABOVE_RECEIVER_SENSITIVITY)
#define ED_RF_POWER_MAX_DBM MAC_RADIO_RECEIVER_SATURATION_DBM
ed = (MAC_SPEC_ED_MAX * (rssiDbm - ED_RF_POWER_MIN_DBM)) / (ED_RF_POWER_MAX_DBM - ED_RF_POWER_MIN_DBM);
pRxBuf->mac.mpduLinkQuality = macRadioComputeLQI(rssiDbm, corr);
LQI值也可以在应用层通过afIncomingMSGPacket_t *pkt; pkt->LinkQuality直接获得。
RSSI和LQI的关系为:LQI=255*(RSSI+81)/91
四、如何使用ZStack——输出功率编程设置
RF输出功率可以由RF寄存器TRCTRLL.PA_LEVEL控制,具体设置参数可参考下表:
ZStack中有如下定义:
const uint8 CODE macRadioDefsTxPowerTable[] =
{
/* 0 dBm */ 0x5F, /* characterized as -0.4 dBm in datasheet */
/* -1 dBm */ 0x3F, /* characterized as -0.9 dBm in datasheet */
/* -2 dBm */ 0x3F,
/* -3 dBm */ 0x1B, /* characterized as -2.7 dBm in datasheet */
/* -4 dBm */ 0x17, /* characterized as -4.0 dBm in datasheet */
/* -5 dBm */ 0x13,
/* -6 dBm */ 0x13, /* characterized as -5.7 dBm in datasheet */
/* -7 dBm */ 0x13,
/* -8 dBm */ 0x0F, /* characterized as -7.9 dBm in datashee t */
/* -9 dBm */ 0x0F,
/* -10 dBm */ 0x0F,
/* -11 dBm */ 0x0B, /* characterized as -10.8 dBm in datasheet */
/* -12 dBm */ 0x0B,
/* -13 dBm */ 0x0B,
/* -14 dBm */ 0x0B,
/* -15 dBm */ 0x07, /* characterized as -15.4 dBm in datasheet */
/* -16 dBm */ 0x07,
/* -17 dBm */ 0x07,
/* -18 dBm */ 0x07,
/* -19 dBm */ 0x06, /* characterized as -18.6 dBm in datasheet */
/* -20 dBm */ 0x06,
/* -21 dBm */ 0x06,
/* -22 dBm */ 0x06,
/* -23 dBm */ 0x06,
/* -24 dBm */ 0x06,
/* -25 dBm */ 0x03 /* characterized as -25.2 dBm in datasheet */
};
缺省设置为0dBm,即
#define MAC_RADIO_TX_POWER_DEFAULT 0x1F
macPhyTxPower = MAC_RADIO_TX_POWER_DEFAULT;
MAC_RADIO_SET_TX_POWER(macPhyTxPower);
至于macRadioDefsTxPowerTable中0dBm为0x5F而不是0x1F,是因为0x1F只代表TRCTRLL的低5位即TRCTRLL.PA_LEVEL,而0x5F则包含了高3位的缘故。