Chinaunix首页 | 论坛 | 博客
  • 博客访问: 586322
  • 博文数量: 192
  • 博客积分: 3780
  • 博客等级: 中校
  • 技术积分: 1487
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-26 10:11
文章存档

2012年(6)

2011年(160)

2010年(26)

分类: 嵌入式

2011-05-24 21:42:50

Android上的蓝牙通信功能的开发:BluetoothChat例程分析

 

1.     概述

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

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

首先看聊天室的效果图:

 

2.     Bluetooth 通信 API 介绍

2.1. Bluetooth 通信过程

 

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.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() 管理员在2009年8月13日编辑了该文章文章。

-->
阅读(1037) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~