首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS 蓝牙4.0开发使用(内附 Demo)

iOS 蓝牙4.0开发使用(内附 Demo)

作者头像
网罗开发
发布于 2021-01-29 09:33:06
发布于 2021-01-29 09:33:06
1.8K00
代码可运行
举报
文章被收录于专栏:网罗开发网罗开发
运行总次数:0
代码可运行

一: 介绍

近几年,智能设备越来越火,这些智能设备中,有很大一部分是通过手机来控制硬件设备,来达到预期的效果,这中间少不了要使用到蓝牙功能,通过蓝牙来通信来控制设备。

蓝牙分为蓝牙2.0和蓝牙4.0。

蓝牙2.0为传统蓝牙,传统蓝牙也称为经典蓝牙。

蓝牙4.0因为低耗电,所以也叫做低功耗蓝(BLE),它将三种规格集一体,包括传统蓝牙技术、高速技术和低耗能技术。

这篇文章用来介绍BLE 4.0的使用以及相关问题的解决。

二:BLE的两种模式

BLE的两种模式分为CBCentralMannager 中心模式 和CBPeripheralManager 外设模式,在这里主要和大家分享CBCentralMannager 中心模式的开发和使用。

CBCentralMannager 中心模式

以手机(app)作为中心,连接其他外设的场景。详细流程如下:

1. 建立中心角色

2. 扫描外设

3. 发现外设

4. 连接外设

4.1 连接失败

4.2 连接断开

4.3 连接成功

5. 扫描外设中的服务

5.1 发现并获取外设中的服务

6. 扫描外设对应服务的特征

6.1 发现并获取外设对应服务的特征

6.2 给对应特征写数据

7. 订阅特征的通知

7.1 根据特征读取数据

三:BLE开发步骤

在介绍CBCentralMannager 中心模式开发步骤之前,首先需要对项目进行如下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "ESPFBYBLEHelper.h"
#import <CoreBluetooth/CoreBluetooth.h>

@interface ESPFBYBLEHelper ()<CBCentralManagerDelegate,CBPeripheralDelegate>
// 中心管理者(管理设备的扫描和连接)
@property (nonatomic, strong) CBCentralManager *centralManager;
// 存储的设备
@property (nonatomic, strong) NSMutableArray *peripherals;
// 扫描到的设备
@property (nonatomic, strong) CBPeripheral *cbPeripheral;
// 外设状态
@property (nonatomic, assign) CBManagerState peripheralState;
@end

// 蓝牙4.0设备名
static NSString * const kBlePeripheralName = @"lighte290";
// 通知服务
static NSString * const kNotifyServerUUID = @"FF03";
// 写服务
static NSString * const kWriteServerUUID = @"FFFF";
// 通知特征值
static NSString * const kNotifyCharacteristicUUID = @"FF05";
// 写特征值
static NSString * const kWriteCharacteristicUUID = @"FF08";
@implementation ESPFBYBLEHelper

这其中需要导入CoreBluetooth框架

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import <CoreBluetooth/CoreBluetooth.h>

遵守CBCentralManagerDelegate,CBPeripheralDelegate协议

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@interface ESPFBYBLEHelper ()<CBCentralManagerDelegate,CBPeripheralDelegate>

然后需要检测蓝牙状态,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 状态更新时调用
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    switch (central.state) {
        case CBManagerStateUnknown:{
            NSLog(@"为知状态");
            self.peripheralState = central.state;
        }
            break;
        case CBManagerStateResetting:
        {
            NSLog(@"重置状态");
            self.peripheralState = central.state;
        }
            break;
        case CBManagerStateUnsupported:
        {
            NSLog(@"不支持的状态");
            self.peripheralState = central.state;
        }
            break;
        case CBManagerStateUnauthorized:
        {
            NSLog(@"未授权的状态");
            self.peripheralState = central.state;
        }
            break;
        case CBManagerStatePoweredOff:
        {
            NSLog(@"关闭状态");
            self.peripheralState = central.state;
        }
            break;
        case CBManagerStatePoweredOn:
        {
            NSLog(@"开启状态-可用状态");
            self.peripheralState = central.state;
            NSLog(@"%ld",(long)self.peripheralState);
        }
            break;
        default:
            break;
    }
}

添加属性和常量,常量需要根据自己的项目来进行配置。

下面只需要根据实现流程一步步实现即可,核心代码如下:

1. 建立中心角色

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

2. 扫描外设

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (self.peripheralState ==  CBManagerStatePoweredOn){
    [self.centralManager scanForPeripheralsWithServices:nil options:nil];
}

3. 发现外设

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 扫描到设备
 @param central 中心管理者
 @param peripheral 扫描到的设备
 @param advertisementData 广告信息
 @param RSSI 信号强度
 */
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSLog(@"%@",[NSString stringWithFormat:@"发现设备,设备名:%@",peripheral.name]);
}

4. 连接外设

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[self.centralManager connectPeripheral:peripheral options:nil];
  • 4.1 连接失败 didFailToConnectPeripheral
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 连接失败
 @param central 中心管理者
 @param peripheral 连接失败的设备
 @param error 错误信息
 */
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"%@",@"连接失败");
}
  • 4.2 连接断开
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 连接断开
 @param central 中心管理者
 @param peripheral 连接断开的设备
 @param error 错误信息
 */
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"%@",@"断开连接");
}
  • 4.3 连接成功
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 连接成功
 
 @param central 中心管理者
 @param peripheral 连接成功的设备
 */
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    NSLog(@"连接设备:%@成功",peripheral.name);
    [self.centralManager stopScan];
}

5. 扫描外设中的服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 设置设备的代理
peripheral.delegate = self;
// services:传入nil  代表扫描所有服务
[peripheral discoverServices:nil];
  • 5.1 发现并获取外设中的服务
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 扫描到服务
 @param peripheral 服务对应的设备
 @param error 扫描错误信息
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
    // 遍历所有的服务
    for (CBService *service in peripheral.services)
    {
        NSLog(@"服务:%@",service.UUID.UUIDString);
    }
}

6. 扫描外设对应服务的特征

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 获取对应的服务
        if (![service.UUID.UUIDString isEqualToString:kWriteServerUUID])
        {
            return;
        }
        // 根据服务去扫描特征
        [peripheral discoverCharacteristics:nil forService:service];
  • 6.1 发现并获取外设对应服务的特征
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 扫描到对应的特征
 @param peripheral 设备
 @param service 特征对应的服务
 @param error 错误信息
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    NSLog(@"%@",peripheral);
}
  • 6.2 给对应特征写数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];

7. 订阅特征的通知

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if ([characteristic.UUID.UUIDString isEqualToString:kNotifyCharacteristicUUID]){
  [peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
  • 7.1 根据特征读取数据 didUpdateValueForCharacteristic
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 根据特征读到数据
 @param peripheral 读取到数据对应的设备
 @param characteristic 特征
 @param error 错误信息
 */
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error
{
    if ([characteristic.UUID.UUIDString isEqualToString:kNotifyCharacteristicUUID])
    {
        NSData *data = characteristic.value;
        NSLog(@"%@",data);
    }
}

四:源码Demo获取方法

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网罗开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
解决Maven在pom.xml配置依赖后IntelliJ IDEA无代码提示的方法
在开发Java项目时,我们通常会使用Maven来管理项目的依赖项。然而,有时在配置了pom.xml文件后,我们可能会遇到IntelliJ IDEA无法提供代码提示的情况。下面是解决这个问题的步骤和方法:
高老师
2023/12/14
2.8K0
idea中导入maven项目
我们项目组所开发的项目没有做前后端分离,所有开发人员都在同一个项目下编写代码,项目的前端使用jQuery+Layui+GoJS+echarts实现,后端使用的是SSH,因为没做前后端分离再加上后端开发用了maven构建代码,所以每个开发人员的开发工具都是idea,刚接触项目时,因为我是做前端开发,对后端不熟,每次搭建开发环境的时候都要叫后端开发的同事帮忙,经过不断摸索,我现在差不多也能自己独立完成开发环境的配置。
用户3880999
2023/04/13
1.6K0
idea中导入maven项目
IDEA 2024.1到底更新啥有用的?
IntelliJ IDEA Ultimate 2024.1 针对 Java 全行代码补全。 这项功能由无缝集成到 IDE 中的高级深度学习模型提供支持。 它可以基于上下文分析预测和建议整行代码,有助于提高编码效率。 这些建议由针对不同语言和框架特别训练的专属语言模型驱动,模型完全在本地设备上运行,有助于确保数据安全,并且无需与外部服务器通信。 此功能包含在 IntelliJ IDEA Ultimate 许可证订阅中。 在这篇博文中了解详情。
JavaEdge
2024/05/25
8000
IDEA 2024.1到底更新啥有用的?
详述 IntelliJ IDEA 遇到 Maven 项目 pom.xml 文件没有识别的解决方法
有的时候,我们可能会遇到 IDEA 没有识别 Maven 项目pom.xml的问题,其表现出来的现象就是:
CG国斌
2021/12/07
8.6K0
详述 IntelliJ IDEA 遇到 Maven 项目 pom.xml 文件没有识别的解决方法
idea右边找不到maven窗口(Idea_最右侧常用栏中没有Maven选项)
方案一: 首先idea自带了maven控件,不像Eclipse还需要下载控件,如果你以前有maven在右边,出于某种原因,消失找不到 了,你可以试试我写的方法。
botkenni
2021/09/26
13.1K0
IDEA 2024.2 正式发布,速览新功能!
IntelliJ IDEA 2024.2 允许你直接在 IDE 运行 Spring Data JPA 方法,即时验证存储库查询。
JavaEdge
2025/06/01
2350
IDEA 2024.2 正式发布,速览新功能!
IDE工具之IDEA中Module的创建、删除、导入
Module创建好以后,可以打开pom.xml文件,修改其springboot版本,如图所示:
猫头虎
2024/04/08
2K0
IDE工具之IDEA中Module的创建、删除、导入
[1085]对于maven中pom.xml依赖报红问题
在写maven项目的时候,导入的依赖报红问题解决办法,像下图标注位置是红色,依赖包也无法正常导入解决
周小董
2021/12/09
2.6K0
[1085]对于maven中pom.xml依赖报红问题
在IDEA里解决maven的pom引用jar包冲突
本文由本人原创,原文首先发布于本人的个人博客 http://791202.com/,原文地址:在IDEA里解决maven的pom引用jar包冲突
那啥快看791202
2020/02/14
4.8K0
在IDEA里解决maven的pom引用jar包冲突
Eclipse & Spring Tool Suite常用配置
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。Eclipse是Java开发人员常用的开发工具,虽然现在很多人转向使用IDEA,但是Eclipse给我们还是留下了一段美好的回忆。
Java架构师必看
2020/04/22
2.4K0
在IDEA中配置Maven开发环境
环境说明: 系统:win10专业版 deepin V20 IDE:IDEA 2020.3 java:jdk1.8 Maven:3.8.1
知识分子没文化
2023/07/01
9470
在IDEA中配置Maven开发环境
2024最新版IDEA设置启动参数
JavaEdge
2025/06/01
6580
2024最新版IDEA设置启动参数
idea引入maven期间失败导致maven项目加载失败
idea默认使用的是maven中央仓库,由于加载过慢,因此我们一般会使用阿里或者网易等一些国内的maven仓库,但是在项目加载过程中,不会因为你修改了maven的配置而改变之前项目对maven仓库,因此笔者直接把idea关闭后重启了,出现了如下问题:
johnhuster的分享
2022/03/28
2.3K0
idea引入maven期间失败导致maven项目加载失败
Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图「建议收藏」
为什么我的这个jar包依赖这么少呢,因为我这个项目只是简单示范了一下springmvc框架的使用。所以,也没有引入过多的jar包,要是在一个大一点的项目里面,你使用定时任务了,使用poi了使用等等一些其他工具类的包,那么就会很多了。
全栈程序员站长
2022/09/23
16.9K0
Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图「建议收藏」
maven 依赖jar包时版本冲突的解决:mvn dependency:tree -Dverbose
maven 依赖jar包时版本冲突的解决: mvn dependency:tree -Dverbose
一个会写诗的程序员
2018/08/17
9.9K0
maven 依赖jar包时版本冲突的解决:mvn dependency:tree -Dverbose
IDEA配置Maven
Maven的简介与安装->IDEA配置Maven->Maven依赖范围 ->如何用Maven打包 简介:本文讲解IDEA怎么配置Maven.
GeekLiHua
2025/01/21
3280
IDEA配置Maven
idea使用总结
1.本地检出服务器代码,存放目录D:\csworks\yksDir\baoming-V2
用户6182664
2020/06/16
9420
idea使用总结
Spark2.x学习笔记:6、在Windows平台下搭建Spark开发环境(Intellij IDEA)
本文介绍了如何使用IntelliJ IDEA和Scala进行Spark编程,包括创建Scala和Spark项目、安装和配置Scala和Spark、编写Spark程序等步骤。
程裕强
2018/01/02
3.1K0
Spark2.x学习笔记:6、在Windows平台下搭建Spark开发环境(Intellij IDEA)
Maven
之前我们导入依赖的时候,每次都要去下载对应的 Jar 包,这样其实是很麻烦的,并且还有可能一个 Jar 包依赖于另一个 Jar 包,因此我们需要一个更加方便的包管理机制。
小简
2023/01/04
8580
Maven
windows环境下搭建spark开发环境(IDEA)
“大数据”(Big Data)指一般的软件工具难以捕捉、管理和分析的大容量数据。“大数据”之“大”,并不仅仅在于“容量之大”,更大的意义在于:通过对海量数据的交换、整合和分析,发现新的知识,创造新的价值,带来“大知识”、“大科技”、“大利润”和“大发展”。“大数据”能帮助企业找到一个个难题的答案,给企业带来前所未有的商业价值与机会。大数据同时也给企业的IT系统提出了巨大的挑战。通过不同行业的“大数据”应用状况,我们能够看到企业如何使用大数据和云计算技术,解决他们的难题,灵活、快速、高效地响应瞬息万变的市场需求。
量子态的沐子呓
2019/12/25
7.3K0
windows环境下搭建spark开发环境(IDEA)
推荐阅读
相关推荐
解决Maven在pom.xml配置依赖后IntelliJ IDEA无代码提示的方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档