Android蓝牙开发

一、配置权限

AndroidManifest.xml里加入权限

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

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

二、相关API

Android所有关于蓝牙开发的类都在android.bluetooth包下:

1.BluetoothAdapter类

描述:

蓝牙适配器,代表本地的蓝牙适配器设备。BluetoothAdapter类让用户能执行基本的蓝牙任务。例如: 初始化设备的搜索,查询可匹配的设备集,使用一个已知的MAC地址来初始化一个BluetoothDevice类,创建一个 BluetoothServerSocket类以监听其它设备对本机的连接请求等。

为了得到这个代表本地蓝牙适配器的 BluetoothAdapter类,调用getDefaultAdapter()这一静态方法。这是所有蓝牙动作使用的第一步。当拥有本地适配器以后, 用户可以获得一系列的BluetoothDevice对象,这些对象代表所有拥有getBondedDevice()方法的已经匹配的设备;用 startDiscovery()方法来开始设备的搜寻;或者创建一个BluetoothServerSocket类,通过 listenUsingRfcommWithServiceRecord(String, UUID)方法来监听新来的连接请求。

方法:

1)cancelDiscovery() 

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

2)disable()关闭蓝牙

3)enable()打开蓝牙

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

  Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

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

4)getAddress()获取本地蓝牙地址

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

6)getName()获取本地蓝牙名称

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

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

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

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

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

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

2.BluetoothDevice

描述

代表一个远程蓝牙设备。让你创建一个带有各自设备的BluetoothDevice或者查询其皆如名称、地址、类和连接状态等信息。

对于蓝牙硬件地址而言,这个类仅仅是一个瘦包装器。这个类的对象是不可改变的。这个类上的操作会使用这个用来创建BluetoothDevice类的BluetoothAdapter类执行在远程蓝牙硬件上。

为了获得BluetoothDevice,类,使用BluetoothAdapter.getRemoteDevice(String)方法去创建一个表示 已知MAC地址的设备(用户可以通过带有BluetoothAdapter类来完成对设备的查找)或者从一个通过 BluetoothAdapter.getBondedDevices()得到返回值的有联系的设备集合来得到该设备。

方法

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

这个方法也是我们获取BluetoothDevice的目的——创建BluetoothSocket

2)getAddress()同BluetoothAdapter

3)getName()同BluetoothAdapter

3.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()方法总会马上放弃外界操作并关闭服务器端口。

方法

1)accept()

  阻塞直到一个连接已经建立。(译者注:默认超时时间设置为-1,见源码)

     在一个成功建立的连接上返回一个已连接的BluetoothSocket类。

     每当该调用返回的时候,它可以在此调用去接收以后新来的连接。

2)accept(inttimeout)

  阻塞直到超时时间内的连接建立。

      在一个成功建立的连接上返回一个已连接的BluetoothSocket类。

      每当该调用返回的时候,它可以在此调用去接收以后新来的连接。

3)close()

  用来放弃从另一线程来的调用。

  马上关闭端口,并释放所有相关的资源。

  在其他线程的该端口中引起阻塞,从而使系统马上抛出一个IO异常。

  关闭BluetoothServerSocket不会关闭接受自accept()的任意BluetoothSocket。

4.BluetoothSocket

描述

已连接或连接到蓝牙套接字(socket)。

蓝牙端口监听接口和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()方法总会马上放弃外界操作并关闭服务器端口。

方法

1)close() 关闭

2)connect() 连接

3)getInptuStream() 获取输入流

4)getOutputStream() 获取输出流

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

三、操作

1、获取本地蓝牙适配器     

BluetoothAdapter mAdapter= BluetoothAdapter.getDefaultAdapter();

2、打开蓝牙

if(!mAdapter.isEnabled()){

//弹出对话框提示用户是后打开

Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enabler, REQUEST_ENABLE);

//不做提示,强行打开

// mAdapter.enable();
}

3、搜索设备

BroadcastReceiver mReceiver = new BroadcastReceiver() {
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
      //找到设备
    if (BluetoothDevice.ACTION_FOUND.equals(action)) {
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
      if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
        Log.v(TAG, "find device:" + device.getName() + device.getAddress());
      }
    }
     //搜索完成
    else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
      setTitle("搜索完成");
      if (mNewDevicesAdapter.getCount() == 0) {
        Log.v(TAG,"find over");
      }
    }
  //执行更新列表的代码
  }
};

onCreate()中代码

 

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

registerReceiver(mReceiver, filter);

filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

registerReceiver(mReceiver, filter);

 

4、建立连接

首先Android sdk(2.0以上版本)支持的蓝牙连接是通过BluetoothSocket建立连接(说的不对请高人指正),服务器端(BluetoothServerSocket)和客户端(BluetoothSocket)需指定同样的UUID,才能建立连接,因为建立连接的方法会阻塞线程,所以服务器端和客户端都应启动新线程连接

1)服务器端:

 

//UUID格式一般是"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"可到
        //http://www.uuidgenerator.com 申请

BluetoothServerSocket serverSocket = mAdapter. listenUsingRfcommWithServiceRecord(serverSocketName,UUID);

serverSocket.accept();

 

2)客户端:

 

BluetoothSocket clienSocket=dcvice. createRfcommSocketToServiceRecord(UUID);

clienSocket.connect();

 

5、数据传递,通过以上操作,就已经建立的BluetoothSocket连接了,数据传递无非是通过流的形式

1)获取流

 

inputStream = socket.getInputStream();

outputStream = socket.getOutputStream();

 

2)写出、读入

 

你可能感兴趣的:(Android蓝牙开发)