This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

删除UI,使用TI Zigbee 3.0协议栈快速进入产品开发模式

Guru 58556 points
Other Parts Discussed in Thread: Z-STACK, CC2530, CC2538, CC2531

大家好,最近收到很多用户的反馈,在学习使用TI的Zigbee 3.0协议栈Z-Stack 3.0.1过程中,需要花较长的时间来了解和熟悉协议栈例程中UI的操作,而这个UI在将来的实际产品中,又不会使用到,反而给Zigbee 3.0的学习和入门增加的难度。

TI设计这个UI的初衷其实很简单,为了让大家能够在下载安装协议栈以后,能够使用例程在TI开发板上快速演示Zigbee 3.0的所有feature。 另外一个原因大家都知道,在Zigbee 3.0里面增加BDB(Base Device Behavior)功能,简单来说他是一个从设备上电开始,初始化,建网,加网,发现其他应用匹配的设备,绑定,到最后能够使用的一些过程的集合,内容包含很多状态机的转换。这个BDB好处在用户不需要太关注设备怎么家网,怎么匹配,怎么绑定,都是有这个BDB完成。之所有他有了这么强大的功能,往往就会有很多可以配置的参数,比方说设备是做建网还是加网,设备在哪个信道或者哪组信道上建网加网,设备是否需要支持touchlink 功能,设备是否在加网完成以后启动匹配绑定过程,设备加网是否使用install code还是默认的key。这些东西如果通过UI界面的方式,通过菜单选择会使得更加简单,这个也是设计UI的另一个目的。当然这些东西抛开UI, 直接使用代码都可以实现.....

接下来,我们可以看如何把UI部分删除掉,使用代码,直接开发Zigbee 3.0产品。

1) 在TI官网,下载最新的Zigbee3.0协议栈,Z-Stack3.0. http://www.ti.com/tool/Z-STACK?keyMatch=Z-Stack&tisearch=Search-EN-Everything

2) 将协议栈安装到默认路径,位于C:\Texas Instruments\Z-Stack 3.0.1

3) 使用IAR打开工程,以CC2530上面的SampleSwitch工程为例,C:\Texas Instruments\Z-Stack 3.0.1\Projects\zstack\HomeAutomation\SampleSwitch\CC2530DB

4) 删除跟UI相关的文件,zcl_sampleapps_ui.c和zcl_sampleapps_ui.h

5)在zcl_samplesw.c文件中删除跟UI相关的代码,具体如下面的文件,只要搜索NO_UI宏定义就可以了。在IAR工程里面可以加入宏定义NO_UI或者,或者跟UI相关的代码直接删除。

6)在去掉了UI功能以后,就可以编译整个工程,没有报错就可以了。

7)如何让协调器建网,如何在建网以后去绑定设备(在上面的附件文件中通过按键实现了)

可以通过调用 bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_FINDING_BINDING); 函数选择合适的模式。

8)如何让路由或者终端设备进行加网,如何在加网以后去绑定设备

可以通过调用bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);

9)如果加网成功了,或者不成功在哪里可以知道状态?

在zclSampleSw_ProcessCommissioningStatus函数里面知道相关的状态。比方说下

case BDB_COMMISSIONING_NWK_STEERING:
if(bdbCommissioningModeMsg->bdbCommissioningStatus == BDB_COMMISSIONING_SUCCESS)
{
//YOUR JOB:
//We are on the nwk, what now?

此处表示加网成功,可以做应用上的使用,最简单的比方说LED指示,UART打印。
}
else
{
//See the possible errors for nwk steering procedure
//No suitable networks found
//Want to try other channels?
//try with bdb_setChannelAttribute

如果代码运行到这里说明加网失败了,可以在这里再次调用bdb_StartCommissioning函数进行新的加网,如果为了节省功耗,可以在这里触发一个timer事件,在timer事件触发的时候可以再调用bdb_StartCommissioning函数进行加网。
}

zclSampleSw_ProcessCommissioningStatus中除了加网的状态以外,还有建网,绑定,断网等状态的指示。

10) 设备需要在指定的信道上进行搜网,加网,需要在哪里修改?

在bdb_interface.h文件的

#define BDB_DEFAULT_PRIMARY_CHANNEL_SET                    DEFAULT_CHANLIST //BDB specification default is: 0x02108800

#define BDB_DEFAULT_SECONDARY_CHANNEL_SET (DEFAULT_CHANLIST ^ 0x07FFF800) //BDB specification default is: (0x07FFF800 ^ 0x02108800)

11)需要使用install code进行加网,

也是在bdb_interface.h文件的

#define BDB_DEFAULT_JOIN_USES_INSTALL_CODE_KEY             FALSE

基本上使用BDB的接口可以方便的完成一个设备从上电初始化,到网络里面正常工作的整个过程。具体关于BDB的工作流程,状态机的转换,请参考BDB Specification。 

http://www.zigbee.org/wp-content/uploads/2014/10/docs-13-0402-13-00zi-Base-Device-Behavior-Specification-2.pdf

谢谢!

  • 谢谢VV的分享!

  • 3.0刚出来大概是去年底今年初的时候,我一拿到就着手干掉里面的UI相关的东西了,话说这玩意需要LCD来显示,我们设备没有任何显示,怎么弄呢,放在那反而碍事,就统统删掉了。

    现在跑的好好的,只是不用install code这种费劲的方式入网(虽然后面用户扫码入网方便快捷,但是给开发带来麻烦)

  • 最近发现《Z-Stack 3.0.1》新出了个demo——《GenericApp》

    不知道这个demo是否可以当做 “纯净版” demo(没有UI的)。

    document里面没有提到这个demo。

    @VV 

  • qingquan chen said:

    最近发现《Z-Stack 3.0.1》新出了个demo——《GenericApp》

    不知道这个demo是否可以当做 “纯净版” demo(没有UI的)。

    document里面没有提到这个demo。

    @VV 

    对的,可以的。你可以拿这个例程开发自己私有的应用。但是BDB还是需要的。

  • "对的,可以的。你可以拿这个例程开发自己私有的应用。但是BDB还是需要的。"

    不能拿这个demo做标准产品吗?协议底层没有剪裁吧?

  • qingquan chen said:

    "对的,可以的。你可以拿这个例程开发自己私有的应用。但是BDB还是需要的。"

    不能拿这个demo做标准产品吗?协议底层没有剪裁吧?

    我说的私有,仅仅是指应用层上的私用,比方说你们可以定义自己应用层通信的格式,对于底层来说还是一样的,仍然按照Zigbee标准来做的。

    我说的标准是指应用层也是按照Zigbee Cluster Library来开发的,如果是这种的话参考其他的例程更为合适。

  • 感谢分享!
    另,请问下Z-satck 是用AF_DataRequest()函数发送的, Z-satck 3.0 测试不用直接使用这个函数了. 请问有BDB的发送函数来替代它吗?

    协调器掉电离网后, 如果回到掉电前的网络?


  • 也是可以使用的,BDB只是负责设备从上电开始搜网,入网,这一系列的过程,如果是做私有应用的话,通信方面还是用户可以自己实现。你可以参考GenericApp例程,适合开发私有的应用。

  • VV  你好

    我用AF_DataRequest 发送一次后,回复成功,但  osal_start_timerEx就结束了.

    抓包看是有一个错误.(在最后一个);

    3620[1].psd

    if ( events & SAMPLEAPP_TEST_EVT )

     {

       P0_0= ~P0_0;

        if ( AF_DataRequest( &zclSampleSw_DstAddr, &GenericApp_epDesc,

                          ZCL_CMD_DISCOVER_ATTRS_RSP,

                          (byte)osal_strlen( theMessageData ) + 1,

                          (byte *)&theMessageData,

                          &zclSampleSw_TaskID,

                          AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )

                         {

                            // Successfully requested to be sent.

                           OLED_ShowString(20,3,"send OK");

                          }  

        else  OLED_ShowString(50,3,"send False");

       osal_start_timerEx( zclSampleSw_TaskID,SAMPLEAPP_TEST_EVT,1500 );

       return ( events ^ SAMPLEAPP_TEST_EVT );

    请指点下.

  • 能否重新发个帖子,谢谢!如果在这个事件的处理里面,不加发送的函数,这个事件可以周期性的触发吗?
  • 目前我们就是在3.0基础上开发的,UI一开始就给全删了,不费劲,再说UI没什么用,也没TI的smartRF评估板,更是没LCD显示屏了,所以UI没什么用。所有入网操作都靠ubiqua抓包分析就可以了。

    另外,最近所有项目都迁移到最新的3.0.1协议栈了,3.0太多bug了,内存泄漏,有些地方实现有缺陷等等,建议大家还是以最新的3.0.1为基础进行开发。

  • 关于bug修复的问题,请参考下面的链接
    processors.wiki.ti.com/.../Zigbee_Known_Issues_and_Proposed_Fixes
  • 这个很给力,感谢分享,正需要
  • 请问,Z-Stack 3.0.1 需要什么版本的IAR打开,我打开协议栈例程的时候提示'.........ewp'was created by a newver version of the product and not be opened
  • EWARM 8.11.1 (8.11.1.13272) for CC2538 Wireless MCU
    EW8051 10.10.1 (10.10.1) for CC2530 and CC2531 Wireless MCU
  • 哦 好的 谢谢

  • 请问哪里可以找到UI使用说明书?
  • Z-Stack 3.0 Sample Application User's Guide.pdf

    C:\Texas Instruments\Z-Stack 3.0.1\Documents

  • 你好,我按您提供的方法删除了UI,但是测试遇到问题。用一个协调器,一个终端进行测试:第一步:协调器在KEY_CHANGE事件下添加了bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_FINDING_BINDING);终端在KEY_CHANGE事件下添加了bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING); 用抓包工具查看,协调器发出广播帧,但组网不成功。第二步,前面两处各添加NLME_PermitJoiningRequest(0xFF);用抓包工具查看,协调器组网,终端入网是成功了。在这个基础上再添加一个协调器,第二个协调器却把网络建在同一信道上。这不符合协议的要求。我从网上搜到很多解读Z-tack协议的资料,依然没有找到解决办法。我的测试场景是很简单,一个协调器带一个终端,一共两个协调器,相互不干扰,也不受外界信号影响就好了。
  • 第二个协调器却把网络建在同一信道上。这不符合协议的要求

    根據Zigbee spec基本上协调器是可以把网络建在同一信道上只要PANID不同就行了

  • 不好意思,可能是我理解错了。测试的结果是两个协调器是在同一信道上PAN ID不同。可是其他信道根本就没信号。我是希望两个协调器分别占两个信道组网的。这样可以避免传输发生碰撞。修改默认信道不能解决多个协调器同时工作会产生的竞争问题,因此我想能不能从协议栈入手解决这个问题。
  • 如果是讓Z-Stack自行從16個信道上選一個,有很大的機會是選到同一個的,除非程序介入指定