iOS蓝牙开发:蓝牙连接和数据读写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS蓝牙开发:蓝牙连接和数据读写相关的知识,希望对你有一定的参考价值。

参考技术A 当下蓝牙开发可谓是越来越火,不论是智能穿戴的兴起还是蓝牙家具,车联网蓝牙等等,很多同学也会接触到蓝牙的项目,我从事蓝牙开发也有一段时间了,经手了两个项目。废话不多说了,先向大家简单的介绍有关蓝牙开发的知识。蓝牙低能耗(BLE),以下介绍的都是围绕ios的 <CoreBluetooth/CoreBluetooth.h> 框架展开的。

蓝牙开发分为中心者模式和管理者模式:1.常用的(其实99.99%)就是使用中心者模式作为开发,就是我们手机作为主机,连接蓝牙外设;2.管理者模式,这个基本用到的比较少,我们手机自己作为外设,自己创建服务和特征,然后有其他的设备连接我们的手机。

在做蓝牙开发之前,最好先了解一些概念:
服务(services):蓝牙外设对外广播的必定会有一个服务,可能也有多个,服务下面包含着一些特征,服务可以理解成一个模块的窗口;
特征(characteristic):存在于服务下面的,一个服务下面也可以存在多个特征,特征可以理解成具体实现功能的窗口,一般特征都会有value,也就是特征值,特征是与外界交互的最小单位;
UUID:可以理解成蓝牙上的唯一标识符(硬件上肯定不是这个意思,但是这样理解便于我们开发),为了区分不同的服务和特征,或者给服务和特征取名字,我们就用UUID来代表服务和特征。

蓝牙连接可以大致分为以下几个步骤
1.建立一个Central Manager实例进行蓝牙管理
2.搜索外围设备
3.连接外围设备
4.获得外围设备的服务
5.获得服务的特征
6.从外围设备读数据
7.给外围设备发送数据
其他:提醒

首先我们先导入系统的BLE的框架
#import <CoreBluetooth/CoreBluetooth.h>

必须遵守2个协议
<CBCentralManagerDelegate, CBPeripheralDelegate>

/** 中心管理者 */
@property (nonatomic, strong) CBCentralManager *cMgr;

/** 连接到的外设 */
@property (nonatomic, strong) CBPeripheral *peripheral;

1.建立一个Central Manager实例进行蓝牙管理

2.搜索外围设备 (我这里为了举例,采用了自己身边的一个手环)

3.连接外围设备

4.获得外围设备的服务 & 5.获得服务的特征

6.从外围设备读数据

7.给外围设备发送数据(也就是写入数据到蓝牙)
这个方法你可以放在button的响应里面,也可以在找到特征的时候就写入,具体看你业务需求怎么用啦

其他:提醒
有那么多的特征,我们怎么知道哪些特征是用来读数据的,哪些是用来写入的,哪些是需要订阅之后再读的呢?
如果你们硬件工程师事先告诉你了,或者有完成的开发文档,那么就可以直接知道了,否则你就需要自己去查看特征的属性,推介可以使用下第三方的app——LightBlue,让你更能清楚的看到你蓝牙里面的服务,特征,特征的属性。

其他后续有关文章,我会慢慢整理发出来,我也可以回答相关的问题,有错误的地方可以帮忙指出来呦!

Android-蓝牙传输

参考技术A 通过蓝牙传输数据与Socket类似。在网络中使用Socket和ServerSocket控制客户端和服务端的数据读写。而蓝牙通讯也由客户端和服务端Socket来完成。蓝牙客户端Socket是BluetoothSocket,蓝牙服务端Socket是BluetoothServerSocket。这两个类都在android.bluetooth包中。

如果打算建议两个蓝牙设备之间的连接,则必须实现服务器端与客户端的机制。当两个设备在同一个RFCOMM channel下分别拥有一个连接的BluetoothSocket,这两个设备才可以说是建立了连接。

服务器设备与客户端设备获取BluetoothSocket的途径是不同的。服务器设备是通过accepted一个incoming connection来获取的,而客户端设备则是通过打开一个到服务器的RFCOMMchannel来获取的。

通过调用BluetoothAdapter的listenUsingRfcommWithServiceRecord(String, UUID) 方法来获取
BluetoothServerSocket(UUID用于客户端与服务器端之间的配对)调用BluetoothServerSocket的 accept() 方法监听连接请求,如果收到请求,则返回一个BluetoothSocket实例。

如果不想在accept其他的连接,则调用BluetoothServerSocket的 close() 方法释放资源(调用该方法后,之前获得的BluetoothSocket实例并没有close。但由于RFCOMM一个时刻只允许在一条channel中有一个连接,则一般在accept一个连接后,便close掉BluetoothServerSocket)

通过搜索得到服务器端的BluetoothService,调用BluetoothService的listenUsingRfcommWithServiceRecord(String, UUID)方法获取BluetoothSocket(该UUID应该同于服务器端的UUID)。

调用BluetoothSocket的 connect() 方法(该方法为block方法),如果UUID同服务器端的UUID匹配,并且连接被服务器端accept,则 connect() 方法返回。

以上是关于iOS蓝牙开发:蓝牙连接和数据读写的主要内容,如果未能解决你的问题,请参考以下文章

iOS蓝牙开发:蓝牙的连接和数据的读写

iOS蓝牙开发:蓝牙的连接和数据的读写

iOS 蓝牙BLE开发

Android BLE低功耗蓝牙开发极简系列(二)之读写操作

ios蓝牙开发

缓存蓝牙连接iOS