wifi驱动适配源码实现分析 概述它是典型的适配器模式——屏蔽底层 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.5msscanWindow每次扫描持续多久50即 31.25msscanPhy用哪个物理信道Coded PHY远距离scanType主动扫描会发 SCAN_REQ 请求更多数据主动扫描可获取 ScanRspSoftBusBcScanFilter *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) → 创建事件监听线程

相关新闻

最新新闻

11.PostgreSQ、-MySQL与MongoDB-AI应用如何选择数据库

11.PostgreSQ、-MySQL与MongoDB-AI应用如何选择数据库

PostgreSQL、MySQL 与 MongoDB:AI 应用该如何选择数据库? 码海寻道 大模型、智能体与 RAG 工程组件系列第 11 篇 做大模型应用时,数据库选型经常被简化成一句话:PostgreSQL 功能最全,MySQL 最常见,MongoDB…

2026/8/25 14:24:43
UE5使用蓝图实现简单角色跳跃案例

UE5使用蓝图实现简单角色跳跃案例

前言:基于该文章实现的案例上制作的动画案例《UE5简单角色移动案例》 1 创建IA_JUMP输入操作 右键资产浏览器,新建->输入->输入操作,命名为IA_JUMP 点进去,找到值类型设置为Digital(Bool)数字,保存后就可以关闭…

2026/8/25 14:24:43
《数学少年-从正负号到几何原本》(第九章:“万物建模,方程作答“)--9.3 岁月与选择

《数学少年-从正负号到几何原本》(第九章:“万物建模,方程作答“)--9.3 岁月与选择

第九章 万物建模,方程作答 卷首语:生活里所有等量难题,都能翻译成含未知数的等式。把现实故事转化为数学模型,答案自然清晰浮现。 9.3 岁月与选择 连续学完配比工程、行程买卖两大板块,苏晚和林默已经熟练掌握了看得…

2026/8/25 14:24:43
php json schema 你的PHP JSON Schema验证,真能像健身库一样,一个git clone就搞定吗?

php json schema 你的PHP JSON Schema验证,真能像健身库一样,一个git clone就搞定吗?

1324个动作, 1324张缩略情形图态, 1324个动态影像图, 5种语言——全都免费开放代码。你距"AI私教"仅缺一次从远程仓库复制到本地的操作。如果你有过做健身App的想法,你一定经历过这个噩梦:设想添加一个“哑铃飞鸟”动作, 接着翻找图片, 然后寻…

2026/8/25 14:24:43
体育馆赛事管理系统源码 Java+SpringBoot+Vue 前后分离

体育馆赛事管理系统源码 Java+SpringBoot+Vue 前后分离

一、关键词体育馆赛事管理系统,体育赛事场馆一体化管理系统,体育馆赛事运维管理平台二、作品包含源码数据库全套环境和工具资源本地部署教程三、项目技术前端技术:Html、Css、Js、Vue2、Element-ui后端技术:Java、SpringBoot2、My…

2026/8/25 14:24:43
【案例说明】融合知识图谱、大语言模型和 AI Agent 完成能源领域知识工程工作

【案例说明】融合知识图谱、大语言模型和 AI Agent 完成能源领域知识工程工作

关于知识工程,前面写过【新手上路常见问答】关于知识工程-CSDN博客从知识到智慧:知识图谱还要走多远?_cayley 知识图谱-CSDN博客【学习资源】知识图谱与大语言模型融合_oneke知识图谱-CSDN博客随着技术的快速发展,知识工程的实现有…

2026/8/25 14:19:43