赞
踩
Zigbee是一种低功耗、短距离无线通信技术,广泛应用于智能家居领域。它为智能设备之间的互联提供了一种可靠、安全且高效的通信解决方案。利用Zigbee,我们可以构建一个灵活可扩展的智能家居系统,实现各种功能,如智能照明、温湿度监测、安全警报等。其低功耗特性还使得Zigbee设备能够长时间运行,减少了能源消耗的压力。
CC2530是一款常用的Zigbee开发板,具有出色的性能和灵活性。它基于TI的SoC(系统级芯片)设计,集成了Zigbee无线通信协议栈和丰富的外设接口。本次实验使用的是善学坊的Zigbee开发板,善学坊的开发板和资料相对较新,例程比较易于学习,质量较高,教程比较详细和全面,录制的较新。
目前网络上关于CC2530的资料很多但是比较烦杂混乱,并且Z-Stack的文档并不详细。因此,记录一下使用Z-Stack和CC2530开发一个温湿度传感器的完整过程,本次实验的系统架构如图所示。
TemperatureSensor工程源码分析
对官方的例程进行了适配,包括了开发板引脚的配置以及OLED和DHT11的驱动编写。您可以直接使用这个适配好的例程进行开发,因为CC2530的引脚相关的配置较为繁琐,为了确保成功率,我们推荐使用具备例程的开发板。在设置协调器的过程中,我们需要准备以下硬件设备:
准好好香橙派和USB-Zigbee模块后,需要将CC2531 Zigbee模块插入香橙派的USB接口上。使用命令行工具查看系统日志,以找到新连接的USB设备的串口号,以便后续使用。
dmesg | tail
在输出中,找到最近连接的USB设备的信息。通常,您会看到类似于以下内容的行:
[12345.67890] usb 1-1.2: New USB device found, idVendor=abcd, idProduct=efgh, serial=0123456789
[12345.67891] usb 1-1.2: Product: Zigbee USB Coordinator
[12345.67892] usb 1-1.2: Manufacturer: XYZ Corporation
[12345.67893] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
在这个示例中,设备路径为/dev/ttyACM0
。
记下找到的设备路径,我们稍后在配置Home Assistant的Docker Compose文件时会用到。
Docker是一种流行的容器化平台,可帮助我们快速部署和管理应用程序。我们可以按照以下步骤安装Docker环境:
首先确保您的树莓派已连接到互联网。
输入以下命令来扫描可用的WiFi网络:
sudo iwlist scan
输入以下命令来连接WiFi网络:
sudo nmcli device wifi connect <SSID> password <password>
等待几秒钟,直到网络连接成功。可以通过使用以下命令检查网络连接状态:
nmcli device status
打开终端并运行以下命令来升级您的系统软件包列表:
sudo apt-get update
在香橙派上安装 Docker,可以使用以下命令:
curl -sSL https://get.docker.com | sh
安装完成后,运行以下命令以将当前用户添加到docker用户组(可选):
sudo usermod -aG docker $USER
为了使更改生效,注销并重新登录香橙派。
安装 Docker Compose:
sudo apt-get install docker-compose
检查 Docker Compose 是否已正确安装:
docker-compose --version
docker-compose.yml
的文件,使用文本编辑器打开,并将以下内容复制粘贴到文件中:version: '3'
services:
homeassistant:
container_name: homeassistant
image: homeassistant/home-assistant:latest
restart: always
network_mode: host
volumes:
- ./config:/config
- /etc/localtime:/etc/localtime:ro
- /dev/ttyACM0:/dev/ttyACM0
devices:
- /dev/ttyACM0:/dev/ttyACM0
environment:
- TZ=Asia/Shanghai
将./config
替换为您要将Home Assistant配置文件保存的路径。
将/dev/ttyACM0
替换为您的USB-Zigbee模块的设备路径,您可以使用以下命令检查设备路径:
ls /dev/ttyUSB*
在终端中,导航到包含docker-compose.yml
文件的目录。
运行以下命令以启动Home Assistant容器:
docker-compose up -d
局域网下访问<device-ip>:8123
,在Home Assistant的Web界面中启用ZHA插件。
配置zha集成,指定Zigbee适配器的设备路径后,会发现对应的USB zigbee 适配器。
下载善学坊的TemperatureSensor工程源码分析.zip
例程,解压后使用IAR打开Z-Stack 3.0.1\Projects\zstack\HomeAutomation\SampleTemperatureSensor
。
左边的Worksapce选择EndDeviceEB
信道:Projects\zstack\Tools\CC2530DB\f8wConfig.cfg
的文件可以配置传感器终端节点的zigbee参数,其中DDEFAULT_CHANLIST
信道参数需要和Home assistant的网络设置保持一致。
端点号:修改Projects\zstack\HomeAutomation\SampleTemperatureSensor\Source\zcl_sampletemperaturesensor.h
文件中的SAMPLETEMPERATURESENSOR_ENDPOINT
宏定义,端点号改为1
zcl_sampletemperaturesensor_data.c
文件。zclSampleTemperatureSensor_Attrs[]
的数组,该数组定义了当前已经存在的属性。zclSampleTemperatureSensor_Attrs[]
数组中,添加一个新的属性定义,用于相对湿度。每个属性定义包含以下信息:
clusterID
:属性所属的簇(Cluster)ID。attrID
:属性的唯一标识符。dataType
:属性的数据类型。accessControl
:属性的访问控制权限。attrData
:属性的数据指针。CONST zclAttrRec_t zclSampleTemperatureSensor_Attrs[] = { // ... { ZCL_CLUSTER_ID_MS_TEMPERATURE_MEASUREMENT, { // Attribute record ATTRID_CLUSTER_REVISION, ZCL_DATATYPE_UINT16, ACCESS_CONTROL_READ, (void *)&zclSampleTemperatureSensor_clusterRevision_all } }, { // 相对湿度 ZCL_CLUSTER_ID_MS_RELATIVE_HUMIDITY, { // Attribute record ATTRID_MS_RELATIVE_HUMIDITY_MEASURED_VALUE, ZCL_DATATYPE_INT16, ACCESS_CONTROL_READ | ACCESS_REPORTABLE, (void *)&zclSampleTemperatureSensor_Humidity_MeasuredValue } }, };
其他的包括初始化函数、上报函数、消息处理函数等均仿造温度属性来编写即可。
完成传感器节点固件的配置后,我们需要进行编译并将固件烧录到CC2530开发板上。
安装cc-debugger的驱动后,点击Download and Debug,将固件烧录到CC2530开发板中。
首次通过CC-Debugger连接到CC2530时,需要摁下CC-Debugger上的复位键。
在HA的UI界面中,通过zigbee协调器添加新设备。
Zigbee工作流程涉及到传感器节点的加入网络、数据传输和设备管理等方面。
初始化和网络建立阶段:
Beacon Request
、Beacon
。网络加入阶段:
Join Request
、Join Response
。安全认证和密钥协商阶段:
Network Key Request
、Network Key Response
。设备通信阶段:
Data Request
、Data Response
。路由和数据转发阶段:
Route Request
、Route Response
。打开Ubiqua,添加信任中心的Link Key,抓取后才能解密zigbee报文。
// ZigBee Alliance Pre-configured TC Link Key - 'ZigBeeAlliance09' (for Centralized networks)
#define DEFAULT_TC_LINK_KEY { 0x5a, 0x69, 0x67, 0x42, 0x65, 0x65, 0x41, 0x6c,\
0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x30, 0x39 }
也可以添加HA的Network key
,进行解密。
为了更好地分析节点入网的流程,我们可以在Ubiqua中设置一个过滤器,以便只显示与ZCL和ZDP相关的报文。
Zigbee Cluster Library(ZCL)是一种标准化的协议库,用于定义和管理Zigbee网络中的应用层功能。它提供了一套通用的集群(Cluster)和属性(Attribute)定义,以及与之相关的命令(Command)和数据类型。通过使用ZCL,开发人员可以快速构建具有特定功能的设备和应用。
Zigbee Device Profile(ZDP)是一种用于设备发现、网络管理和协调器功能的协议。ZDP定义了与设备相关的管理和控制功能,例如设备加入网络、路由发现和设备描述等操作。它与ZCL协议紧密配合,共同构建了完整的Zigbee网络和应用生态系统。
在Ubiqua中,我们可以设置过滤器来仅显示与ZCL和ZDP相关的报文。通过这样的过滤器设置,我们可以聚焦于分析节点入网的流程,并更好地理解Zigbee网络中的应用层和设备管理功能。
ubiqua抓取的报文如下。
节点描述符中,传感器节点向协调器提供有关其能力和特性的信息,报文包含了节点的类型、频段支持、MAC层能力等信息。
简单描述符报文是传感器节点向协调器提供其支持的集群和属性的信息。它包含了节点支持的集群和属性的详细描述。在简单描述符响应报文中,我们可以看到Application Input Clusters List(应用层输入集群列表)包含0x0402(温度)和0x0405(相对湿度)的cluster id。初始化过程中会读取CONST zclAttrRec_t zclSampleTemperatureSensor_Attrs[]
列表,统计其中涉及到的cluster id,然后通过简单描述符发送。
之后协调器会根据获取到的简单描述符中的cluster id列表,向传感器节点发送相应属性的Configure Reporting报文。通过Configure Reporting报文,协调器告知传感器节点在报文中所定义的属性上报数据的频率和格式。
完成上述配置后,协调器就成功添加了传感器节点,HA的界面也显示设备已初始化完成,属性也与节点配置的保持一致。
节点也会不断向协调器上报温度和相对湿度的属性值,报文如下所示。
HA的传感器界面中可以看到所有的历史数据。
eternal-echo/zigbee-sensor-enddevice at tem_humi (github.com)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。