Skip to content

3.2 通信原理 ​

一句话理解

地址找设备,端点找服务。ZigBee 通信 = 先确定发给哪台设备(网络地址),再确定发给这台设备的哪个功能(端点号),然后选一种通信方式把数据送出去。

AF 是谁?在协议栈的什么位置 ​

AF 的全称是 Application Framework(应用框架层),它是开发者写业务代码的主要舞台。它在 ZigBee 协议栈中的位置如下:

📚 ZigBee Cluster Library(ZCL)—— 通用语言
规定设备功能的标准描述,与 AF 平级配合使用
▲ ▾
🧩 Application Framework(AF)—— 业务舞台(本章主角)
包含 ZigBee Device Objects(ZDO,端点0)、设备应用端点1~240
▲ 数据从这里往下送 ▾
📮 Application Support Sub-layer(APS)—— 翻译+门卫
数据收发、安全加密、地址管理
▲ ▾
🗺️ Network Layer(NWK)—— 快递调度中心
组网、路由、投递
▲ ▾
🚦 IEEE 802.15.4:MAC Layer —— 交通警察
有序使用无线电资源
▲ ▾
📡 IEEE 802.15.4:PHY Layer —— 无线电收发员
数据 ↔ 电磁波

开发者就基于 AF 这一层编写代码,实现 ZigBee 设备之间的数据通信。

AF 层通信原理 ​

① 网络地址:先找到"哪台设备" ​

处于网络中的每台 ZigBee 设备都会被分配一个网络地址,用于标识设备在网络中的位置。通过网络地址就能找到对应设备——它就像设备的"门牌号"。

② 端点号:再找到"哪个功能" ​

前面讲过,ZigBee 3.0 用简单描述符描述特定服务,每个简单描述符有唯一的端点号。ZigBee 3.0 通信最终是发送到设备的特定服务(端点号)。

举个例子:

🏛️
协调器
网络地址:0x0000
要发"打开"指令给智能插座
➡️
🔌
智能插座(终端)
网络地址:0x0EF1
端点号:8(开关服务)

协调器要向这个插座发送"打开"指令,不能只写网络地址 0x0EF1(那只是找到设备),还必须带上端点号 8(说明把命令交给"开关"这个服务)。合起来才是完整的投递信息。

类比理解

如果你了解过远程服务器的端口号,会发现它们本质相同:网址 http://baidu.com:80 中,baidu.com 是域名(找到服务器),80 是端口号(找到 HTTP 服务)。ZigBee 里:网络地址 = 域名,端点号 = 端口号。

③ 端点号的分类 ​

端点号取值范围 0~255:

🛠️
端点号 0
分配给 ZDO(ZigBee Device Object),管设备管理、入网、绑定
📢
端点号 255
广播:向这个端点发数据,设备的所有服务(简单描述符)都会收到
🔒
端点号 241~254
保留端点,暂时不能使用
🧩
端点号 1~240
开发者自由使用。如 SampleSwitch 工程用的就是端点号 8

④ 三种通信方式 ​

ZigBee 支持 3 种通信方式:

1️⃣
点对点(P2P)
一对一:只发给指定那台设备(Peer to Peer)
·
2️⃣
广播
一对所有:发给网络中的全部设备
·
3️⃣
组播
对一组:只发给特定"组"里的设备(如客厅的灯)

通信前的准备:注册简单描述符 ​

使用 AF 通信前,需要先注册简单描述符、让端点号生效(相当于把名片挂出来,别人才能找到你)。流程是:

  1. 创建简单描述符(上一节已完成);
  2. 注册这个简单描述符。

在 zcl_samplesw.c 的 zclSampleSw_Init() 初始化函数中,可以看到注册代码:

c
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 中注册
  ...
}

注册简单描述符有两种方法:

  1. 调用 bdb_RegisterSimpleDescriptor() 在 BDB 中注册;
  2. 调用 afRegister() 直接在 AF 中注册。

注册完成后,就可以使用 AF 层的通信 API 收发数据了(下一节讲解)。

小结

通信三步走:① 定义名片(简单描述符)→ ② 挂出名片(注册)→ ③ 用名片交流(AF 收发 API)。

内容来源:紫甲 IoT《ZigBee 3.0 开发指南》第四部分·3.2 通信原理,原站链接


本章自测 ​

一、单项选择题(每题 4 分,共 40 分) ​

  1. AF 的全称是(A. Application Framework(应用框架层) B. Address Field(地址域) C. Authentication Function(认证函数) D. Associated Frame(关联帧)) 答案:A

  2. 在 ZigBee 协议栈分层中,位于 AF 之下、负责"数据收发、安全加密、地址管理"的是(A. NWK 网络层 B. APS 支持子层 C. MAC 层 D. PHY 层) 答案:B

  3. 关于 ZigBee 通信的寻址,下列说法最准确的是(A. 只需要网络地址就能把命令送到具体服务 B. 网络地址找设备,端点号找服务,二者合起来才是完整投递信息 C. 只需要端点号就能找到设备 D. 网络地址和端点号作用完全相同) 答案:B

  4. 在书中例子里,协调器的网络地址是(A. 0x0EF1 B. 0x0000 C. 0xFFFF D. 0x0008) 答案:B

  5. 书中把 ZigBee 的寻址与访问网页做类比,下列对应关系正确的是(A. 网络地址 = 端口号,端点号 = 域名 B. 网络地址 = 域名,端点号 = 端口号 C. 网络地址 = 协议,端点号 = 域名 D. 二者与服务器端口无关) 答案:B

  6. 端点号 0 被分配给(A. 普通用户应用 B. ZDO(ZigBee Device Object),负责设备管理、入网、绑定 C. 广播 D. 保留) 答案:B

  7. 下列端点号取值范围中,属于"保留端点、暂时不能使用"的是(A. 1~240 B. 0 C. 241~254 D. 255) 答案:C

  8. 向端点号 255 发送数据意味着(A. 只发给 ZDO B. 该设备的所有服务(简单描述符)都会收到 C. 数据被丢弃 D. 只发给输入簇) 答案:B

  9. ZigBee 支持的三种通信方式是(A. 单播、任播、泛洪 B. 点对点(P2P)、广播、组播 C. 同步、异步、定时 D. 上行、下行、转发) 答案:B

  10. 注册简单描述符有两种方法,下列正确的是(A. 只能调用 afRegister() B. 只能调用 bdb_RegisterSimpleDescriptor() C. 可调用 bdb_RegisterSimpleDescriptor() 在 BDB 中注册,或调用 afRegister() 直接在 AF 中注册 D. 不需要注册,端点自动生效) 答案:C

二、问答题(每题 20 分,共 60 分) ​

  1. 题干:用"地址找设备,端点找服务"这句话,说明 ZigBee 一次完整通信为什么必须同时带上网络地址和端点号。 参考答案要点:
  • 网络地址标识一台设备在网络中的位置,相当于"门牌号 / 域名",只能找到哪台设备。
  • 一台设备可能有多个端点(多个简单描述符),每个端点对应一种服务;端点号相当于"端口号",决定把数据交给该设备的哪个功能。
  • 只写网络地址只找到了设备,不知道交给哪个服务;必须二者合一,才能把命令精确投递到目标端点。
  1. 题干:简述端点号 0~255 各取值范围的用途划分。 参考答案要点:
  • 端点号 0:分配给 ZDO,负责设备管理、入网、绑定。
  • 端点号 255:广播端点,发数据时设备的所有服务都会收到。
  • 端点号 241~254:保留端点,暂时不能使用。
  • 端点号 1~240:开发者自由使用(如 SampleSwitch 工程用的就是端点号 8)。
  1. 题干:使用 AF 通信前为什么要"注册简单描述符"?请写出书中归纳的通信三步流程。 参考答案要点:
  • 注册相当于把"名片"挂出来,端点号才生效,别的设备才能通过它找到本端点的服务。
  • 三步流程:① 定义名片(创建简单描述符)→ ② 挂出名片(注册简单描述符)→ ③ 用名片交流(调用 AF 收发 API)。
  • 注册方式有两种:bdb_RegisterSimpleDescriptor() 在 BDB 中注册,或 afRegister() 直接在 AF 中注册。

aioteer · 物联网专业课程群

💬AI 伴学配置