iPhone蓝牙能和Android手机通过蓝牙BLE或者经典蓝牙连接并传输数据吗

凭借大脑残留的记忆写的BLE的一些概念与接入流程

IOT领域与智能设备通信的方式除了zigbee wifi 就算蓝牙了,BLE(bluetooth low energy)看名字就是低功耗的一个东西通俗来说ble很简单啊,因为无论是iOS还是android 提供嘚api 都屏蔽了嵌入式开发的东西基本就是看看api,连接下蓝牙与蓝牙通讯下。当然也有被坑的地方

perial 大概是这么拼的,分为中心设备与外圍设备一般来说,手机是中心设备其他智能设备是外设。

charactics就是我们具体要操作的东西就是读写特征值来实现与蓝牙的交互。一般来說每个服务有特定的uuid来区分一个服务有两个特征值,一个用来读一个用来写。

怎么识别需要连接的设备外设可以发一个广播数据,Φ心设备扫描到后获取里面的值 跟server下发的数据对比。(so 不安全的地方)

根据服务的uuid找到服务根据服务找到读写的特征值。

向写特征值裏面写定好的协议数据ps每段命令的长度一定,有可能需要发两次写一个命令

我试图让它使用的新的低功耗蓝牙API的Andr??oid 的应用程序对于这一点,我开始与BLE样品未来是 API级别18

当我读了Android无法充当外设,我把Android手机的核心模式扫描周围的 BLE设备。为此峩做了一个北欧平台模拟心脏传感器一些测试。一切工作以完美的方式!

在此我尽量挑一个 iPhone蓝牙(iOS的7测试版4),并把它放在一个外围设備的方式和模拟的心率传感器作为previous测试 Android应用程序能够看到该设备,并连接到它但之后的连接处于活动状态时,两个设备互相断开3-4秒除此之外,当我打电话discoverServices()在Android方面没有回调被触发!在某些情况下,Android设备接收即使iOS的蓝牙芯片是关闭的连接事件。这是很奇怪的为叻证明这一点,我把在北欧理事会中环模式我是正确的能没有问题连接到iOS设备。

可能是什么呢有在Android或iOS的一些限制不允许从一个Android连接到iOS戓反之亦然?

编辑:经过一番艰苦的测试我的AOSP页面上提出的一个问题。它可以检查here

我写了一个简单的工作示例以及相对简单,并把它列入在Github开源:的 到目前为止,只进行过测试一个Android的Nexus 9和iPhone蓝牙 5S但我presume它也将与一台Nexus 6和各种iPhone蓝牙工种。到目前为止这是建立明确的一款使用Android操作系统,一个iPhone蓝牙之间的沟通但我presume是可修改做更多的事情。

声明:这篇文章是楼主beautifulzzzz学习网上關于蓝牙的相关知识的笔记其中比较多的受益于xubin341719的蓝牙系列文章,同时还有其他网上作者的资料由于有些文章只做参考或统计不足,洳涉及版权请在下面留言~同时我也在博客分类中新建一个蓝牙通信分类,用来研究分享蓝牙相关技术

主要参考资料的来源:xubin341719[下面是该湔辈的BT系列文章]
下载连接: (基本涵盖所有蓝牙协议)、(三蓝牙版本的核心协议v2.1\v3.0\v4.0)、(蓝牙协议相关初学者必读,开发者参考)

蓝牙昰一种支持设备短距离通信(一般10m内)的技术。能在包括移动电话、PDA、无线耳机、、相关外设等众多设备之间进行无线信息交换利用“藍牙”技术,能够有效地简化终端设备之间的通信也能够成功地简化设备与因特网Internet之间的通信,从而变得更加迅速高效为拓宽道路。藍牙采用结构以及快跳频和短包技术支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工业、科学、医学)其数据速率为1Mbps。采用传輸方案实现

1、无线射频单元(Radio):负责数据和语音的发送和接收,特点是短距离、低功耗蓝牙天线一般体积小、重量轻,属于微带天线
2、基带或链路控制单元(LinkController):进行射频信号与数字或语音信号的相互转化,实现基带协议和其它的底层连接规程
3、链路管理单元(LinkManager):负责管理藍牙设备之间的通信,实现链路的建立、验证、链路配置等操作
4、蓝牙软件协议实现:如上图紫色部分,这个后面我们做详细说明

蓝牙协议体系中的协议按SIG的关注程度分为四层:

除上述协议层外,规范还定义了主机控制器接口(HCI)它为基带控制器、连接管理器、硬件狀态和控制寄存器提供命令接口。在图1中HCI位于L2CAP的下层,但HCI也可位于L2CAP上层

蓝牙核心协议由SIG制定的蓝牙专用协议组成。绝大部分蓝牙设备嘟需要核心协议(加上无线部分)而其他协议则根据应用的需要而定。总之电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。 

在设备之间发送和接收文件如果想发送和接收流数据(而且想采用传统的串口应用程序,并给它加上蓝牙支持)那么 RFCOMM 更好。反过来如果想发送对象数据以及关于负载的上下文和元数据,则 OBEX 最好

蓝牙应用程序活动图,如下:

找到服务RFCOMM昰通过不同的频道(channel)来提供不同的Profile的,所以需要找到要用的服务在设备上的哪个频道上这是通过同一个软件包里的sdptool来完成的,就是SDP垺务发现协议 

  从3.0版本开始(据说2.1也是支持的?TBD)蓝牙才开始支持BluetoothProfile。BluetoothProfile是蓝牙设备间数据通信的无线接口规范想要使用蓝牙无线技术,设備必须能够翻译特定蓝牙配置文件,配置文件定义了可能的应用.

    蓝牙配置文件表达了一般行为,蓝牙设备可以通过这些行为与其他设备进行通信.

    蓝牙技术定义了广泛的配置文件,描述了许多不同类型的使用安全.按蓝牙规格中提供的指导,开发商可创建应用程序以用来与其他符合蓝牙規格的设备协同工作.在最低限度下,各配置文件规格应包含下列主题的相关信息.

    为执行其任务,每个配置文件都使用堆栈各层上的特定选项和參数.若需要,也可包括必需的服务记录概要。ProfilesAPI层则分别对Audio、Data、Control等提供了不同的模块目前已规范有四大类、十三种协议规格。

  Bluetooth的一个很偅要特性就是所有的Bluetooth产品都无须实现全部的Bluetooth规范。为了更容易的保持Bluetooth设备之间的兼容Bluetooth规范中定义了Profile。Profile定义了设备如何实现一种连接或鍺应用你可以把Profile理解为连接层或者应用层协议。

GAP是所有其他配置文件的基础,它定义了在蓝牙设备间建立基带链路的通用方法.除此之外,GAP还萣义了下列内容:

   ① 必须在所有蓝牙设备中实施的功能
   ② 发现和链接设备的通用步骤
   ③ 基本用户界面术语.

GAP确保了应用程序和设备间的高度互操作性,还允许开发人员利用现有的定义更加容易地定义新的配置文件.GAP处理未连接的两个设备间的发现和建立连接过程.此配置文件定義了一些通用的操作,这些操作可供引用GAP的配置文件,以及实施多个配置文件的设备使用.GAP确保了两个蓝牙设备可通过蓝牙技术交换信息,以发现彼此支持的应用程序.不符合任何其他蓝牙配置文件的蓝牙设备必须与GAP符合以确保基本的互操作性和共存.

SDAP描述了应用程序如何使用SDP发现远程設备上的服务.由于GAP的要求,任何蓝牙设备都应能够连接至其他蓝牙设备.基于此,SDAP要求任何应用程序都应当能够发现它要连接的其他蓝牙设备上嘚可用服务.此配置文件可承担搜索已知和特定服务及一般的任务.SDAP涉及了称为“服务发现用户应用程序”的一个应用程序,这是蓝牙设备查找垺务所必需的.此应用程序可与向/从其他蓝牙设备发送/接收服务查询的SDP相接.SDAP依赖于GAP,并可以重新使用部分GAP.

SPP定义了如何设置虚拟串行端口及如何連接两个蓝牙设备.SPP基于ETSI TS 07.10规格,使用RFCOMM协议提供串行商品仿真.SPP提供了以无线方式替代现有的RS-232串行通信应用程序和控制信号的方法.SPP为DUN,FAX,HSP和LAN配置文件提供了基础.此配置文件可以支持最高128kb/s的数据率.SPP依赖于GAP.

GOEP可用于将对象从一个设备传输到另一个设备.对象可以是任意的.如:图片,文档,名片等.此配置攵件定义了两个角色:提供拉提或推送对象位置的服务器及启动操作的客户端.使用GOEP的应用程序假定链路和信道已按GAP的定义建立.GOEP依赖于串行端ロ配置文件.
GOEP为使用OBEX协议的其他配置文件提供了通用蓝图,并为设备定义了客户端和服务器角色.对于所有的OBEX事务.GOEP规定应由客户端启动所有事务.泹是此配置文件并没有描述应用程序就如何定义要交换的对象或如何实施交换.这些细节留给属于GOEP的配置文件.即OPP,FTP和SYNC去完成.通常使用此配置文件的蓝牙设备为笔记本电脑,PDA,手机及智能电话.

注意:蓝牙1.1版本规范所有蓝牙设备的最小实现必须支持通用访问配置文件,服务发现应用配置文件囷串行端口配置文件.

在两台电脑或者Labtop之间就可以建立这种连接如下图所示: 

SPP是基于RFCOMM的,spp 协议处于rfcomm的上层spp的应用需走rfcomm层。如果你使用RFCOMM能夠实现那么也就不需要使用SPP,而却速度还会比SPP来做快因为省略了采用profile的一些数据包头等。不过还是推荐采用SPP来做,兼容性有保证這也是为什么蓝牙本质上数据和语音的传送却出现HFP,HSPSPP,OPP等诸多具体应用profile的原因

? 蓝牙4.0实际是个三位一体的蓝牙技术,它将传统蓝牙、低功耗蓝牙和高速蓝牙技术融合在一起这三个规格可以组合或者单独使用。也就是说 BLE是蓝牙4.0增加的之前没有?(TBD)

蓝牙4.0专门面向对成夲和功耗都有较高要求的无线方案其主打特性就是省电、省电、省电。极低的运行和待机功耗使得一粒纽扣电池甚至可连续工作一年之玖它有低功耗、经典、高速三种协议模式。其中:高速蓝牙主攻数据交换与传输;经典蓝牙则以信息沟通、设备连接为重点;低功耗蓝牙以不需占用太多带宽的设备连接为主这三种协议规范能够互相组合搭配,从而适应更广泛的应用模式正因为有了三种可以互相组合搭配的协议,蓝牙4.0因此成为唯一一个综合协议规范它有着极低的运行和待机功耗。此外低成本和跨厂商互操作性,3毫秒低延迟、AES-128加密等诸多特色可以用于计步器、心律监视器、智能仪表、传感器物联网等众多领域,大大扩展蓝牙技术的应用范围

蓝牙4.1主打IOT(Internet Of Things全联网),最新的蓝牙4.1标准是个很有前途的技术其智能、低功耗、高传输速度、连接简单的特性将适合用在许多新兴设备上。

蓝牙4.1设备可以同時作为发射方和接受方,并且可以连接到多个设备上举个例子,智能手表可以作为发射方向手机发射身体健康指数同时作为接受方连接箌蓝牙耳机、手环或其他设备上。蓝牙4.1使得批量数据可以以更高的速率传输当然这并不意味着可以用蓝牙高速传输流媒体视频,这一改進的主要针对的还是刚刚兴起的可穿戴设备例如已经比较常见的健康手环,其发送出的数据流并不大通过蓝牙4.1能够更快速地将跑步、遊泳、骑车过程中收集到。因为新标准加入了对IPv6专用通道联机的支持通过IPv6连接到网络,实现与Wi-Fi相同的功能解决可穿戴设备上网不易的問题。

蓝牙4.0和蓝牙4.1的比较

)不同蓝牙低功耗(BLE)的目的是提供更显著的低功耗。这使得Android应用程序可以和具有低功耗的要求BLE设备如接近傳感器,心脏速率监视器健身设备等进行通信。

③ BLE低功耗蓝牙软件有2个主要组成: OSAL操作系统抽象层和 HAL硬件抽象层多个Task任务和事件在OSAL管悝下工作,而每个任务和事件又包括3个组成:BLE 协议栈profiles和应用程序。

         附图1 BLE蓝牙协议栈结构图

分为两部分:控制器和主機对于4.0以前的蓝牙,这两部分是分开的所有profile(姑且称为剧本吧,用来定义设备或组件的角色)和应用都建构在GAP或GATT之上下面由结构图嘚底层组件开始介绍。 

附图 2 BLE低功耗蓝牙系统架构图图中的Task用附图1BLE蓝牙协议栈结构图来描述

通用属性规范(GATT)—GATTprofile是一个通用规范用于在BLE链蕗发送和接收被称为“属性(attributes)”的数据片。目前所有的低功耗应用 profile都是基于GATT

蓝牙SIG定义了许多profile用于低功耗设备。Profile(配置文件)是一个规范规范了设备如何工作在一个特定的应用场景。注意:一个设备可以实现多个profile例如,一个设备可以包含一个心脏监测仪和电池电平检測器

    低功耗蓝牙模块主透传协议是针对低功耗蓝牙模块从透传协议设计的,通过本协议模块可替代手机设备与从透传协议模块连接实現透传功能或直驱控制功能。此协议模块可用作从透传协议模块开发过程中的辅助工具

    BLE主透传协议模块(以下简称MTTM)可以工作在透传模式(TTM)或指令模式(CM)。

    MTTM上电启动后处于待机模式(SBM),此时处于空闲状态无睡眠,需要用户通过AT指令控制模块连接从设备在成功與从设备建立链接后,MTTM会自动查找从设备的透传通道如果从设备属于BLE从透传协议模块(以下简称STTM),MTTM默认进入透传模式否则默认进入指令模式。

  透传模式下用户CPU可以通过模块的通用串口与STTM进行双向通讯。从MTTM串口输入的数据将转发到STTM并从STTM的串口输出;从STTM输入的数据將转发到MTTM,并从MTTM的串口输出从而实现透明传输功能,用户数据的具体含义由上层应用程序自行定义 

透传中数据的格式也是profile,或蓝牙标准profile或自定义simple profile基本结构依然是:

  profile可以理解为一种规范,一个标准的通信协议它存在于从机中。蓝牙组织规定了一些标准的profile例如 HID OVER GATT ,防丢器 心率计等。每个profile中会包含多个service每个service代表从机的一种能力。

  service可以理解为一个服务在ble从机中,通过有多个服务例如电量信息服务、系统信息服务等,每个service中又包含多个characteristic特征值每个具体的characteristic特征值才是ble通信的主题。比如当前的电量是80%所以会通过电量的characteristic特征值存在从机的profile里,这样主机就可以通过这个characteristic来读取80%这个数据

  characteristic特征值ble主从机的通信均是通过characteristic来实现,可以 理解为一个标签通过这个标簽可以获取或者写入想要的内容。

每个从机都会有一个叫做profile的东西存在不管是上面的自定义的simpleprofile,还是标准的防丢器profile他们都是由一些列service組成,然后每个service又包含了多个characteristic主机和从机之间的通信,均是通过characteristic来实现

实际产品中,每个蓝牙4.0的设备都是通过服务和特征来展示自己嘚服务和特征都是用UUID来唯一标识的。一个设备必然包含一个或多个服务每个服务下面又包含若干个特征。特征是与外界交互的最小单位蓝牙设备硬件厂商通常都会提供他们的设备里面各个服务(service)和特征(characteristics)的功能,比如哪些是用来交互(读写)哪些可获取模块信息(只读)等。比洳说一台蓝牙4.0设备,用特征A来描述自己的出厂信息用特征B来与收发数据等。

4.0中profile的存在是干嘛用的呢,只是一种组织形式存在 

服务囷特征都是用UUID来唯一标识的,UUID的概念如果不清楚请自行google,国际蓝牙组织为一些很典型的设备(比如测量心跳和血压的设备)规定了标准的service UUID(特征的UUID仳较多这里就不列举了)

2、面向进程的架构视图

iOS 有两个框架支持蓝牙与外设连接。

另一个框架则是本文要介绍的CoreBluetooth在蓝牙4.0出来之后(注意,硬件上要4s以上系统要ios6以上才能支持4.0),苹果开放了BLE通道专门用于与BLE设备通讯(因为它的API都是基于BLE的)。这个不需要MFI并且现在很多藍牙设备都支持4.0,所以也是在IOS比较推荐的一种开发方法。现CoreBluetooth在的开发几乎全部基于该框架本节只介绍CoreBluetooth。

CoreBluetooth框架的核心其实是两个东西peripheral和central, 可鉯理解成外设和中心。对应他们分别有一组相关的API和类如下图所示:

作为一个中心(central)要实现完整的通讯,一般要经过这样几个步骤:

(1)建立中心角色— 


  c, 搜索到的蓝牙设备都是通过广播返回so..。需要注册广播接收器来获得已经搜索到的蓝牙设备

(4)扫描外设中的服务囷特征(discover)(一个设备里的服务和特征往往比较多一般会在发现服务和特征的回调里通过service、characteristic UUID去匹配我们关心那些)— 

    每个与苹果设备兼容的藍牙接入都必须:支持蓝牙设备ID描述,1.3版本或者更高;使用蓝牙SIG分配的Assigned Numbers文档中的公司标识作为他的Vendor ID值也就是VID,如果生产商没有蓝牙SIG公司標识那么蓝牙HID描述接入可能会使用USB Implementers Forum分配的VID;使用他的VID值来标识最终的产品生产商;使用版本值来唯一标识软件的版本;使用ProductID值唯一标识產品。Device ID描述使得苹果产品能够识别远程的蓝牙接入该信息可以用来在与远程接入交互的时候连接蓝牙描述间的交替互操作。因此Device ID中的信息记录非常重要

    理想情况下,这两个设备应该有不同的产品ID但是,当他们拥有完全相同的硬件、软件和特性的时候拥有相同的ProductID也是可鉯允许的如果他们有任何的不同,就都应该有不同的Product ID

3,IOS的蓝牙低功耗

    蓝牙4.0标准引入了蓝牙低功耗一种针对有限电池资源的蓝牙接入嘚无线技术。如果支持蓝牙低功耗的话接入点需要支持下面的这些特性。(这里更多的是蓝牙芯片商要做的事情)

蓝牙接入需要实现蓝牙4.0标准中定义的外围角色

蓝牙接入需要在所有三个广告通道中针对每个广告事件进行广告

由蓝牙接入发送的广告信息应该至少包含蓝牙4.0标准中包含的如下信息:Flags;TX Power Level;Local Name;Services如果需要降低电量消耗或者并不是所有的广告数据都适合放入到广告PDU中的时候,接入点可能将Local Name和TX Power Level数据方知噵SCAN_RSP PDU中需要注意的是根据它的状态,苹果产品可能不会总是执行激活扫描主要的服务应该总是放在广告PDU中进行广告。次要的服务不应该進行广告对于接入点不重要的服务信息可能会因为广告PDU中的空间不足而被忽略。广告数据和SCAN_RSP PDU中的扫描响应数据应该遵循蓝牙4.0标准中的格式

蓝牙接入的广告间隔应该慎重考虑,因为他会影响到发现和连接的性能对于低功耗的接入,电池资源也应该被考虑在内为了能够被苹果产品发现,蓝牙接入应该首先使用推荐的广告间隔20ms并持续至少30秒。如果在这30秒内没有被发现那么接入点可能会选择节省电池电量然后增加广告间隔,苹果推荐使用如下依次延长的事件间隔来发现蓝牙接入点:645 ms;768 ms;961 ms;1065

蓝牙接入应该在任何情况下都能够满足Resovable Private Address因为私隱方面的考虑,苹果设备将会使用蓝牙4.0标准中定义的随机设备地址

蓝牙接入不需要请求特殊的授权,如配对、认证或加密等来发现服务囷特性只有在获取特性值或者描述值的时候可能会需要特殊的授权。9

蓝牙接入不应该请求配对如果处于安全考虑,接入点需要与Central建立綁定关系外围可以使用Insufficient Authentication错误码在必要的时候拒绝ATT请求。因此苹果设备可能会需要按照既定的安流程程来执行过程配对可能会需要基于蘋果产品的用户认证。

通用接入描述服务:蓝牙接入应该实现按照蓝牙标准4.0中的Device Name特性

通用属性描述服务:只有当接入有能力在生命周期内哽改他的服务的时候该接入点才需要实现Service Changed特性。苹果产品可以使用Service Changed服务特性来决定它是否可以使用之前读取的或者缓存的来自设备的信息

    手机APP要想获得蓝牙设备的一些额外的信息如电量或者操作蓝牙设备,必须通过IOS API那么IOS底层必然有某种方式来与蓝牙设备交互。 那么电量通过什么来读写呢自定义 service characteristic?

任何免提的蓝牙耳机都可以在iOS设备的状态栏中显示一个用来标识他电池电量的图标这个特性被所有的iOS设備所支持,包括iPhone蓝牙、iPod和iPad耳机的蓝牙知识通过两个iOS蓝牙HFP AT命令:HFP Command AT+XAPL

  • 描述:允许通过耳机自定义AT命令
  • 1 = 耳机支持电池电量报告
  • 2 = 耳机暂停或者正在充电
  • 描述:报告耳机的状态变更
    • key: 被报告状态变化的类型

 一般蓝牙芯片通过UART、USB、SDIO、I2S、PcCard和主控芯片通信。如下图所示通过UART和主控芯片通信。

我要回帖

更多关于 iphone蓝牙 的文章

 

随机推荐