尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

wifi驱动适配源码实现分析

wifi驱动适配源码实现分析
📅 发布时间:2026/7/3 18:49:05

概述

它是典型的适配器模式——屏蔽底层 HCI 操作细节,给上层提供统一的扫描发现能力

上层 (shareservice 等) ↓ 调用标准接口 driver_ble_discovery.c ← 适配层,承上启下 ↓ 操作 HCI socket Linux 内核蓝牙协议栈

1. 向上:提供统一接口

通过 softbus_ble_discovery_interface.h 对上层暴露标准接口,如:

  • SoftbusBleDiscoveryStartScan— 开始扫描
  • SoftbusBleDiscoveryStopScan— 停止扫描
  • SoftbusBleDiscoveryRegisterScanListener— 注册扫描监听
  • SoftbusBleDiscoveryUnRegisterScanListener— 反注册扫描监听

上层(如 shareservice)只调用这些接口,不关心底层实现。

2. 向下:适配 Linux HCI 层

通过直接操作 Linux Bluetooth HCI socket 实现扫描功能:

  • DriverExtendBleScanSwitch— 发送 HCI 命令控制扫描开关
  • ExtendedEventListenerThread— 通过 HCI socket 轮询读取 BLE 广播包
  • ProcessExtendedBleAdvEvent— 解析 HCI 层上报的扩展广播数据

SoftbusBleDiscoveryStartScan

参数说明

scannerId扫描通道ID,项目定义了8个通道,可实际上只用到了1个1号。每个通道包含

| 字段 | 含义 | |----------------|-----------------------| | `isUsed` | 该通道是否已被注册占用 | | `isScanning` | 该通道是否正在扫描 | | `scannerId` | 通道编号(等于数组下标)| | `scanCallback` | 上层注册的回调函数 |

softbusscanparams----HCI扫描物理参数

typedef struct { uint8_t scanType; // 扫描类型:被动扫描(0) / 主动扫描(1) uint8_t scanPhy; // 扫描物理信道:1M PHY / 2M PHY / Coded PHY uint8_t scanFilterPolicy; // 过滤策略:接受所有 / 只接受白名单 uint8_t frameType; // 帧类型 uint16_t scanInterval; // 扫描间隔(单位 0.625ms) uint16_t scanWindow; // 扫描窗口(单位 0.625ms) } SoftBusBcScanParams;

这些参数会通过ConvertSoftbus2HciExtScanParams转换成 HCI 命令,直接下发给蓝牙控制器,控制硬件层面怎么扫描:

参数作用举例
scanInterval每隔多久扫描一次100(即 62.5ms)
scanWindow每次扫描持续多久50(即 31.25ms)
scanPhy用哪个物理信道Coded PHY(远距离)
scanType主动扫描会发 SCAN_REQ 请求更多数据主动扫描可获取 ScanRsp

SoftBusBcScanFilter *scanFilter— 过滤条件数组

typedef struct { uint16_t serviceUuid; // 服务 UUID uint32_t serviceDataLength; // 服务数据长度 uint16_t manufactureId; // 厂商 ID uint32_t manufactureDataLength; // 厂商数据长度 int8_t *address; // 设备 MAC 地址 int8_t *deviceName; // 设备名称 uint8_t *serviceData; // 服务数据 uint8_t *serviceDataMask; // 服务数据掩码 uint8_t *manufactureData; // 厂商数据 uint8_t *manufactureDataMask; // 厂商数据掩码 uint8_t filterIndex; // 过滤器索引 } SoftBusBcScanFilter;

作用:启动蓝牙扫描

阶段一:参数校验

① 检查入参 param / scanFilter / filterSize 是否合法 ② 检查 scanCallback 是否已注册(否则启动后无法回调通知上层)
LOGI("Enter scannerId=%d", scannerId); if (param == NULL || scanFilter == NULL || filterSize <= 0) { LOGE("invalid param, scannerId=%d", scannerId); return SOFTBUS_INVALID_PARAM; } // 调用启动回调 if (g_scanChannel[scannerId].scanCallback == NULL || g_scanChannel[scannerId].scanCallback->OnStartScanCallback == NULL) { LOGE("invalid param, OnStartScanCallback is null"); return SOFTBUS_INVALID_PARAM; }

阶段二:状态检查

作用:检查通道未注册或者已经在扫描就提前解锁返回错误

加锁 g_scannerLock → 检查扫描通道是否已注册(isUsed) → 检查是否已经在扫描(isScanning) 解锁 g_scannerLock
// 获取互斥锁 if (pthread_mutex_lock(&g_scannerLock) != 0) { LOGE("lock failed, scannerId=%d", scannerId); return SOFTBUS_LOCK_ERR; } // 检查扫描通道状态 if (!CheckScanChannelInUsed(scannerId)) { LOGE("scanner is not in used, scannerId=%d", scannerId); pthread_mutex_unlock(&g_scannerLock); return SOFTBUS_BC_ADAPTER_NOT_IN_USED_FAIL; } // 检查是否已经在扫描 if (g_scanChannel[scannerId].isScanning) { LOGE("already scanning, scannerId=%d, btScanId=%d", scannerId, g_scanChannel[scannerId].scannerId); pthread_mutex_unlock(&g_scannerLock); return SOFTBUS_ALREADY_TRIGGERED; } pthread_mutex_unlock(&g_scannerLock);

sharkit暂时先看到这吧,PL和我说让我负责文件互传模块,WiFi适配暂时搁置

阶段三:启动底层扫描

调用 DriverBleDiscoveryStartScan() → 向 HCI 层发送扫描命令 再次加锁 g_scannerLock → 根据 HCI 返回值更新 isScanning 状态 解锁 g_scannerLock

阶段四:通知上层启动结果

作用:不直接在当前线程回调上层,而是丢到线程池异步执行。这是为了避免回调中如果上层又调用了其他接口(比如 StopScan),形成同线程递归调用导致死锁。

malloc 一个 ScanResultReportData ThreadPoolAdd(ThreadOnStartScanCallback) → 通过线程池异步回调上层

阶段五:启动事件监听线程

作用:事件监听线程通过 HCI socket 持续读取 BLE 广播包。如果线程创建失败,会回滚:调用DriverExtendBleScanSwitch(false)停止 HCI 扫描,并将isScanning置回 false。

设置全局 g_scannerId = scannerId pthread_create(ExtendedEventListenerThread) → 创建事件监听线程

相关新闻

  • 隐藏WIN10开始菜单应用[系统]标签
  • 自动驾驶场景下YOLO系列实时目标检测:性能实测与选型避坑指南
  • 如何精准识别高校与地方产业的协同发展机会?

最新新闻

  • PiliPlus:告别B站观影烦恼,开启纯净跨平台体验
  • 告别运维黑盒:Semaphore如何让基础设施管理变得像操作手机应用一样简单
  • 3步轻松实现自然语言SQL查询:Vanna AI开源工具完整指南
  • 知网维普 AI 检测双重施压?paperxie 分层改写方案一站式搞定论文降重消 AIGC 难题
  • 3步掌握Real-ESRGAN:基于ncnn-Vulkan的终极图像超分辨率实战指南
  • Spring Boot集成国密SM4:基于过滤器的全局加解密方案详解

日新闻

  • JMeter接口测试实战:从核心元件到复杂场景构建
  • Java Applet版刽子手游戏源码:含完整项目结构、吊杆绘图与胜负逻辑
  • 使用Apache JMeter对RoadRunner PHP应用进行性能测试与调优指南

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号