brahen 发表于 2012-6-29 11:48:28

关于z-stack和它的简易版api的疑问

本帖最后由 brahen 于 2012-6-29 11:51 编辑

6月初的时候,部门老大让我去搞zigbee。一开始我是很热心的,实习生嘛,求早出成绩早转正。。从芯片选型,其实也就是几家的产品,ember,jennic,ti等。
结果老大选了ti的芯片,原因就是51内核,而且相比之下比较便宜。废话多了。

入正题。
目前全公司就我一个人围着这东西转,入门大概花了一个星期,其实可以更短,只是一个人像无头苍蝇一样撞得多了。
现在的情况是,单播,群播,广播均可以实现了。可是说好的高级特性呢。。。。网状网,自恢复等等等等。说真的,我不知道从何开始,看了整套的api(非sapi),并没有发现实现以上特性的api。
还是说,这个是z-stack自己实现的?看了z-stack的开发者手册,说得挺美,仿佛一下子都看明白了,可是动手编程,又是另一回事。

关于短地址。
加入zigbee网络的设备会由coordinator 或者 router 分配短地址,这个我从debugger里面看到了,确实是随机分配的。
但是,开发者手册里面说道,要给一个zigbee设备发送信息,需要指定目标的短地址和endpoint 号(endpoint号暂时不理),既然是随机分配的,那我怎么知道刚加入设备的短地址,然后给它发信息?我觉得我已经遇到死循环了。然后,短地址不是网内唯一的吗?为什么加一个endpoint号?

关于长地址。

第一个在代码里看到这个差点背过气去。64位的扩展地址居然和短地址存在同一个union里!这部是坑爹么?
首先一点是确定的,照片里的扩展地址与ieee的64位地址肯定不是同一个东西,不然短地址一变,扩展地址也会变。通过ti的下载软件读取,真正的ieee地址妥妥的是不会随便变的。
那这个扩展地址,又是用来做什么的?

关于endpoint。
我所谓的单播成功,实际上是广播的时候,指定一个设备的endpoint号,而注册在该endpoint号下的,仅有一个设备。。。。。
因为我无法在程序编写的时候,就给一个设备分配短地址,所以真正意义上的单播还没有实现。
而关于这点,手册说,每一个zigbee设备都是一个节点,一个节点自身既是另一个临近节点的endpoint端,对外也可以注册240个endpoint。那么在父节点不同的情况下,如果endpoint号相同,有什么影响?

关于绑定。

文中说道,绑定允许设备在不知道目标设备的地址的前提下给它发送数据,原因在于aps层会自动在绑定列表里寻找目标的地址。好像挺智能,可是问题是,如果我要向某个特定的设备发消息,前提我本人肯定不知道它的短地址,尽管绑定列表里存了一大堆,可是系统也不知道我想发送的目标是谁?它只是知道自己手里有多少个设备绑定了。

关于简易版api
这个其实没怎么用过,所以不知道简易版的api和自己老老实实一点一点查N组api去写有什么区别?会不会导致功能的缺失?

以上问题,希望能跟有做过zigbee的各位一起探讨一下。

brahen 发表于 2012-6-29 14:18:10

zigbee果然是小众啊,没有什么动力了。。。。。。

sanbin 发表于 2012-6-29 16:03:36

本帖最后由 sanbin 于 2012-6-29 16:04 编辑

1、那我怎么知道刚加入设备的短地址,然后给它发信息?
      短地址的分配其实他固定的算法的,不完全算是随机分配。想知道对方的短地址可以采用服务发现或者绑定的方式。两种其实现起来原理差不多。
2、短地址不是网内唯一的吗?
   是唯一的
3、为什么加一个endpoint号?
   加端点号的作用在于可以使一个节点上运行多项服务,一个服务或者说是应用程序注册一个端点。类似tcp/ip协议中的端口号,一个应用程序使用这个端口号,另一个应用程序可以使用另一个端口号。
4、 64位的扩展地址居然和短地址存在同一个union里
    节省内存空间啊
5、一个节点自身既是另一个临近节点的endpoint端,对外也可以注册240个endpoint。那么在父节点不同的情况下,如果endpoint号相同,有什么影响?
   没影响,通讯的时候是采用短地址或长地址+端点号来对节点上的服务进行访问的。而每个节点的地址都是不同的,互不干扰。
6、如果我要向某个特定的设备发消息,前提我本人肯定不知道它的短地址,尽管绑定列表里存了一大堆,可是系统也不知道我想发送的目标是谁?
   绑定完成后,设备会在把对方的地址写入绑定表。发送数据时,设备会在自身绑定表内查找具有相应服务(clusterid,endpoint)的地址,并将数据向该地址发送。向知道该地址可以调用api去读取绑定表中的数据。

brahen 发表于 2012-6-30 08:53:52

非常感谢楼上的回复。
1、2均能理解。
3、我一直以为区分应用程序是用cluster id的。个人感觉cluster id是个挺抽象的东西。不知道你怎么看。
4、确实有节省内存的作用。可以这样,低16个bit的短地址一变化的话,那么扩展地址不是也变了?我记得文档里把扩展地址、长地址和ieee地址均说是同一个东西。
6、去查看了存储绑定信息的结构体,确实存在cluster id等信息,或许真的有某种方法实现。我回头再看看。

sanbin 发表于 2012-7-1 09:47:39

3区分应用程序的是端点,不是clusterid。我觉得clusterid不过就是个方便对消息类型进行分类的一个标志,比如说我自定义两个clusterid,一个用来传温度,一个用来传湿度。接收方收到不同的clusterid立马知道是什么类型的数据了。

4那个是一个在发送数据时才用到的临时变量类型,可以根据具体目标地址类型进行填充。

brahen 发表于 2012-7-3 14:40:25

sanbin 发表于 2012-7-1 09:47 static/image/common/back.gif
3区分应用程序的是端点,不是clusterid。我觉得clusterid不过就是个方便对消息类型进行分类的一个标志,比 ...

非常感谢,我对zigbee的疑惑慢慢地解开了。

lanzhihai118 发表于 2012-7-3 19:48:08

本帖最后由 lanzhihai118 于 2012-7-3 19:53 编辑

做zigbee的顶一下! 呵呵 lz研究的很细啊,三楼是行家 学习了~~
页: [1]
查看完整版本: 关于z-stack和它的简易版api的疑问