您的位置:首页 > 移动开发 > Android开发

Android蓝牙开发全面总结

2018-03-29 09:47 211 查看

版权声明:本文出自张朋永的博客,转载必须注明出处。 https://blog.csdn.net/VNanyesheshou/article/details/51554852

基本概念

安卓平台提供对蓝牙的通讯栈的支持,允许设别和其他的设备进行无线传输数据。应用程序层通过安卓API来调用蓝牙的相关功能,这些API使程序无线连接到蓝牙设备,并拥有P2P或者多端无线连接的特性。蓝牙的功能:1、扫描其他蓝牙设备2、为可配对的蓝牙设备查询蓝牙适配器3、建立RFCOMM通道(其实就是尼玛的认证)4、通过服务搜索来链接其他的设备5、与其他的设备进行数据传输6、管理多个连接蓝牙建立连接必须要求:1、打开蓝牙2、查找附近已配对或可用设备3、连接设备4、设备间数据交互首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限
Android所有关于蓝牙开发的类都在android.bluetooth包下,只有8个类

1.BluetoothAdapter 蓝牙适配器

直到我们建立bluetoothSocket连接之前,都要不断操作它BluetoothAdapter里的方法很多,常用的有以下几个:

2.BluetoothDevice 描述了一个蓝牙设备

3.BluetoothServerSocket

这个类一种只有三个方法两个重载的accept(),accept(inttimeout)两者的区别在于后面的方法指定了过时时间,需要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行!还有一点需要注意的是,这两个方法都返回一个BluetoothSocket,最后的连接也是服务器端与客户端的两个BluetoothSocket的连接

4.BluetoothSocket

跟BluetoothServerSocket相对,是客户端一共5个方法,不出意外,都会用到

5、BluetoothClass

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

两个内部类:

class   BluetoothClass.Device定义所有设备类的常量class   BluetoothClass.Service定义所有服务类的常量公共方法:public int describeContents ()描述包含在可封装编组的表示中所有特殊对象的种类。返回值 一个指示被Parcelabel所排列的特殊对象类型集合的位掩码。public boolean equals (Object o)比较带有特定目标的常量。如果他们相等则标示出来。 为了保证其相等,o必须代表相同的对象,该对象作为这个使用类依赖比较的常量。通常约定,该比较既要可移植又需灵活。当且仅当o是一个作为接收器(使用==操作符来做比较)的精确相同的对象是,这个对象的实现才返回true值。子类通常实现equals(Object)方法,这样它才会重视这两个对象的类型和状态。通常约定,对于equals(Object)和hashCode() 方法,如果equals对于任意两个对象返回真值,那么hashCode()必须对这些对象返回相同的纸。这意味着对象的子类通常都覆盖或者都不覆盖这两个方法。参数o   需要对比常量的对象返回值如果特定的对象和该对象相等则返回true,否则返回false。public int getDeviceClass ()返回BluetoothClass中的设备类部分(主要的和较小的)从函数中返回的值可以和在BluetoothClass.Device中的公共常量做比较,从而确定哪个设备类在这个蓝牙类中是被编码的。返回值设备类部分public int getMajorDeviceClass ()返回BluetoothClass中设备类的主要部分从函数中返回的值可以和在BluetoothClass.Device.Major中的公共常量做比较,从而确定哪个主要类在这个蓝牙类中是被编码的。返回值主要设备类部分public boolean hasService (int service)如果该指定服务类被BluetoothClass所支持,则返回true在BluetoothClass.Service中,合法的服务类是公共常量,比如AUDIO类。参数service 合法服务类返回值如果该服务类可被支持,则返回truepublic int hashCode ()返回这个对象的整型哈希码。按约定,任意两个在equals(Object)中返回true的对象必须返回相同的哈希码。这意味着对象的子类通常通常覆盖或者都不覆盖这两个方法。注意:除非同等对比信息发生改变,否则哈希码不随时间改变而改变。public String toString ()  返回这个对象的字符串,该字符串包含精确且可读的介绍。系统鼓励子类去重写该方法,并且提供了能对该对象的类型和数据进行重视的实现方法。默认的实现方法只是简单地把类名、“@“符号和该对象hashCode()方法的16进制数连接起来(如下列所示的表达式):
以上是蓝牙主要操作的类。

基本用法:

1、获取本地蓝牙适配器
2、打开蓝牙
3、搜索设备1)mAdapter.startDiscovery() 是第一步,可能你会发现没有返回的蓝牙设备2)定义BroadcastReceiver,代码如下
4、建立连接首先Android sdk(2.0以上版本)支持的蓝牙连接是通过BluetoothSocket建立连接,服务器端(BluetoothServerSocket)和客户端(BluetoothSocket)需指定同样的UUID,才能建立连接,因为建立连接的方法会阻塞线程,所以服务器端和客户端都应启动新线程连接
1)服务器端:
2)客户端:
5、数据传递通过以上操作,就已经建立的BluetoothSocket连接了,数据传递是通过流1)获取流
2)写出、读入(JAVA常规操作)补充一下,使设备能够被搜索

关于蓝牙连接:

可以直接用以下代码进行连接:
1.startDiscovey有可能启动失败一般程序中会有两步:开启蓝牙、开始寻找设备。顺序执行了开启蓝牙-寻找设备的步骤,但是由于蓝牙还没有完全打开,就开始寻找设备,导致寻找失败。解决办法:
2.接收数据转换使用socket.getInputStream接收到的数据是字节流,这样的数据是没法分析的,所以很多情况需要一个byte转十六进制String的函数:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: