一、端点(Endpoint)
1、端点基础知识
(1)、它是一个字节编号的(端点编号是0-255),数据接收和发送的基本单元,在模块通信的时候,发送模块必须指定收发双方模块的网络地址和端点。
(2)、端点要使用必须要和模块里的某个任务挂钩定义。
首先每一个端点可以看成是一个1给字节数字编号的开有一扇门的房间,数据的最终目标是进入到无线数据包指定的接收方的房间(端点);而获取无线数据的这个相关代码在任务事件处理函数中,而TI协议栈每一个层都有各自的一个任务事件处理函数,所以必须要指定在哪个任务事件处理函数来取这个无线数据包中有用的数据。
(3)、一个端点只能挂钩在一个任务上,而一个任务可以挂钩多个端点,并且端点对所有的任务是公用的,定义一个少一个。
理解:一个端点假如可以挂钩在多个任务上,那么接收模块接收到无线数据的时候,同一个端点有多个任务事件处理函数去处理,不合理;一个任务上挂钩多个端点(如6和7挂在应用层任务),发送给协调器模块的6、7端点的数据都会进入到应用层任务事件处理函数里来,仅仅做个判断到底是投递到6号房间还是7号房间就可以了。
举例:假如我们接收模块定义两个两个端点6和7,并且都挂钩在应用层,那么端点6和7就不能再被其它层定义和挂钩。如果发送方发送一个无线数据到接收模块的6号端点或者7号端点,那么数据都会进入到应用层任务的任务事件处理函数里来,最后再判断是进入到6号端点房间还是7号端点房间。
2、注册端点
(1)、在目录APP下的smartHomeApp.c文件文件中,有一个smartHomeApp_Init( byte task_id )函数,定义端点和任务的挂钩的代码就在这里。
代码的分析:
void smartHomeApp_Init( byte task_id ) //定义10号端点,并与这个模块的应用层任务挂钩
{
...
...
// Fill out the endpoint description.
//指定端点10
smartHomeApp_epDesc.endPoint = 10;
//smartHomeApp_TaskID是应用层任务ID,指定挂在哪个任务上
smartHomeApp_epDesc.task_id = &smartHomeApp_TaskID;
//添加端点描述信息
smartHomeApp_epDesc.simpleDesc
= ( SimpleDescriptionFormat_t* )&smartHomeApp_SimpleDesc;
//添加端点描述信息
smartHomeApp_epDesc.latencyReq = noLatencyReqs;
// Register the endpoint description with the AF
//调用此函数完成最终的端点注册与挂载
afRegister( &smartHomeApp_epDesc );
...
...
}
/*
smartHomeApp_epDesc是一个端点变量,是一个如下结构体类型
typedef struct
{
byte endPoint;//端点编号
byte *task_id; //挂再的任务ID的地址 Pointer to location of the Application task ID.
SimpleDescriptionFormat_t *simpleDesc;//更加详细的描述这个端点的一些情况
afNetworkLatencyReq_t latencyReq;//更加详细的描述这个端点的一些情况
} endPointDesc_t;
*/
(2) 如果同时有两个端点与应用层任务挂钩,那么一旦接收到数据,最后都会到smartHomeApp_MessageMSGCB 函数中(工程名被修改为smartHomeApp),因此我们可以针对不同端点进行区分,将外部来数据处理函数smartHome_MessageMSGCB修改如下:
static void StarryApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
if(pkt->endPoint==10)//处理由目标端点10进入的数据
{
switch ( pkt->clusterId )//簇判断,具体由哪一个簇来接收数据
{
case StarryApp_CLUSTERID:
... ...
break;
}
}
if(应该接收的目标端点B)
{
switch ( pkt->clusterId )
{
case StarryApp_CLUSTERID:
... ...
break;
}
}
... ...
}