Android蓝牙通信总结
BluetoothAdapter- Represents the local Bluetooth adapter (Bluetooth radio). The
BluetoothAdapteris the entry-point for all Bluetooth interaction. Using this, you can discover other Bluetooth devices, query a list of bonded (paired) devices, instantiate aBluetoothDeviceusing a known MAC address, and create aBluetoothServerSocketto listen for communications from other devices.
BluetoothDevice- Represents a remote Bluetooth device. Use this to request a connection with a remote device through a
BluetoothSocketor query information about the device such as its name, address, class, and bonding state.
BluetoothSocket- Represents the interface for a Bluetooth socket (similar to a TCP
Socket). This is the connection point that allows an application to exchange data with another Bluetooth device via InputStream and OutputStream.
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket ;
private final BluetoothDevice mmDevice ;
public ConnectThread(BluetoothDevice device, boolean secure) {
mmDevice = device;
BluetoothSocket tmp = null ;
// Get a BluetoothSocket for a connection with the
// given BluetoothDevice
try {
tmp = device.createRfcommSocketToServiceRecord( MY_UUID );
} catch (IOException e) {
Log. e( TAG,e);
}
mmSocket = tmp;
}
public void run() {
// Always cancel discovery because it will slow down a connection
mAdapter.cancelDiscovery();
try {
mmSocket .connect();
} catch (IOException e) {
// Close the socket
try {
mmSocket .close();
} catch (IOException e2) {
Log. e( TAG,e2);
}
connectionFailed();
return ;
}
synchronized (BluetoothService. this ) {
mConnectThread = null ;
}
// Start the connected thread
connected(mmSocket);
}
public void cancel() {
try {
mmSocket .close();
} catch (IOException e) {
Log. e( TAG, "close() of connect " + mSocketType + " socket failed", e);
}
}
}
BluetoothServerSocket- Represents an open server socket that listens for incoming requests (similar to a TCP
ServerSocket). In order to connect two Android devices, one device must open a server socket with this class. When a remote Bluetooth device makes a connection request to the this device, theBluetoothServerSocketwill return a connectedBluetoothSocketwhen the connection is accepted.

public class MainActivity extends Activity implements View.OnClickListener {
private BluetoothAdapter mBluetoothAdapter = null;
private BluetoothService mService = null;
private BluetoothDevice mOnePairedDevice;
private final String DeviceName = "LILEI" ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
mBluetoothAdapter = BluetoothAdapter. getDefaultAdapter();
if ( mBluetoothAdapter == null ) {
Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG ).show();
finish();
}
....
}
@Override
public void onStart() {
super.onStart();
if (! mBluetoothAdapter.isEnabled()) {
// Enable Bluetooth function
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE );
startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
} else if (mService == null) {
setupBluetoothService();
}
}
@Override
public void onResume() {
super.onResume();
// Performing this check in onResume() covers the case in which BT was
// not enabled during onStart(), so we were paused to enable it...
// onResume() will be called when ACTION_REQUEST_ENABLE activity returns.
if ( mService != null ) {
// Only if the state is STATE_NONE, do we know that we haven't started already
if ( mService.getState() == BluetoothService.STATE_NONE) {
if (mOnePairedDevice == null) {
mOnePairedDevice = getASpecificPairedDevice(DeviceName );
}
if (mOnePairedDevice != null) {
mService.start(mOnePairedDevice );
} else {
Toast. makeText(this, "Not Found the paired Device." , Toast.LENGTH_LONG ).show();
}
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
if ( mService != null ) {
mService.stop();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_ENABLE_BT:
// When the request to enable Bluetooth returns
if (resultCode == Activity.RESULT_OK) {
setupBluetoothService();
} else {
// User did not enable Bluetooth or an error occurred
Log. d(TAG, "BT not enabled");
Toast. makeText(this, R.string. bt_not_enabled_leaving, Toast.LENGTH_SHORT ).show();
finish();
}
}
}
public void setupBluetoothService() {
mService = new BluetoothService(mHandler );
}
private BluetoothDevice getASpecificPairedDevice(String name) {
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
// Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
if (name.equals(device.getName())) {
return device;
}
}
}
return null;
}
...
}
public class BluetoothService {
private static final String TAG = "BluetoothService" ;
private static final UUID MY_UUID = UUID.fromString( "00001101-0000-1000-8000-00805F9B34FB");
// Constants that indicate the current connection state
public static final int STATE_NONE = 0; // we're doing nothing
public static final int STATE_LISTEN = 1; // now listening for incoming connections
public static final int STATE_CONNECTING = 2; // now initiating an outgoing connection
public static final int STATE_CONNECTED = 3; // now connected to a remote device
private final BluetoothAdapter mAdapter ;
private Handler mHandler ;
private ConnectThread mConnectThread ;
private ConnectedThread mConnectedThread ;
private int mState ;
public BluetoothService(Handler handler) {
mAdapter = BluetoothAdapter.getDefaultAdapter();
mHandler = handler;
mState = STATE_NONE ;
}
public void setHandler(Handler handler) {
mHandler = handler;
}
public void start(BluetoothDevice remoteDevice) {
connect(remoteDevice, false );
}
public int getState() {
return mState ;
}
public void stop() {
Log. d( TAG, "stop" );
if (mConnectThread != null) {
mConnectThread .cancel();
mConnectThread = null ;
}
if (mConnectedThread != null) {
mConnectedThread .cancel();
mConnectedThread = null ;
}
setState( STATE_NONE );
}
/**
* This thread runs while attempting to make an outgoing connection with a device. It runs
* straight through; the connection either succeeds or fails.
*/
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
private String mSocketType ;
public ConnectThread(BluetoothDevice device, boolean secure) {
mmDevice = device;
BluetoothSocket tmp = null ;
mSocketType = secure ? "Secure" : "Insecure";
// Get a BluetoothSocket for a connection with the
// given BluetoothDevice
try {
tmp = device.createRfcommSocketToServiceRecord( MY_UUID );
} catch (IOException e) {
Log. e( TAG, "Socket Type: " + mSocketType + "create() failed", e);
}
mmSocket = tmp;
}
public void run() {
Log. i( TAG, "BEGIN mConnectThread SocketType:" + mSocketType );
setName( "ConnectThread" + mSocketType );
// Always cancel discovery because it will slow down a connection
mAdapter .cancelDiscovery();
// Make a connection to the BluetoothSocket
try {
// This is a blocking call and will only return on a
// successful connection or an exception
mmSocket .connect();
} catch (IOException e) {
// Close the socket
try {
mmSocket .close();
} catch (IOException e2) {
Log. e( TAG, "unable to close() " + mSocketType
+ " socket during connection failure" , e2);
}
connectionFailed();
return ;
}
// Reset the ConnectThread because we're done
synchronized (BluetoothService. this) {
mConnectThread = null ;
}
// Start the connected thread
connected( mmSocket , mmDevice , mSocketType );
}
public void cancel() {
try {
mmSocket .close();
} catch (IOException e) {
Log. e( TAG, "close() of connect " + mSocketType + " socket failed", e);
}
}
}
/**
* Indicate that the connection attempt failed and notify the UI Activity.
*/
private void connectionFailed() {
// Send a failure message back to the Activity
Message msg = mHandler .obtainMessage(Constants. MESSAGE_TOAST);
Bundle bundle = new Bundle();
bundle.putString(Constants. TOAST , "Unable to connect device" );
msg.setData(bundle);
mHandler .sendMessage(msg);
}
/**
* Set the current state of the chat connection
*
* @param state An integer defining the current connection state
*/
private synchronized void setState( int state) {
Log. d( TAG, "setState() " + mState + " -> " + state);
mState = state;
// Give the new state to the Handler so the UI Activity can update
mHandler .obtainMessage(Constants. MESSAGE_STATE_CHANGE, state, -1).sendToTarget();
}
/**
* Start the ConnectedThread to begin managing a Bluetooth connection
*
* @param socket The BluetoothSocket on which the connection was made
* @param device The BluetoothDevice that has been connected
*/
public synchronized void connected(BluetoothSocket socket, BluetoothDevice device,
final String socketType) {
Log. d( TAG, "connected, Socket Type:" + socketType);
// Cancel the thread that completed the connection
if (mConnectThread != null) {
mConnectThread .cancel();
mConnectThread = null ;
}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {
mConnectedThread .cancel();
mConnectedThread = null ;
}
// Start the thread to manage the connection and perform transmissions
mConnectedThread = new ConnectedThread(socket, socketType);
mConnectedThread .start();
// Send the name of the connected device back to the UI Activity
Message msg = mHandler .obtainMessage(Constants. MESSAGE_DEVICE_NAME);
Bundle bundle = new Bundle();
bundle.putString(Constants. DEVICE_NAME , device.getName());
msg.setData(bundle);
mHandler .sendMessage(msg);
setState( STATE_CONNECTED );
}
/**
* This thread runs during a connection with a remote device. It handles all incoming and
* outgoing transmissions.
*/
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket, String socketType) {
Log. d( TAG, "create ConnectedThread: " + socketType);
mmSocket = socket;
InputStream tmpIn = null ;
OutputStream tmpOut = null ;
// Get the BluetoothSocket input and output streams
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log. e( TAG, "temp sockets not created" , e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
Log. i( TAG, "BEGIN mConnectedThread" );
byte [] buffer = new byte[3024];
int bytes;
// Keep listening to the InputStream while connected
while (true ) {
try {
// Read from the InputStream
bytes = mmInStream .read(buffer);
// Send the obtained bytes to the UI Activity
mHandler .obtainMessage(Constants. MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Log. e( TAG, "disconnected" , e);
connectionLost();
break ;
}
}
}
/**
* Write to the connected OutStream.
*
* @param buffer The bytes to write
*/
public void write( byte[] buffer) {
try {
mmOutStream .write(buffer);
// Share the sent message back to the UI Activity
mHandler .obtainMessage(Constants. MESSAGE_WRITE, -1, -1, buffer).sendToTarget();
} catch (IOException e) {
Log. e( TAG, "Exception during write" , e);
}
}
public void writeFileMessage( byte[] buffer) {
try {
mmOutStream .write(buffer);
} catch (IOException e) {
Log. e( TAG, "Exception during write" , e);
}
}
public void writeFileStream (InputStream input) {
byte [] buffer = new byte[1024];
int readLengh;
try {
while ((readLengh = input.read(buffer)) != -1) {
mmOutStream .write(buffer, 0, readLengh);
}
mHandler
.obtainMessage(Constants. MESSAGE_WRITE , -1, -1,
"Finish send file to remoteDevice." )
.sendToTarget();
} catch (IOException e) {
Log. e( TAG, "Exception during write" , e);
mHandler .obtainMessage(Constants. MESSAGE_WRITE, -1, -1,
"Error when send file to remoteDevice").sendToTarget();
}
}
public void cancel() {
try {
mmSocket .close();
} catch (IOException e) {
Log. e( TAG, "close() of connect socket failed" , e);
}
}
}
/**
* Indicate that the connection was lost and notify the UI Activity.
*/
private void connectionLost() {
// Send a failure message back to the Activity
Message msg = mHandler .obtainMessage(Constants. MESSAGE_TOAST);
Bundle bundle = new Bundle();
bundle.putString(Constants. TOAST , "Device connection was lost" );
msg.setData(bundle);
mHandler .sendMessage(msg);
// Start the service over to restart listening mode
}
/**
* Start the ConnectThread to initiate a connection to a remote device.
*
* @param device The BluetoothDevice to connect
* @param secure Socket Security type - Secure (true) , Insecure (false)
*/
public synchronized void connect(BluetoothDevice device, boolean secure) {
Log. d( TAG, "connect to: " + device);
// Cancel any thread attempting to make a connection
if (mState == STATE_CONNECTING) {
if (mConnectThread != null) {
mConnectThread .cancel();
mConnectThread = null ;
}
}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {
mConnectedThread .cancel();
mConnectedThread = null ;
}
// Start the thread to connect with the given device
mConnectThread = new ConnectThread(device, secure);
mConnectThread .start();
setState( STATE_CONNECTING );
}
/**
* Write to the ConnectedThread in an unsynchronized manner
*
* @param out The bytes to write
* @see ConnectedThread#write(byte[])
*/
public void write( byte[] out, boolean isFile) {
// Create temporary object
ConnectedThread r;
// Synchronize a copy of the ConnectedThread
synchronized (this ) {
if (mState != STATE_CONNECTED)
return ;
r = mConnectedThread ;
}
// Perform the write unsynchronized
if (isFile) {
r.writeFileMessage(out);
} else {
r.write(out);
}
}
public void write(InputStream in) {
// Create temporary object
ConnectedThread r;
// Synchronize a copy of the ConnectedThread
synchronized (this ) {
if (mState != STATE_CONNECTED)
return ;
r = mConnectedThread ;
}
// Perform the write unsynchronized
r. writeFileStream(in);
}
}
Android蓝牙通信总结的更多相关文章
- Qt on Android 蓝牙通信开发
版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...
- Android蓝牙通信具体解释
蓝牙通信的大概过程例如以下: 1.首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket.获取输入输出流 4,读取和写入数据 5.断开连接关闭蓝牙 还要发送配对码发送进行推断! 以下是全部的源码:不 ...
- Android蓝牙通信
Android为蓝牙设备之间的通信封装好了一些调用接口,使得实现Android的蓝牙通信功能并不困难.可通过UUID使两个设备直接建立连接. 具体步骤: 1. 获取BluetoothAdapter实例 ...
- (转)android 蓝牙通信编程
转自:http://blog.csdn.net/pwei007/article/details/6015907 Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输. 本文档描述了怎样 ...
- Android蓝牙通信功能开发
1. 概述 Bluetooth 是几乎现在每部手机标准配备的功能,多用于耳机 mic 等设备与手机的连接,除此之外,还可以多部手机之间建立 bluetooth 通信,本文就通过 SDK 中带的一个聊天 ...
- android 蓝牙通信编程讲解
以下是开发中的几个关键步骤: 1,首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket,获取输入输出流 4,读取和写入数据 5,断开连接关闭蓝牙 下面是一个demo 效果图: SearchDevi ...
- android 蓝牙 通信 bluetooth
此例子基于 android demo Android的蓝牙开发,虽然不多用,但有时还是会用到, Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试需要两部手机: ...
- Android 蓝牙通信——AndroidBluetoothManager
转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN To get a Git project into your build: Step 1. Add the JitPack repos ...
- Android BLE设备蓝牙通信框架BluetoothKit
BluetoothKit是一款功能强大的Android蓝牙通信框架,支持低功耗蓝牙设备的连接通信.蓝牙广播扫描及Beacon解析. 关于该项目的详细文档请关注:https://github.com/d ...
随机推荐
- wwnjld第二轮迭代测试报告
1.引言 1.1测试报告目的 被测试报告为wwnjld小组我们的时间管理软件的第二轮迭代所写的软件测试报告.在经过本小组大家不懈的努力之下,我们小组第二轮迭代的产品终于新鲜出炉了.这次测试小组的主要成 ...
- 一个例子说明mouseover事件与mouseenter事件的区别
<html> <head> <meta charset="UTF-8"> <title>haha</title> < ...
- 全排列 next_permutation() 函数的用法
在头文件<algorithm>里面有如下代码: int a[]; do { } while(next_permutation(a,a+n)); 可产生1~n的全排列有如下代码: #incl ...
- lintcode-186-最多有多少个点在一条直线上
186-最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...
- hadoop下安装mysql
http://www.cnblogs.com/zhuyp1015/p/3561470.html 第一步:先把这个文件放入到linux环境下桌面. 接着编写脚本:sudo apt-get u ...
- 【Spring.Net】- 环境搭建
参考文章:http://www.cnblogs.com/GoodHelper/archive/2009/10/25/SpringNET_Config.html 一.环境下载及安装 到Spring的官方 ...
- 安装django 提示ImportError: No module named setuptools
安装django前要先安装setuptools 先安装一些必要的包,否则会报错:Python build finished, but the necessary bits to build these ...
- CheckStateChanged(复选框选中状态更改事件)和 CheckedChanged(单选按钮选中状态更改事件)二者区别?
CheckStateChanged(复选框选中状态更改事件)和 CheckedChanged(单选按钮选中状态更改事件)二者区别: 复选框控件(CheckBox)提供了CheckedChanged控件 ...
- 向今天要结果; 向明天要动力 eclipse不自动弹出提示(alt+/快捷键失效)
最近公司电脑上的Eclipse没有了自动提示功能,也不是全部不提示,大多数情况下按下“alt+/”键还会产生提示,但是当我在java项目中邪main方法和syso的时候,“alt+/”则会失效,今天在 ...
- Delphi 制作自定义数据感知控件并装入包(dpk文件)中(与DBText类似的数据感知控件)
一.基础知识简介: 1.包的命名介绍: 包的命名没有规则,但是建议遵守包的命名约定:包的命名与包的版本相关,包的名称前面几个字符通常表示作者或公司名,也可以是控件的一个描述词,后面紧跟的Std表示运行 ...