Bluetooth

蓝牙技术各版本历程介绍
蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。 
截止目前,蓝牙共有八个版本 V1.0/1.1/1.2/2.0/2.1/3.0/4.0/4.1,各版本的功能变化如下所示: 
V1.0版(发布日期1999.7.5) 
1. 传输速率748~810kb/s; 2. 基本支持立体声,只能单工传输; 
3. 通信加密方式致使不同厂家模块难以正常通信; 4. 主辐设备难以区分; 5. 通讯易干扰; 
6. Bluetooth技术将2.4GHz的频带划分为79个子频段,而为了适应一些
国家的军用需要,Bluetooth 1.0重新定义了另一套子频段划分标准,将
整个频带划分为23个子频段作为副标准。 
V1.1版(发布日期2001.2.22) 
1. 传输率约在748~810kb/s; 
2. 容易受到同频率之产品所干扰下影响通讯质量; 3. 已可以进行主副设备的区分; 
4. 可以支持 Stereo音效的传输要求,但只能够作(单工)方式工作; 5. Bluetooth 1.1标准取消了23子频段的副标准,所有的Bluetooth 1.1设备都使用79个子频段在2.4GHz的频谱范围之内进行相互的通信。解决了使用79个子频段的设备与那些设计为使用23个子频段的设备之间互
不兼容。 
V1.2版(发布日期2003.11.5) 
1. 传输速率同样是只有 748~810kb/s; 
2. 采用了AFH可调式跳频技术(Adaptive Frequency Hopping) 增强了抗干扰功能; 
3. 增强了语音处理,改善了语音连接的品质(可以提高蓝牙耳机的音质);
4. 能更快速的连接设置; 
5. 可以支持 Stereo音效的传输要求,但只能够作(单工)方式工作。 V2.0版(通常写成 Bluetooth 2.0 +EDR,发布日期2004.11.9) 
1. 传输率约在 1.8M/s~2.1M/s; 
2. 使用了 EDR,可以增加带宽。EDR 即Enhanced data rate,是蓝牙技术中增强速率的缩写,其特色是大大提高了蓝牙技术的数据传输速率,最大可达3Mbps。EDR可以100%和蓝牙1.2版兼容; 
3. 数据传输速率为原v1.2的3倍,并降低了功耗,从而延长电池的使用时间。由于带宽增加,新规范提高了设备同时进行多项任务处理、或同时连接多个蓝牙设备的能力,并使传输范围可达100米; 
4. 开始支持双工模式——即一面作语音通讯,同时亦可以传输档案/高质素图片。 
V2.1版(通常写成 Bluetooth 2.1 +EDR,发布日期2007.7.26) 
1. 传输率约在 1.8M/s~2.1M/s; 2. 使用了 EDR,可以增加带宽; 
3. 简化了设备间的配对过程,改进过后的连接方式会自动使用数字密码来进行配对与连接;
4. 更佳的省电效果:蓝牙2.1版加入了Sniff Subrating的功能,透过设定
在2个装置之间互相确认讯号的发送间隔来达到节省功耗的目的。蓝牙2.1将装置之间相互确认的讯号发送时间间隔从旧版的0.1秒延长到0.5秒左右,无形中变为手机和蓝牙设备节省了很多电量,大大提升了续航能力。采用此技术之后,蓝牙装置在开启蓝牙联机之后的待机时间可以有效延长5倍以上。 
V3.0版(发布日期2009.4.21) 
1. 蓝牙3.0的核心是"Generic Alternate MAC/PHY"(AMP),这是一种全新
的交替射频技术,允许蓝牙协议栈针对任一任务动态地选择正确射频,允许消费类设备使用标准蓝牙射频和无线局域网射频(WIFI)多重传输; 2. 蓝牙3.0的传输速度更高,而秘密就在802.11无线协议上。通过集成
"802.11 PAL"(协议适应层),蓝牙3.0的数据传输率提高到了大约24Mbps(即可在需要的时候调用802.11 WI-FI用于实现高速数据传输)。在传输速度上,蓝牙3.0是蓝牙2.0的八倍;3.0版本的蓝牙的有效传输距离为10米; 
3. 功耗方面,通过蓝牙3.0高速传送大量数据自然会消耗更多能量,但由
于引入了增强电源控制(EPC)机制,再辅以802.11,实际空闲功耗会明显降低。 
V4.0版(发布日期2010.7.7) 
1. 有效传输距离可达60米,最大范围可超过100米; 
2. 4.0与3.0版本相比最大的不同就是大幅降低能耗,4.0版本的功耗较3.0版本降低了90%; 
3. 拥有低成本,跨厂商互操作性,3毫秒低延迟、AES-128加密等诸多特色; 
4. 蓝牙4.0实际是个三位一体的蓝牙技术,它将三种规格合而为一,分别是传统蓝牙、低功耗蓝牙和高速蓝牙技术,这三个规格可以组合或者单
独使用。 
V4.1版(2013年底) 
1. 提供LTE的并存支持,可与LTE等最新一代蜂窝技术无缝协作。蓝牙与
LTE无线技术可彼此通讯,以确保协同传输,降低近带干扰。可作为IP连接基础,巩固蓝牙技术在物联网无线连接中的重要地位。 
2. v4.1标准下蓝牙设备可以同时作为发射方(Bluetooth Smart)和接受方
(Bluetooth Smart Ready),并且可以连接到多个设备上。 
3. 提升连接质量,提升制造商更多的控制能力,重新连接时,时间间隔更
具灵活性与可变性,使建立与维持蓝牙连接更加方便。当设备彼此接近时,就可自动重新连接,改善用户体验;即使用户暂离,但当设备返回原处后,最近曾使用的设备将不需手动操作即可自动重新连接; 4. 改善数据传输:Bluetooth Smart技术可提供大量数据传输; 5. 提升蓝牙技术的组网性能与低功耗特性,拓展物联网市场; 
6. 最新的蓝牙4.1标准就能够让蓝牙组网,增加了对路由、网关等协议的
支持,满足物联网的应用需求,加入了专用通道允许设备通过 IPv6 联机使用,通过IPv6建立网络连接。蓝牙设备只需要通过蓝牙4.1连接到可以上网的设备(如手机),就可以通过IPv6与云端的数据进行同步,即实现“云同步”,不再需要wifi连接。 
其他 
以通讯距离来看,不同的版本可再分为 Class A(1)/Class B(2): 
1. Class A 是用在大功率/远距离的蓝牙产品上,但因成本高和耗电量大,
不适合作个人通讯产品之用(手机/蓝牙耳机/蓝牙 Dongle 等等),故多用在部分商业特殊用途上,通讯距离大约在 80~100M 距离之间; 2. Class B 是前几年流行的制式,通讯距离大约在 8~30M 之间,视产品
的设计而定,多用于手机内/蓝牙耳机/蓝牙 Dongle 的个人通讯产品上,耗电量和体积较细,方便携带。

一.蓝牙耳机怎么连接手机

  1、一般情况下,蓝牙耳机进入配对状态时,只需要一直按住开机按键10秒左右别松手,耳机就会从关机转为开机再转为配对状态,其表现为耳机指示灯(长亮)。然后用手机搜索蓝牙设置,就可以找到你的耳机。例如WEP200WEP310BH980BH320BH330等等.....

  2、有些耳机的出厂设置是比较复杂的,例如索爱的HBH-602HBH608HBH610A和诺基亚的HS-36W等....602在对码的时候,要先打开耳机,然后同时后按住+、-号10秒左右,这时指示灯会红绿交替闪动,这样就可以用手机搜索蓝牙设备了。36W是在耳机开机后,同时按住开机按键和+号10秒左右,其他步骤都和普通耳机一样。

  3、耳机进入配对后,手机要搜索蓝牙设备,一般手机用5秒钟左右的时间可以搜索到耳机,然后在手机上选择你找到的蓝牙耳机设备,手机会提示你输入密码。大部分的手机密码是0000或者1234,但是也有个别是厂家特别设置的,在你的耳机说明书里会有详细的记录。

  4,当手机搜索到耳机,同时你也正确输入了密码后,并不是说你的手机就可以用蓝牙耳机来接听电话了。现在很多手机在找到蓝牙设备后还需要和耳机进行连接,如果你的手机没有在设置里与耳机进行连接的话,还是不能接听电话的。当然也有的手机如摩托罗拉的V3,就不需要你再另外去连接耳机了,只要配对成功,手机会很智能化的把耳机连接起来。

  经过上面的介绍,车主们对蓝牙耳机怎么连接手机已经有了一定的了解了吧,购买蓝牙耳机后,要先对蓝牙耳机和手机进行配对连接,由于各种手机的出厂设置是不一样的,所以小编在此建议车主们看下自己手机的使用手册,根据手册来设置连接。

二.蓝牙耳机恢复出厂设置

       有两种方法,一个是强制一个是非强制。
  1、非强制方法:同时按住“电源开关”和“音量+”按键15秒不要放开,等到有反应就可以了。
  2、强制方法:先把耳机打开(不需要进入配对状态),这时给蓝牙耳机充大约5-10秒的电,这样大部分的蓝牙耳机在开机状态下充电的时候会强制关机,进入出厂设置的状态。这种方法谁说是强制性的,但是有的时候对部分的蓝牙耳机没有效果。
  如果只有一个按键没有音量键的话,只能用强制法。
  用户在使用蓝牙耳机的时候难免会遇到一些麻烦,即使按正规的操作方法进行配对,但是老是出现蓝牙设备搜索不到的情况;或者是搜索到了蓝牙设备但是输入的正确配对的密码却提示密码错误。主要的原因还是因为蓝牙耳机内置的芯片程序还没有激活,或者是蓝牙耳机的记忆功能因为连接次数过多而终止记忆功能。这时就需要恢复出厂设置了。

三.蓝牙的配对和连接的建立过程

蓝牙的建立过程是一个复杂的过程,即使有过相当一段工作和使用经验的人,如果不仔细去了解还是理解不全。

平时我们用蓝牙耳机听音乐,和不同的设备共享文件,打电话等,都有一个配对--连接--传输数据的过程。

配对,其实就是一个认证的过程

为什么不配对便无法建立连接?

任何无线通信技术都存在被监听和破解的可能,蓝牙SIG为了保证蓝牙通信的安全性,采用认证的方式进行数据交互。同时为了保证使用的方便性,以配对的形式完成两个蓝牙设备之间的首次通讯认证,经配对之后,随后的通讯连接就不必每次都要做确认。所以认证码的产生是从配对开始的,经过配对,设备之间以PIN码建立约定的link key用于产生初始认证码,以用于以后建立的连接。

所以不配对,两个设备之间便无法建立认证关系,无法进行连接及其之后的操作,所以配对在一定程度上保证了蓝牙通信的安全,当然这个安全保证机制是比较容易被破解的,因为现在很多个人设备没有人机接口,所以PIN码都是固定的而且大都设置为通用的0000或者1234之类的,所以很容易被猜到并进而建立配对和连接。

蓝牙的连接过程


现在的蓝牙芯片供应商提供的技术支持能力相当强大,有完整的硬件和软件解决方案。对于应用而言,提供了固件用于实现底层协议栈,提供了profile库及源代码规范了各种应用,开发人员只要专注于应用程序开发就可以了。对于蓝牙底层的一些东西往往不甚了了。以前我也是这样子的,最近在做一个自动搜索以实现自动连接的应用,发现还是需要了解一些底层的机制的。
我们可以很容易的进行操作在一个手机和免提设备之间建立连接,那么这个连接是怎么建立起来的呢?
首先,主设备(master,即发起连接的设备)会寻呼(page)从设备(slave,接收连接的设备),master会已跳频的方式去寻呼slave,slave会固定间隔地去扫描(scan)外部寻呼,即page scan,当scan 到外部page时便会响应response该page,这样两个设备之间便会建立link的连接,即ACL链路的连接。当ACL 链路连接建立后,主设备会发起channel的连接请求,即L2CAP的连接,建立L2CAP的连接之后,主设备采用SDP去查询从设备的免提服务,从中得到rfcomm的通道号,然后主设备会发起rfcomm的连接请求建立rfcomm的连接。然后就建立了应用的连接。

即link establish(链路的建立)->channel establish(渠道的建立)->rfcomm establish(RFCOMM建立)->connection


蓝牙技术原理:http://www.eepw.com.cn/article/278204.htm

EEPW:userName:BunnyCDM


允许程序连接到已配对的蓝牙设备

四: BluetoothAdapter类介绍

      BluetoothAdapter类简单点来说就是代表了本设备(手机、电脑等)的蓝牙适配器对象,通过它我们可以蓝牙设备进行基本

    开发了,主要有如下功能:

             1、开关蓝牙设备

             2、扫描蓝牙设备

             3、设置/获取蓝牙状态信息,例如:蓝牙状态值、蓝牙Name、蓝牙Mac地址等;

 

     由于网络上关于BluetoothAdapter的一些常用API函数都有了介绍,因此,我着重介绍一些BluetoothAdapter类疏忽的地方。

 

     1、BluetoothAdapter STATE 状态值 , 即开关状态


              int STATE_OFF        蓝牙已经关闭

              int STATE_ON        蓝牙已经打开

              int STATE_TURNING_OFF      蓝牙处于关闭过程中 ,关闭ing

              int STATE_TURNING_ON        蓝牙处于打开过程中 ,打开ing

 

            


                  上图中 , 红色线路图表示蓝牙由关闭状态 转向为打开状态的过程 ;

                                 蓝色线路图表示蓝牙由打开状态 转向为关闭状态的过程 ;

 


    2、BluetoothAdapter  SCAN_MOD状态值 ,即扫描状态

            首先说明,可以扫描其他设备的,当然它同时能被其他蓝牙设备扫码。

 

         int  SCAN_MODE_CONNECTABLE         表明该蓝牙可以扫描其他蓝牙设备

         int  SCAN_MODE_CONNECTABLE_DISCOVERABLE    

                        表 明该蓝牙设备同时可以扫码其他蓝牙设备,并且可以被其他蓝牙设备扫描到。

         int  SCAN_MODE_NONE : 该蓝牙不能扫描以及被扫描。

 

    3、获得蓝牙适配器实例

  

       public static synchronized BluetoothAdapter getDefaultAdapter ()

           功能:获得本设备的蓝牙适配器实例。

           返回值:如果设备具备蓝牙功能,返回BluetoothAdapter 实例;否则,返回null对象。

 

 

    4、打开/关闭蓝牙的两种方法:

 

         4.1、打开蓝牙:

            ①、直接调用函数enable()去打开蓝牙设备 ;

            ②、系统API去打开蓝牙设备,该方式会弹出一个对话框样式的Activity供用户选择是否打开蓝牙设备。

                    注意:如果蓝牙已经开启,不会弹出该Activity界面。

 

        PS:在目前Android手机中,是不支持在飞行模式下开启蓝牙的。如果蓝牙已经开启,那么蓝牙的开关状态会随着飞行模式

 的状态而发生改变。

 

       代码示例分别如下:

 

[java] view plain copy
 print?
  1. //第一种打开方法: 调用enable 即可  
  2. boolean result = mBluetoothAdapter.enable();  
  3.   
  4. //  
  5. /第二种打开方法 ,调用系统API去打开蓝牙  
  6. if (!mBluetoothAdapter.isEnabled()) //未打开蓝牙,才需要打开蓝牙  
  7. {  
  8. Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  
  9. startActivityForResult(intent, REQUEST_OPEN_BT_CODE);  
  10. //会以Dialog样式显示一个Activity , 我们可以在onActivityResult()方法去处理返回值  
  11. }  

        4.2、关闭蓝牙

           直接调用API 函数即disable()即可。

             public  boolean disable ()

               功能:关闭蓝牙设备。

               返回值:该函数会立即返回。

                            true    表示关闭操作成功

                           false   表示蓝牙操作失败 , ①、当前蓝牙已经关闭 ;  ②、其他一些异常情况

 

 

   5、扫描蓝牙设备


      public boolean startDiscovery () 

          功能: 扫描蓝牙设备

          注意: 如果蓝牙没有开启,该方法会返回false ,即不会开始扫描过程。


      public  boolean cancelDiscovery ()

         功能: 取消扫描过程。

         注意: 如果蓝牙没有开启,该方法会返回false。


     public boolean isDiscovering ()

        功能: 是否正在处于扫描过程中。

        注意: 如果蓝牙没有开启,该方法会返回false。

 

   6、 获取蓝牙相关信息

 

    public String getName ()

       功能:获取蓝牙设备Name

    public String getAddress ()

       功能:获取蓝牙设备的硬件地址(MAC地址),例如:00:11:22:AA:BB:CC  

   public boolean setName (String name)

     功能:设置蓝牙设备的Name,


   public Set<BluetoothDevice> getBondedDevices ()

     功能:获取与本机蓝牙所有绑定的远程蓝牙信息,以BluetoothDevice类实例(稍后讲到)返回。

     注意:如果蓝牙为开启,该函数会返回一个空集合 。


  public static boolean checkBluetoothAddress (String address)

     功能: 验证蓝牙设备MAC地址是否有效。所有设备地址的英文字母必须大写,48位,形如:00:43:A8:23:10:F1 。

     返回值: true 设备地址有效

                   false 设备地址无效


 public BluetoothDevice getRemoteDevice (String address)

      功能:以给定的MAC地址去创建一个 BluetoothDevice 类实例(代表远程蓝牙实例)。即使该蓝牙地址不可见,也会产生

          一BluetoothDevice 类实例。

      返回:BluetoothDevice 类实例 。注意,如果该蓝牙设备MAC地址不能被识别,其蓝牙Name为null。

          异常:如果MAC  address无效,抛出IllegalArgumentException

 

 7、蓝牙相关广播


             Action值                                                说明


      ACTION_STATE_CHANGED                    蓝牙状态值发生改变

      ACTION_SCAN_MODE_CHANGED         蓝牙扫描状态(SCAN_MODE)发生改变

      ACTION_DISCOVERY_STARTED             蓝牙扫描过程开始

      ACTION_DISCOVERY_FINISHED             蓝牙扫描过程结束

      ACTION_LOCAL_NAME_CHANGED        蓝牙设备Name发生改变

      ACTION_REQUEST_DISCOVERABLE       请求用户选择是否使该蓝牙能被扫描

                PS:如果蓝牙没有开启,用户点击确定后,会首先开启蓝牙,继而设置蓝牙能被扫描。

      ACTION_REQUEST_ENABLE                  请求用户选择是否打开蓝牙

 

      ACTION_FOUND  (该常量字段位于BluetoothDevice类中,稍后讲到)

                说明:蓝牙扫描时,扫描到任一远程蓝牙设备时,会发送此广播。

 

         通过注册这个广播,我们可以获取扫描到的蓝牙信息。方法如下:

[java] view plain copy
 print?
  1. //扫描到了任一蓝牙设备  
  2. if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction()))  
  3. {  
  4.    Log.v(TAG, "### BT BluetoothDevice.ACTION_FOUND ##");  
  5.                   
  6.    BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  
  7.                   
  8.    if(btDevice != null){  
  9.         Log.v(TAG , "Name : " + btDevice.getName() + " Address: " + btDevice.getAddress());  
  10.                       
  11.    }  
  12.    else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction()))  
  13.    {  
  14.         Log.v(TAG, "### BT ACTION_BOND_STATE_CHANGED ##");  
  15.                   
  16.         int cur_bond_state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);  
  17.         int previous_bond_state = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.BOND_NONE);  
  18.                   
  19.                   
  20.         Log.v(TAG, "### cur_bond_state ##" + cur_bond_state + " ~~ previous_bond_state" + previous_bond_state);  
  21.     }  
  22. }  

              

 

      最后,关于这些广播的Intent信息,还有很多附加值,大家可以去看看Android SDK。

 

 

 

      更多关于BluetoothAdapter类的API介绍:http://www.cnblogs.com/over140/archive/2010/12/21/1912460.html



      最后,在使用这两个类时,需要以下两个权限:           

    BLUETOOTH                    值为  "android.permission.BLUETOOTH"

        BLUETOOTH_ADMIN      值为 "android.permission.BLUETOOTH_ADMIN"

  五.BluetoothDevice类介绍

      http://www.cnblogs.com/over140/archive/2010/12/21/1912482.html

 六.蓝牙SDP协议

Questions:

1.自己写的app怎么与远程蓝牙设备连接(手机(安装改软件和没有的)、蓝牙耳机、蓝牙遥控器)

2.假如与远程设备连接,之后的请求配对产生是怎么回事,还有配对成功后下次蓝牙打开会自动完成连接又是什么鬼

3.使用手机和一个远程的蓝牙设备匹配并连接好之后, 这时候再启动我写的app, 那么我如何在App中获取已经匹配并连接好的远程蓝牙设备的MAC地址呢(或该远程蓝牙设备怎么操作我的app呢)

4.在手机与远程蓝牙设备连接成功的基础,对于手机而言更换其他蓝牙怎么处理结果,对于其他手机搜索到该远程蓝牙设备能否连接成功的




阅读更多

没有更多推荐了,返回首页