极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3631|回复: 5

乐联的开放平台,zigbee的接入使用

[复制链接]
发表于 2013-8-19 00:33:59 | 显示全部楼层 |阅读模式

前些天,不断地探索,和实践中,终于解决了TI公司的半开源Zstack协议栈,在解读官方例程和参考一些资料后后,自己写了一个小型的通讯协议。同时也初步手工制作出一些硬件。在此写下记录和一些问题的分享记录。
先贴上一些实物图吧。


那么对于这个项目的第一篇,首先解决核心组网的问题,这里先设计小型网络的组网和控制的主要问题。

一.zigbee组网的建立,加入,等等。
这里省略一下,毕竟如果细谈zigbee就很复杂了,本来也只是懂得一些皮毛,所以就不细谈,但是要提出一些重点注意的地方。
1,编译中,防止网络因为断电而丢失,那么在zigbee编译时要加上
ZTOOL_P1MT_TASK
MT_APP_FUNC
MT_SYS_FUNC
MT_ZDO_FUNC
NV_RESTORE

其中的NV_RESTORE是比较关键的,当断电重启,能够保持其参数,加入原来的网络中。
当然在Coordinator中,其底层函数还要将重启胡的PAN_IP++中的++去掉,这样重启后,不会再重新建一个,这个问题困扰了我几个月。现在解决了。
协议栈建网后,历程中已经有自动加入网络的,但是为了安全起见,还要或者可以加上手动设置入网控制。那么其核心关键就在于:
第一种,在广播中使用Group ,这样可以让需要的设备手动加入到群组内,那么这样就相对较为安全。(即在协调器中设置KEY事件,当按下时才准加入群中,然后才能共享网络的控制以及,信息)主要涉及下面的东西:
//--------------------------------------------//
// Group Table Element
typedef struct
{
  uint16 ID;                       // Unique to this table
  uint8  name[APS_GROUP_NAME_LEN]; // Human readable name of group
} aps_Group_t;

//--------------------------------------------//新建组结构体
  aps_Group_t SampleApp_Group;//这里贴的是官方网站的例子的部分代码

//--------------------------------------------// 在任务初始化中的设置
  SampleApp_Group.ID = 0x0001;
  osal_memcpy( SampleApp_Group.name, "Group 1", 7  );
  aps_AddGroup( LightCtl_ENDPOINT, &SampleApp_Group );
//--------------------------------------------//
第二种,在协议栈中有BindingTable.c//BindingTable.h这两个文件中有专门的函数处理网络表的加入,退出,删除等
看图附件中,其函数有英文说明。



2,通过官方例程,合上述的几个关键点。那么就可以初步建立一个断电自己恢复的网络。
下面就是要解决,每一个节点(就是一个设备)的独有代号,这里叫地址。其实每一个zigbee都有唯一的16位长码。但是对于了解zigbee的人都知道网络里是使用short address的,所以在这里,就要知道每个设备的地方。
这里给出几个比较关键的东西:
  short_ddr=NLME_GetShortAddr();//本地短地址获得
  xad = NLME_GetExtAddr();//长地址获得
  //_------------------------__//下面是根据短地址发消息
  Lt_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
  Lt_DstAddr.endPoint = LightCtl_ENDPOINT;
  Lt_DstAddr.addr.shortAddr = 0x00;

  if ( AF_DataRequest( &Lt _DstAddr,
                 (endPointDesc_t *)&Lt_epDesc,
                  Lt _CLUSTERID,
                  11, tmpBuf,
                  &Lt _TransID,
                  AF_DISCV_ROUTE,
                  AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  ;
  }
  else
  {
  ;
  }
3.下面就是通信代码的协议的构成的问题。

4.就是传感器代码在zigbee中的移植,其实只要有c51代码很快就能将代码移植进去,只要注意,cc2530一般协议时38M速度,只要注意一下时序,就行。还有一点要注意:不要出现死循环判断。毕竟这个也是个小操作系统。会出现BUG。

那么zigbee的部分先说到这里,这篇只是短短的介绍一下,属于粗浅的认识,和简短的介绍。有什么说的不对的望见谅。


那么对于乐联中的一些关键使用代码,这里要感谢一下瘦网虫的指点。
//这里是乐联网的“控制设备”的自定义,设备的开始默认状态为开(1)
  UserSwitch us1 (switchLED1,"LED1",0);
  client->addUserSwitch(us1);
  UserSwitch us2 (switchLED2,"LED2",0);
  client->addUserSwitch(us2);
  UserSwitch us3 (switchLED3,"LED3",0);
  client->addUserSwitch(us3);
  UserSwitch us4 (switchLED4,"LED4",0);
  client->addUserSwitch(us4);
  UserSwitch us5 (switchROOM,"ROOM",0);
  client->addUserSwitch(us5);
  UserSwitch us6 (switchBACKT,"BACKT",0);
  client->addUserSwitch(us6);
控制设备的建立,对应的还有其处理函数。
其中ROOM是数值输入不同数值代表不同房间,zhel
这里贴一些代码下面是arduino从zigbee串口中得到信息以'\n'结尾的指令在loop()中的

while (Serial.available() > 0&&comdata_FLAG == 0) {
         comdata_one=Serial.read();
     if (comdata_one== '\n')  comdata_FLAG = 1 ;
         comdata += char(comdata_one);   
    }


算了,代码还不精简,灯精简后再编程库在发布吧。


协议栈中

协议栈中

节点2

节点2

门禁节点

门禁节点

节点

节点

乐联网控制设备

乐联网控制设备

Aduino部分代码

Aduino部分代码
回复

使用道具 举报

发表于 2013-8-19 10:30:20 | 显示全部楼层
支持下,慢慢来学习。
回复 支持 反对

使用道具 举报

发表于 2013-8-19 10:31:52 | 显示全部楼层
必须顶啊,RFID确实也是一个zigbee 可以用的有意思的地方。之前就考虑了家里面的能耗和厨房的空气质量了。{:soso_e113:}
回复 支持 反对

使用道具 举报

发表于 2013-8-19 18:07:49 | 显示全部楼层
慢慢来学习,感谢楼主给爱好者探路
回复 支持 反对

使用道具 举报

发表于 2013-8-19 21:20:59 | 显示全部楼层
膜拜下楼主,请问下,arduino 在这里只做数据上传到乐联网呢还是也负责数据采集? 据了解zigbee 模块可以直接做数据采集,不知道楼主是怎么做的? 谢谢。
回复 支持 反对

使用道具 举报

发表于 2013-8-19 22:37:18 | 显示全部楼层
有点高端黑啊,顶。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-12-11 11:12 , Processed in 0.054947 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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