`
long_yu2
  • 浏览: 334535 次
社区版块
存档分类
最新评论

Android 蓝牙编程基础

阅读更多

在移动设备上,联网的方式很多,也存在了很大的差异,包括速度,有效范围等等因素都会对网络有不同的要求,本文我们就先分析一下Ophone平台上如何通过蓝牙进行网络连接,进而使用蓝牙来开发一些小的游戏或者应用,这里我们先从最基础的开始,首先学习蓝牙编程,我在查看了android sdk之后,发现蓝牙聊天这个示例基本上已经包含了所有的蓝牙基础知识,但是学习实例之前,我们有必要介绍一下蓝牙的基础知识,我大概浏览了一下,没有看到过多介绍蓝牙开发包的使用的文章,因此我们这里会对Ophone平台中蓝牙开发包进行一个详细的介绍,后面则会通过一个蓝牙聊天程序来进行实际开发。


蓝牙API
  在OPhone平台中,蓝牙api主要存在于"android.bluetooth"包中,它提供了皆如扫描设备、连接设备以及对设备间的数据传输进行管理的类,这些类对蓝牙设备进行功能性管理,蓝牙模块API提供的应用包括一下几个方面:
 扫描其它蓝牙设备
 通过查询本地蓝牙适配器来匹配蓝牙设备
 建立RFCOMM(无线射频通信协议)的通道/端口
 从其他的蓝牙设备中连接到指定的端口
 传输数据到其他设备,或者从其他设备中接收数据
如需运用这些API来执行蓝牙通信,应用程序必须声明BLUETOOTH许可。对于皆如寻找设备请求等的一些附加功能,也同样需要BLUETOOTH_ADMIN许可。比如本文所介绍的蓝牙聊天程序就包含了一下两个权限许可:

  1. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />  
  2.   <uses-permission android:name="android.permission.BLUETOOTH" />  


在蓝牙包(android.bluetooth)中有存在了以下几个类和接口,下面我们看一下他们分别具有什么样的功能,如下表所示。

 

类\接口
功能描述
BluetoothAdapter
本地的蓝牙适配器设备
BluetoothClass
描述了设备通用特性和功能的蓝牙类
BluetoothClass.Device
定义了所有设备类的常量
BluetoothClass.Device.Major
定义了所有主要设备类的常量
BluetoothClass.Service
定义了所有服务类的常量
BluetoothDevice
代表一个远程的蓝牙设备
BluetoothServerSocket
监听蓝牙服务的端口
BluetoothSocket
一个双向连接的蓝牙端口socket

  BluetoothAdapter
  本地的蓝牙适配器。该类主要用来操作蓝牙的基本服务。比如:初始化设备的可见,查询可匹配的设备集,使用一个已知的MAC地址来初始化一个BluetoothDevice类,创建一个BluetoothServerSocket类以监听其它设备对本机的连接请求等。
如果要获得本地蓝牙适配器,只有一个唯一的方式就是调用getDefaultAdapter()函数,同时也只有获得了蓝牙适配器之后才能进一步的操作!下面我们将本地蓝牙适配器的api整理成以下一个表格。

 

  那么上面的表中所列出的都是一些常用的操作,我们在稍后实现蓝牙聊天程序时,都会介绍如何详细的使用这些api。通常我们在使用一下代码请求使用蓝牙时,会弹出一个权限对话框,如图14-1所示。

  1. Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  
  2.   startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);  


图14-1 请求使用蓝牙的权限


当我们在使用ACTION_REQUEST_DISCOVERABLE来请求蓝牙可见状态时,也会弹出一个对话框来让用户确认,如图14-2所示。请求蓝牙可见代码如下:

  1. Intent discoverableIntent = new  
  2.   Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);  
  3.   discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);  
  4.   startActivity(discoverableIntent);  


图14-2 请求蓝牙可见


最后,当我们的蓝牙首次在配对时,同样会出现如图14-3所示的确认对话框。

 

  图14-3 请求配对


BluetoothClass
  该类用来描述设备通用特性和功能的蓝牙类。比如,一个蓝牙类会指定比如电话、计算机或耳机的通用设备类型,可以提供比如音频或者电话的服务。每个蓝牙类都是有0个或更多的服务类,以及一个设备类组成。设备类将被分解成主要和较小的设备类部分。BluetoothClass 用作一个能大致描述一个设备(比如关闭用户界面上一个图标的设备)的特性,但当蓝牙服务事实上是被一个设备所支撑的时候,BluetoothClass的描述则不一定很准确。精确的服务搜寻通过SDP请求来完成。当运用createRfcommSocketToServiceRecord(UUID) 和listenUsingRfcommWithServiceRecord(String, UUID)来创建RFCOMM端口的时候,SDP请求就会自动执行。我们可以使用getBluetoothClass()方法来获取为远程设备所提供的类。
同样,我们还是将该类的常用api列一个表,如下所示。

 

内部类
class
BluetoothClass.Device
定义所有设备类的常量。
class
BluetoothClass.Service
定义所有服务类的常量。
常用方法
boolean
equals(Object o)
判断相等操作。
int
getDeviceClass()
返回BluetoothClass.中的设备类部分。
int
getMajorDeviceClass()
返回BluetoothClass.中设备类的主要部分。
boolean
hasService(int service)
如果该指定服务类被BluetoothClass.所支持,则返回true。
int
hashCode()
返回这个对象的整型哈希码。
String
toString()
返回这个对象的字符串。

这里,有几个方法需要说明一下,首先getDeviceClass()返回BluetoothClass.中的设备类部分,从函数中返回的值可以和在BluetoothClass.Device中的公共常量做比较,从而确定哪个设备类在这个蓝牙类中是被编码的;其次,getMajorDeviceClass()返回BluetoothClass.中设备类的主要部分,从函数中返回的值可以和在BluetoothClass.Device.Major中的公共常量做比较,从而确定哪个主要类在这个蓝牙类中是被编码的。
BluetoothClass.Device
BluetoothClass.Device.Major
BluetoothClass.Service
  这三个类比较简单,主要是包含了一推常量,其中BluetoothClass.Device中的常量代表主要和较小的设备类部分(完整的设备类)的组合。BluetoothClass.Device.Major的常量只能代表主要设备类。而BluetoothClass.Service定义了所有服务类的常量。由于这些常量的数量比较多,这里我们就不一一列举了,详细信息大家可以参考sdk文档中:
  1. docs/reference/android/bluetooth/BluetoothClass.Device.html  
  2.   
  3.   docs/reference/android/bluetooth/BluetoothClass.Device.Major.html  
  4.   docs/reference/android/bluetooth/BluetoothClass.Service.html  


BluetoothDevice
  该类是一个远程蓝牙设备。我们可以创建一个带有各自设备的BluetoothDevice或者查询其皆如名称、地址、类和连接状态等信息。对于蓝牙硬件地址而言,这个类仅仅是一个包装器。这个类的对象是不可改变的。这个类上的操作会使用这个用来创建BluetoothDevice类的BluetoothAdapter类执行在远程蓝牙硬件上。为了获得BluetoothDevice类,我们可以使用BluetoothAdapter.getRemoteDevice(String)方法去创建一个指定MAC地址的设备(用户可以通过带有BluetoothAdapter类来完成对设备的查找)或者从一个通过BluetoothAdapter.getBondedDevices()得到返回值的有联系的设备集合来得到该设备。注意:使用该类需要加入BLUETOOTH权限。该类主要包含一下api可供我们使用。

常量
String
ACTION_ACL_CONNECTED
广播活动:指明一个与远程设备建立的低级别(ACL)连接。
String
ACTION_ACL_DISCONNECTED
广播活动:指明一个来自于远程设备的低级别(ACL)连接的断开。
String
ACTION_ACL_DISCONNECT_REQUESTED
广播活动:指明一个为远程设备提出的低级别(ACL)的断开连接请求,并即将断开连接。
String
ACTION_BOND_STATE_CHANGED
广播活动:指明一个远程设备的连接状态的改变。
String
ACTION_CLASS_CHANGED
广播活动:一个已经改变的远程设备的蓝牙类。
String
ACTION_FOUND
广播活动:发现远程设备。
String
ACTION_NAME_CHANGED
广播活动:指明一个远程设备的名称第一次找到,或者自从最后一次找到该名称开始已经改变。
int
BOND_BONDED
表明远程设备已经匹配。
int
BOND_BONDING
表明和远程设备的匹配正在进行中。
int
BOND_NONE
表明远程设备并未匹配。
int
ERROR
错误信息。
String
EXTRA_BOND_STATE
作为一个ACTION_BOND_STATE_CHANGED的整型附加域。
String
EXTRA_CLASS
作为一个ACTION_FOUND and和ACTION_CLASS_CHANGED的Parcelabe BluetoothClass附加域。
String
EXTRA_DEVICE
每次通过该类进行广播时,作为Parcelable BluetoothDevice的附加域。
String
EXTRA_NAME
作为ACTION_NAME_CHANGED和ACTION_FOUND的字符串附加域。
String
EXTRA_PREVIOUS_BOND_STATE
作为ACTION_BOND_STATE_CHANGED的整型附加域。
String
EXTRA_RSSI
作为ACTION_FOUND的可选短整型附加域。
常用方法
BluetoothSocket
createRfcommSocketToServiceRecord(UUID uuid)
创建一个RFCOMM 以准备开始一个对使用uuid的SDP查找的远程设备进行安全而连接。
int
describeContents()
描述了包含在Parcelable's marshalled representation中的特殊对象的种类。
String
getAddress()
返回该蓝牙设备的硬件地址。
BluetoothClass
getBluetoothClass()
获得远程设备的蓝牙类。
int
getBondState()
获得远程设备的连接状态。
String
getName()
获得远程蓝牙设备的名称。
 

  下面有几个需要说明的,ACL连接通过Android蓝牙栈自动进行管理,需要BLUETOOTH去获取。该类中常量所对应需要的常量值如下:


注意:toSting()函数会返回该蓝牙设备的字符串表达式。当我们在取得蓝牙地址时,一般会得到一个类似于"00:11:22:AA:BB:CC" 的字符串,如果用户明确需要蓝牙硬件地址以防以后toString()表达式会改变的话,用户总是需要使用getAddress()方法来获取蓝牙的地址。getName()函数也只获取远程蓝牙设备的名称,当执行设备扫描的时候,本地适配器将自动寻找远程名称。该方法只返回来自存储器中该设备的名称。该类中大多数方法的使用都需要获得BLUETOOTH权限。


BluetoothServerSocket
  该类用于实现一个蓝牙的监听端口,蓝牙端口的监听接口和TCP端口类似:Socket和ServerSocket类。在服务器端,使用BluetoothServerSocket类来创建一个监听服务端口。当一个连接被BluetoothServerSocket所接受,它会返回一个新的BluetoothSocket来管理该连接。在客户端,使用一个单独的BluetoothSocket类去初始化一个外接连接和管理该连接。最通常使用的蓝牙端口是RFCOMM,它是被Android API支持的类型。RFCOMM是一个面向连接,通过蓝牙模块进行的数据流传输方式,它也被称为串行端口规范(Serial Port Profile,SPP)。为了创建一个对准备好的新来的连接去进行监听BluetoothServerSocket类,使用BluetoothAdapter.listenUsingRfcommWithServiceRecord()方法。然后调用accept()方法去监听该链接的请求。在连接建立之前,该调用会被阻断,也就是说,它将返回一个BluetoothSocket类去管理该连接。每次获得该类之后,如果不再需要接受连接,最好调用在BluetoothServerSocket类下的close()方法。关闭BluetoothServerSocket类不会关闭这个已经返回的BluetoothSocket类
BluetoothSocket类线程安全。特别的,close()方法总会马上放弃外界操作并关闭服务器端口。如果使用需要BLUETOOTH权限的许可。我们后面将要介绍的蓝牙聊天服务则整需要使用该功能。
该类提供了一下一些常用操作方法。


accept()函数将在一个成功建立的连接上返回一个已连接的BluetoothSocket类。每当该调用返回的时候,它可以在此调用去接收以后新来的连接。close()方法可以用来放弃从另一线程来的调用。close()将马上关闭端口,并释放所有相关的资源。在其他线程的该端口中引起阻塞,从而使系统马上抛出一个IO异常。关闭BluetoothServerSocket不会关闭接受自accept()的任意BluetoothSocket。


BluetoothSocket
  上面说过蓝牙端口监听接口和TCP端口类似:Socket和ServerSocket类。在服务器端,使用BluetoothServerSocket类来创建一个监听服务端口。当一个连接被BluetoothServerSocket所接受,它会返回一个新的BluetoothSocket来管理该连接。在客户端,使用一个单独的BluetoothSocket类去初始化一个外接连接和管理该连接。最通常使用的蓝牙端口是RFCOMM,它是被Android API支持的类型。RFCOMM是一个面向连接,通过蓝牙模块进行的数据流传输方式,它也被称为串行端口规范(Serial Port Profile,SPP)。为了创建一个BluetoothSocket去连接到一个已知设备,使用方法BluetoothDevice.createRfcommSocketToServiceRecord()。然后调用connect()方法去尝试一个面向远程设备的连接。这个调用将被阻塞指导一个连接已经建立或者该链接失效。为了创建一个BluetoothSocket作为服务端(或者"主机"),查看BluetoothServerSocket文档。每当该端口连接成功,无论它初始化为客户端,或者被接受作为服务器端,通过getInputStream()和getOutputStream()来打开IO流,从而获得各自的InputStream和OutputStream对象BluetoothSocket类线程安全。特别的,close()方法总会马上放弃外界操作并关闭服务器端口。如果使用需要BLUETOOTH权限的许可。该类也就以下几个方法需要大家掌握。


connect()函数链接到远程设备时,该方法将阻塞,指导一个连接建立或者失效。如果该方法没有返回异常值,则该端口现在已经建立。当设备查找正在进行的时候,创建对远程蓝牙设备的新连接不可被尝试。在蓝牙适配器上,设备查找是一个重量级过程,并且肯定会降低一个设备的连接。使用cancelDiscovery()方法去取消一个外界的查询。查询并不由活动所管理,而作为一个系统服务来运行,所以即使它不能直接请求一个查询,应用程序也总会调用cancelDiscovery()方法。close()方法可以用来放弃从另一线程而来的调用。getInputStream()函数通过连接的端口获得输入数据流,即使该端口未连接,该输入数据流也会返回。不过在该数据流上的操作将抛出异常,直到相关的连接已经建立,当然在聊天实例中,也是我们用来读取晓得数据流。而getOutputStream ()函数通过连接的端口获得输出数据流,即使该端口未连接,该输出数据流也会返回。不过在该数据流上的操作将抛出异常,直到相关的连接已经建立,同样用于聊天实例上的发送消息操作。


总结
  本文主要分析了Ophone平台中蓝牙开发包中的各个类接口的功能和用途,同时也说明了蓝牙编程并不苦难,掌握其通行机制,熟悉其API就能轻松的完成,当然了本文也还没有涉及到具体的实例操作,但是这也是大家必须需要先掌握的基础知识,大家对这些api有一个认识之后,下一篇文章我们就开始动手来做一个蓝牙聊天程序。

分享到:
评论

相关推荐

    android蓝牙编程教程

    以上就是Android蓝牙编程的基本流程和关键知识点。在实际应用中,你可能需要根据具体需求调整代码,例如实现数据加密、心跳机制等,以提高安全性与可靠性。通过深入学习和实践,你可以掌握构建高效、稳定的蓝牙应用...

    Android蓝牙编程技巧.pdf

    本文将深入探讨Android蓝牙编程的基础结构、主要API以及实际应用中的编程方法和技巧。 首先,蓝牙通信因其低功耗、高传输速率和安全性,成为智能手机与传感器设备之间通信的首选。Android操作系统为开发者提供了...

    Android蓝牙编程.doc

    总之,Android蓝牙编程涉及到多个步骤和组件,理解并熟练掌握`BluetoothAdapter`、`BluetoothDevice`、`BroadcastReceiver`等关键类和方法,是构建蓝牙应用的基础。同时,为了提供良好的用户体验,还需要考虑蓝牙...

    蓝牙编程(android版)

    Android蓝牙编程的基础在于`BluetoothAdapter`类的熟练运用。此类提供了与设备蓝牙硬件交互的主要接口,包括启动和停止设备搜索、获取设备状态、配对和连接设备等功能。`BluetoothAdapter`类是所有蓝牙操作的起点,...

    Android蓝牙socket应用编程-心电图-动态折线图demo

    这个"Android蓝牙socket应用编程-心电图-动态折线图demo"涵盖了几个关键的知识点,让我们逐一深入探讨。 首先,**蓝牙协议**是实现设备间无线通信的基础。Android支持蓝牙低功耗(Bluetooth Low Energy, BLE)和...

    C#Android蓝牙通信

    【C#与Android之间的蓝牙通信】是移动设备间交互的重要技术之一,特别是在物联网(IoT)和嵌入式系统中广泛应用。本示例是通过C#编写的应用程序与Android设备进行蓝牙连接,实现数据传输,如图片、语音和文字等。这种...

    Android高级应用源码-android蓝牙连接打印机.zip

    在Android平台上,实现蓝牙连接打印机是一项常见的高级应用技术。这个源码包提供了具体的实现示例,可以帮助...通过学习和理解这些代码,开发者可以掌握Android蓝牙编程的实战技巧,为自己的应用程序添加蓝牙打印功能。

    Android蓝牙,配对,搜索,连接,通信,断开的Demo

    这个Demo项目是学习和理解Android蓝牙功能的好起点,开发者可以在此基础上进行功能扩展,如支持BLE设备、处理多设备连接,或者优化通信性能等。通过深入研究源代码,可以更好地掌握Android Bluetooth API的使用方法...

    Android蓝牙2.0代码

    开发者可以使用以下关键知识点来编写Android蓝牙2.0的代码: 1. **初始化蓝牙适配器**:首先,你需要检查设备是否支持蓝牙以及蓝牙是否开启。这可以通过`BluetoothAdapter.getDefaultAdapter()`和`BluetoothAdapter...

    android蓝牙源码及学习相关资源

    这份"android蓝牙源码及学习相关资源"压缩包包含了开发者进行蓝牙编程所需的关键资料,帮助你深入理解和掌握Android蓝牙技术。 首先,我们来探讨一下Android蓝牙的基础知识。Android系统支持两种蓝牙通信方式:经典...

    android studio 蓝牙 socket 范例

    综上所述,这个范例涵盖了Android蓝牙通信的基础,对于想要学习如何在Android应用中使用蓝牙功能的开发者来说非常有价值。通过深入理解这些知识点,你可以创建自己的蓝牙应用,实现设备之间的数据交换。

    android 蓝牙通讯程序

    这个程序涵盖了蓝牙连接、数据发送与接收等核心功能,对于理解Android蓝牙编程是很有帮助的。 首先,我们需要了解Android蓝牙API的基础。在Android中,蓝牙功能主要由`BluetoothAdapter`类提供,它负责管理蓝牙...

    android蓝牙聊天软件

    "android蓝牙聊天软件"是一个典型的Android开发案例,它涉及到许多关键的技术点,对于想要深入理解Android蓝牙编程的开发者来说,这是一个不可多得的学习资源。 首先,我们要了解Android蓝牙的基础知识。在Android...

    android蓝牙源代码

    在本项目"android蓝牙源代码"中,我们看到的是一个基于Android Studio (AS) 开发的蓝牙控制小车的应用程序。这个源代码库提供了一个基础,使开发者能够了解如何在Android上构建类似的蓝牙控制系统,并对其进行扩展或...

    Android蓝牙遥控上位机

    综上所述,"Android蓝牙遥控上位机"项目不仅涉及到了Android应用开发的基础知识,还深入到了蓝牙通信的细节,是一个综合性的实践项目,对于提升开发者在移动应用和物联网领域的技能大有裨益。通过学习和实践此类项目...

    BLE_和经典蓝牙Android编程说明

    Android平台上的蓝牙编程主要涉及BLE和经典蓝牙。随着BLE技术的普及,越来越多的移动设备开始支持这项技术,它特别适合于电池供电的便携设备,因为它可以大幅降低功耗。在编程时,开发者需要处理各种蓝牙API,这些...

    Android蓝牙官方文档(中英文对照版)

    Android 蓝牙 APIs 是 Android 平台中提供的蓝牙编程接口,通过这些接口,应用程序可以实现与其他蓝牙设备的无线连接,完成点对点和多点的无线特点。使用蓝牙 APIs,一个 Android 应用可以执行以下功能: * 扫描...

    Android与蓝牙4.0通信编程

    在Android平台上进行蓝牙4.0(也称为Bluetooth Low Energy,BLE)通信编程是现代移动应用开发中的一个重要方面,尤其在物联网(IoT)设备交互、健康监测设备、智能家居控制等领域广泛应用。本文将深入探讨如何使用...

    android 蓝牙开发 sample demo

    在Android平台上进行蓝牙开发是一项常见的任务,...总的来说,这个"android 蓝牙开发 sample demo"提供了全面的教程,让开发者能够快速上手Android蓝牙开发,理解蓝牙通信的基本流程,并为自己的项目打下坚实的基础。

    android简单蓝牙按钮测试

    在Android平台上进行蓝牙开发是一项常见的任务,特别是在物联网(IoT)设备交互或移动设备之间通信时。...通过这个简单的例子,开发者可以快速了解Android蓝牙编程的基本流程,并在此基础上扩展更复杂的蓝牙应用。

Global site tag (gtag.js) - Google Analytics