修改Zigbee的Channel、PANID、发射功率、灵敏度及其它参数

转自:http://blog.csdn.net/xiaoshengyige/article/details/7577115(Channel、PANID、发射功率)原文如下:

现对z-stack里几个网络参数的设置以及如何获取总结一下。

信道配置:

Zigbee在3个频段定义了27个物理信道:868MHz频段中定义了1个20Kb/s信道,915MHz频段中定义了10个40Kb/s信道,信道间隔为2MHz,2.4GHz频段上定义了16个250Kb/s信道,信道间隔为5MHz.



Z-stack中可以在f8wConfig.cfg里设置信道,相关部分如下:

/* Default channel isChannel 11 - 0x0B */

// Channels are definedin the following:

//         0     : 868 MHz     0x00000001

//         1 - 10 : 915 MHz     0x000007FE

//        11 - 26 : 2.4 GHz     0x07FFF800

//-DMAX_CHANNELS_868MHZ     0x00000001

//-DMAX_CHANNELS_915MHZ     0x000007FE

//-DMAX_CHANNELS_24GHZ      0x07FFF800

//-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    这里默认使用的是编号为11的信道

当建网过程开始后,网络层将请求MAC层对规定的信道或由物理层默认的有效信道进行能量检测扫描,以检测可能的干扰。网络层管理实体对能量扫描的结果以递增的方式排序,丢弃那些能量值超出可允许能量水平的信道,然后再由网络层管理实体执行一次主动扫描,结合检查PAN描述符,对剩下的信道选择一个合适的建立网络。

若要在应用中查看信道,可以这样获得,_NIB.nwkLogicalChannel,读取这个就OK了。

PANID:

在确定信道以后,下一步将是确定PANID,如果ZDAPP_CONFIG_PAN_ID被定义为0xFFFF,那么协调器将根据自身的IEEE地址建立一个随机的PANID(0~0x3FFF),如ZDAPP_CONFIG_PAN_ID没有被定义为0xFFFF,那么网络的PANID将由ZDAPP_CONFIG_PAN_ID确定。

“如果ZDAPP_CONFIG_PAN_ID被定义为0xFFFF,那么协调器将根据自身的IEEE地址建立一个随机的PANID(0~0x3FFF)”这句话怎么理解呢,我经过试验发现,这个随机的PANID并非完全随机,它有规律,与IEEE地址有一定的关系:要么就是IEEE地址的低16位,要么就是一个与IEEE地址低16位非常相似的值。如IEEE地址为0x8877665544332211,PANID很有可能就是2211,或相似的值;IEEE地址为0x8877665544337777,PANID很有可能就是3777,或其它相似的值;

Z-stack中相关部分代码如下:

/* Define the default PANID.

*

* Setting this to a valueother than 0xFFFF causes

* ZDO_COORD to use thisvalue as its PAN ID and

* Routers and end devicesto join PAN with this ID

*/

-DZDAPP_CONFIG_PAN_ID=0xFFFF

若要在应用中查看PANID可以这样获得,_NIB.nwkPanId,读取这个就OK了。

发射功率:

传送范围的大小是和发射功率还有信道环境有关, 传送速率和传送范围之间没有直接联系。所以呢,适当的增大发射功率可增大传送范围。但也是有一定的限制的。具体详见datasheet。

在mac_radio_def.h里有可以设置:

#defineMAC_RADIO_CHANNEL_DEFAULT                       11

#defineMAC_RADIO_TX_POWER_DEFAULT                    0x1F

#defineMAC_RADIO_TX_POWER_MAX_MINUS_DBM       25

这些只是举例说明一下,这些参数的意义,以及在z-stack里的什么地方修改。还有很多其它的参数,可以查看相关的源文件。

[mac_radio_def.h]

#defineMAC_RADIO_SET_CHANNEL(x)            st(FSCTRLL = FREQ_2405MHZ + 5 * ((x) - 11); )

#defineMAC_RADIO_SET_TX_POWER(x)            st(TXCTRLL = x; )

#define MAC_RADIO_SET_PAN_ID(x)              st( PANIDL = (x) & 0xFF;PANIDH = (x) >> 8; )

[mac_radio.c]

void macRadioInit(void)

{

/* variableinitialization for this module */

reqChannel    = MAC_RADIO_CHANNEL_DEFAULT;

macPhyChannel =MAC_RADIO_CHANNEL_DEFAULT;

reqTxPower    = MAC_RADIO_TX_POWER_DEFAULT;

macPhyTxPower =MAC_RADIO_TX_POWER_DEFAULT;

}

[mac_low_level.h]

uint8macRadioRandomByte(void);

voidmacRadioSetPanCoordinator(uint8 panCoordinator);

voidmacRadioSetPanID(uint16 panID);

voidmacRadioSetShortAddr(uint16 shortAddr);

voidmacRadioSetIEEEAddr(uint8 * pIEEEAddr);

voidmacRadioSetTxPower(uint8 txPower);

voidmacRadioSetChannel(uint8 channel);

voidmacRadioStartScan(uint8 scanType);

voidmacRadioStopScan(void);

voidmacRadioEnergyDetectStart(void);

uint8 macRadioEnergyDetectStop(void);


http://www.61ic.com/Article/MSP430/ZigBee/201104/33311.html(发射功率)原文如下:

CC2530 控制输出功率的寄存器是 TXPOWER:

推荐功率设置:

协议栈默认的设置是 0xd5,为了扩展信号传输的距离,我把TXPOWER寄存器值改为0xf5, 此时输出功率为4.5dBm.在mac_radio.c文件,做了如下修改:

void macRadioSetTxPower(uint8 txPower)
{
halIntState_t s;

/* if the selected dBm is out of range, use the closest available */
if (txPower > MAC_RADIO_TX_POWER_MAX_DBM)
{
txPower = MAC_RADIO_TX_POWER_MAX_DBM;
}

/*
* Set the global variable reqTxPower. This variable is referenced
* by the function macRadioUpdateTxPower() to write the radio register.
*
* A lookup table is used to translate the power level to the register
* value.
*/
HAL_ENTER_CRITICAL_SECTION(s);
reqTxPower = macRadioDefsTxPowerTable[txPower];
HAL_EXIT_CRITICAL_SECTION(s);

/* update the radio power setting */
//************** 自己修改 ******* 
reqTxPower = 0xF5;
//******************************* 
macRadioUpdateTxPower();
}

由于没有找到哪里调用了函数 macRadioSetTxPower(uint8 txPower),我也就没法修改它的形参。于是,我采用在函数中直接赋值的办法进行了修改,如上面红色部分所示。(我自己的修改方式是在osal_start_system()函数之前添加TXPOWER = 0xF5;

转自:http://blog.csdn.net/ssou_1985/article/details/12974513(接收灵明度)

一、如何使用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位的缘故。


你可能感兴趣的:(zigbee)