Tag: 蓝牙

Core蓝牙入门

核心蓝牙 核心蓝牙是Apple提供的iOS框架,允许使用低功耗蓝牙技术开发应用程序。 该框架抽象了Bluetooth LE内部工作的一些技术方面,使开发人员可以专注于其实际使用。 中央x外围设备 蓝牙LE标准中的通信由两个主要角色构成:中央和外围设备。 外围设备是提供信息的元素:在客户端-服务器方法中,将是谁拥有其他设备所需的信息。 中央利用外围设备提供的信息来运行其任务,如下所示: 为了使中央可以看到外围设备,它发送广告数据包,指示其存在并将传输数据。 该数据包的尺寸很小,仅包含基本信息,例如外围设备的名称和所传送数据的类型。 中心进行扫描,换句话说,它“侦听” BLE广告数据包,以决定是否应从特定设备读取数据。 设备可以具有各种不同的服务,而不仅限于发送一种类型的信息。 温控器可以发送其实际温度及其最近的每小时读数。 外围设备提供的每个服务可以具有许多信息类型,称为特征: 如前所述,由于性能原因,广告包故意很小,它们没有列出外围设备可用的所有功能和信息。 由中心来询问外围设备具有的服务和特性的列表。 这些特征可以分为3种类型:读取,写入或通知。 在此示例中,我们将使用可写特征将数据发送到外围设备,而不仅仅是从外围设备读取信息。 这将颠覆我们先前将外围设备视为服务器而将中央设备视为客户端的概念,但将向您展示事物的灵活性。 让我们在Pratice中看到它 首先,创建一个新的单视图项目: 给它一个名称和项目的包ID,在下一个屏幕上选择“在Mac上创建Git存储库”,到此为止。 使用以下属性创建一个名为Constants.swift的新swift文件: 您可以在终端上使用命令“ uuidgen”创建一个UUID。 Core Bluetooth将使用此标识符来快速有效地找到您的服务。 为了简单起见,我们将有两个视图控制器,一个用于发送数据(外围),另一个用于获取数据(中心)。 您可以通过更改Main.storyboard中的视图控制器基类来选择要在每个设备上运行的设备。 PeripheralViewController(接收器) 在项目中添加一个名为PeripheralViewController.swift的新视图控制器。 在UIKit语句下,将Core Bluetooth导入其中: 另外,创建一个名为peripheralManager的属性来保存CBPeripheralManager的实例,并在viewDidLoad下对其进行初始化。 核心蓝牙几乎可以使用了。 为了能够处理外围设备响应(并停止XCode的警告消息),请将其添加到PeripheralViewController.swift文件的末尾: 我们的代码仅应在用户打开蓝牙无线电时运行。 外围设备管理器代表有一种方法,该方法在每次蓝牙状态更改时运行。 将其添加到最近创建的扩展中: 现在,当状态更改为开机时,很好地打印一条消息并调用一个名为startAdvertising()的方法,如下所示: startAdvertising()最初调用createPeripheralService(),后者创建一个可写服务以用于接收消息,该消息将由另一台设备的中央设备写入。 外围设备管理器收到写调用时,将触发didReceiveWrite委托: CentralViewController(发送方) 在项目中添加一个名为CentralViewController.swift的新视图控制器。 在UIKit语句下,将Core Bluetooth导入其中: 另外,创建一个名为centralManager的属性来保存CBCentralManager的实例,并在viewDidLoad下对其进行初始化。 我们需要一个集合来保存对我们发现的外围设备的引用,因为如果Core Bluetooth没有强大的引用,它们会自动取消分配它们。 在外围示例之后,在CentralViewController.swift的末尾添加此扩展名: 这次,当蓝牙状态更改为打开时,中央管理器将开始使用与外围设备管理器中使用的SERVICE_UUID相同的外围设备进行扫描。 这样,中心将仅扫描具有该特定服务的设备,而不扫描附近所有可用的蓝牙设备,这将导致不必要的电池消耗。 当中心发现一个新的外围设备时,它将其添加到我们的createdPeripherals集合中并尝试连接到它: 之后,如果外围设备已连接,我们将尝试发现其服务,并出于与发现外围设备相同的原因指定SERVICE_UUID。 […]

iOS:尽可能保持与外部BLE设备的连接

在arkulpa,我们为客户构建了一个应用程序-在初始设置后-必须尽可能保持与外部BLE设备的连接,而无需用户做任何事情。 BLE设备是一种家庭配件,其目标是,如果用户离开房屋并可能在几天或几周后才返回,则应自动重新建立连接。 有关iOS / Swift / BLE的详细介绍,请转到此非常棒的博客文章(三部分)。 本文可以看作是扩展,重点是使蓝牙连接保持活动状态,并包括Apple开发人员技术支持提供的一些响应。 学习#1 如果您想在后台运行应用程序时找到BLE设备,请不要在此处使用所有nil : centralManager.scanForPeripherals(withServices:无,选项:无) pheral.discoverServices(无) pheral.discoverCharacteristics(nil,用于:服务) 根据Apple文档: 指定了bluetooth-central背景模式的应用程序可以在后台扫描。 也就是说,它们必须通过在serviceUUIDs参数中指定它们来显式扫描一个或多个服务。 在CBCentralManager扫描时,将忽略CBCentralManager扫描选项。 因此,我们要做的是在设置过程中使用nil选项进行扫描(= app位于前台),然后保存所有UUIDs (例如,在UserDefaults )。 当我们需要在应用程序处于后台运行时进行扫描时,我们可以使用保存的UUID。 学习#2 我们需要一种方法来使应用程序在连接断开时自动在后台自动重新连接,大多数情况下,这是因为iPhone和BLE之间的距离太大。 事实证明,这很简单(尽管您必须知道):只需在func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?)再次调用connect -method func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?)因为… […]连接请求不会超时,用户返回家园时,iOS设备将重新连接。 问题是:只有在以下任何一种情况下,它才起作用: 设备重启 蓝牙无线电正在关闭然后重新打开 飞行模式开启然后关闭 如果由于某种原因BLE堆栈崩溃 而且,最重要的是,用户强制退出了您的应用 (引自Apple Developer技术支持的邮件)。 尽管“重新连接”解决方案对我来说总是适用于2.)和3.),但是仍然存在无法重新建立连接的其他用例。 这导致我们…… […]

使用Bridgefy SDK创建脱机消息应用程序

使用Bridgefy SDK真的那么容易吗? 在为这个项目工作了将近两年之后,我可以说“是” ,但是我们需要展示它,还有比在应用程序上实现它更好的方法吗? 经过深思熟虑,鉴于Bridgefy最初是一个消息传递应用程序,我们决定最好使用即时消息传递应用程序。 主要思想是创建一个即时消息传递应用程序,该应用程序允许彼此靠近的设备之间进行通信。 该应用程序将包含2个屏幕: ChatList :它将是附近可用或已经可用的设备的列表,第二个是 ChatView :是发送消息的地方,可以是直接消息或广播消息。 用Xcode生成项目后,有必要添加Bridgefy SDK。 可以在以下位置查看执行此操作的步骤:https://github.com/bridgefy/bridgefy-ios-developer。 在同一页面上,您可以下载此代码以及使用Bridgefy SDK的其他示例应用程序的代码。 下一步是生成演示板屏幕,如下所示: 我们要使用的第一个类是ChatListController ,必须将其创建为UITableViewController的子类,在该类中,我们将实现SDK的所有委托方法。 为此,我们必须如下导入SDK: 导入Bridgefy SDK。 下一步是声明我们的类将实现BFTransmitter的委托方法。 ChatListController接口。 在最后一个代码段中,我们将使用所有变量和属性,其中: 发送器 : BFTransmitter的实例。 peerNamesDictionary :包含我们先前已连接的对等点的字典,每个对等点都表示为另一个字典。 对等字典结构。 onlinePeers :具有范围内的对等方的UUID的数组。 offlinePeers :数组,其范围的对等方的UUID不在范围内。 chatController :处理聊天视图的ChatViewController实例。 下一步是初始化发送器: BFTransmitter初始化。 我们定义要从发送器获取的日志类型,然后使用在Bridgefy站点上注册应用程序时获得的密钥初始化发送器。 此后,我们向发送方指示该类将是负责实现委托的类。 接下来,我们将激活背景模式,最后调用发射机的start方法以开始工作。 当发送方检测到与任何设备的连接时,将通过以下代表通知我们: 委托方法,用于通知已检测到连接。 当我们通过该委托人收到新连接的通知时,无法确定它是安全的连接。 仅当以前已经建立了安全连接并且密钥尚未过期时,才会发生这种情况。 对于此示例,我们希望在设备之间建立的所有连接都是安全的,因此我们必须实现以下BFTransmitterDelegate方法: 委托方法询问是否应建立安全连接。 现在,当与对等方建立安全连接后,下一个委托将通知我们: 用来通知何时建立安全连接的委托方法。 在此方法中,我们要做的第一件事是调用processNameForUser:方法,该方法将确定对等点是否已存在于我们的对等点列表中。 如果没有,它将创建记录并通过从其UUID的前5个字符生成名称来保存该记录,并为其分配未知的设备类型。 另外,在此方法中,将字典发送到刚与其建立连接的对等方,指示要在其对等方列表中显示的设备的名称和类型。 其余的代码会将对等方移动到范围内的对等方列表中,并更新显示它们的表。 由于我们已经实现了处理连接的代码,因此我们必须注意断开连接。 […]

如何使用Swift 2.2设置BLE

BLE与iPhone配合使用时,需要遵循一个特定的顺序。 Apple的文档被截断了,似乎没有为这些步骤提供清晰的流程。 在线上有摘要,您可以参考其他人的应用程序,但没有任何内容可以解释我所看到的每个步骤中正在发生的事情。 希望这篇文章可以帮助解释它,并避免您遇到与我同样的问题。 与往常一样,有不同的实现方式,所以请让我知道是否存在更有效的处理方式。 步骤1:将CoreBluetooth添加到您的应用程序 首先,为了使用蓝牙,您需要向您的应用程序添加CoreBluetooth库。 要添加CoreBluetooth,您需要选择父Xcode文件。 在“使用库链接二进制文件”部分中,单击“ +”按钮,搜索CoreBluetooth,选择并添加它。 现在,在您的ViewController中,您需要导入CoreBluetooth。 与“导入UIKit”一起添加“导入CoreBluetooth”。 步骤2:利用CoreBluetooth的CBCentral和CBPeripheral 您想从CoreBluetooth中在类中使用CBCentralManagerDelegate和CBPeripheralDelegate协议,因为这将允许您使用委托必须采用的方法,从而可以管理充当蓝牙连接的中心和外围设备的对象。 将CBCentralManagerDelegate和CBPeripheralDelegate添加到“ ViewController”类后,您需要将委托的对象存储在变量中,以便可以调用每个对象的方法。 到目前为止看起来应该像这样: 步骤3:运行CBCentralManager 您的电话将充当中心。 要启动您的中央管理器,您可以将其放置在viewDidLoad()函数中并将其委派给自己。 但是,我将其放置在其自己的功能(“ startManager”)中,以便我们可以控制手机何时启动其顺序,稍后我将对此进行解释。 步骤4:检查BLE是否开启,然后开始扫描 接下来,在我们开始扫描之前,我们需要确保设备的蓝牙电源已打开。 为此,您可以使用预设函数,如果状态已更新,则该函数将被调用并传入CBCentralManager对象。 一旦确定它已开机,就可以调用该函数以开始扫描(scanForPeripheralsWithServices)。 步骤5:找到您的BLE设备并连接到它 要查看所有可用的设备(外围设备),您可以使用didDiscoverPeripheral监听发现的外围设备。 如果这样,它将返回可以存储的每个外围对象。 与其存储每台设备,我只专注于我想要的设备。 找到后,您应该将该外围设备保存到变量中,以备后用。 要连接到发现的外围设备,可以使用centralManager的connectPeripheral方法并引用外围设备。 我添加了该选项以通知我是否断开连接。 连接后,您将要停止扫描。 添加CentralManager侦听器didDisconnectPeripheral非常重要,这样如果断开连接就可以重新启动扫描(这就是为什么我将开始扫描分为一个单独的函数)。 步骤6:获取服务,特征并向设备发送价值 连接到外围设备后,即可找到其服务和特性。 对于外围设备,可以有很多服务,对于服务可以有很多特征。 如果要在BLE设备上写一个值或进行任何更改,则需要确保您正在写正确的服务或特性。 对于我想做的事情,我需要写出我们在BLE设备上拥有的服务的特定特征。 因此,现在使用的是保存的外围对象中的功能,而不是使用centralManager对象中的功能。 要找到服务,您可以在连接后调用discoverServices。 然后,查看didDiscoverServices侦听的外围设备上的服务。 发现后,您可以在该服务上调用discoverCharacteristics。 进行didDiscoverCharacteristicsForService侦听后,将与特征对象一起返回。 我循环浏览这些特征以找到所需的特征,然后可以将其保存在变量中以供以后写入。 在下面,我立即将其写入特征,但在完整的应用程序中将其保存并稍后使用。 要写入外设,您可以在外设对象上调用方法writeValue并传入编码后的值,并调出要写入的特征。 奖励:RSSI 对于我想与该应用程序一起做的事情,我想大致了解一下我离该设备有多远,外围设备的RSSI读取非常适合。 Apple已弃用RSSI功能,因此您需要创建解决方法。 为此,我使用了一个计时器(如果您找到更好的方法来处理此问题,请告诉我)。 当您找到外围设备时,它将为您提供一次RSSI;当您连接到外围设备时,它将再次为您提供RSSI。 为了保持流式传输,您需要继续调用相同的函数。 要读取RSSI,可以在外围对象上调用函数readRSSI。 […]

将Arduino蓝牙传感器与iOS集成

这是我博客的一个交叉报道。 您可以在 此处 找到原始帖子 。 我最近一直在探索的一个领域是传感器电路与iOS应用之间的蓝牙通信。 我想根据Adafruit优秀人士提供的一些示例分享这些研究之一。 它由一个传感器组成,该传感器可以检测到火焰的存在,并通过蓝牙将该信息发送到iPhone应用程序,该应用程序显示传感器的读数。 这是实际的样子: 在本研究中,我使用Adafruit的FLORA系列基于Arduino的板进行原型制作。 FLORA板与Arduino IDE完全兼容,可轻松用于可穿戴项目。 我使用的蓝牙板是FLORA蓝牙模块,传感器是Inland 24传感器套件中随附的火焰传感器。 这是完整的电路: Arduino素描 为了运行Arduino草图,您需要确保您具有: 最新版本的Arduino IDE 已安装Adafruit AVR板套件 已安装Adafruit BluefruitLE nRF51库 该草图是基于Adafruit BluefruitLE nRF51库中包含的blueart_cmdmode草图构建的。 大部分草图是用于配置FLORA和FLORA蓝牙模块的样板代码。 循环功能内部的代码将从火焰传感器获取值,对其进行缩放,并确定是否是近距离火焰(小于1.5英尺),远距离火焰(1-3英尺)或未检测到火焰: //读取模拟量A9上的传感器: int sensorReading = AnalogRead(A9); //映射传感器范围(四个选项): // ex:’long int map(long int,long int,long int,long int,long int)’ int range = map(sensorReading,sensorMin,sensorMax,0,3); //范围值: 开关(范围){ 案例0://距离不到1.5英尺的火。 Serial.println(0); Serial.flush(); 打破; 情况1://距离1-3英尺之间的火。 […]

Swift中的反应式心率监测器

利用RxSwift和RxBluetoothKit的功能以无缝方式与HR监视器交互。 集成核心蓝牙以连接到心率监测器需要进行大量工作。 如果您熟悉反应式编程,则RxBluetoothKit使事情变得容易得多。 但是您仍然需要了解Core Bluetooth的工作原理,并编写大量代码以与HR监视器对话。 RxHeartRateMonitors是RxBluetoothKit和Core Bluetooth之上的一层。 我构建了它以无缝,反应式的方式与心率监测器进行交互。 您可以下载该项目并进行尝试。 它有什么作用? 仅列出心率监测器。 连接和断开监视器。 从监视器读取心率。 记住以前连接的显示器。 自动连接到以前连接的显示器。 读取蓝牙状态。 读取监视器状态。 在本文中,我将解释有关该项目的一些细节。 为什么创建它以及一些实现细节。 我正在作为一个团队的一部分来构建健身应用程序。 该应用程序的要求之一是列出可以使用的心率监测器。 同样,用户应该能够连接并从此类设备读取值。 我以为CoreBluetooth将使这项工作变得容易。 事实并非如此。 核心蓝牙太通用 它抽象了BTLE协议栈,提供了与各种设备进行交互的方式。 发现外围设备非常容易。 但是随后您还需要发现其服务,特征和代码。 最后,您需要读取原始数据并将其转换为正确的格式。 代码可能变得非常复杂。 为了给您一个想法,以下是从监视器读取心率值所需的步骤: 启动中央管理器。 发现外围设备( 需要一名代表 ) 过滤提供心率监测服务的外围设备 连接到外围设备( 需要委托 ) 发现该外围设备的服务( 需要委托 ) 发现服务的特征( 需要委托 ) 找到代表心率的特征 订阅特征值( 需要委托 ) 将原始数据转换为正确的格式。 实现必需的委托需要太多代码。 如果您看一下本教程或本文,则可以了解其复杂性。 苹果公司也有一个例子(在Objective-C中)。 复杂性很高,因为Core Bluetooth是通用的。 […]

Bridgefy SDK的传输模式

Bridgefy功能的基础是使邮件在附近的设备上跳跃,直到它们到达预期的收件人为止。 听起来很简单,不是吗? 我们也这么认为,但是发现事实并非如此,因此我们花了很多时间使所有使用我们SDK的人都可以轻松地保持这种状态。 经过多次会议,测试,错误纠正,模拟甚至方法的完全变更,我们完成了今年早些时候发布的产品。 自发布以来,我们已经与许多开发人员联系,邀请他们试用我们的SDK,并听取他们的使用问题和想法。 根据我们收到的反馈,一个问题已经反复出现: 我必须在我的应用程序中做什么才能使消息转发正常工作? 简短的答案是什么。 因为我们在SDK中实现的算法负责管理必须转发给收件人的邮件; 这些消息通过电话传递,而用户或开发人员却没有意识到。 使用Bridgefy SDK共享的消息可以包含在字典中序列化的信息或原始数据。 可以使用以下三种方法之一发送消息: 发送广播消息的示例。 初始化SDK后,开发人员将只需要担心为他们的消息选择最佳模式,然后Bridgefy SDK将负责其他所有事务。

CocoaTouch BLE陷阱

Yana Arbuzova发布·22小时· 每个使用iOS低功耗蓝牙(BLE)的开发人员都知道现实生活与文档中描述的有所不同。 是否想让您在可可BLE世界中的旅程更轻松,更高效? 阅读有关使用BLE的棘手要点以及如何处理它们的知识。 因此,您首先需要知道的是以下问题的答案:“究竟是哪里出了问题—在我这边还是在连接的设备上? 当我向设备发送命令时,会发生什么情况吗?” 要获得此问题的答案,我建议使用以下几种方法: 嗅探器工具 用于测试API的第三方应用程序 测井 设备的固件版本,无需加密或任何其他保护即可与之一起使用 因此,让我们更详细地讨论每个点。

iOS:简化心率监测器

构建BLE(蓝牙低能耗)设备配套应用程序可能会导致大量复制/粘贴代码。 我们决定提供开放源代码框架,以帮助其他人减少开发时间并避免在项目之间复制/粘贴代码段。 总览 在本教程中,您将使用蓝牙心率传感器构建心率监测应用程序。 我们使用Polar H10蓝牙心率传感器。 但是,只要符合蓝牙GATT服务规范(也可以提供定制服务和特性),其他任何BLE心率传感器都应该可以正常工作。 Gormsson框架 该框架是针对Harald“蓝牙” Gormsson命名的。 丹麦和挪威国王出生于910年,死于986年。 基础 如果您想以更底层的开发方式进行操作,建议阅读www.raywenderlich.com上Jawwad Ahmad的教程。 iOS的核心蓝牙教程:心率监视器 在本核心蓝牙教程中,您将学习如何从兼容设备中发现,连接和检索数据…… www.raywenderlich.com 他的教程将为您提供有关蓝牙特定术语的一些详细信息,例如:中心,外围设备,服务,特性和广告包。 您还将能够评估使用Gormsson框架以更少的代码行实现完全相同的应用程序的好处。 注意 iOS模拟器不支持蓝牙。 您需要在实际设备上构建并运行。 设置xCode项目 启动xCode并创建一个Single View App然后键入“ Next”按钮并将项目命名为“ HeartRateMonitor”。 椰子足 您可以使用Cocoapods或Carthage安装框架。 让我们为本教程选择Cocoapods。 如果您的计算机上尚未安装该软件,请打开您喜欢的Terminal应用程序并运行以下命令。 须藤宝石安装cocoapods 一旦安装了Cocoapods,请使用终端转到您的项目路径,然后键入以下pod命令来设置项目工作区。 cd HeartRateMonitor / 荚初始化 吊舱安装 如果一切正常,您应该在终端中看到以下内容。 分析依赖关系 下载依赖项 生成豆荚项目 整合客户项目 [!]从现在开始,请关闭任何当前的Xcode会话,并对该项目使用`HeartRateMonitor.xcworkspace`。 发送统计 吊舱安装完成! Podfile有0个依赖项,总共安装了0个pod。 关闭您的xCode项目,然后如上所述,在heartRateMonitor.xcworkspace中打开heartRateMonitor.xcworkspace 。 添加Gormsson框架 从Pods项目中打开Podfile ,然后添加Sejima框架依赖项。 豆荚“戈姆森” 返回终端并输入install命令,以确保将Gormsson框架添加到您的项目中。 […]

Android版Android Wear和iOS版问题

Nexus 5X保护区和智能手表Moto 360 de 1gen con Android Wear。 您可以在iOS上兼容旧版本,也可以在Android上继续使用Android。 Tuve que mandarlo al SAT por diversos motivos(bateríadesgastada y tapa inferior rajada)por tuque que hacer lostípicosprocedimientos protocolarios,entre los que se encontraba un“ hard reset”。 Cuandovolvíconci disposito para comprobar si los falloscontinaban medícuenta que cuando apagaba el reloj ,novolvíascrocronizar,entraba en la app de Android Wear y des […]