iOS之CoreBluetooth
思路
手机与设备间的通讯方式CoreBluetooth是比较常见且通用的。在iOS开发中需明晰以下几点
- 蓝牙4.0最多可联机7个设备,iPhone6以上都是蓝牙4.0
- 两台iPhone并不直接通过蓝牙互相搜索配对
- 苹果设备不支持和其他非苹果设备连接蓝牙,当然,除了蓝牙耳机和车载蓝牙之外
- 蓝牙传输的字节顺序是小端
- CoreBluetooth的最大传输单元是20个字节
知识科普:
字节顺序只是对内置数据类型而言
例如对于一整型(int,int 是内置数据类型)数,比如 0x123456
大端模式:
高地址---------->低地址
0x56 | 0x34 | 0x12
小端模式:
高地址 ---------->低地址
0x12 | 0x34 | 0x56
流程
以中心设备为例分析整个流程
1.实例化中心设备管理者
cManager = CBCentralManager(delegate: self, queue: nil)
2.监测状态为PowOn,并搜索附近设备
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
scanForServices()
} else {
print("\(central.state)")
}
}
3.发现外设,保存并展示
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
if let name = peripheral.name {
if !list.contains(name) {
list.append(name)
dict[name] = peripheral
table.reloadData()
}
}
}
4.根据需要选择连接的外设
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// 连接设备
if let pheral = dict[list[indexPath.row]] {
cManager?.connect(pheral, options: nil)
}
}
5.连接外设,失败/成功,成功则扫描外设服务
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
print("连接外设失败")
} func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
// 停止扫描
central.stopScan()
print("连接外设成功") peripheral.delegate = self
self.peripheral = peripheral // 扫描外设的服务
peripheral.discoverServices([CBUUID(string: "打印")])
}
6.回调中发现服务
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
var findService: CBService?
for item in peripheral.services ?? [] {
print(item.uuid)
// 如果服务调用在service中
if item.uuid.isEqual(CBUUID(string: "打印")) {
findService = item
}
}
if let findService = findService {
peripheral.discoverCharacteristics(nil, for: findService)
}
}
7.查询服务下面的特征,回调中返回 then发送打印数据
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
for item in service.characteristics ?? [] {
if item.uuid.isEqual(CBUUID(string: "打印")) {
// 读取成功回调didUpdateValueForCharacteristic
self.characteristic = item // 接收一次(是读一次信息还是数据经常变实时接收视情况而定, 再决定使用哪个)
peripheral.readValue(for: item) // 订阅、实时接收
peripheral.setNotifyValue(true, for: item) // 发送下行指令【发送一条】
guard let data = "硬件工程师给我的指令, 发送给蓝牙该指令, 蓝牙会给我返回一条数据".data(using: .utf8) else { return }
self.peripheral?.writeValue(data, for: item, type: .withResponse)
} // 当发现characteristic有descriptor,回调didDiscoverDescriptorsForCharacteristic
peripheral.discoverDescriptors(for: item)
}
}
8.从外围设备读取数据
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
//characteristic.value就是蓝牙传递过来的值
print("\(String(describing: characteristic.value))")
}
9.中心设备读取外设实时数据
func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) {
if characteristic.isNotifying {
peripheral.readValue(for: characteristic)
} else {
print("notification stoped on \(characteristic)")
self.cManager?.cancelPeripheralConnection(peripheral)
}
}
结束
iOS之CoreBluetooth的更多相关文章
- [iOS 基于CoreBluetooth的蓝牙4.0通讯]
一.首先大致介绍下蓝牙4.0的模式,中心和周边: 一般情况下,iPhone作为中心,接收来自周边传感器(比如手环等)采集的数据. 二.那整一个数据通讯的协议是怎样的呢? 为什么要一层层搞这么复杂呢?据 ...
- iOS蓝牙--CoreBluetooth基本使用
蓝牙使用步骤: 1. 扫描外设 2. 连接外设 3. 连上外设后,获取指定外设的服务 4. 获取服务后,遍历服务的特征,得到可读,可写等特征,然后与中心管理者进行数据交互 附上代码 一:导入框架 #i ...
- iOS CoreBluetooth 教程
去App Store搜索并下载“LightBlue”这个App,对调试你的app和理解Core Bluetooth会很有帮助. ================================ Cor ...
- CBCentralManagerDelegate Protocol 委托协议相关分析
总体概述 CBCentralManagerDelegate 协议中定义了一系列方法列表,这些方法是委托对象必须要实现的方法(也有可选择的),当中央管理器的相应变化就会调用委托对象中实现的相应方法. M ...
- iOS蓝牙开发CoreBluetooth快速入门
在iOS开发中,实现蓝牙通信有两种方式,一种是使用传统的GameKit.framework,另一种就是使用在iOS 5中加入的CoreBluetooth.framework. 利用CoreBlueto ...
- ios CoreBluetooth 警告 is being dealloc'ed while pending connection
ios CoreBluetooth 警告 is being dealloc'ed while pending connection CoreBluetooth[WARNING] <CBPerip ...
- iOS之蓝牙开发—CoreBluetooth详解
CoreBluetooth的API是基于BLE4.0的标准的.这个框架涵盖了BLE标准的所有细节.仅仅只有新的iOS设备和Mac是和BLE标准兼容.在CoreBluetooth框架中,有两个主要的角色 ...
- iOS 蓝牙(GameKit CoreBluetooth)
利用GameKit框架实现ios设备的蓝牙通讯,导入框架:#import <GameKit/GameKit.h> , 注意: 此框架只能用于ios设置间蓝牙通讯 如今苹果开放了接口来实现 ...
- iOS 蓝牙开发之(CoreBlueTooth)
CoreBlueTooth 简介: 可用于第三方的蓝牙交互设备 设备必须支持蓝牙4.0 iPhone的设备必须是4S或者更新 iPad设备必须是iPad mini或者更新 iOS的系统必须是iOS 6 ...
随机推荐
- 【noi 2.6_9270】&【poj 2440】DNA(DP)
题意:问长度为L的所有01串中,有多少个不包含"101"和"111"的串. 解法:f[i][j]表示长度为i的01串中,结尾2位的十进制数是j的合法串的个数.那 ...
- UVALive 7146
Long long ago there is a strong tribe living on the earth. They always have wars and eonquer others. ...
- AtCoder Beginner Contest 182 D - Wandering (前缀和)
题意:在\(x\)轴上,你刚开始在\(0\)的位置,第\(i\)次操作需要走\(A_1,...,A_i\)个单位,如果\(A_i\)为正向右走,否则向左走,求你所能走到的最大坐标. 题解:我们一步一步 ...
- [CodeForces-629A 用阶乘会爆掉
题意: 给你一个n*n的蛋糕,如果某个位置是'C'那就代表这是一个巧克力块,否则就不是.如果某两个巧克力块在同一行或同一列,那么这个家庭的幸福值就会加1,问你这个家庭的幸福值最大是多少 Input 3 ...
- CQRS Event Sourcing介绍
什么是CQRS模式? CQRS是Command and Query Responsibility Segregation的缩写,直译就是命令与查询责任分离的意思. 命令会改变对象的状态,但不返回任何数 ...
- 关于vmwaretools
今天安装Ubuntu16.04-i386,vmware15.5,使用的快速安装,然后安装vmwaretools出现问题:无法复制粘贴,顶部管理"重新安装vmware-tools"选 ...
- Git使用指南(上)
1 Git简介 学习一门技术老师更加倾向于看官网的. 度娘看完了,官网看完了,大家还是很懵逼 学生成绩管理系统 登录模块 3.2 登录模块进一步完善 缺一个验证码的功能 3.3 登录模 ...
- 基于vue3.0+electron新开窗口|Electron多开窗体|父子模态窗口
最近一直在折腾Vue3+Electron技术结合的实践,今天就来分享一些vue3.x和electron实现开启多窗口功能. 开始本文之前,先来介绍下如何使用vue3和electron来快速搭建项目. ...
- Protocol Buffers All In One
Protocol Buffers All In One Protocol Buffers - Google's data interchange format Protocol buffers are ...
- HTML a Tag All In One
HTML a Tag All In One HTML <a> target https://developer.mozilla.org/en-US/docs/Web/HTML/Elemen ...