查看: 118323|回复: 147

[原创]奥特曼Zigbee读书日记(三)-- 设备“对话”专题(1)

[复制链接]
outman 发表于 2010-4-16 11:06:15 | 显示全部楼层 |阅读模式
前两篇的笔记基本上都在“补课”,对zigbee协议的学习做了铺垫,了解了OSAL系统的基本原理,相信仔细读过前面笔记的同学,现在看起程序来不会那么吃力了吧?--如果真的能达到这个效果,那这两天“挑灯苦读”也算没白费了。先赞自己一个,也趁机感谢下一直关心、支持我的老婆大人~(背景音:切,这个人真臭P~~~)

  接下来才回到第一篇笔记里的第1个问题--数据传输是如何实现的?到现在为止,我们还没搞清楚各个设备之间到底是怎么建立连接,怎么“说上话”的--还是个“门外汉”,对于在座的这么喜欢钻研的同学们,被人这样讲,肯定是要丢面子的。。。那就让我们一起进入无线电波的美妙世界吧。。。(怎么又是这个句型?~)

[注:本文源自www.feibit.com--“飞比”Zigbee论坛,为尊重劳动者成果,如需转载请保留此行]

10. "老王,吃了没?"--中国人老是喜欢用这样的开场白跟别人打招呼(建立连接),那zigbee设备之间呢?他们是怎么建立连接,怎么交谈的呢?
(欲知后事如何,且听下回分解。。。)
--by outman from feibit.com 2010.4.16 11:08

最近杂事太多,一直也没时间更新笔记。多怀念上学时的时光,有那么多时间可以做自己想做的事情。实在对不住还在关心我笔记的网友,评书过了12天可能也没人听了,不过我还得硬着头皮写下去,要不然连自己也对不住了。。。

当决定要做一件事情后,无论多难,我都会坚持下去,因为我相信“坚持就是一种力量”--by outman

"老王,吃了没?",多简单的一句话。之所以我们认为简单,那是因为第一,我们都是人,第二我们都说汉语。但对机器来说,这个情况这有点复杂了,因为我们要创造它的认知系统,创造它的语言。所以。。。呃。。。对不住大家了,这个问题没那么容易说清楚,要分几部分,让我们一点点地共同学习,也许这个问题10要分N个子问题了。。。

Zigbee及802.15.4是一个比较复杂的系统,TI 2430的IC对我们来说也同样陌生。那么面对这样一个“大胖子”,我们的目的是什么?--吃掉它!但是,一口能行吗?不行,不但不行,还不能那么急着下口,要先认识它,了解它,把它分解成一块块的,然后再吃掉--怎么听起来这么血腥。。。

我的想法是这样的,由应用开始,先做几个简单的程序,然后一步步深入,对协议的应用基本掌握后就进入协议底层。我的性格让我不得不把这几十K的程序彻底弄明白。。。

第一个简单的应用程序打算从TI提供的最简单例程为基础,做一个点对点的传输的例子,模拟一个人与人打招呼的过程,场景是这样的:老张(end device)遇到了(建立连接)老王(coordinator),对老王说(按下一个按键发送数据):“老王,吃了没?”(发送字符串“lao wang, chi le mei?”),老王听到这话(确认字符串是否包含“chi le mei?”)想了想(在这里,利用2430的IC温度检测功能,如果温度高于25度,则回答“吃了”,否则回答“还没有”),回答道:“吃了”(回复字符数据:"chi le")。老张听到后,点了点头(接收到数据后,输出到串口,同时,如果“吃了”LED闪烁一次,否则闪烁两次)。本实验目的是了解Zigbee设备的基本通信原理、Zstack的常用API及串口的基本应用,可以在任意至少有一个按键及LED的“最小化”实验板中运行。

--by outman from feibit.com 2010.4.27 22:35 (下次更新只能到5.1后了)

4月份湖北还在下雪,今天重庆又开始刮龙卷风了。不知道2012来了,到底要发生什么???不管发生什么,我能做的只是继续做自己喜欢做的事情,如果真的有那么一天,最应该做的事倒是应该提前几天回去陪陪父母。。。

时间过得太快了,这一个多周的业余时间基本都花在“老王,吃了没”一句话上了,连个理发的时间都没挤出来~~让这个笨机器说话还真不是件容易的事~~~不过,如果手头有开发板,而且也成功做过“点对点”数据传输例程的同学,可以不用那么痛苦,直接改下面这两个地方,把一个字节的数据传输,改成传输字符串就OK了

[子问题]10.1、我已经实现了点对点的单字符传输,如何在两个zigbee设备中传输字符串数据?

1. 发送端发送点对点数据的函数(具体在哪就不用我教了吧?)
  char say_hello[] = "lao wang, chi le mei?";

  if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
                       SAMPLEAPP_PTOP_CLUSTERID,
//                       1,
//                       (uint8*)&SampleAppPeriodicCounter,
                       (byte)osal_strlen( say_hello) + 1,
                       (byte *)&say_hello,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )

看到其中改掉的两行了吧?其中数据长度“1”改为“say_hello”的数组长度,而数据内容改为"lao wang, chi le mei?"

2.接收端的“APP任务”的,AF_INCOMING_MSG_CMD事件(XXX_MessageMSGCB)中,在对应的“CLUSTERID”下面增加:
rec_msg = pkt->cmd.Data;
UART_Send_String(rec_msg,pkt->cmd.DataLength);

这样,就从接收到的数据包“pkt”中,提取了从发送端送出的字符串的内容和长度,UART_Send_String是串口数据的发送函数,感兴趣的同学,我会在后面详细介绍。


/********************************************************/
先休息一下,下面是广告时间~~
英语里有个短语叫“reinventing the wheel”,大多数人用这句话告诉别人,轮子别人已经发明好了,不用再重新发明了。不过我要说的是,对于学习,最有效和最深入的方式就是“reinventing the wheel”!-- by outman from feibit.com

802.15.4和TI的2430和Zstack这几个大轮子我们是暂时没有机会去“reinventing”了,真希望中国有点良知的教授们抽出点赚钱的时间去做点这样的事情,虽然是个“re-”,但是至少不至于让俺们这些小工程师天天围着别人的轮子转。。。跑题了~~~

不过,除了底盘那几个大轮子,变速箱里的小齿轮,我们还是可以玩一玩滴~~既然不能从零,那我们就从壹(TI提供的“库”)开始,完成上面“吃饭了没”的简单应用。
[子问题]10.2、如何用TI提供的库函数实现基本的点对点数据传输?

首先,我们来剖析一下TI Zstack 2006中的基本通信例程“GenericApp”中的文件,区别开“应用”与“库”(我暂时把在GenericApp中所有TI提供的函数,都叫做“库”,不去理会,只关心我们的“应用”),然后从零开始建立一个IAR的工程,编译并在板子上仿真。

老规矩,先上图吧~


在这个例程里,除了APP这个文件夹是用来存用户程序的,其他都是由Zstak提供的,APP里有三个文件GenericApp.c(用户程序)、GenericApp.h(用户程序头文件)和OSAL_GenericApp.c(用户程序与OSAL交互程序),三个文件不复杂吧?
又有同学举手了?什么?文件里面的内容太复杂了?
我们来看看,GenericApp.c有五、六百行,这也算复杂??那好吧,待会我们把它全删了,只留一个按键,一个LED,保证程序干干净净--中国人“奇强”

再来看下这个例程在硬盘里的文件结构,到底哪些是我们需要的?



晕了没?恩,我也有同感,那我们就不看这么复杂的图了,看这个



这个是不是舒服点?这个就是按照我们最小化程序的需要,整理过的所有用得到的文件。其中,只有BeginApp这一个文件夹是我们的用户程序,后面4个全部是TI提供的,我们暂时不去动它。而且项目中已经删除了“EB”“BB”的内容,只保留了“DB”。

有同学要问了,为什么选“DB”,而不是其他的?说实话,到现在我也没仔细研究TI这三个板子对应的软件的具体差异,但是从直观图片来看(请参见日记一中的图片),DB不大不小,应该正好符合我们的要求--不要砸我啊~~~

已经有人等不及了,现在我们就开始看看这个最小化项目是怎么一步步来的吧?
-- by outman from feibit.com 2010.5.6 17:54  其实还没下班,不过我决定等回家以后再写了~~

1. 首先,建空文件夹命名为BeginApp,再在其中建一个名字一样的文件夹专门用来我们自己的内容,进入其中,再建“IAR Project”文件夹用来存放IAR的项目文件。

2. 建一个空的IAR项目,取名BeginApp并保存至“IAR Project”文件夹。详细过程我在这就不赘述了,请参见附件“IAR入门”


后面的工作可是要有点耐性,但我觉得每个用IAR学Zigbee的人都应该做一遍,花费半个小时,虽然说没什么技术含量,但是会让你对你一直在用的IAR项目有个全新的认识,而且能和Zstack的文件先混个“眼熟”。。。

3. 详细设置项目参数。打开GenericApp的项目文件,workspace中选择CoordinatorDB,project==>option,打开项目参数设置窗口;同时打开新建的BeginApp项目,在workspace中选择debug,用同样的方法进入参数设置窗口。剩下的就是一项一项地按照GenericApp的设置进行修改啦,这个一定要仔细,如果有一项不对应,可能编译就会有问题。

4. 当你改到有文件路径的地方,比如“C/C++ compiler ==> preprocessor”,这个时候,先跳过去,把其它改好再回来改这个。因为这些地方都是编译器要寻找文件的地方,我们必须要确保里面指定的文件在硬盘的文件夹里能找得到,否则编译会出错。同时,这些地方也告诉我们这个项目到底用到了哪些文件,增加了我们对项目全局的了解。

例如,如上的“preprocessor”中:
$PROJ_DIR$\..\SOURCE
$PROJ_DIR$\..\..\..\ZMAIN\TI2430DB
$PROJ_DIR$\..\..\..\..\..\COMPONENTS\MT
...

在如上的路径中,$PROJ_DIR$指的是IAR的工程文件夹,就是上面我们建的“IAR Project”,“\..”是代表向上一级,那么我们就找到SOURCE、ZMAIN和COMPONENTS这三个必须的文件夹,把SOURCE拷到二级BeginApp文件夹中,另外两个拷到一级BeginApp根目录下,同时上述相应的文件夹位置也要按照新的结构来更改,如$PROJ_DIR$\..\..\..\ZMAIN\TI2430DB就要改为$PROJ_DIR$\..\..\ZMAIN\TI2430DB,以此类推。注:这个文件夹的命名和位置都是不固定的,完全可以按照你的想法来做,我这样命名的目的只是为了区别TI的“库”和我们的“应用”。

另外,在“C/C++ compiler ==> extra options”中,我们又找到了“tools”;在“linker ==> extra options”中我们又找到了这个Libraries,这两个必须的文件夹,也拷到一级BeginApp根目录下。好了,至此,项目需要的文件我们已经按照自己喜欢的方式排列好啦~~~

5. 这一步是最麻烦的,就是按照“GenericApp”里“workspace”下的文件夹和文件一个个添加文件了。这中间遇到“EB”的我们可以不管,因为我们用的是“DB”。

6. 编译。如果上面工作做得仔细,这一步应该是一次性成功。但是又有一个问题:虽然编译成功了,但是我们编译出来的结果和原来的是不是一样的呢?(毕竟我们第一步的目的是造一个一模一样的轮子~~)
code size!对,如果编译的代码大小一样的话,那基本上能保证完全相同了吧?
那code size及RAM的使用情况等信息在哪里找得到呢?
\BeginApp\BeginApp\IAR Project\Coordinator\List这里面有个“BeginApp.map”文件,打开它,在最底部看一下

                ****************************************
                *                                      *
                *        END OF CROSS REFERENCE        *
                *                                      *
                ****************************************

74 598 bytes of CODE  memory
     18 bytes of DATA  memory (+ 67 absolute )
  3 627 bytes of XDATA memory
    192 bytes of IDATA memory
      8 bits  of BIT   memory

Errors: none
Warnings: none
就是这里啦,对比一下是不是和原来的一样就OK啦~

7. 增加自己的“应用”,在source文件夹中,仿照GenericApp里的源文件,增加三个文件BeginApp.c/BeginApp.h/OSAL_BeginApp.c,然后写自己想写的东西罗~
做为最原始的程序,本教程中,采用了一个按键(P0_0)来控制一个LED(P2_0),按一次取一次反。当然,由于开发板的差异性,这个具体的IO定义要根据您的硬件进行修改了。

8. 运行,把上面的程序下载到你自己的板子中,看到LED在“眨眼”了吗~~~

至此,我们就有了一个属于自己的“最小化”项目了,回想一下这个项目里的文件,是不是觉得比看别人给做好的更清爽了呢?

由于本教程不是单片机的入门教程,至于“应用”中的源代码就不再累述了,回头把我做好的整个项目文件共享出来,需要的请自行下载,不过记得雁过留名哦!

配插图一张

本帖子中包含更多资源

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

x
ximaoyoyo 发表于 2010-4-20 10:37:20 | 显示全部楼层
顶了outman,很有帮助了。谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
DDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDD
qianxiao 发表于 2010-4-20 15:09:23 | 显示全部楼层

加油啊!
很感谢你!
 楼主| outman 发表于 2010-4-20 22:38:08 | 显示全部楼层
有了大家的鼓励,我会继续写下去的


[特别提醒:]由于本教程写得时间比较久,是基于CC2430和ZStack 1.4.3-1.2.1平台的,里面提到的个别函数可能在最新的协议栈里无法对应,但读者可参考基本思路,这是没有太大变化的。我们会在FIT1000系列物联网实验箱的资料里对这部分内容进行更改,敬请关注。
小猴子 发表于 2010-4-27 19:15:24 | 显示全部楼层
下回分解咋还没有见呢???
 楼主| outman 发表于 2010-4-27 19:55:46 | 显示全部楼层
对不住大家了,最近杂事太多.一直到5.1才有时间,多谢关注.我尽快更新!
 楼主| outman 发表于 2010-4-28 23:06:02 | 显示全部楼层
更新了一下后面的思路,希望大家拍砖~
sdphome 发表于 2010-4-29 14:05:33 | 显示全部楼层
拍砖的继续啊。。哈哈哈。。
小猴子 发表于 2010-4-30 21:29:10 | 显示全部楼层
楼主,希望能结合下串口,不要只用闪烁灯来表现,与PC连接后,用串口调试助手显示下,这样很直观~~
 楼主| outman 发表于 2010-4-30 23:38:19 | 显示全部楼层
楼主,希望能结合下串口,不要只用闪烁灯来表现,与PC连接后,用串口调试助手显示下,这样很直观~~
小猴子 发表于 2010-4-30 21:29


这个主意不错,不过这样大家可能就需要多等两天了,串口我也需要从头学起。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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