一、单播通信理论

(1)Zigbee网络通信方式有4种:单播,广播,组播,绑定(MAC)。

(2)单播通信的特点:在Zigbee网络里,模块之间要进行通信,发射模块要明确知道接收模块的网络地址。

(3)Zigbee模块的地址特点:模块在加入网络的时候,父节点随机分配网络地址给子节点。但是协调器模块在)网络里的地址永远都是0x00。

image-20210528085917105

单播发送数据需要明确的信息: (1)目标地址 (2)目标端点与簇 (3)要发送的数据大小

应用任务层数据发送函数

该函数在GenericApp.c里的GenericApp_SendTheMessage函数里:

AF_DataRequest(
              &GenericApp_DstAddr, //目标的网络地址指针
              &GenericApp_epDesc,//端点描述符指针
              GENERICAPP_CLUSTERID,//目标簇
              (byte)osal_strlen( theMessageData ) + 1,//发送数据的大小
              (byte *)&theMessageData,//发送数据缓冲区的地址
              &GenericApp_TransID,//这是个全局变量,用来保存发送的次数
              AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );//发送路径,don't care
image-20210529101711143
image-20210528090054641

网络地址结构体

网络地址结构体就是定义在GenericApp.c前面的一个结构体变量,该类型为afAddrType_t,系统已经默认定义了一个网络地址结构体变量GenericApp_DstAddr,我们可以在GenericApp_Init()函数中,对网络地址结构体变量的成员进行赋值。

//网络地址结构体:
typedef struct
{
      union
     {
            uint16      shortAddr;//网络地址
            ZLongAddr_t extAddr; //MAC地址
     } addr;
     afAddrMode_t addrMode;//通信模式
     byte endPoint; //指定的端点
     uint16 panId;  //don't care
} afAddrType_t;
//通信模式枚举类型:
typedef enum
{
        afAddrNotPresent = AddrNotPresent,//当前不确定
        afAddr16Bit      = Addr16Bit,//单播通信模式
        afAddr64Bit      = Addr64Bit,//MAC通信模式
        afAddrGroup      = AddrGroup,//组播通信模式
        afAddrBroadcast  = AddrBroadcast//广播通信模式
} afAddrMode_t;	
image-20210529102118365

二、端点与簇

1.端点

(1)通常发送的数据要明确该数据是给接收模块的哪个任务层用的,而这个就是用端点来指定的

(2)端点是一个字节的编号,通常为定义在GenericApp.h中的一个宏。端点必须要与任务层绑定,而这个就是用端点描述符来实现的。

(3)端点描述符是一个结构体变量,该变量定义在GenericApp.c开头,我们也可以定义新的端点描述符。该结构体的类型为 endPointDesc_t,系统也默认定义了一个端点描述符GenericApp_epDesc。

(4)我们可以在 GenericApp_Init()函数中,把新的端点描述符变量赋值,使新的端点与某个任务层绑定。

//端点结构体类型:
typedef struct
{
       byte endPoint;//端点的值
       byte *task_id;  //与端点绑定的任务层ID
       SimpleDescriptionFormat_t *simpleDesc;//端点的描述信息,don’t care
       afNetworkLatencyReq_t latencyReq;//don’t care
} endPointDesc_t;	

2.簇

(1)在接收模块中,每个任务层可以对不同种类的数据采取不同的处理方式,这里的数据种类就是簇(CLUSTER)

(2)在发送模块中,簇是定义在GenericApp.h中的一个宏,我们也可以定义新的簇。

  1. 系统也默认定义了一个簇 GenericApp_CLUSTERID,在GenericApp.h中

三、 应用任务层数据发送接收API

(1)该函数为GenericApp.c中的void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )

image-20210529115258491

(2)在switch语句中可以定义对不同的簇采用不同的方式处理数据

(3)该函数中的pkt->cmd.Data就是接收数据的首地址

image-20210528090956245