Zigbee/SiliconLabs解读sdk文档(1) —— Mesh网络特性

本文目的:了解zigbee的mesh网络特性,比如多跳的延时、传输距离、丢包率等,有助于评估网络的适用场景和性能是否异常。

参考官方文档:an1138-zigbee-mesh-network-performance.pdf

目录

1. 背景介绍

1.1底层物理层和数据包结构

1.2网络路由差异

2. 目标和方法

2.1其他性能测试

3. 测试结果

3.1 测试配置

4. 总结


1. 背景介绍

1.1底层物理层和数据包结构

网络性能基于有效载荷大小,因为应用程序的使用不考虑数据包开销。

Zigbee 使用 IEEE 802.15.4 2006 和 127 字节数据包,底层数据速率为 250 kbps。 Zigbee 数据包格式如下所示,并产生 68 字节的有效负载。对于 68 字节以上的

有效载荷,Zigbee 将其分成多个数据包。我们的性能数据基于有效载荷大小,因为这是构建应用程序时需要关注的设计参数。

1.2网络路由差异

 Zigbee 支持多种路由技术,包括用于路由发现或组消息的网格泛洪、用于网格中受控消息的下一跳路由以及到网关的多对一路由,然后网关使用源路由到设备。 Zigbee 网络同时使用这些方法是正常的。

网络将较大的消息分割成较小的消息。对于 Zigbee,分片是在应用层完成的,从源端到目的端是端到端的。

对于这些网络中的单播转发,一旦设备准备好发送,消息就会被转发。对于多播转发,通常对如何转发消息有网络要求。对于 Zigbee 设备,组播消息仅在最多 64 毫秒的抖动后由设备转发。但是,发起设备在重新传输初始消息之前有 500 毫秒的间隙。

注意:此性能数据适用于 Silicon Labs 实施的这些网状网络堆栈。正如为本次测试提供的测试网络和基础设施所示,没有对其他堆栈或系统执行任何测试。

2. 目标和方法

评估网状网络性能、可扩展性和可靠性的测试。通常,在分析网络性能数据时,我们会考虑可以对网络进行哪些改进以提高性能。存在以下问题:

• 其他网络流量,因为可能有许多相互干扰的子网

• 来自普通建筑 Wi-Fi 基础设施的 Wi-Fi 干扰,因为这些技术通常在 2.4 GHz ISM 频段运行。

• 网络吞吐量和延迟以及大型网络多播延迟和可靠性,因为多播通常用于密集办公环境中的照

2.1其他性能测试

 没有特定的、已定义的方法来评估和报告大型网络的可靠性、可扩展性或延迟。该测试的重点是设备行为和对电池寿命的影响,以及网络吞吐量和延迟。大规模多播测试还需要从大型分布式网络中捕获准确的时间和可靠性信息。所有测试均使用 Silicon Labs 的 Wireless Gecko SoC 平台进行,该平台能够运行 Zigbee、Thread、蓝牙 Mesh 和专有 RF 协议,以消除设备本身作为测试的差异。

Table 2.1. Packet Loss for Distance and Average Round Trip

Distance Average Round Trip Packet Loss

20 meters 18.0 milliseconds 0%

50 meters 17.9 milliseconds 0%

75 meters 17.9 milliseconds 0.75%

85 meters 18.6 milliseconds 1.65%

该测试针对 50 字节的有效负载单播,间隔为 100 毫秒,安全关闭。请注意,Zigbee 不允许关闭安全性。结果显示 1 跳测试始终需要约 18 毫秒的往返时间。该测试在室内以各种干扰条件重复进行,但 1 跳的往返时间与 18 毫秒相差不大。

(剩下一写siliconlabs对自家模组的测试方法,这里略过)

3. 测试结果

3.1 测试配置

测6跳,一个源节点,一系列路由

此测试使用以下配置完成:

1. Zigbee 应用层消息

2. 延迟测试的数据包有效负载从 50 字节到最多 300 字节,以 50 字节为增量 3. 使用安全性完成测试

4. 从 1 到 6 跳

5. 在飞行中使用 2 个数据包(当从第一个…收到 ack 时发送第 3 个数据包)

6. 在给定 ack 时间的情况下尽可能快地发送

7. 以毫秒为单位测量往返延迟(源到目标到源)对于这些不同的网状网络中的每一个,如上所述,随着我们增加有效负载大小,数据包碎片会发生不同的情况。使用更大的数据包大小取决于应用程序层,但我们在此处提供比较数据以指示发生碎片时的相对性能。

在这个多跳延迟测试中,有几个项目值得注意,如下所示:

• 对于 250 字节的 1 跳有效负载,我们看到非常低的延迟(60 毫秒)。

• 使用 50 字节的有效负载(包含在 1 个数据包内),Zigbee 将延迟保持在 6 跳以下 140 毫秒以下。

• 延迟保持在 200 毫秒以下,除非负载超过 150 字节并且跳数超过 5。

4. 总结

Zigbee 表现出出色的可靠性和延迟,低于人类与设备交互通常所需的 200 毫秒时间。

Zigbee 网络在我们测试的 192 个节点网络中表现良好,除非广播频率被推得太高,然后 Zigbee 显示延迟增加。

随着网络规模扩大,增加的跳数和广播拥塞会导致延迟增加。随着数据包负载的增加,整个网络的延迟也会增加,但在测试 5、25 和 50 字节的负载时影响较小。当广播间隔降低到 1 秒时,最大延迟会增加,这对于某些应用程序可能是不希望的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 WiFi Mesh 功能需要用到 Qt 的网络模块和无线模块,具体实现步骤如下: 1. 创建一个 Qt 应用程序,并在主窗口中添加一个按钮,用于启动 WiFi Mesh 功能。 2. 在按钮的点击事件中,使用 QNetworkConfigurationManager 类获取当前设备的网络配置信息,包括网络接口、IP 地址、SSID 等。 ```cpp QNetworkConfigurationManager manager; QList<QNetworkConfiguration> configurations = manager.allConfigurations(QNetworkConfiguration::Discovered); foreach (const QNetworkConfiguration &configuration, configurations) { if (configuration.bearerType() == QNetworkConfiguration::BearerWLAN) { QString ssid = configuration.name(); QString ipAddress = configuration.ipAddress().toString(); QNetworkInterface interface = QNetworkInterface::interfaceFromName(configuration.name()); QString macAddress = interface.hardwareAddress(); // ... } } ``` 3. 使用 QHostAddress 类创建一个广播地址,用于发送 Mesh 网络管理消息。 ```cpp QHostAddress broadcastAddress = QHostAddress("255.255.255.255"); ``` 4. 使用 QUdpSocket 类创建一个 UDP 套接字,并设置广播选项。 ```cpp QUdpSocket udpSocket; udpSocket.setSocketOption(QAbstractSocket::MulticastTtlOption, 1); udpSocket.setSocketOption(QAbstractSocket::MulticastLoopbackOption, 0); udpSocket.bind(QHostAddress::AnyIPv4, 0, QUdpSocket::ShareAddress); udpSocket.joinMulticastGroup(broadcastAddress); ``` 5. 在 Mesh 网络中,每个节点都有一个唯一的地址,可以使用 QNetworkInterface 类获取当前设备的 MAC 地址,并将其转换为一个唯一的节点地址。 ```cpp QNetworkInterface interface = QNetworkInterface::interfaceFromName(configuration.name()); QByteArray macAddress = interface.hardwareAddress().toLocal8Bit(); quint64 nodeId = qChecksum(macAddress.constData(), macAddress.size()); ``` 6. 使用一个消息结构体来表示 Mesh 网络管理消息,并使用 QByteArray 类将其序列化为二进制数据。 ```cpp struct MeshMessage { quint64 nodeId; // ... }; MeshMessage message; message.nodeId = nodeId; // ... QByteArray datagram; QDataStream stream(&datagram, QIODevice::WriteOnly); stream << message; ``` 7. 使用 QUdpSocket 类的 writeDatagram() 方法将 Mesh 网络管理消息发送到广播地址。 ```cpp udpSocket.writeDatagram(datagram.data(), datagram.size(), broadcastAddress, 12345); ``` 8. 在 Mesh 网络中,每个节点都需要监听广播地址,以接收 Mesh 网络管理消息。可以使用 QUdpSocket 类的 readyRead() 信号来实现。 ```cpp connect(&udpSocket, &QUdpSocket::readyRead, this, [this]() { while (udpSocket.hasPendingDatagrams()) { QByteArray datagram; datagram.resize(udpSocket.pendingDatagramSize()); udpSocket.readDatagram(datagram.data(), datagram.size()); QDataStream stream(&datagram, QIODevice::ReadOnly); MeshMessage message; stream >> message; if (message.nodeId != nodeId) { // Handle message from another node } } }); ``` 9. 处理 Mesh 网络管理消息,可以根据消息的类型,执行不同的操作,如加入 Mesh 网络、离开 Mesh 网络、转发 Mesh 数据包等。 以上是实现 WiFi Mesh 功能的大致步骤,具体实现还需要根据具体的需求进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值