Android 蓝牙开发(整理大全)

 Android蓝牙开发


鉴于国内Android蓝牙开发的例子不多,以及蓝牙开发也比较少用到,因此找的资料不是很全

(一):


因为Android蓝牙的通讯都须要用到UUID,若是由手机发起搜索,当搜索到电脑的蓝牙时,可以获得蓝牙的地址(address),但通讯时须要获得BluetoothSocket,而BluetoothSocket则须要电脑蓝牙的UUID,请问这个是怎么样获得的呢?html

在蓝牙中,每一个服务和服务属性都惟一地由"全球惟一标识符" (UUID)来校验。正如它的名字所暗示的,每个这样的标识符都要在时空上保证惟一。UUID类可表现为短整形(16或32位)和长整形(128 位)UUID。他提供了分别利用String和16位或32位数值来建立类的构造函数,提供了一个能够比较两个UUID(若是两个都是128位)的方法,还有一个能够转换一个UUID为一个字符串的方法。UUID实例是不可改变的(immutable),只有被UUID标示的服务能够被发现。
    在Linux下你用一个命令uuidgen -t能够生成一个UUID值;在Windows下则执行命令uuidgen 。UUID看起来就像以下的这个形式:2d266186-01fb-47c2-8d9f-10b8ec891363。当使用生成的UUID去建立一个 UUID对象,你能够去掉连字符。java

我搞定了电脑和android手机的蓝牙通讯问题:
首先解答几个问题
1.两边的UUID必须是同样的,这是一个服务的惟一标识,并且这个UUID的值必须是
00001101-0000-1000-8000-00805F9B34FB。为何呢?由于这个是android的API上面说明的,用于普通蓝牙适配器和android手机蓝牙模块链接的,请你们本身看一下android有关bluetooth的API。
2.在链接的时候,若是电脑做为server(一直监听是否有服务链接),android手机做为client(主动和电脑创建链接),则须要在手机端调用这样一行代码:mmSocket.connect();
其中mmSocket是一个BluetoothSocket类,在这句话以前请肯定你已经把手机和电脑进行了配对,并且那些乱七八糟的设置都搞定了。linux

http://developer.android.com/reference/android/bluetooth/BluetoothDevice.htmlandroid

public BluetoothSocket createInsecureRfcommSocketToServiceRecord (UUID uuid)
Since: API Level 10Create an RFCOMM BluetoothSocket socket ready to start an insecure outgoing connection to this remote device using SDP lookup of uuid.程序员

The communication channel will not have an authenticated link key i.e it will be subject to man-in-the-middle attacks. For Bluetooth 2.1 devices, the link key will be encrypted, as encryption is mandatory. For legacy devices (pre Bluetooth 2.1 devices) the link key will be not be encrypted. UsecreateRfcommSocketToServiceRecord(UUID) if an encrypted and authenticated communication channel is desired.api

This is designed to be used with listenUsingInsecureRfcommWithServiceRecord(String, UUID) for peer-peer Bluetooth applications.服务器

Use connect() to initiate the outgoing connection. This will also perform an SDP lookup of the given uuid to determine which channel to connect to.app

The remote device will be authenticated and communication on this socket will be encrypted.框架

Hint: If you are connecting to a Bluetooth serial board then try using the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB. However if you are connecting to an Android peer then please generate your own unique UUID.socket



(二):

         Android对于蓝牙开发从2.0版本的sdk才开始支持,并且模拟器不支持,测试至少须要两部手机,因此制约了不少技术人员的开发。

        首先,要操做蓝牙,先要在AndroidManifest.xml里加入权限

<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />

<uses-permissionandroid:name="android.permission.BLUETOOTH" />


         而后,看下api,Android全部关于蓝牙开发的类都在android.bluetooth包下,以下图,只有8个类

 

而咱们须要用到了就只有几个而已:

    1.BluetoothAdapter 顾名思义,蓝牙适配器,直到咱们创建bluetoothSocket链接以前,都要不断操做它

      BluetoothAdapter里的方法不少,经常使用的有如下几个:

      cancelDiscovery() 根据字面意思,是取消发现,也就是说当咱们正在搜索设备的时候调用这个方法将再也不继续搜索

      disable()关闭蓝牙

      enable()打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候咱们须要问下用户是否打开,一下这两行代码一样是打开蓝牙,不过会提示用户:

Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enabler,reCode);//同startActivity(enabler);

      getAddress()获取本地蓝牙地址

      getDefaultAdapter()获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdapter

      getName()获取本地蓝牙名称

      getRemoteDevice(String address)根据蓝牙地址获取远程蓝牙设备

      getState()获取本地蓝牙适配器当前状态(感受可能调试的时候更须要)

      isDiscovering()判断当前是否正在查找设备,是返回true

      isEnabled()判断蓝牙是否打开,已打开返回true,不然,返回false

     listenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID建立并返回BluetoothServerSocket,这是建立BluetoothSocket服务器端的第一步

      startDiscovery()开始搜索,这是搜索的第一步

    2.BluetoothDevice看名字就知道,这个类描述了一个蓝牙设备

       createRfcommSocketToServiceRecord(UUIDuuid)根据UUID建立并返回一个BluetoothSocket


       这个方法也是咱们获取BluetoothDevice的目的——建立BluetoothSocket


       这个类其余的方法,如getAddress(),getName(),同BluetoothAdapter

    3.BluetoothServerSocket若是去除了Bluetooth相信你们必定再熟悉不过了,既然是Socket,方法就应该都差很少,


这个类一种只有三个方法


两个重载的accept(),accept(inttimeout)二者的区别在于后面的方法指定了过期时间,须要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过时以后),都会阻塞线程,应该放在新线程里运行!


还有一点须要注意的是,这两个方法都返回一个BluetoothSocket,最后的链接也是服务器端与客户端的两个BluetoothSocket的链接

      close()这个就不用说了吧,翻译一下——关闭!

    4.BluetoothSocket,跟BluetoothServerSocket相对,是客户端


一共5个方法,不出意外,都会用到

      close(),关闭

      connect()链接

      getInptuStream()获取输入流

      getOutputStream()获取输出流

      getRemoteDevice()获取远程设备,这里指的是获取bluetoothSocket指定链接的那个远程蓝牙设备


(三):

1. 概述

  Bluetooth 是几乎如今每部手机标准配备的功能,多用于耳机 mic 等设备与手机的链接,除此以外,还能够多部手机之间创建 bluetooth 通讯,本文就经过 SDK 中带的一个聊天室的例程,来介绍一下 Android 上的 Bluetooth 的开发。

  在 Android1.x 的时候,相关 API 很是不完善,还不能简单的使用 Bluetooth 开发,有一个开源项目能够帮助程序员使用、开发蓝牙,支持直接方法bluetooth 协议栈。在 Android2 之后,框架提供了一些官方 API 来进行蓝牙的通讯,但目前的程序也比较不完善。本文主要讨论 Android2 后的Bluetooth 通讯的 API 使用方法。

  首先看聊天室的效果图:

  

1.gif

 

  2. Bluetooth 通讯 API 介绍2.1. Bluetooth 通讯过程

  

2.gif

 2.2. Bluetooth API 的主要方法

 

  BluetoothAdapter 类

  BluetoothAdapter.getDefaultAdapter() :获得本地默认的 BluetoothAdapter ,若返回为 null 则表示本地不支持蓝牙;

  isDiscovering() :返回设备是否正在发现周围蓝牙设备;

  cancelDiscovery() :取消正在发现远程蓝牙设备的过程;

  startDiscovery() :开始发现过程;

  getScanMode() :获得本地蓝牙设备的 Scan Mode ;

  getBondedDevices() :获得已配对的设备;

  isEnabled() :蓝牙功能是否启用。

  当发现蓝牙功能未启用时,以下调用设置启用蓝牙:

  if (! mBluetoothAdapter .isEnabled()) {

  Intent enableIntent = new Intent(BluetoothAdapter. ACTION_REQUEST_ENABLE );

  startActivityForResult(enableIntent, REQUEST_ENABLE_BT );

  }

  复制代码

  若是发现当前设备没有打开对外可见模式,则传递 Intent 来调用打开可发现模式,代码以下:

  Intent discoverableIntent = new Intent(BluetoothAdapter. ACTION_REQUEST_DISCOVERABLE ); discoverableIntent.putExtra(BluetoothAdapter. EXTRA_DISCOVERABLE_DURATION , 300);

  startActivity(discoverableIntent);

  复制代码

  BluetoothDevice 类,此为对应的远程蓝牙 Device

  createRfcommSocketToServiceRecord() :建立该 Device 的 socket 。

  BluetoothSocket 类

  connect() :请求链接蓝牙。

  getInputStream() :获得输入流,用于接收远程方信息。

  getOutputStream() :获得输出流,发送给远程方的信息。

  close() :关闭蓝牙链接。

  InputStream 类:

  read(byte[]) :以阻塞方式读取输入流。

  OutputStream 类:

  write(byte[]) :将信息写入该输出流,发送给远程。


..

3. BluetoothChat 例程分析

  Google 提供的关于 Bluetooth 开发的例程为 Bluetoothchat ,使用截图可见本文一开始。除去配置及 ui 定义等文件,主程序文件共三个:BluetoothChat.java 、 BluetoothChatService.java 以及 DeviceListActivity.java ,详细功能可见下面的描述。

  3.1. 总体调用关系序列图

  

3.gif

 3.2. BluetoothChat.java

 

  例程的主 Activity 。 onCreate() 获得本地 BluetoothAdapter 设备,检查是否支持。 onStart() 中检查是否启用蓝牙,并请求启用,而后执行 setupChat()。 setupChat() 中先对界面中的控件进行初始化增长点击监听器等,然建立 BluetoothChatService 对象,该对象在整个应用过程当中存在,并执行蓝牙链接创建、消息发送接受等实际的行为。

  3.3. BluetoothChatService.java

  public synchronized void start() :

  开启 mAcceptThread 线程,因为样例程序是仅 2 人的聊天过程,故以前先检测 mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。

  public synchronized void connect(BluetoothDevice device) :

  取消 CONNECTING 和 CONNECTED 状态下的相关线程,而后运行新的 mConnectThread 线程。

  public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :

  开启一个 ConnectedThread 来管理对应的当前链接。以前先取消任意现存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 线程,而后开启新 mConnectedThread ,传入当前刚刚接受的 socket 链接。最后经过 Handler 来通知 UI 链接 OK 。

  public synchronized void stop() :

  中止全部相关线程,设当前状态为 NONE 。

  public void write(byte[] out) :

  在 STATE_CONNECTED 状态下,调用 mConnectedThread 里的 write 方法,写入 byte 。

  private void connectionFailed() :

  链接失败的时候处理,通知 ui ,并设为 STATE_LISTEN 状态。

  private void connectionLost() :

  当链接失去的时候,设为 STATE_LISTEN 状态并通知 ui 。

  内部类:

  private class AcceptThread extends Thread :

  建立监听线程,准备接受新链接。使用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。

  private class ConnectThread extends Thread :

  这是定义的链接线程,专门用来对外发出链接对方蓝牙的请求和处理流程。构造函数里经过 BluetoothDevice.createRfcommSocketToServiceRecord(),从待链接的 device 产生 BluetoothSocket. 而后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时可以关闭相关 socket 。

  private class ConnectedThread extends Thread :

  这个是双方蓝牙链接后一直运行的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的 InputStream.read() 循环读取输入流, 而后 post 到UI 线程中更新聊天消息。也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭链接的 socket 。

  3.4. DeviceListActivity.java

  该类包含 UI 和操做的 Activity 类,做用是获得系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。而后提供点击后发出链接设备请求的功能。

  除了 RFCOMM 通讯外, Android 上关于 Bluetooth 的还有 SDP 、 GAP 、耳机设备链接等内容,本文还未涉及,将会随着蓝牙相关 API 在新版本中的进一步完善来学习使用。




以上资料包含三大部分,有时间会把代码搞上去供你们参考.

~.~
相关文章
相关标签/搜索