别小看iOS蓝牙,它也是通向万物互联的小桥梁

整体概念

iOSBluetooth
iOSBluetooth
iOSBluetooth
iOSBluetooth

蓝牙连接发送数据流程

iOSBluetooth

基础概念

BLE: 全称Bluetooth low energy ,蓝牙4.0设备,(因为低功耗)

Central: 中心设备,发起蓝牙连接的设备(一般指手机)

peripheral: 外设,被蓝牙连接的设备(一般是带蓝牙模块的硬件设备,如手环、音响等)

Service: 服务,外设广播和运行的时候会有服务,可以理解成一个功能模块,外设可以有多个服务。中心设备可以读取服务。

Characteristic: 特征,每个服务都包含很多特征值,特征值会有一个value,一般读写的数据就是这个value,特征分read、write、notify等权限

Description: 描述,每个特征可以对应一个或者多个,用于描述特征的信息或者属性。

MFI: made for iOS (苹果MFI认证),是苹果公司对其授权配件厂商生产的外置配件的一种标识使用许可

UUID: unique identify,UUID是一个16bit或128bit的值,用于区分不同的服务和特征,可以理解为服务或者特征的身份证。它通常不会由我们定义,一般是通过查询后获取。一般在编写外设时,定义设备(NSUUID),服务(CBUUID)或特征(CBUUID)的唯一标识符时用到。编写中心设备时,需根据搜索设备(NSUUID)或服务(CBUUID)时也会用到。UUID每个字符用的是16进制表示。

NSUUID: 采用RFC4122 version 4协议形成的128位唯一标识字符串,这里用于唯一标识蓝牙设备。这意味着每个蓝牙模块都是唯一的。

CBUUID: 也是一个128位唯一标识符,用于标识蓝牙的服务、特征或特征的描述符descriptor。这里使用的是蓝牙技术联盟Bluetooth SIG制定的规范。

广播: 就是外设不停散播蓝牙信号,让中心设备可以扫描到。

基础操作 - 检测蓝牙的状态

在对蓝牙进行广播、连接等一系列操作之前,都要先检查蓝牙的状态,在已确保蓝牙开启的前提下去操作,避免因为蓝牙未开启而导致操作失败。


#import "ViewController.h"
#import <CoreBluetooth/CoreBluetooth.h>

@interface ViewController ()<CBCentralManagerDelegate>
/// 蓝牙相关 中心管理者(手机设备)
@property (nonatomic, strong) CBCentralManager *mCentral;
/// 是否已打开蓝牙
@property (nonatomic, assign) BOOL isOpenBluetooth;


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 检测程序进入前台并处于活动状态时蓝牙的状态
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkBLEStatus) name:UIApplicationDidBecomeActiveNotification object:nil];
    // 初始化BLE中心设备
    [self mCentral];
    
}

/// 1开始,初始化一个中心设备
- (CBCentralManager *)mCentral {
    if (!_mCentral) {
        _mCentral = [[CBCentralManager alloc] initWithDelegate:self
                                                         queue:dispatch_get_main_queue()
                                                       options:nil];
    }
    return _mCentral;
}

/// 2如果成功初始化中心管理者,就会回调 CBCentralManagerDelegate 触发此代理方法
/// @param central 中心设备
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    if (central.state == CBManagerStatePoweredOn) {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.isOpenBluetooth = YES;
            [[NSUserDefaults standardUserDefaults]setBool:true forKey:@"isOpenBluetooth"];
            [[NSUserDefaults standardUserDefaults]synchronize];
            [self checkBLEStatus];
        });
    } else {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.isOpenBluetooth = NO;
            [[NSUserDefaults standardUserDefaults]setBool:false forKey:@"isOpenBluetooth"];
            [[NSUserDefaults standardUserDefaults]synchronize];
            [self checkBLEStatus];
        });
    }
}

/// 检测蓝牙开启状态
- (void)checkBLEStatus {
    if (self.isOpenBluetooth) {
        NSLog(@"已开启蓝牙");
    } else {
        NSLog(@"没有打开蓝牙");
    }
}

基础操作 - NSUUID一般用法

// 生成一个随机128位唯一标识符
NSUUID *uu = [NSUUID UUID];

// 读取UUID
NSString *str = uu.UUIDString;

// 两个UUID比较不能使用== 
if ([UUID1 isEqueal: UUID2]) {
// other code;
}

常见问题 - [CoreBluetooth] XPC connection invalid

CBCentralManager 的创建是异步的,如果初始化完成之后没有被当前创建它的类所持有,就会在下一次 RunLoop 迭代的时候释放。当然 CBCentralManager 实例如果不是在 ViewController 中创建的,那么持有 CBCentralManager 的这个类在初始化之后也必须被 ViewController 持有,否则控制台会有此输出

常见问题 - 关于Mac地址的获取

自iOS7之后,苹果不支持获取Mac地址,只能用UUID来标识设备。值得注意的是同一个设备在不同手机上显示的UUID不相同。但有的设备可以通过 “180A”这个服务来发现特征,再读取 “2A23”这个特征值,可以获得Mac地址。若该蓝牙设备不支持此获取方式,你可以跟硬件工程师协商添加一个获取地址命令或者增加一个含地址的特征值来获得Mac地址。(前提都是需要先建立连接)。若要求在扫描的时候获得Mac地址,需让硬件工程师把数据写入广播包里。

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容