• 思路

    手机与设备间的通讯方式CoreBluetooth是比较常见且通用的。在iOS开发中需明晰以下几点

    1. 蓝牙4.0最多可联机7个设备,iPhone6以上都是蓝牙4.0
    2. 两台iPhone并不直接通过蓝牙互相搜索配对
    3. 苹果设备不支持和其他非苹果设备连接蓝牙,当然,除了蓝牙耳机和车载蓝牙之外
    4. 蓝牙传输的字节顺序是小端
    5. 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的更多相关文章

  1. [iOS 基于CoreBluetooth的蓝牙4.0通讯]

    一.首先大致介绍下蓝牙4.0的模式,中心和周边: 一般情况下,iPhone作为中心,接收来自周边传感器(比如手环等)采集的数据. 二.那整一个数据通讯的协议是怎样的呢? 为什么要一层层搞这么复杂呢?据 ...

  2. iOS蓝牙--CoreBluetooth基本使用

    蓝牙使用步骤: 1. 扫描外设 2. 连接外设 3. 连上外设后,获取指定外设的服务 4. 获取服务后,遍历服务的特征,得到可读,可写等特征,然后与中心管理者进行数据交互 附上代码 一:导入框架 #i ...

  3. iOS CoreBluetooth 教程

    去App Store搜索并下载“LightBlue”这个App,对调试你的app和理解Core Bluetooth会很有帮助. ================================ Cor ...

  4. CBCentralManagerDelegate Protocol 委托协议相关分析

    总体概述 CBCentralManagerDelegate 协议中定义了一系列方法列表,这些方法是委托对象必须要实现的方法(也有可选择的),当中央管理器的相应变化就会调用委托对象中实现的相应方法. M ...

  5. iOS蓝牙开发CoreBluetooth快速入门

    在iOS开发中,实现蓝牙通信有两种方式,一种是使用传统的GameKit.framework,另一种就是使用在iOS 5中加入的CoreBluetooth.framework. 利用CoreBlueto ...

  6. ios CoreBluetooth 警告 is being dealloc'ed while pending connection

    ios CoreBluetooth 警告 is being dealloc'ed while pending connection CoreBluetooth[WARNING] <CBPerip ...

  7. iOS之蓝牙开发—CoreBluetooth详解

    CoreBluetooth的API是基于BLE4.0的标准的.这个框架涵盖了BLE标准的所有细节.仅仅只有新的iOS设备和Mac是和BLE标准兼容.在CoreBluetooth框架中,有两个主要的角色 ...

  8. iOS 蓝牙(GameKit CoreBluetooth)

    利用GameKit框架实现ios设备的蓝牙通讯,导入框架:#import <GameKit/GameKit.h>  , 注意: 此框架只能用于ios设置间蓝牙通讯 如今苹果开放了接口来实现 ...

  9. iOS 蓝牙开发之(CoreBlueTooth)

    CoreBlueTooth 简介: 可用于第三方的蓝牙交互设备 设备必须支持蓝牙4.0 iPhone的设备必须是4S或者更新 iPad设备必须是iPad mini或者更新 iOS的系统必须是iOS 6 ...

随机推荐

  1. 2020牛客暑期多校训练营(第八场) Kabaleo Lite

    传送门:Kabaleo Lite 题意 有n道菜,1≤n≤105,a[i]是每道菜可以赚的钱,−109≤ ai ≤109,b[i]是这道菜的个数,1≤bi≤105,你每次只能选从1开始连续的菜,然后问 ...

  2. Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) B. Journey Planning(映射)

    题意: 已知 n 所城市(从 1 至 n 编号)及其美丽值,选取一条旅行路线,满足路线中两两城市美丽值之差等于编号之差,求所有旅行路线中美丽值的最大值. 思路: 美丽值与编号作差,差值为键,映射累加 ...

  3. Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords(贪心/数学)

    题目链接:https://codeforces.com/contest/1366/problem/A 题意 有两个数 $a$ 和 $b$,每次可以选择从一个数中取 $2$,另一个数中取 $1$,问最多 ...

  4. Luogu T10025 排列名次

    题目链接 题目描述 给定一个长度为n的排列,要求输出该排列的字典序名次(1,2,3,...,n的名次为1). 输入输出格式 输入格式: 第一行一个数n,表示排列长度. 第二行n个数,用空格分隔,表示一 ...

  5. Educational Codeforces Round 9 C. The Smallest String Concatenation(字符串排序)

    You're given a list of n strings a1, a2, ..., an. You'd like to concatenate them together in some or ...

  6. URAL - 1635 哈希区间(或者不哈希)+dp

    题意: 演队在口试中非常不幸.在42道考题中,他恰好没有准备最后一道题,而刚好被问到的正是那道题.演队坐在教授面前,一句话也说不出来.但教授心情很好,给了演队最后一次通过考试的机会.他让这个可怜的学生 ...

  7. python代理池的构建2——代理ip是否可用的处理和检查

    上一篇博客地址:python代理池的构建1--代理IP类的构建,以及配置文件.日志文件.requests请求头 一.代理ip是否可用的处理(httpbin_validator.py) #-*-codi ...

  8. k8s二进制部署 - harbor安装

    harbor安装 # 目录说明: # /opt/src : 源码.文件下载目录 # /opt/release : 各个版本软件存放位置 # /opt/apps : 各个软件当前版本的软链接 [root ...

  9. 缓冲区溢出实验 4 内存管理(类似于malloc free)

    实验环境.代码.及准备 https://www.cnblogs.com/lqerio/p/12870834.html vul4 观察foo函数,可见问题在于最后一次tfree(q).由于之前已经tfr ...

  10. CodeForces - 803C Maximal GCD 【构造】

    You are given positive integer number n. You should create such strictly increasing sequence of k po ...