iOS 蓝牙开发中 app 作为外设被连接怎么实现?

本贴最后更新于 3520 天前,其中的信息可能已经斗转星移

在 iOS 应用开发中,蓝牙开发是一个重点, 是 iOS 开发人员必须掌握的一个知识。今天小编就将为大家分享一篇 iOS 大牛写的有关蓝牙开发中,使用 app 发布一个 peripheral,给其他的 central 连接的实现方法。

peripheral 模式的流程

  1. 打开 peripheralManager,设置 peripheralManager 的委托

  2. 创建 characteristics,characteristics 的 description 创建 service,把 characteristics 添加到 service 中,再把 service 添加到 peripheralManager 中

  3. 开启广播 advertising

  4. 对 central 的操作进行响应

    • 4.1 读 characteristics 请求

    • 4.2 写 characteristics 请求

    • 4.4 订阅和取消订阅 characteristics

准备开发环境

1 、Xcode

2、 开发证书和手机(蓝牙程序需要使用使用真机调试,使用模拟器也可以调试,但是方法很负责,本篇分享不做过多赘述),如果不行可以使用 osx 程序调试

3、 蓝牙外设

实现步骤

  1. 打开 peripheralManager,设置 peripheralManager 的委托。设置当前 ViewController 实现 CBPeripheralManagerDelegate 委托

    @interface BePeripheralViewController : UIViewController

初始化 peripheralManager

/* 和CBCentralManager类似,蓝牙设备打开需要一定时间,打开成功后会进入委托方法 - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral; 模拟器永远也不会得CBPeripheralManagerStatePoweredOn状态 */ peripheralManager = [[CBPeripheralManager alloc]initWithDelegate:self queue:nil];
  1. 创建 characteristics,characteristics 的 description ,创建 service,把 characteristics 添加到 service 中,再把 service 添加到 peripheralManager 中

在委托方法 - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral 中,当 peripheral 成功打开后,才可以配置 service 和 characteristics。 这里创建的 service 和 chara 对象是 CBMutableCharacteristic 和 CBMutableService。他们的区别就像 NSArray 和 NSMutableArray 区别类似。 我们先创建 characteristics 和 description,description 是 characteristics 的描述,描述分很多种, 这里不细说了,常用的就是 CBUUIDCharacteristicUserDescriptionString。

//peripheralManager 状态改变

  • (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{

    switch (peripheral.state) {

    //在这里判断蓝牙设别的状态 当开启了则可调用 setUp方法(自定义) case CBPeripheralManagerStatePoweredOn: NSLog(@"powered on"); [info setText:[NSString stringWithFormat:@"设备名%@已经打开,可以使用center进行连接",LocalNameKey]]; [self setUp]; break; case CBPeripheralManagerStatePoweredOff: NSLog(@"powered off"); [info setText:@"powered off"]; break; default: break;

    }

}

//配置 bluetooch 的

-(void)setUp{
//characteristics 字段描述

CBUUID *CBUUIDCharacteristicUserDescriptionStringUUID = [CBUUID UUIDWithString:CBUUIDCharacteristicUserDescriptionString]; /* 可以通知的Characteristic properties:CBCharacteristicPropertyNotify permissions CBAttributePermissionsReadable */ CBMutableCharacteristic *notiyCharacteristic = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:notiyCharacteristicUUID] properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable]; /* 可读写的characteristics properties:CBCharacteristicPropertyWrite | CBCharacteristicPropertyRead permissions CBAttributePermissionsReadable | CBAttributePermissionsWriteable */ CBMutableCharacteristic *readwriteCharacteristic = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:readwriteCharacteristicUUID] properties:CBCharacteristicPropertyWrite | CBCharacteristicPropertyRead value:nil permissions:CBAttributePermissionsReadable | CBAttributePermissionsWriteable]; //设置description CBMutableDescriptor *readwriteCharacteristicDescription1 = [[CBMutableDescriptor alloc]initWithType: CBUUIDCharacteristicUserDescriptionStringUUID value:@"name"]; [readwriteCharacteristic setDescriptors:@[readwriteCharacteristicDescription1]]; /* 只读的Characteristic properties:CBCharacteristicPropertyRead permissions CBAttributePermissionsReadable */ CBMutableCharacteristic *readCharacteristic = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:readCharacteristicUUID] properties:CBCharacteristicPropertyRead value:nil permissions:CBAttributePermissionsReadable]; //service1初始化并加入两个characteristics CBMutableService *service1 = [[CBMutableService alloc]initWithType:[CBUUID UUIDWithString:ServiceUUID1] primary:YES]; [service1 setCharacteristics:@[notiyCharacteristic,readwriteCharacteristic]]; //service2初始化并加入一个characteristics CBMutableService *service2 = [[CBMutableService alloc]initWithType:[CBUUID UUIDWithString:ServiceUUID2] primary:YES]; [service2 setCharacteristics:@[readCharacteristic]]; //添加后就会调用代理的- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error [peripheralManager addService:service1]; [peripheralManager addService:service2];

}

  1. 开启广播 advertising

//perihpheral 添加了 service

  • (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error{

    if (error == nil) {

    serviceNum++;

    }

    //因为我们添加了 2 个服务,所以想两次都添加完成后才去发送广播

    if (serviceNum==2) {

    //添加服务后可以在此向外界发出通告 调用完这个方法后会调用代理的 //(void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error [peripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:ServiceUUID1],[CBUUID UUIDWithString:ServiceUUID2]], CBAdvertisementDataLocalNameKey : LocalNameKey } ];

    }

}

//peripheral 开始发送 advertising

  • (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error{

    NSLog(@"in peripheralManagerDidStartAdvertisiong");

}

  1. 对 central 的操作进行响应
  • 4.1 读 characteristics 请求

  • 4.2 写 characteristics 请求

  • 4.3 订阅和取消订阅 characteristics

//订阅 characteristics

-(void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic{

NSLog(@"订阅了 %@的数据",characteristic.UUID); //每秒执行一次给主设备发送一个当前时间的秒数 timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(sendData:) userInfo:characteristic repeats:YES];

}

//取消订阅 characteristics

-(void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic{

NSLog(@"取消订阅 %@的数据",characteristic.UUID); //取消回应 [timer invalidate];

}

//发送数据,发送当前时间的秒数

-(BOOL)sendData:(NSTimer *)t {

CBMutableCharacteristic *characteristic = t.userInfo; NSDateFormatter *dft = [[NSDateFormatter alloc]init]; [dft setDateFormat:@"ss"]; NSLog(@"%@",[dft stringFromDate:[NSDate date]]); //执行回应Central通知数据 return [peripheralManager updateValue:[[dft stringFromDate:[NSDate date]] dataUsingEncoding:NSUTF8StringEncoding] forCharacteristic:(CBMutableCharacteristic *)characteristic onSubscribedCentrals:nil];

}
//读 characteristics 请求

  • (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request{

    NSLog(@"didReceiveReadRequest");

    //判断是否有读数据的权限

    if (request.characteristic.properties & CBCharacteristicPropertyRead) {

    NSData *data = request.characteristic.value; [request setValue:data]; //对请求作出成功响应 [peripheralManager respondToRequest:request withResult:CBATTErrorSuccess];

    }else{

    [peripheralManager respondToRequest:request withResult:CBATTErrorWriteNotPermitted];

    }

}

//写 characteristics 请求

  • (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests{

    NSLog(@"didReceiveWriteRequests");

    CBATTRequest *request = requests[0];

    //判断是否有写数据的权限

    if (request.characteristic.properties & CBCharacteristicPropertyWrite) {

    //需要转换成CBMutableCharacteristic对象才能进行写值 CBMutableCharacteristic *c =(CBMutableCharacteristic *)request.characteristic; c.value = request.value; [peripheralManager respondToRequest:request withResult:CBATTErrorSuccess];

    }else{

    [peripheralManager respondToRequest:request withResult:CBATTErrorWriteNotPermitted];

    }

}

以上就是 iOS 蓝牙开发中,app 作为外设被连接的具体实现方法,希望对大家开发这项功能有所帮助吧。

相关文章:《DASH 中查询 iOS 文档的方法》 http://www.maiziedu.com/group/article/5618/

  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖 • 1 关注
  • 蓝牙
    10 引用 • 10 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 114 回帖 • 169 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖 • 1 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 2 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 522 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖 • 1 关注
  • 笔记

    好记性不如烂笔头。

    311 引用 • 794 回帖
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 2 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 5 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 3 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 6 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 440 关注
  • 倾城之链
    23 引用 • 66 回帖 • 166 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    17 引用 • 7 回帖 • 2 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • 叶归
    12 引用 • 56 回帖 • 21 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 52 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 190 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 248 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 2 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 58 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 1 关注