当前位置: 首页 > article >正文

iOS BLE 开发(Swift 实现 + 面试 + 开发必备)

一、BLE 基础概念必须懂1. BLE 是什么Bluetooth Low Energy低功耗蓝牙特点低功耗、连接快、小数据传输适用于智能硬件、手环、车机、传感器、设备诊断2. BLE 角色Central中心设备手机主动扫描、连接Peripheral外设硬件设备被动广播、被连接3. BLE 通信核心结构外设 → 服务 (Service) → 特征 (Characteristic)Service功能模块UUIDCharacteristic数据通道读写 / 通知所有数据交互都通过Characteristic完成二、iOS BLE 开发完整流程Swift 标准 7 步1. 初始化 CBCentralManagerimportCoreBluetoothclassBLEManager:NSObject,CBCentralManagerDelegate,CBPeripheralDelegate{varcentralManager:CBCentralManager!varconnectedPeripheral:CBPeripheral!overrideinit(){super.init()centralManagerCBCentralManager(delegate:self,queue:.main)}}// 蓝牙状态回调funccentralManagerDidUpdateState(_central:CBCentralManager){ifcentral.state.poweredOn{print(蓝牙已开启可以扫描)}else{print(蓝牙不可用)}}2. 扫描外设// 开始扫描funcstartScan(){guardcentralManager.state.poweredOnelse{return}// 传入 nil 扫描所有设备传入服务 UUID 可精准扫描centralManager.scanForPeripherals(withServices:nil,options:nil)}// 扫描到设备funccentralManager(_central:CBCentralManager,didDiscover peripheral:CBPeripheral,advertisementData:[String:Any],rssiRSSI:NSNumber){print(发现设备\(peripheral.name??未知设备))// 记录设备、停止扫描、准备连接}// 停止扫描funcstopScan(){centralManager.stopScan()}3. 连接外设funcconnect(peripheral:CBPeripheral){connectedPeripheralperipheral connectedPeripheral.delegateselfcentralManager.connect(peripheral,options:nil)}// 连接成功funccentralManager(_central:CBCentralManager,didConnect peripheral:CBPeripheral){print(连接成功)// 连接后自动搜索服务peripheral.discoverServices(nil)}// 连接失败funccentralManager(_central:CBCentralManager,didFailToConnect peripheral:CBPeripheral,error:Error?){print(连接失败\(error?.localizedDescription??))}4. 发现服务funcperipheral(_peripheral:CBPeripheral,didDiscoverServices error:Error?){guardletservicesperipheral.serviceselse{return}forserviceinservices{// 发现特征peripheral.discoverCharacteristics(nil,for:service)}}5. 发现特征funcperipheral(_peripheral:CBPeripheral,didDiscoverCharacteristicsFor service:CBService,error:Error?){guardletcharacteristicsservice.characteristicselse{return}forcharacincharacteristics{print(特征UUID\(charac.uuid))// 可根据 UUID 匹配读写/通知特征}}6. 数据交互核心① 读特征funcreadCharacteristic(_charac:CBCharacteristic){connectedPeripheral.readValue(for:charac)}// 读结果回调funcperipheral(_peripheral:CBPeripheral,didUpdateValueFor characteristic:CBCharacteristic,error:Error?){ifletdatacharacteristic.value{letvalueString(data:data,encoding:.utf8)print(读取到数据\(value??))}}② 写特征funcwriteData(_data:Data,to charac:CBCharacteristic){connectedPeripheral.writeValue(data,for:charac,type:.withResponse)}③ 订阅通知硬件主动推送funcsubscribeNotify(_charac:CBCharacteristic){connectedPeripheral.setNotifyValue(true,for:charac)}// 取消订阅funcunsubscribeNotify(_charac:CBCharacteristic){connectedPeripheral.setNotifyValue(false,for:charac)}// 通知数据回调硬件主动发数据funcperipheral(_peripheral:CBPeripheral,didUpdateValueFor characteristic:CBCharacteristic,error:Error?){ifletdatacharacteristic.value{// 处理硬件推送的数据}}7. 断开连接funcdisconnect(){ifletperipheralconnectedPeripheral{centralManager.cancelPeripheralConnection(peripheral)}}// 断开回调funccentralManager(_central:CBCentralManager,didDisconnectPeripheral peripheral:CBPeripheral,error:Error?){print(设备断开连接)// 可在此处执行重连逻辑}三、GATT 机制详解面试必问GATT Generic Attribute ProfileBLE 数据交互的标准协议规则以Service为功能单位以Characteristic为数据单位手机和硬件通过读写 / 通知交互数据Characteristic 三种交互方式Read手机主动读Write手机主动写Notify硬件主动推送给手机最常用四、断连重连机制Swift 最稳定实现1. 监听断开上面已实现2. 重连策略直接用 UUID 重连无需扫描// 存储设备 UUIDletstoredUUIDString设备的identifier.uuidString// 重连方法funcreconnect(){guardletuuidUUID(uuidString:storedUUIDString)else{return}letperipheralscentralManager.retrievePeripherals(withIdentifiers:[uuid])ifletperipheralperipherals.first{connectedPeripheralperipheral connectedPeripheral.delegateselfcentralManager.connect(peripheral,options:nil)}}3. 重连失败 → 延迟重试 / 重新扫描五、iOS 对 BLE 的强限制非常重要1. 扫描限制后台扫描必须指定 Service UUID后台扫描频率降低不能无限扫描2. 连接限制最多同时连接~20 个设备看系统连接失败不会自动重连3. 后台运行限制必须开启Background Modes → Uses Bluetooth LE accessories后台不能长时间扫描后台写数据可能延迟 / 被挂起4. 权限限制iOS 13NSBluetoothAlwaysUsageDescriptioniOS 14NSBluetoothPeripheralUsageDescription不配置权限直接崩溃5. 电池优化限制系统会自动休眠 BLE频繁扫描会导致耗电飙升不用时必须停止扫描6. 系统杀死 APP后台超过一定时间会被系统 kill被杀死后无法自动重连除非重新打开 APP六、iOS BLE 开发注意事项Swift 避坑大全1. 必须判断 CBCentralManager 状态状态未启用就扫描 →直接无效2. 不要连续调用 connect连接中再次 connect → 系统报错加isConnecting标记位3. 订阅通知前必须判断特征属性ifcharac.properties.contains(.notify){// 允许订阅}4. 数据分包发送BLE 单次最大传输20 字节超过必须分包、组包5. 不要阻塞主线程所有 BLE 回调都在子线程UI 更新必须切主线程DispatchQueue.main.async{// 更新 UI}6. 多设备管理用 UUID 作为唯一标识不要用外设对象 / 名称7. 处理设备信号弱信号弱RSSI lt; -80会导致卡顿、断连不要远距离操作8. 释放逻辑页面退出时停止扫描取消连接置空代理防止内存泄漏、崩溃七、面试高频 BLE 问题总结BLE 经典蓝牙区别BLE GATT 结构Characteristic 三种交互方式iOS 后台 BLE 限制断连重连如何实现BLE 数据超过 20 字节怎么办iOS 13 蓝牙权限BLE 开发常见崩溃原因八、一句话总结面试背诵iOS BLE 开发基于GATT 协议流程为初始化 → 扫描 → 连接 → 发现服务 → 发现特征 → 读写 / 通知 → 断开 / 重连。iOS 对扫描、后台、权限、电量都有严格限制开发必须注意线程、分包、重连、内存、权限、后台模式才能保证稳定不崩溃。

相关文章:

iOS BLE 开发(Swift 实现 + 面试 + 开发必备)

一、BLE 基础概念(必须懂) 1. BLE 是什么 Bluetooth Low Energy 低功耗蓝牙,特点:低功耗、连接快、小数据传输适用于:智能硬件、手环、车机、传感器、设备诊断2. BLE 角色Central(中心设备)&…...

AWorksLP嵌入式平台FatFs文件系统与SD卡驱动移植实战指南

1. 项目概述:为什么要在AWorksLP上折腾FatFs和SD卡?在嵌入式开发里,存储扩展是个绕不开的话题。尤其是当你手头的MCU片上Flash只有几百KB,却要存点日志、配置文件,甚至是一些小体积的音频、图片资源时,外挂…...

Python代码质量双保险:Black格式化与类型提示实战指南

1. 项目概述:当代码格式化遇上类型安全在嵌入式开发,尤其是像CircuitPython这样的微控制器编程领域,代码的清晰度和可靠性往往比在桌面环境更为重要。资源受限、调试困难,意味着每一行代码都最好能“一次写对”。我这些年折腾过不…...

AI智能体在社交约会场景中的架构设计与工程实践

1. 项目概述:当AI遇见约会,一个开源智能体的诞生最近在GitHub上看到一个挺有意思的项目,叫jessastrid/matchclaws-ai_agent_dating。光看名字,就能嗅到一股混合了技术、社交与未来感的独特气息。简单来说,这是一个利用…...

Java后端工程师必备:系统学习大模型应用开发(收藏版)

本文深入探讨了Java后端工程师如何系统性地学习AI应用开发,从基础的CRUD操作到大模型的集成,包括RAG、Tool Calling、MCP、Agent等关键技术。文章强调了AI应用开发不仅是调用大模型接口,而是将大模型能力融入真实业务系统,实现理解…...

AI应用开发与AI Agent开发:小白程序员必备技能,收藏学习迎高薪未来!

本文介绍了AI应用开发和AI Agent开发的核心概念和区别,通过传统后端开发、AI应用开发和AI Agent开发三个场景的对比,阐述了AI技术如何赋能产品和服务。AI应用开发是将大模型能力嵌入产品,而AI Agent开发则是让大模型自主完成任务。文章还结合…...

2026程序员必看:收藏这份AI大模型学习资源包,小白也能轻松入门!

2026程序员必看:收藏这份AI大模型学习资源包,小白也能轻松入门! 随着AI大模型技术的快速发展,传统编程技能已难以满足职场需求。本文分析了程序员面临的职场焦虑,指出掌握大模型技术是2026年程序员提升竞争力的关键。文…...

对比直接使用官方API体验Taotoken在稳定性与成本上的差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用官方API体验Taotoken在稳定性与成本上的差异 在将大模型能力集成到个人项目或小团队工作流中时,开发者通常…...

番茄小说下载器终极指南:如何轻松构建个人离线图书馆

番茄小说下载器终极指南:如何轻松构建个人离线图书馆 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否经常在地铁、高铁或飞机上想要阅读番茄小说&#xff0c…...

对比直接购买,使用 Taotoken 的 Token Plan 带来的成本优势感知

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接购买,使用 Taotoken 的 Token Plan 带来的成本优势感知 1. 从按需付费到套餐规划的成本视角转变 在直接使用各…...

Java程序员必看:收藏这份2026大模型转型攻略,小白也能轻松入行高薪赛道!

Java程序员必看:收藏这份2026大模型转型攻略,小白也能轻松入行高薪赛道! 随着大模型(LLMs)成为IT行业新质生产力的核心引擎,2026年国内大模型核心市场规模将突破700亿元,人才缺口达200万。本文专…...

2026年十大最佳小程序制作平台:革新数字化运营体验

小程序制作已成为企业数字化运营的重要抓手,2026年市场涌现多个高效平台。本文聚焦十大主流工具,涵盖从开发效率到生态构建的核心维度。好赞科技凭借地域精准算法领跑,亿点通科技以低代码开发见长,启帆数字突出定制化能力。各平台…...

第9课:Linux开发工具(四):make与makefile

第9课:Linux开发工具(四):make与makefile 一、为什么我们需要 Makefile? 1.1 IDE 背后的秘密 在使用 Visual Studio 等 IDE 时,我们只需按下 F5 或点击"编译"按钮,程序就会自动完成编…...

绝对不要让两根线在同一个交换机上连成一个圈。 为什么 形成一个环就会网络风暴?

为了让你彻底理解“为什么环路会导致风暴”,我们把网络连接看作一个“数字信息的传递游戏”。 1. 关键前提:交换机不懂“记忆” 交换机(特别是普通的傻瓜交换机)在转发广播消息时,它不具备判断“这条消息我刚才是不是发过”的能力。它只认一个逻辑: “只要是从端口A进来…...

AP的全称是什么?

AP 的全称是 Access Point。 中文常叫 无线接入点 或 无线 AP,一般指 Wi‑Fi 路由器 / 热点 里负责 让手机、笔记本、POS 等无线接入局域网 的那一部分(有时也整台设备被口语叫成 AP)。 在你们文档里 「Connect the LAN port … to an AP r…...

USB OTG = 让这个 USB 口既能当设备连电脑,也能当主机接 U 盘等外设。

USB OTG = 让这个 USB 口既能当设备连电脑,也能当主机接 U 盘等外设。 USB OTG = USB On-The-Go(常读成「USB OTG」) 一句话 让 本来当 U 盘、鼠标那种「从设备(Device)」用的 USB 口,在需要时也能 临时当「主机(Host)」,去 接 U 盘、键盘、读卡器 等外设。...

LabVIEW IMAQ 三缓冲高性能图像处理

2. 原生 G 语言图像操作性能差的原因3. 最高性能路径:DLL 像素指针最优路径:获取图像首地址指针 → 传入 C/C DLL → 整块内存直接读写这是 LabVIEW 图像处理最快路径。关键函数:IMAQ GetImagePixelPtr —— 获取图像像素缓冲区首指针。二、…...

Unity3D项目跨平台部署实战:从Windows到Linux的完整流程与避坑指南

1. 环境准备:搭建跨平台开发基础 跨平台部署的第一步是确保开发环境配置正确。很多开发者容易忽略这一步,结果在后续流程中遇到各种奇怪的问题。我在实际项目中遇到过多次因为环境不匹配导致的编译失败,所以特别强调环境准备的重要性。 首先需…...

保姆级教程:用Materials Studio切(111)晶面并构建真空层,一步步教你分析晶体生长

从零开始掌握Materials Studio晶体表面建模:以(111)晶面为例的完整实战指南 在材料模拟与计算化学领域,精确构建晶体表面模型是研究催化反应、界面特性以及材料生长机制的基础环节。Materials Studio作为业界广泛采用的模拟平台,其表面建模功…...

Vue2项目里,如何用DHTMLX Gantt实现任务搜索、今日线定位和视图切换?这些实用功能我帮你搞定了

Vue2项目中DHTMLX Gantt三大进阶功能实战:搜索、今日线与视图切换 在项目管理工具的开发中,甘特图作为核心可视化组件,其交互体验直接决定了用户的使用效率。本文将聚焦三个高频需求场景,手把手教你如何在已有DHTMLX Gantt集成的V…...

ONLYOFFICE集成踩坑实录:90%的“内容丢失”和“版本已更新”都因为document.key用错了

在集成OnlyOffice DocumentServer的过程中,很多开发者都会遇到两个非常典型的问题: 多人协同编辑后,再次打开文档发现内容缺失重新打开文档时提示“文档版本已更新” 很多人会认为: 是 ONLYOFFICE 不稳定是缓存机制异常是协同编…...

告别硬件依赖:用Proteus玩转STM32F1,从CubeMX生成代码到仿真调试的避坑实践

零硬件玩转STM32F103:Proteus仿真全流程与LL库高效开发指南 从真实硬件到虚拟仿真的思维转换 嵌入式开发者的传统认知里,调试灯闪烁必须连接实物开发板——直到他们遇到Proteus。这款电路仿真软件让STM32F103系列芯片在虚拟环境中完美运行,配…...

ubuntu linux虚拟机安装部署hermes详细教程(安装、问题处理)

文章目录 前言 一、Hermes 介绍 1. 什么是 Hermes Agent? 2. 核心特性 3. 为什么选择 Hermes Agent? 4. 适用场景 二、安装Hermes 1.安装 2.配置 3.开始对话 4.接入多平台(可选) 5.保持更新 三、Hermes接入微信 四、常见错误解决 1.Failed to connect to github.com port 4…...

避开这些坑!STC8H8K64U IAP升级中FLASH分区与Keil定位的保姆级教程

STC8H8K64U IAP升级实战:FLASH分区设计与Keil定位全解析 第一次接触STC8H8K64U的IAP功能时,我花了整整三天时间才搞明白为什么程序总是莫名其妙地崩溃。直到发现是FLASH分区地址计算错误导致用户程序覆盖了ISP引导区,才恍然大悟。本文将分享从…...

告别手动标注!用TableBank数据集+Detectron2,快速搞定表格检测模型训练

零基础实战:基于TableBank与Detectron2的工业级表格检测方案 在金融报表解析、医疗档案数字化等场景中,表格检测作为文档智能处理的第一道关卡,其准确性直接影响后续信息提取的成败。传统人工标注数据的方式不仅成本高昂,更面临版…...

Next.js静态站点图片优化实战:next-image-export-optimizer配置指南

1. 项目概述:为什么我们需要一个“静态图片优化器”?如果你和我一样,经常用 Next.js 做项目,那你肯定对next/image组件又爱又恨。爱的是它开箱即用的图片懒加载、自动格式转换和响应式适配,恨的是它在构建和部署时带来…...

干货版《算法导论》04:渐近复杂度与序列接口实战

干货版《算法导论》04:渐近复杂度与序列接口实战Bilibili 同步视频✨ 开篇引言一、为什么要做「算法问题精讲」?二、渐近复杂度:函数增长排序的终极法则1. 核心增长关系(必背!)2. 解题通用方法3. 阶乘与二项…...

书匠策AI:一个让论文小白也能“开挂“的毕业论文神器,到底有多能打?

各位同学,你有没有经历过这种崩溃时刻——毕业论文 deadline 倒计时,你的Word文档里只有标题,脑子里一片空白,选题没思路、大纲理不清、参考文献不会找,甚至连学校格式都搞不明白? 别慌,今天作…...

B站成分检测器:3分钟快速安装指南,智能识别评论区用户真实身份

B站成分检测器:3分钟快速安装指南,智能识别评论区用户真实身份 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分,支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comme…...

利用 Taotoken 模型广场为不同智能体任务选择合适的模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用 Taotoken 模型广场为不同智能体任务选择合适的模型 在设计多智能体系统时,一个常见的挑战是如何为系统中承担不同…...