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

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

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

要设置 6LoWPAN 接口,您需要:1. 添加 IEEE802.15.4 接口并设置通道和 PAN ID; 2. 通过以下命令添加 6lowpan 接口:# ip link add link wpan0 name lowpan0 type lowpan 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 设备操作结构。