shen2008jie 发表于 2013-8-19 00:33:59

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


前些天,不断地探索,和实践中,终于解决了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
uint8name; // 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);   
    }


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


瘦网虫 发表于 2013-8-19 10:30:20

支持下,慢慢来学习。

laoliu1982 发表于 2013-8-19 10:31:52

必须顶啊,RFID确实也是一个zigbee 可以用的有意思的地方。之前就考虑了家里面的能耗和厨房的空气质量了。{:soso_e113:}

问题不大 发表于 2013-8-19 18:07:49

慢慢来学习,感谢楼主给爱好者探路

chzhewl 发表于 2013-8-19 21:20:59

膜拜下楼主:lol,请问下,arduino 在这里只做数据上传到乐联网呢还是也负责数据采集? 据了解zigbee 模块可以直接做数据采集,不知道楼主是怎么做的? 谢谢。

philhoo 发表于 2013-8-19 22:37:18

有点高端黑啊,顶。
页: [1]
查看完整版本: 乐联的开放平台,zigbee的接入使用