打开Cyril3AppCoordManage.c源文件?添加如下代码:
byte Cyril3AppCoordManage_TaskID; void Cyril3AppCoordManage_Init( byte task_id ) {
Cyril3AppCoordManage_TaskID = task_id; }
UINT16 Cyril3AppCoordManage_ProcessEvent( byte task_id, UINT16 events ) {
return 0; }
在任务初始化函数中?我们仅仅将分配给任务的ID保存下来。在事件处理函数中?我们先什么也不
干。简单的返回0代表所有的事件已经处理完毕。不过即使这样?谁也不能否认它是一个有效的事件处理
函数。接着?我们在tasksArr数组里面加入Cyril3AppCoordManage_ProcessEvent这个事件处理函
数?然后在osalInitTasks函数中调用任务的初始化函数。需要注意的是?tasksArr数组里面各任务事件
处理程序的排列顺序?必须要与osalInitTasks所调用任务初始化函数的顺序一致。
我们第一个任务的添加到此就完成了。
cyril3
2010-9-09 00:03:32
[i=s] 本帖最后由 cyril3 于 2010-9-9 00:16 编辑
四、加入网络
在把我们的设备加入网络之前?我需要介绍几个概念。
1?IEEE地址?也叫64位长地址。在网络中?每一个节点都是一个具体的物理设备。每个物理设备
都是独一无二的。如何从物理上标识网络上的设备呢?我们引入了IEEE这样一个地址。IEEE地址是一个
64位地址?这个地址是直接烧写进FLASH里面的?它不会因为程序的运行而改变?每个设备都有一个独
一无二的IEEE地址?从而从物理上对设备加以区分。在PC机上?每个网卡都有一个世界独一无二的MAC
地址?道理是一样的。
2?网络地址?也叫16位短地址。当设备加入网络中以后?为了在这个网络中对节点进行标识?网络
会分配给设备一个16位短地址?以此来标识此设备在网络中的地位。类似于我们常说的IP地址。
3?ENDPOINT。很多资料将其翻译为“端点”?我们不如也这么叫。不过问题的关键不是它如何称呼?
而是如何认识它。我们来研究这样一个事实:outman在看我的帖子的同时他又使用QQ和别人聊天。假
设他的电脑IP地址为192.168.1.2。那么当他的QQ好友向他发送了一句话的时候?这个信息里面包含
了目的IP地址?所以通过TCP/TP协议可以到达outman的电脑。但是问题随之而来。当outman电脑
上的操作系统接收到此条信息时?它将把这个信息交给浏览器(我们刚才说了?他在看帖子?所以肯定开
着浏览器)呢?还是交给QQ?操作系统通过怎么样的方法作出裁决呢?显然?只通过IP地址是没有办法
决定的?所以这条消息除了包含IP地址以外?还要告诉目的机?这条消息应该交由哪个应用程序来处理。
于是端口(Port)的概念产生了。操作系统为应用程序提供了很多端口?消息由IP地址到达操作系统?再
由端口找到处理消息的应用程序。同样的道理?在ZigBee的应用程序框架里(结构图请看《深入浅出Z-Stack 2006 OSAL多任务资源分配机制》)包含了最多240个应用程序对象?每个应用程序对象在
OSAL中对应了一个任务?当网络层接收到信息以后如何决定将此信息传递给哪个任务呢?ENDPOINT决
定了传递方向?于是我们可以说ENDPOINT的作用与TCP/IP协议中的端口的作用是一样的。
4?Cluster。中文翻译为“簇”。我们如何去理解“簇”这个概念呢?当一个任务接收到消息(这里所说
的消息是指无线网络之中的数据)之后?一定会对消息进行处理。但是我们的应用肯定不会盲目的处理所
有消息?消息一定会被分门别类。“簇”代表了消息的类型?为与相同簇的消息具有相同的类型?而这个类
型可以被用户自定义。
了解了这些?我们可以考虑如何将设备加入网络中。
在我们的设备加电运行以后?设备会对网络发送广播消息请求入网?协调器确认其入网请求以后会给
它分配网络地址?此设备将会作为网络中的一个节点运行。
设备加入网络由协议栈自动完成?然而将任务作为一个ZigBee应用程序对象加入到ZigBee的应用
程序框架中是如何完成的呢?
要将任务加入网络需要在任务重做一下两件事情:
1?定义此任务作为ZigBee应用程序对象所需要的信息。
2?将这些信息注册到应用程序框架中。
接下来?我们就在我们的例子中实现它。
在Cyril3App.h中定义如下宏:
#define CYRIL3APPMANAGE_ENDPOINT 15
#define CYRIL3APPMANAGE_PROFID 0x0005
#define CYRIL3APPMANAGE_DEVICEID 0x0001
#define CYRIL3APPMANAGE_DEVICE_VERSION 0
#define CYRIL3APPMANAGE_FLAGS 0
#define CYRIL3APPMANAGE_MAX_CLUSTERS 1
#define CYRIL3APPMANAGE_CLUSTERID 1
CYRIL3APPMANAGE_ENDPOINT定义了当前任务的端点?CYRIL3APPMANAGE_PROFID和
CYRIL3APPMANAGE_DEVICEID是一些有关识别的定义?在学习实验中?我们可以任意取值。
CYRIL3APPMANAGE_DEVICE_VERSION和CYRIL3APPMANAGE_FLAGS代表了硬件版本和自定义
标志?我们定义为0?不影响我们的应用开发。CYRIL3APPMANAGE_MAX_CLUSTERS定义了当前任
务的簇数量。CYRIL3APPMANAGE_CLUSTERID是我们自定义的一个簇?ID取为1。
在Cyril3AppCoordManage.c中?我们定义如下三个全局变量: