3.2 通信原理
一句话理解
地址找设备,端点找服务。ZigBee 通信 = 先确定发给哪台设备(网络地址),再确定发给这台设备的哪个功能(端点号),然后选一种通信方式把数据送出去。
AF 是谁?在协议栈的什么位置
AF 的全称是 Application Framework(应用框架层),它是开发者写业务代码的主要舞台。它在 ZigBee 协议栈中的位置如下:
开发者就基于 AF 这一层编写代码,实现 ZigBee 设备之间的数据通信。
AF 层通信原理
① 网络地址:先找到"哪台设备"
处于网络中的每台 ZigBee 设备都会被分配一个网络地址,用于标识设备在网络中的位置。通过网络地址就能找到对应设备——它就像设备的"门牌号"。
② 端点号:再找到"哪个功能"
前面讲过,ZigBee 3.0 用简单描述符描述特定服务,每个简单描述符有唯一的端点号。ZigBee 3.0 通信最终是发送到设备的特定服务(端点号)。
举个例子:
要发"打开"指令给智能插座
端点号:8(开关服务)
协调器要向这个插座发送"打开"指令,不能只写网络地址 0x0EF1(那只是找到设备),还必须带上端点号 8(说明把命令交给"开关"这个服务)。合起来才是完整的投递信息。
类比理解
如果你了解过远程服务器的端口号,会发现它们本质相同:网址 http://baidu.com:80 中,baidu.com 是域名(找到服务器),80 是端口号(找到 HTTP 服务)。ZigBee 里:网络地址 = 域名,端点号 = 端口号。
③ 端点号的分类
端点号取值范围 0~255:
④ 三种通信方式
ZigBee 支持 3 种通信方式:
通信前的准备:注册简单描述符
使用 AF 通信前,需要先注册简单描述符、让端点号生效(相当于把名片挂出来,别人才能找到你)。流程是:
- 创建简单描述符(上一节已完成);
- 注册这个简单描述符。
在 zcl_samplesw.c 的 zclSampleSw_Init() 初始化函数中,可以看到注册代码:
void zclSampleSw_Init( byte task_id )
{
zclSampleSw_TaskID = task_id;
// Set destination address to indirect
zclSampleSw_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
zclSampleSw_DstAddr.endPoint = 0;
zclSampleSw_DstAddr.addr.shortAddr = 0;
// Register the Simple Descriptor for this application
bdb_RegisterSimpleDescriptor( &zclSampleSw_SimpleDesc ); // ← 方式1:在 BDB 中注册
// Register the ZCL General Cluster Library callback functions
zclGeneral_RegisterCmdsCallbacks( SAMPLESW_ENDPOINT, &zclSampleSw_CmdCallbacks );
zclSampleSw_ResetAttributesToDefaultValues();
// Register the application's attribute list
zcl_registerAttrList( SAMPLESW_ENDPOINT, zclSampleSw_NumAttributes, zclSampleSw_Attrs );
// Register the Application to receive the unprocessed Foundation command/response messages
zclRegisterForMsg( zclSampleSw_TaskID );
// Register for all key events - This app will handle all key events
RegisterForKey( zclSampleSw_TaskID );
bdb_RegisterCommissioningStatusCB( zclSampleSw_ProcessCommissioningStatus );
// Register for a test endpoint
afRegister( &sampleSW_TestEp ); // ← 方式2:直接在 AF 中注册
...
}注册简单描述符有两种方法:
- 调用
bdb_RegisterSimpleDescriptor()在 BDB 中注册; - 调用
afRegister()直接在 AF 中注册。
注册完成后,就可以使用 AF 层的通信 API 收发数据了(下一节讲解)。
小结
通信三步走:① 定义名片(简单描述符)→ ② 挂出名片(注册)→ ③ 用名片交流(AF 收发 API)。
内容来源:紫甲 IoT《ZigBee 3.0 开发指南》第四部分·3.2 通信原理,原站链接
本章自测
一、单项选择题(每题 4 分,共 40 分)
AF 的全称是(A. Application Framework(应用框架层) B. Address Field(地址域) C. Authentication Function(认证函数) D. Associated Frame(关联帧)) 答案:A
在 ZigBee 协议栈分层中,位于 AF 之下、负责"数据收发、安全加密、地址管理"的是(A. NWK 网络层 B. APS 支持子层 C. MAC 层 D. PHY 层) 答案:B
关于 ZigBee 通信的寻址,下列说法最准确的是(A. 只需要网络地址就能把命令送到具体服务 B. 网络地址找设备,端点号找服务,二者合起来才是完整投递信息 C. 只需要端点号就能找到设备 D. 网络地址和端点号作用完全相同) 答案:B
在书中例子里,协调器的网络地址是(A. 0x0EF1 B. 0x0000 C. 0xFFFF D. 0x0008) 答案:B
书中把 ZigBee 的寻址与访问网页做类比,下列对应关系正确的是(A. 网络地址 = 端口号,端点号 = 域名 B. 网络地址 = 域名,端点号 = 端口号 C. 网络地址 = 协议,端点号 = 域名 D. 二者与服务器端口无关) 答案:B
端点号 0 被分配给(A. 普通用户应用 B. ZDO(ZigBee Device Object),负责设备管理、入网、绑定 C. 广播 D. 保留) 答案:B
下列端点号取值范围中,属于"保留端点、暂时不能使用"的是(A. 1~240 B. 0 C. 241~254 D. 255) 答案:C
向端点号 255 发送数据意味着(A. 只发给 ZDO B. 该设备的所有服务(简单描述符)都会收到 C. 数据被丢弃 D. 只发给输入簇) 答案:B
ZigBee 支持的三种通信方式是(A. 单播、任播、泛洪 B. 点对点(P2P)、广播、组播 C. 同步、异步、定时 D. 上行、下行、转发) 答案:B
注册简单描述符有两种方法,下列正确的是(A. 只能调用
afRegister()B. 只能调用bdb_RegisterSimpleDescriptor()C. 可调用bdb_RegisterSimpleDescriptor()在 BDB 中注册,或调用afRegister()直接在 AF 中注册 D. 不需要注册,端点自动生效) 答案:C
二、问答题(每题 20 分,共 60 分)
- 题干:用"地址找设备,端点找服务"这句话,说明 ZigBee 一次完整通信为什么必须同时带上网络地址和端点号。 参考答案要点:
- 网络地址标识一台设备在网络中的位置,相当于"门牌号 / 域名",只能找到哪台设备。
- 一台设备可能有多个端点(多个简单描述符),每个端点对应一种服务;端点号相当于"端口号",决定把数据交给该设备的哪个功能。
- 只写网络地址只找到了设备,不知道交给哪个服务;必须二者合一,才能把命令精确投递到目标端点。
- 题干:简述端点号 0~255 各取值范围的用途划分。 参考答案要点:
- 端点号 0:分配给 ZDO,负责设备管理、入网、绑定。
- 端点号 255:广播端点,发数据时设备的所有服务都会收到。
- 端点号 241~254:保留端点,暂时不能使用。
- 端点号 1~240:开发者自由使用(如 SampleSwitch 工程用的就是端点号 8)。
- 题干:使用 AF 通信前为什么要"注册简单描述符"?请写出书中归纳的通信三步流程。 参考答案要点:
- 注册相当于把"名片"挂出来,端点号才生效,别的设备才能通过它找到本端点的服务。
- 三步流程:① 定义名片(创建简单描述符)→ ② 挂出名片(注册简单描述符)→ ③ 用名片交流(调用 AF 收发 API)。
- 注册方式有两种:
bdb_RegisterSimpleDescriptor()在 BDB 中注册,或afRegister()直接在 AF 中注册。