IEEE 802.15.4 开发者指南

简介

IEEE 802.15.4 工作组专注于底层两层的标准化:介质访问控制 (MAC) 和物理访问 (PHY)。主要有两种可用于上层的选项

  • ZigBee - 来自 ZigBee 联盟的专有协议

  • 6LoWPAN - 基于低速率个人区域网络的 IPv6 网络

Linux-wpan 的目标是提供 IEEE 802.15.4 和 6LoWPAN 协议的完整实现。IEEE 802.15.4 是一组用于组织低速率无线个人区域网络的协议栈。

该协议栈由三个主要部分组成

  • IEEE 802.15.4 层;我们选择使用普通的 Berkeley 套接字 API、通用的 Linux 网络堆栈来传输 IEEE 802.15.4 数据消息,并使用 netlink 上的特殊协议进行配置/管理

  • MAC - 提供对共享通道的访问和可靠的数据传递

  • PHY - 代表设备驱动程序

套接字 API

int sd = socket(PF_IEEE802154, SOCK_DGRAM, 0);

地址族、套接字地址等在 include/net/af_ieee802154.h 头文件中或用户空间包中的特殊头文件中定义(请参阅 https://linux-wpan.org/wpan-tools.html 或 git 树 https://github.com/linux-wpan/wpan-tools)。

6LoWPAN Linux 实现

IEEE 802.15.4 标准规定了 127 字节的 MTU,一旦启用安全性,在链路吞吐量为 250 kbps 或更低的无线链路上,可产生大约 80 个八位字节的实际 MAC 有效负载。6LoWPAN 适配格式 [RFC4944] 被指定用于通过此类受限链路携带 IPv6 数据报,同时考虑到无线传感器网络等应用中预期的有限带宽、内存或能源资源。[RFC4944] 定义了一个网格寻址头以支持子 IP 转发、一个分段头以支持 IPv6 最小 MTU 要求 [RFC2460],以及用于 IPv6 数据报的无状态头部压缩(LOWPAN_HC1 和 LOWPAN_HC2)以将相对较大的 IPv6 和 UDP 头部缩小到(在最佳情况下)几个字节。

在 2011 年 9 月,发布了标准更新 - [RFC6282]。它弃用了 HC1 和 HC2 压缩,并定义了此 Linux 实现中使用的 IPHC 编码格式。

您可以在以下文件中找到与 6lowpan 相关的所有代码:net/6lowpan/* 和 net/ieee802154/6lowpan/*

要设置 6LoWPAN 接口,您需要:1. 添加 IEEE802.15.4 接口并设置通道和 PAN ID;2. 通过命令(如:# ip link add link wpan0 name lowpan0 type lowpan)添加 6lowpan 接口 3. 启动“lowpan0”接口

驱动程序

与 WiFi 一样,有几种类型的设备实现了 IEEE 802.15.4。 1) “HardMAC”。 MAC 层在设备本身中实现,该设备导出管理(例如 MLME)和数据 API。 2) “SoftMAC” 或只是无线电。这些类型的设备只是无线电收发器,可能具有某些类型的加速功能,例如自动 CRC 计算和比较、自动 ACK 处理、地址匹配等。

这些类型的设备需要不同的方法才能连接到 Linux 内核。

HardMAC

请参阅头文件 include/net/ieee802154_netdev.h。您必须实现 Linux net_device,其中 .type = ARPHRD_IEEE802154。数据通过普通 sk_buffs 与套接字族代码交换。在 skb 接收时,skb->cb 必须包含 struct ieee802154_mac_cb 中描述的附加信息。在数据包传输期间,skb->cb 用于向设备的 header_ops->create 函数提供附加数据。请注意,此数据可以在以后被覆盖(当套接字代码将 skb 提交给 qdisc 时),因此如果您以后需要该 cb 中的某些内容,您应该自己将信息存储在 skb->data 中。

要连接 MLME 接口,您必须使用指向 struct ieee802154_mlme_ops 实例的指针填充您的 net_device 的 ml_priv 字段。assoc_req、assoc_resp、disassoc_req、start_req 和 scan_req 字段是可选的。所有其他字段都是必需的。

SoftMAC

MAC 是 IEEE 802.15.4 Linux 协议栈中的中间层。目前,它为驱动程序注册和从属接口管理提供接口。

注意:目前仅支持监视器设备类型 - 它是用于网络嗅探器(例如 WireShark)的 IEEE 802.15.4 协议栈接口。

这一层将很快得到扩展。

请参阅头文件 include/net/mac802154.h 和 drivers/net/ieee802154/ 中的几个驱动程序。

伪驱动程序

此外,还有一个驱动程序可用于模拟具有 SoftMAC (fakelb - IEEE 802.15.4 环回驱动程序) 接口的真实设备。此选项提供了一种无需使用真实硬件即可测试和调试协议栈的可能性。

设备驱动程序 API

include/net/mac802154.h 定义以下函数

struct ieee802154_dev *ieee802154_alloc_device(size_t priv_size, struct ieee802154_ops *ops)

分配与 IEEE 802.15.4 兼容的设备。

void ieee802154_free_device(struct ieee802154_dev *dev)

释放已分配的设备。

int ieee802154_register_device(struct ieee802154_dev *dev)

在系统中注册 PHY。

void ieee802154_unregister_device(struct ieee802154_dev *dev)

释放已注册的 PHY。

void ieee802154_rx_irqsafe(struct ieee802154_hw *hw, struct sk_buff *skb, u8 lqi)

告诉 802.15.4 模块在 skb 中有一个新接收的帧,其中包含来自硬件设备的 RF 链路质量指示器 (LQI)。

void ieee802154_xmit_complete(struct ieee802154_hw *hw, struct sk_buff *skb, bool ifs_handling)

告诉 802.15.4 模块 skb 中的帧正在或即将通过硬件设备传输

设备驱动程序必须至少在 IEEE 802.15.4 操作结构中实现以下回调

struct ieee802154_ops {
     ...
     int     (*start)(struct ieee802154_hw *hw);
     void    (*stop)(struct ieee802154_hw *hw);
     ...
     int     (*xmit_async)(struct ieee802154_hw *hw, struct sk_buff *skb);
     int     (*ed)(struct ieee802154_hw *hw, u8 *level);
     int     (*set_channel)(struct ieee802154_hw *hw, u8 page, u8 channel);
     ...
};
int start(struct ieee802154_hw *hw)

802.15.4 模块为硬件设备初始化调用的处理程序。

void stop(struct ieee802154_hw *hw)

802.15.4 模块为硬件设备清理调用的处理程序。

int xmit_async(struct ieee802154_hw *hw, struct sk_buff *skb)

802.15.4 模块为每个将通过硬件设备传输的 skb 中的帧调用的处理程序。

int ed(struct ieee802154_hw *hw, u8 *level)

802.15.4 模块为从硬件设备获取能量检测结果而调用的处理程序。

int set_channel(struct ieee802154_hw *hw, u8 page, u8 channel)

设置无线电以监听硬件设备的特定频道。

此外,还应填充 IEEE 802.15.4 设备操作结构。