查看: 8650|回复: 15

Tree型组网的代码实现以及mesh型组网的困惑

[复制链接]
hellolwp 发表于 2012-8-20 21:37:57 | 显示全部楼层 |阅读模式
前一周在忙一个小项目,在已有的CC2530板子上实现簇树形组网和数据发送。使用的是sensordemo的例程,对代码做了一些改动,更多的硬件接口层的修改,下面附上详细过程,希望对大家能有参考作用。

之前先说说自己的几个困惑,希望能有高手指点,要是outman能出来指教一下小弟那就更好啦,嘿嘿{:soso_e112:}
1.sensordemo貌似是给CC2530用的,CC2430能用么?如果不能,还有其他适用cc2430的demo么?
2.实现的树型网络按照sensordemo必须通过按键来允许或者禁止子节点的加入,子节点能自动选择么?
3.mesh型组网在代码中怎么实现呢?

一.关于SensorDemo
首先打开SensorDemo例程。
该例程在数据传输控制上采用绑定机制,可构成簇树型网络拓扑。网络有一个协调器(Collector),若干个路由器(        Router),若干个终端传感器(Enddevice)组成。首先协调器打开,建立网络并接受其他设备加入。然后路由器开启,并选择网络加入。最后终端加入网络并周期性发送传感数据。在SensorDemo例程中,通过摇杆joystick的UP,DOWN,LEFT,RIGHT分别来控制FFD的角色选择,周期发送报告,允许/禁止加入网络,允许绑定。在树形组网的过程中,按照顺序控制这些按键,可以顺利完成簇树型网络拓扑的建立。(具体步骤详见CC2530ZDK_Sensor_Demo_Users_Guide)例程提供了簇树型组网的方法实现和程序框架,但是其对应的硬件板和我所用的zigbee板子不同。我使用的板子没有joysticks,只有2个LED灯,只有2个按键K1,K2,没有LCD显示屏,所以原demo中的一些按键控制的功能必须要在程序中自动实现,并且要改写硬件接口层大HAL的硬件接口定义,以符合现有板子的实际。

二.代码实现
具体要修改的文件如下:
hal_board_cfg.h
hal_board.h
hal_led.h
hal_key.h
hal_key.c
sapi.c
DemoSensor.c
DemoCollector.c
接下来对各文件的修改作说明
1. sapi.c文件
在SAPI_Init()函数中根据FFD的角色(协调器或是路由器),自动开启或者关闭绑定匹配功能。具体实现如下:
打开SensorDemo工程,在Project菜单下找到Edit Configurations,进去之后点击New按钮,弹出New Configuration对话框,如下图所示填写,点击OK:


这是时建立的RouterEB跟CollectorEB的配置是完全相同的。
选择CollectorEB配置,打开Options选项,在Defined Symbols那里加多一个编译选项:MY_TYPE_COLLECTOR
在sapi.c文件的 SAPI_Init()函数,找到下面语句:

afSetMatch(sapi_epDesc.simpleDesc->EndPoint, FALSE);

修改为:

#ifdef MY_TYPE_COLLECTOR
afSetMatch(sapi_epDesc.simpleDesc->EndPoint, TRUE);//FALSE
#else
afSetMatch(sapi_epDesc.simpleDesc->EndPoint, FALSE);//FALSE
#endif

2. DemoCollector.c文件
在void zb_HandleOsalEvent( uint16 event )函数中,
将if( event & ZB_ENTRY_EVENT )内的代码修改为以下内容:
if( event & ZB_ENTRY_EVENT )
{
// blind LED 1 to indicate starting/joining a network
HalLedBlink ( HAL_LED_1, 0, 50, 500 );
HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );

if ( appState == APP_INIT )
{
#ifdef MY_TYPE_COLLECTOR
logicalType = ZG_DEVICETYPE_COORDINATOR;
zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);
initUart(uartRxCB);
#else
logicalType = ZG_DEVICETYPE_ROUTER;
zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);

#endif
}
// Start the device
zb_StartRequest();
}
这样修改后,当设备启动后进入ZB_ENTRY_EVENT事件,将根据初始的宏定义,选择协调器或者路由器类型,并将其写入NV中。

zb_HandleKeys()函数中,注释 ( shift )下的代码,shift是按键复用的判断量,不用。将else下的HAL_KEY_SW_1,HAL_KEY_SW_2改为HAL_KEY_SW_6,HAL_KEY_SW_7,并在NLME_PermitJoiningRequest()函数后加入调试代码,显示LED亮灭。
HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );
HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );

注销if ( keys & HAL_KEY_SW_3 )和if ( keys & HAL_KEY_SW_4)代码

zb_StartConfirm()函数中
注释L CD相关的代码,并且在工程的options选项中去除LCD_SUPPORTED宏定义。

zb_ReceiveDataIndication()
同上,注释L CD相关的代码。

3. DemoSensor.c文件
zb_HandleKeys()函数中,同样注释if ( shift )代码,并在else中改成HAL_KEY_SW_6和HAL_KEY_SW_7。

zb_StartConfirm()函数中
注释LCD代码

readTemp(),readVoltage()函数中
主要研究组网,将传感器返回值写死,改为return 30; 和return 3;


4. hal_key.h文件
没有要修改的地方,该头文件中定义了keys的8位量,每一位分别对应于一个KEY,从HAL_KEY_SW_1到HAL_KEY_SW_7,分别为joysticks的5个键和预留的2个按键,这2个按键DEMO程序中没有用到,但正好我的板子上有两个控制按键,所以可以不用改变demo程序结构,直接使用这两个预留的KEY定义我们的2个按键。

5. hal_key.c文件
将#define HAL_KEY_CPU_PORT_0_IF P0IF改为HAL_KEY_CPU_PORT_1_IF P1IF

接着将HAL_KEY_SW_6和HAL_KEY_SW_7的硬件接口定义的代码全部做改写,如下:

///////////////////////////////////硬件接口改动*************************************
//SW_6做k1,SW_7做k2,不用摇杆joystick
/* 原来SW_6 is at P0.5 */           
#define HAL_KEY_SW_6_PORT   P1
#define HAL_KEY_SW_6_BIT    BV(0)  //p1_0   k1
#define HAL_KEY_SW_6_SEL    P1SEL
#define HAL_KEY_SW_6_DIR    P1DIR

/* edge interrupt */
#define HAL_KEY_SW_6_EDGEBIT  BV(1) //P1ICON   
#define HAL_KEY_SW_6_EDGE     HAL_KEY_FALLING_EDGE


/* SW_6 interrupts */
#define HAL_KEY_SW_6_IEN      IEN2  /* CPU interrupt mask register */
#define HAL_KEY_SW_6_IENBIT   BV(4) /* Mask bit for all of Port_1 */      
#define HAL_KEY_SW_6_ICTL     P1IEN /* Port Interrupt Control register */
#define HAL_KEY_SW_6_ICTLBIT  BV(0) /* P0IEN - P0.1 enable/disable bit */
#define HAL_KEY_SW_6_PXIFG    P1IFG /* Interrupt flag at source */

#define HAL_KEY_SW_7_EN     TRUE

/* 原来SW_7 is at P0.4 */
#define HAL_KEY_SW_7_PORT   P1    //p1_1   k2
#define HAL_KEY_SW_7_BIT    BV(1)
#define HAL_KEY_SW_7_SEL    P1SEL
#define HAL_KEY_SW_7_DIR    P1DIR

/* edge interrupt */
#define HAL_KEY_SW_7_EDGEBIT  BV(1) //P1ICON        
#define HAL_KEY_SW_7_EDGE     HAL_KEY_FALLING_EDGE  


/* SW_7 interrupts */
#define HAL_KEY_SW_7_IEN      IEN2  /* CPU interrupt mask register */
#define HAL_KEY_SW_7_IENBIT   BV(4) /* Mask bit for all of Port_1 */
#define HAL_KEY_SW_7_ICTL     P1IEN /* Port Interrupt Control register */
#define HAL_KEY_SW_7_ICTLBIT  BV(1) /* P0IEN - P0.1 enable/disable bit */
#define HAL_KEY_SW_7_PXIFG    P1IFG /* Interrupt flag at source */

6. hal_led.h文件
注释掉HAL_LED_3和HAL_LED_4的位定义

7. hal_board.h文件
在该文件中点击go to definition 打开hal_board_cfg.h文件

8. hal_board_cfg.h文件
修改LED1,LED2的接口定义,注释LED3的接口定义
#define LED1_BV           BV(5)   
#define LED1_SBIT         P0_5
#define LED1_DDR          P0DIR
#define LED1_POLARITY     ACTIVE_HIGH  

#define LED2_BV           BV(0)
#define LED2_SBIT         P2_0
#define LED2_DDR          P2DIR      
#define LED2_POLARITY     ACTIVE_HIGH  

在之后的文件中注释和LED3 LED4有关的所有宏函数。

最后编译整个工程,会有许多LED3,LED4的未定义的错误,通常是一些文件中的宏定义函数或者是LED灯开关或者闪烁函数中的HAL_LED_3,HAL_LED_4参数未定义,将它们改为HAL_LED_1,HAL_LED_2即可,至于灯的具体功能可根据需要设定和改变。

三.操作流程
1.打开ZigBee Sensor Monitor软件,分别将程序下载到对应的各个板子中。将协调器和电脑相连,打开电源,点ZigBee Sensor Monitor开始按钮;
2.按协调器的K1,使LED2红灯亮,此时协调器允许其他设备加入网络。每一次按下K1,LED1和LED2在亮灭之间切换;
3.打开路由器,按下K2,路由器与协调器相连,在ZigBee Sensor Monitor中也显示路由器和协调器相连;
4.打开一个终端,按下K2,终端直接和协调器相连,在上位机屏幕上也有显示;
5.此时,再次按下协调器的K1键,使LED1的绿灯亮,LED2的红灯灭,协调器禁止其他设备加入。同时按下路由器的K1键,使路由器允许其他设备加入;
6.再分别打开一个路由器和一个终端,按下K2键,发起连接,均与第一个路由器相连,而未与协调器想连,至此构成三层树形网络。
ZigBee Sensor Monitor显示图如下:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
lizheng86312 发表于 2012-8-29 11:53:12 | 显示全部楼层
学到东西了。顶。。。
zyroad 发表于 2012-8-29 20:40:06 | 显示全部楼层
学习,谢谢
wenbo1223 发表于 2012-9-13 21:12:53 | 显示全部楼层
您好 楼主 我的电路板和你的一样 按照你说的做之后发现还是不对 你能不能把你的程序发给我一份呢 在这谢谢你了 邮箱wangwenboxiaoxiao@163.com
钝尒陔 发表于 2012-11-2 23:39:23 | 显示全部楼层
也给我发一份程序吧!谢谢了{:soso_e183:}{:soso_e183:}  邮箱625247481@qq.com
D.ivine 发表于 2012-12-26 23:17:33 | 显示全部楼层
我很想知道是否能在cc2430上运行,那位大神说下,谢谢了!
星夜 发表于 2012-12-31 09:30:56 | 显示全部楼层
谢谢分享
D.ivine 发表于 2013-1-4 15:59:24 | 显示全部楼层

cc2430 上可以实现。
D.ivine 发表于 2013-1-4 16:01:01 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
yfchina2008 发表于 2013-3-7 16:02:00 | 显示全部楼层
偶像啊,也发我一份吧,邮箱1025711194@qq.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表