dumbking 发表于 2021-7-27 00:46

zigbee单播通信

# 一、单播通信理论

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

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

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

!(https://raw.githubusercontent.com/Editblog/PicGo/main/img/20210528085917.png)

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

**应用任务层数据发送函数**

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

```c
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
```

!(https://raw.githubusercontent.com/Editblog/PicGo/main/img/20210529101718.png)

!(https://raw.githubusercontent.com/Editblog/PicGo/main/img/20210528090054.png)

**网络地址结构体**

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

```c
//网络地址结构体:
typedef struct
{
      union
   {
            uint16      shortAddr;//网络地址
            ZLongAddr_t extAddr; //MAC地址
   } addr;
   afAddrMode_t addrMode;//通信模式
   byte endPoint; //指定的端点
   uint16 panId;//don't care
} afAddrType_t;

```

```c
//通信模式枚举类型:
typedef enum
{
      afAddrNotPresent = AddrNotPresent,//当前不确定
      afAddr16Bit      = Addr16Bit,//单播通信模式
      afAddr64Bit      = Addr64Bit,//MAC通信模式
      afAddrGroup      = AddrGroup,//组播通信模式
      afAddrBroadcast= AddrBroadcast//广播通信模式
} afAddrMode_t;      
```

!(https://raw.githubusercontent.com/Editblog/PicGo/main/img/20210529102118.png)

# 二、端点与簇

## 1.端点

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

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

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

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

```c
//端点结构体类型:
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中的一个宏,我们也可以定义新的簇。

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

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

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

!(https://raw.githubusercontent.com/Editblog/PicGo/main/img/20210529115258.png)

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

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

!(https://raw.githubusercontent.com/Editblog/PicGo/main/img/20210528090956.png)

bennyt 发表于 2021-7-27 01:47

来学习一下通信标准,不错。

Wits 发表于 2021-7-27 07:10

andyup2 发表于 2021-7-27 08:33

观摩学习。。打卡

hejie127 发表于 2021-7-27 10:19

太复杂了,纯原理的真的感觉很难上手。
不知道zigbee有没有8266这样的模块化产品可以直接使用呢?
页: [1]
查看完整版本: zigbee单播通信