文档章节

iOS开发 最近开发了蓝牙模块,在此记录总结一下

最牛逼的代码搬运工
 最牛逼的代码搬运工
发布于 2017/05/08 18:27
字数 1199
阅读 403
收藏 0
点赞 0
评论 1

1.基本概念

<1>中心者模式:常用的(其实99.99%)就是使用中心者模式作为开发,就是我们手机作为主机,连接蓝牙外设。由于开发只用到了中心者模式,所以我也只介绍中心者模式。

<2>管理者模式:这个基本用到的比较少,我们手机自己作为外设,自己创建服务和特征,然后有其他的设备连接我们的手机。

<3>服务(services):蓝牙外设对外广播的必定会有一个服务,可能也有多个,服务下面包含着一些特征,服务可以理解成一个模块的窗口。

<4>特征(characteristic):存在于服务下面的,一个服务下面也可以存在多个特征,特征可以理解成具体实现功能的窗口,一般特征都会有value,也就是特征值,特征是与外界交互的最小单位。

<5>UUID:以理解成蓝牙上的唯一标识符(硬件上肯定不是这个意思,但是这样理解便于我们开发),为了区分不同的服务和特征,或者给服务和特征取名字,我们就用UUID来代表服务和特征。

<6>外设名字(name):不是每一个蓝牙外设都是拥有name的。在开发的时候,当你发现name属性为空,这是很正常的,我曾经就因为这个问题纠结了很久。

2.具体的操作流程

<1>遵循两个协议

CBCentralManagerDelegate(中心管理的协议),CBPeripheralDelegate(外设的协议),并打开手机的蓝牙。

<2>创建一个中心管理(CBCentralManager),并设置代理。

代理一旦设置,就会走协议(CBCentralManagerDelegate)里面的方法。

<3>扫描周围的外设

当-(void)centralManagerDidUpdateState:(CBCentralManager *)central方法检测到本机蓝牙开启的时候,开始扫描([central scanForPeripheralsWithServices:nil options:nil];)周围的外设,必须是本机蓝牙开启之后才去扫描周围外设。

<4>获取扫描到的外设

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI;会返回扫描到的外设。如果你不关闭扫描,这个方法会一直被调用。

<5>连接外设

在上一步中选择一个外设进行连接。

- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;

在下面三个方法中可以返回蓝牙连接的状态。如果连接成功,我们就开始设置外设的代理,并获取该外设的服务;

-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;

-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;

-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;

[peripheral setDelegate:self];

[peripheral discoverServices:nil];

<6>获取已连接外设的服务

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;

该方法可以返回已连接外设的服务。在这里我们找到我们需要的服务,并获取对应服务的特征。

<7>获取对应服务的特征

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;

这个方法会给出你选择的服务里面的特种。在这里,我们找到我们需要的特种,并作为全局变量存储起来,因为我们在后面对外设进行写操作的时候会用到。这一点切记!

<8>对外设进行写操作

- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;

这里注意的是,一定要确保二进制流的正确性,检查特征的属性是否为可写,特征就是将上一步拿到的特征传入即可,type有两种,根据具体的硬件进行选择即可。对于读操作,因为比较简单,这里就不多说了。

到这里,作为中心者模式,大体的流程都已经走完。

3.使用过成功可能会遇到的坑

<1>必须在蓝牙打开的时候,才能调用扫描外围设备的API。

<2>中心外设向别的外设写入对数据的时候,一定要保证二进制串的正确性(这方面上我是吃过很大的亏的)。

4.推荐的第三方

在此,本来我是想自己封装一套蓝牙的调用机制,但是我看了BabyBlueTooth之后就放弃了。所以我强烈推荐BabyBlueTooth这个第三方库,想要的同学可以去github上面进行搜索。

5.最后附上demo地址

由于我的代码是基于我们的智能密码锁写出来的,里面的规则不便拿出来共享。所以,还是建议看BabyBlueTooth的Demo。如有任何疑问请添加QQ:2799569272,一起讨论。

谢谢阅读,如有不对之处,欢迎指出。

© 著作权归作者所有

共有 人打赏支持
最牛逼的代码搬运工
粉丝 5
博文 42
码字总数 23329
作品 0
六安
程序员
加载中

评论(1)

姚兜兜
姚兜兜
作者为何不把参考文章写一下呢?因为我摘抄的篇幅较长,算是尊重一下原作者吧
fir.im Weekly - 每个程序员都应当拥有的技能树

本周收集了一些优秀的 iOS & Android 开发资源和程序员 IT 技能拓展的 Tips. 知道创宇研发技能表 v3.0 作为程序员可能都听说过【知道创宇】,他们是一家黑客文化浓厚的安全公司。这张技能表为...

风起云飞fir_im
2015/09/06
0
0
实战分享,教你蓝牙在小程序中的应用

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:朱胜 导语 蓝牙在日常生活中广泛使用的一项技术,小程序给了我们前端工程师一个控制蓝牙的方法,带上你的设备,来看看怎...

腾讯云加社区
2017/10/23
0
0
阿里腾讯百度头条美团iOS面试总结

阿里腾讯百度头条美团iOS面试总结 2018-05-30 15:24编辑: garace分类:程序人生来源:代码湾 互联网面试iOS 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师 京东招聘iOS开发工...

garace
05/30
0
0
IOS下WEBVIEW 的javascript数组与json定义 及交互

最近在折腾IOS新闻浏览客户端,当中需要用到webview传递JSON数据到IOS上,然后在IOS上解析。刚入门IOS不久,看了不少的书,但都是囫囵吞枣。在开发过程中,遇到不少问题。 开发环境 mac mini...

GIFCOOL
2013/08/20
0
0
iOS 终于支持了 PWA,一起来认识一下这个强化版「小程序」 | 科普

iOS 终于支持了 PWA,一起来认识一下这个强化版「小程序」 | 科普 发布于 2018-04-13 文章被以下专栏收录

少数派
07/06
0
0
iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd
04/17
0
0
fir.im Weekly - 30 天从 0 开始学 Swift

最近一周看到很多很好用的的轮子,忍不住推荐给大家。此外,本期 fir.im Weekly 还精选了一些实用的 iOS , Android , UI 动画的干货文章。让我们一起来看下: Hacking with Swift 由@稀土圈...

风起云飞fir_im
2015/11/05
0
0
fir.im Weekly - iOS 开发中的 Git 流程

本期 fir.im Weekly 收集了微博上的热转资源,包含 Android、iOS 开发工具、源码等好用的轮子,还有一些 APP 设计的 Tips,希望对你有用。 精仿知乎日报 iOS 端 @我偏笑_NSNirvana花了将近一...

风起云飞fir_im
2015/11/03
0
0
c++学习总结:define的小细节

在iOS开发中,我们可以使用#ifdef或者#ifndef来进行一些判断,这在我之前的博客中已经有所说明。今天我无意中又发现了一个小细节,总结起来就是预编译判断的两种方式,特在此与大家分享。 (...

召唤攻城狮
2014/05/19
0
0
使用UniDAC在Delphi XE4中开发iOS应用

使用UniDAC在Delphi XE4中开发iOS应用   核心提示:Delphi XE4的发布让很多Delphi开发者欣喜若狂,毫无疑问它使得Delphi开发更简单且更容易被理解,而且让开发无论是iPhone、iPad还是iPod的...

vga
2014/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
14分钟前
5
0
python上传文件

//注意 <form action="/login/" method="post" enctype="multipart/form-data"> f=request.FILES.get('fafa') ff=open(f.name,mode='wb') for i in f.chunks(): ff.write(i) ff.close()......

南桥北木
27分钟前
0
0
CISCO VPN Client Reason 442 WIN8/10错误解决方案

http://jdkleo.iteye.com/blog/2163493 引用 http://my.oschina.net/cloudcoder/blog/220391?p={{currentPage 1}} 在使用cisco VPN 客户端登录时,产生Reason 442:Failedto enable Virtual......

chenfj_fer
30分钟前
0
0
信号量有没有容量限制?

之前一直误以为信号量初始化的时候那个初始化的值是信号量的“容量”,昨天同事指出了我的错误,最初我是不相信的,经过以下代码实践,证明了我的错误: Java版: import java.util.concurr...

锟斤拷烫烫烫
34分钟前
0
0
【RocketMQ】Message存储笔记

概述 消息中间件存储分为三种,一是保存在内存中,速度快但会因为系统宕机等因素造成消息丢失;二是保存在内存中,同时定时将消息写入DB中,好处是持久化消息,如何读写DB是MQ的瓶颈;三是内...

SaintTinyBoy
45分钟前
0
0
Android应用Context详解及源码解析

Android应用Context详解及源码解析 本文定位:优质文章收集 本文转载 1 背景 今天突然想起之前在上家公司(做TV与BOX盒子)时有好几个人问过我关于Android的Context到底是啥的问题,所以就马...

lichuangnk
今天
0
0
PostgreSQL的昨天今天和明天

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS), 也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。 这个起源于伯克利(...

闻术苑
今天
1
0
Mysql对自增主键ID进行重新排序

1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段: ALTER TABLE `table_name` ADD `id` MEDIUMINT( 8 ) NOT NULL FIRST; 3,设置新主键: ALTER TABLE `table_nam......

niithub
今天
0
0
福利篇:免费csdn vip账号分享

分享一个发布免费csdn vip账号的网站:啰嗦vip www.lostvip.com , 各种软件开发类的视频教程:慕课网、动脑学院、黑马各大培训机构VIP视频教程,非常不错!

在水一方发盐人
今天
1
0
Nginx+Tomcat搭建高性能负载均衡集群

一、 工具   nginx-1.8.0   apache-tomcat-6.0.33 二、 目标   实现高性能负载均衡的Tomcat集群:    三、 步骤   1、首先下载Nginx,要下载稳定版:      2、然后解压两个Tom...

码代码的小司机
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部