• Linux内核——IEEE 802.15.4开发者指南


    简介

    IEEE 802.15.4 工作组专注于底层两层的标准化:媒体访问控制 (MAC) 和物理访问 (PHY)。上层网络层则有两种主流的选择:

    • ZigBee - ZigBee 联盟的专有协议
    • 6LoWPAN - 基于低速率个人区域网络(Low Rate Personal Area Networks,LoWPAN)的 IPv6 网络

    在Linux系统中,Linux-wpan的目标是提供 IEEE 802.15.4 和 6LoWPAN 协议的完整实现。IEEE 802.15.4 是一组用于组织低速率无线个域网(LoWPAN)的协议。

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

    • IEEE 802.15.4 层:使用普通的 Berkeley socket API(套接字API)、通用的 Linux 网络协议栈来传输 IEEE 802.15.4 数据消息以及通过netlink来配置/管理特殊协议;
    • MAC :提供对共享通道的访问和可靠的数据传输
    • PHY :代表设备驱动程序

    套接字(Socket API)

    int sd = soket(PF_IEEE802154, SOCK_DGRAM, 0);  //标准的套接字API
    
    • 1

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

    6LoWPAN的Linux实现

    IEEE 802.15.4 标准中规定, MTU 为 127 字节,一旦开启安全性,在链路吞吐量为 250 kbps 或更低的无线链路上产生大约 80 个Byte的实际 MAC 有效负载。6LoWPAN适配格式[RFC4944]考虑到无线传感器网络等应用中预期的有限带宽、内存或能源资源,指定在此类受限链路上传输 IPv6 数据报文。[RFC4944] 定义了一个 Mesh Addressing 报头以支持sub-IP转发,一个 Fragmentation (碎片、拼接)报头以支持 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 处理、地址匹配等。

    这些类型的设备需要使用不同的方法来接入(hooked into) Linux 内核。

    HardMAC

    请参阅头文件 include/net/ieee802154_netdev.h。您必须实现Linux的net_devicetype = ARPHRD_IEEE802154 。数据通过常见的 sk_buffs 与套接字系列代码(socket family code)交换。
    在 skb 接收时,skb->cb 必须包含struct ieee802154_mac_cb中描述的附加信息。在数据包传输期间,skb->cb用于向设备的 header_ops->create 函数提供附加数据。请注意,从数据后续可能被覆盖(当套接字代码将 skb 提交给 qdisc时),因此如果您以后需要该 cb 中的某些内容,则应自行将该信息存储在skb->data中。
    要挂钩 MLME 接口,您必须使用指向struct ieee802154_mlme_ops (MLME驱动ops)实例的指针填充 net_device 的 ml_priv 字段。(net_device->ml_priv = &mac802154_mlme_ops
    字段 assoc_reqassoc_respdisassoc_reqstart_reqscan_req 是可选的。所有其他字段都是必需的。

    SoftMAC

    MAC 是 IEEE 802.15.4 Linux协议栈的中间层。此时它为驱动注册和管理提供从接口(slave interfaces)。

    注意:目前唯一支持的监控设备类型——它是IEEE 802.15.4 协议栈接口用于network sniffers(例如:WireShark)。
    该层将很快被扩展。请参阅头文件 include/net/mac802154.hdrivers/net/ieee802154/中的几个驱动程序。

    Fake drivers

    此外,还有一个可用的驱动程序可以模拟一个真实设备具有SoftMAC(fakelb - IEEE 802.15.4 loopback driver,环回驱动程序)接口。此选项提供了在不使用真实硬件的情况下测试和调试协议栈的可能性。

    设备驱动API

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

    //分配IEEE802.15.4兼容设备
    struct ieee802154_dev *ieee802154_alloc_device(size_t priv_size, 
                                                   struct ieee802154_ops *ops);
    
    //释放分配的设备
    void ieee802154_free_device(struct ieee802154_dev *dev);
    
    //在系统中注册设备(PHY)
    int ieee802154_register_device(struct ieee802154_dev *dev);
    
    // 在系统中释放注册的PHY
    void ieee802154_unregister_device(struct ieee802154_dev *dev);
    
    // 告诉802.15.4模块在skb中有一个新收到的帧,包含了
    // 来自硬件设备的RF链路质量指示(Link Quality Indicator, LQI)
    void ieee802154_rx_irqsafe(struct ieee802154_hw *hw, struct sk_buff *skb, u8 lqi);
    
    // 告诉802.15.4模块,skb中的帧正在或将要通过硬件设备完成传输
    void ieee802154_xmit_complete(struct ieee802154_hw *hw, 
                                  struct sk_buff *skb, bool ifs_handling);
    
    //设备驱动程序必须至少在IEEE 802.15.4操作结构下实现以下回调:
    struct ieee802154_ops {
        ...
        int (*start)(struct ieee802154_hw *hw);//调用硬件设备初始化的处理程序
        void (*stop)(struct ieee802154_hw *hw);//停止调用相关处理
        ...
        // 802.15.4模块要通过硬件设备传输skb中的每一帧调用的处理程序
        int (*xmit_async)(struct ieee802154_hw *hw, struct sk_buff *skb);
        // 802.15.4模块从硬件上调用能量检测的处理程序
        int (*ed)(struct ieee802154_hw *hw, u8 *level);
        // 设置无线电硬件设备特定的频道页、信道
        int (*set_channel)(struct ieee802154_hw *hw, u8 page, u8 channel);
        ...
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    参考链接:

    IEEE 802.15.4 Developer’s Guide,IEEE 802.15.4 开发者指南,https://www.kernel.org/doc/html/latest/networking/ieee802154.html

    补充信息

    备注:关于部分结构体的细节,尝试使用InsCode AI来进行补充,未直接查阅相关内核源码。

    struct ieee802154_dev

    struct ieee802154_dev是一个用于表示IEEE 802.15.4设备的结构体,其中包含了该设备的各种属性、状态等信息。具体来说,该结构体包含了以下成员:

    name: 设备名称,用于标识该设备
    current_channel: 当前使用的信道号
    pan_id: 网络ID
    short_addr: 短地址
    long_addr: 长地址
    rx_queue: 接收队列,用于存储接收到的数据帧
    tx_queue: 发送队列,用于存储待发送的数据帧
    ops: 设备相关操作的函数指针结构体,包括打开设备、关闭设备、发送数据等操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    通过使用struct ieee802154_dev,可以方便地管理和控制IEEE 802.15.4设备的各个方面,从而实现无线通信等功能。

    struct ieee802154_hw

    struct ieee802154_hw是Linux内核中定义IEEE 802.15.4无线协议栈硬件接口的结构体。

    它包含了一些成员变量,如:

    wpan_phy: 指向包含了IEEE 802.15.4 PHY层信息的结构体的指针。
    perm_extended_addr: 指向一个数组,存储设备的扩展地址。
    (*xmit): 指向一个函数指针,用于发送数据包。
    (*start): 指向一个函数指针,用于启动设备。
    (*stop): 指向一个函数指针,用于停止设备。
    (*ack): 指向一个函数指针,用于发送确认帧。
    (*set_channel): 指向一个函数指针,用于设置无线信道。
    *set_pan_id: 指向一个函数指针,用于设置PAN ID。
    (*set_short_addr): 指向一个函数指针,用于设置短地址。
    xmit_sync: 一个标志位,指示是否需要同步发送。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这些成员变量提供了对IEEE 802.15.4设备的访问和操作功能。

  • 相关阅读:
    Adobe Acrobat for mac 缺少字体文件Microsoft Ya Hei
    JavaScript基础 JavaScript第一天 1. JavaScript介绍
    Spring Cloud OpenFeign
    30.10.4 角色管理
    100道C/C++面试题
    redis快速回顾
    一个 Java 对象到底有多大?
    代码随想录1.5——数组:35搜索插入位置、34在排序数组中查找元素的第一个和最后一个位置、26.删除排序数组中的重复项、283移动零
    阿里云serverless从入门到进阶测评(阿里云/AWS/腾讯云)
    【概率论】第八章 假设检验
  • 原文地址:https://blog.csdn.net/luo58614013/article/details/133456441