【鸿蒙南向开发】OpenHarmony 短距子系统-WIFI源码分析

1. WiFi 简介

1.1 WiFi 介绍

WiFi 是一种无线通信技术,可以将个人电脑、手持设备(如 pad、手机)等终端以无线方式互相连接。WiFi 网络是使用无线通信技术在一定的局部范围内建立的网络,是计算机网络与无线通信技术相结合的产物,它以无线多址信道作为媒介,提供传统局域网的功能,使用户真正实现随时随地随意的宽带网络接入。

WiFi 主要遵循 IEEE802.11 系列协议标准,该通信协议于 1996 年由澳洲的研究机构 CSIRO 提出,WiFi 凭借其独特的技术优势,被公认为是目前最为主流的 WLAN(无线局域网)技术标准。随着 WiFi 无线通信技术的不断优化和发展,目前主要的通信协议标准有 802.11a、802.11b、802.11g、802.11n 和 802.11ac、802.11ax,根据不同的协议标准主要有两个工作频段,分别为 2.4GHz 和 5.0GHz。

下表简单介绍了各个标准的发布时间和特点。

在这里插入图片描述

1.2 基本概念

1.2.1 WiFi 网络结构

WiFi 无线网络中包含了一些基本的组成元素如工作站,接入点等,以下介绍 WiFi 网络中一些基础概念。

(1)工作站(Station)

工作站是指配备无线网络接口的终端设备(计算机、手机等),构建网络的目的就是为了在工作站间传送数据。

(2)接入点(Access Point)

802.11 网络所使用的帧必须经过转换,方能被传递至其他不同类型的网络。具备无线至有线(wireless-to-wired)的桥接功能的设备称为接入点,简称 AP。

(3)无线媒介(Wireless medium)

802.11 标准以无线媒介在工作站之间传递帧。

(4)分布式系统(Distribution system)

几个接入点串联起来可以覆盖一块比较大的区域,接入点之间相互通信可以掌握移动式工作站的行踪,这就组成了一个分布式系统。分布式系统属于 802.11 的逻辑组件,负责将帧(frame)传送至目的地,分布式系统是接入点间转发帧的骨干网络,因此通常称为骨干网络(backbone network),基本都是以太网(Ethernet)。

在这里插入图片描述

​ 图 1 WiFi 分布式系统组成

如图,在分布式网络拓扑结构中,有几个基本概念:

1)基本服务集(BSS)

由一组彼此通信的工作站组成,这里只讨论基础型 BSS,一个热点覆盖的范围称为一个 BSS。

2)扩展服务集(ESS)

多个 BSS 可以构成一个扩展网络,称为扩展服务集(ESS)网络,一个 ESS 网络内部的 STA 可以互相通信,是采用相同的 SSID 的多个 BSS 形成的更大规模的虚拟 BSS。

连接 BSS 的组件称为分布式系统(Distribution System,DS)。

3)SSID

Service Set ID,服务集标识。

SSID 是让网管人员为服务集合(SS)指定的识别码,组成 ESS 的所有 BSS 都会使用相同的 SSID。

4)BSSID

Basic Service Set ID,基本服务集标识。

在基础网络里,BSSID 就是接入点(AP)使用的 MAC 地址。

5)ESSID

Extended Service Set ID,扩展服务集标识。

因为 ESS 中所有 BSS 使用同一标识,所以 ESSID 就是 SSID。

1.2.2 WiFi 网络安全技术

IEEE802.11 技术从出现开始,就一直为安全问题困扰。继因安全性问题被指责的 WEP 后,Wifi 联盟先后推出了 WPA 和 WPA2 安全标准以及最新的 WPA3 标准。下面对常见的这几种安全标准做简单说明。

l WEP(Wired Equivalent Privacy,有线等效加密),是 IEEE802.11 最初提出的基于 RC4 流加密算法的安全协议,存在加密流重用、密钥管理等问题,已基本被弃用。

l WPA(WiFi Protected Access,WiFi 保护访问),WiFi 联盟在 IEEE802.11i 草案基础上制定的一项无线网络安全技术,目的在于替代传统 WEP 安全技术,分为 WPA Personal(pre-shared key 身份验证)和 WPA Enterprise。WPA 使用临时密钥完整性协议(Temporal Key Integrity Protocol,TKIP),提高了无线网络的安全性。

l WPA2 是 WPA 的加强版,支持高级加密协议(Advanced Encryption Standard,AES),使用计数器模式密码块链消息完整码协议(CCMP),安全性比 WPA 有进一步提升。

l WPA3 是 Wi-Fi 联盟组织于 2018 年 1 月 8 日发布的 Wifi 新加密协议,是 WPA2 技术的后续版本。WPA3 支持 SAE(对等同步认证)以及具有 192 位加密功能的 WPA3-Enterprise,比 WPA2 更安全。

1.2.3 WiFi 工作模式

鸿蒙系统的 WiFi 组件在驱动支持的前提下,可以支持三种工作模式:STATION 模式、AP 模式和 P2P 模式。

●STATION 模式,就是 2.2.1 中讲到的工作站,也就是无线局域网中的一个客户端,这是 Wifi 最基本的工作模式,通过连接其他接入点访问网络。
●AP 模式也就是接入点模式,即设备作为接入点,为无线局域网中的客户端提供网络接入功能,大多数终端设备称其为 hotspot(热点)或者 softap,通过 wifi 的 AP 模式,可以将设备的运营商数据网络共享给接入的客户端,实现随时随地的网络资源共享。
●P2P 模式是 WFA(WiFi 联盟)推出的一项与蓝牙类似的技术,允许设备间一对一直连,无需通过 AP 即可相互连接。P2P 模式中的设备,称为 P2P Device,P2P 设备组成的网络叫 P2P Group。在 P2P 网络中,P2P Device 有两个角色,一个是 GO(Group Owner),其作用类似于 AP;另一个角色是 GC(Group Client),类似于工作站(Station)。P2P 设备完成协商组建为一个 P2P 网络的时候,有且只能有一个设备作为 GO,其他设备做为 GC。Wifi P2P 模式传输速度和传输距离比蓝牙有大幅提升,但功耗也要比蓝牙高。

2. WiFi 子系统介绍

本章主要讲解鸿蒙系统中 WIFI 子系统的架构组成以及部分关键模块的实现。

2.1 系统架构简介

在这里插入图片描述

图 1 WiFi 系统架构图

如图 1 所示,鸿蒙 WiFi 系统是典型的分层结构,自上而下包括:

●应用层
主要包含鸿蒙提供的 settings 应用,该应用是典型的用户使用 WiFi 的方式,提供用户可见的设置界面,提供 WiFi 开关、WiFi 扫描、连接断开等基本功能。

应用代码通过导入接口类,从而调用下层 WIFI Native 提供的 JS 接口,这部分实现的代码在以下目录中:

applications\standard\settings

●Wifi Native JS
这部分应用了 Node.js 推出的用于开发 C 原生模块的接口 N-API 技术,对框架提供的 C 接口进行封装,为应用提供了调用 WiFi 功能的 JS 接口。

这部分代码在以下目录中:

foundation\communication\wifi\interfaces

●WiFi 框架
主要包含 wifi 服务的实现。其中,

wifi_manager_service 负责管理 STA、SCAN、AP、P2P 等服务的加载和卸载。

wifi_ap_service 实现 AP 模式的状态机管理和事件处理。

wifi_p2p_service 实现 P2P 模式的状态机管理和事件处理。

wifi_scan_service 实现 SCAN 时的状态机管理和事件处理。

wifi_sta_service 实现 STA 模式的状态机管理和事件处理。

wifi_idl_client 实现了与 Wifi HAL 进行 RPC 通信的客户端。

dhcp_manager_service 实现 DHCP 管理服务,启动 DHCP 客户端或者 DHCP 服务器。

dhcp_client_service 是 DHCP 客户端的实现。

dhcp_server 是 DHCP 服务器的实现。

这部分代码在以下目录中:

foundation\communication\wifi\services\wifi_stand

<think>嗯,用户想了解Linux驱动开发的学习路线,我得好好理清楚思路。首先,用户可能是刚开始接触Linux驱动开发,或者是已经有了一些编程基础,想转行到这个领域。需要从基础开始讲起,逐步深入,确保他能跟上。 首先,Linux驱动开发需要哪些基础知识呢?操作系统原理、C语言应该是必须的。可能还需要了解一些硬件相关的知识,比如处理器架构、内存管理之类的。我得先列出这些基础知识,让用户打好基础。 然后,Linux系统本身的了解也很重要。比如内核的组成、模块化机制,还有编译和调试的方法。用户可能需要学习如何编译内核,如何编写简单的模块,这部分可以通过一些例子来讲解,比如经典的Hello World模块。 接下来是驱动开发的核心部分,字符设备、平台设备、设备树这些概念。用户需要理解这些驱动类型的工作原理,以及如何实际操作。比如,如何注册字符设备,如何使用设备树来描述硬件。这部分可能需要结合代码示例,但用户现在可能还不需要写代码,所以先解释概念。 另外,同步与互斥机制、中断处理、DMA这些高级主题也是必须的。用户可能会遇到多线程环境下的资源竞争问题,或者需要处理硬件中断,这些都需要详细说明。不过要分阶段,先掌握基础再深入高级内容。 调试和优化技巧也很关键,没有这些在实际开发中会遇到很多困难。比如如何使用printk和动态调试,还有性能优化的方法。用户需要知道如何排查问题,提高驱动效率。 最后,推荐一些学习资源和项目实践,帮助用户巩固知识。书籍、在线文档、社区论坛都是不错的资源。实际项目比如LED驱动、传感器驱动,能让他动手实践,加深理解。 可能用户还想知道学习的大致时间安排,或者有哪些常见的陷阱需要避免。不过目前的问题主要是学习路线,所以先按步骤来,确保每个阶段都有明确的目标和内容。还要注意语言要口语化,避免太技术化的术语,让用户容易理解。 总之,结构应该是先基础,再系统学习,然后核心开发,高级主题,最后调试和项目实践。这样用户能循序渐进,逐步掌握Linux驱动开发的各个方面。需要检查是否有遗漏的重要知识点,比如设备树现在在嵌入式系统中很常用,必须涵盖进去。另外,驱动模型和sysfs这类用户空间接口也很重要,应该提到。</think>Linux驱动开发学习路线可以分为以下阶段,结合理论与实践逐步深入: --- ### **一、基础准备阶段(1-3个月)** 1. **C语言基础** - 重点掌握:指针、结构体、内存管理(malloc/free)、位操作、函数指针 - 推荐书籍:《C和指针》《C Primer Plus》 2. **操作系统原理** - 理解进程/线程、内存管理、中断、I/O机制、内核态与用户态 - 推荐学习:《操作系统导论》《深入理解计算机系统》 3. **Linux系统基础** - 熟练使用Linux命令行(gcc/gdb/makefile) - 掌握Shell脚本编写 - 学习内核源码目录结构(如`drivers/`, `include/`, `arch/`) --- ### **二、Linux内核入门(2-4个月)** 1. **内核编译与模块开发** - 实践内核编译(配置选项、交叉编译) - 编写第一个内核模块(Hello World) - 学习模块加载/卸载(`insmod/rmmod`) 2. **内核关键机制** - 理解系统调用、Proc文件系统、Sysfs - 掌握内核日志(`printk`)与动态调试(`dmesg`) 3. **设备驱动模型** - 学习字符设备驱动(`cdev`)、平台设备驱动(`platform_device/platform_driver`) - 掌握设备树(Device Tree)语法与使用 --- ### **三、驱动开发核心(3-6个月)** 1. **硬件交互基础** - 内存映射(`ioremap`)、寄存器操作、GPIO控制 - 中断处理(`request_irq`)、延时机制(`mdelay`) 2. **典型驱动开发** - **字符设备**:按键、LED、ADC - **块设备**:RAMDisk模拟 - **网络设备**:虚拟网卡驱动 - **输入子系统**:触摸屏、键盘驱动 3. **同步与并发** - 自旋锁(`spinlock`)、互斥锁(`mutex`)、信号量(`semaphore`) - 原子操作(`atomic_t`)、等待队列(`wait_queue`) --- ### **四、进阶技术(3-6个月)** 1. **内核调试与优化** - 使用`ftrace`、`kprobe`分析性能 - 内存泄漏检测(`kmemleak`)、死锁排查 2. **高级驱动技术** - DMA传输(`dma_alloc_coherent`) - 内核线程(`kthread`)、工作队列(`workqueue`) - 电源管理(`PM Framework`) 3. **实战项目** - 实现SPI/I2C设备驱动(如传感器) - 开发USB摄像头驱动(结合V4L2框架) - 移植开源驱动(如WiFi模块) --- ### **五、学习资源推荐** 1. **书籍** - 《Linux设备驱动程序》(经典必读) - 《Linux内核设计与实现》 - 《精通Linux设备驱动程序开发》 2. **在线文档** - 内核文档(`Documentation/`目录) - [Linux Kernel Module Programming Guide](https://tldp.org/LDP/lkmpg/2.6/html/) 3. **社区与工具** - 订阅[LKML](https://lore.kernel.org/)邮件列表 - 使用QEMU模拟器调试驱动 - 参与开源项目(如Raspberry Pi驱动开发--- ### **六、避坑指南** 1. **硬件依赖问题**:优先选择支持良好的开发板(如树莓派、BeagleBone)。 2. **内核版本兼容性**:注意API变化(如`register_chrdev` vs `cdev_init`)。 3. **调试技巧**:善用`CONFIG_DEBUG_KERNEL`和`objdump`反汇编。 --- **学习路线总结**: 基础 → 内核机制 → 驱动开发 → 调试优化 → 项目实战 建议每天投入2-3小时,配合开发板实践,1年左右可达到中级水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值