功能:蓝牙设备通信连接。
蓝牙连接分为两种情况。
一、手机与手机间通信
二、手机与蓝牙模块通信。
注意:蓝牙通信使用了多线程,必须掌握线程的创建使用才能使用蓝牙进行通信。
手机与手机间通信:
手机间蓝牙通信使用客户端和服务端。
客户端:搜索设备找到服务端,和服务端配对,连接服务端。
服务端:等待客户端与其配对并来连接。(配对和连接由同一端发起)
申明:
private BluetoothSocket btSocket; // 客户端socket
private BluetoothServerSocket mServerSocket;
private ReadThread mReadThread; // 服务端获取客户端传输的数据
private ReadThread2 mReadThread2; // 客户端获取服务器传输的数据
private ClientThread mClientThread; // 客户端运行线程
private ServerThread mServerThread; // 服务端线程
private BluetoothDevice device1;
private BluetoothSocket socket; // 服务器socket
private TToast MessageBox; //显示是否连接成功
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private BluetoothAdapter mBluetoothAdapter;//蓝牙适配器
在ListView中点击配对完成后,在后面添加:
//主动配对方为客户端,配对完成后调用客户端线程,根据设备地址进行连接
device1 = mBluetoothAdapter.getRemoteDevice(al[arg2]);
mClientThread = new ClientThread(); //开启客户端的线程
mClientThread.start();
服务端线程在程序运行时就启动了
@Override
protected void onResume()
{
super.onResume();
mServerThread = new ServerThread(); //开启服务段线程
mServerThread.start();
}
客户端和服务端代码
//客户端
private class ClientThread extends Thread //线程
{
@Override
public void run()
{
if (device1 != null) //蓝牙设备
{
//连接
try
{
btSocket = device1.createRfcommSocketToServiceRecord(MY_UUID);
btSocket.connect(); //后面不能添加提示框 (后面可以显示已连接上)
//显示是否连接成功
MessageBox = new TToast();
MessageBox.start();
//显示传输过来的数据
mReadThread2 = new ReadThread2();
mReadThread2.start();
}
catch (IOException e)
{
}
}
}
}
//服务器
private class ServerThread extends Thread
{
public void run()
{
try
{
/* 创建一个蓝牙服务器 参数分别:服务器名称、UUID */
mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("btspp",MY_UUID);
/* 接受客户端的连接请求 */
// 这是一个阻塞过程,直到建立一个连接或者连接失效
// 通过BluetoothServerSocket得到一个BluetoothSocket对象,管理这个连接
socket = mServerSocket.accept();
//显示是否成功连接
MessageBox = new TToast();
<span style="white-space:pre"> </span>MessageBox.start();
//显示传输过来的数据
mReadThread = new ReadThread();
mReadThread.start();
}
catch (IOException e)
{
e.printStackTrace();
}
}
};
添加一个编辑框,两个按钮,在编辑框中输入数据,按钮为客户端和服务端,本机为客户端,就点击客户端将编辑框中数据发送到服务端。同理服务端按钮。
编辑框为et2,按钮为mt11和mt12
mt11.setOnClickListener(new OnClickListener()//客户端
{
public void onClick(View v)
{
String add = et2.getText().toString();//获取编辑框数据
if (add.length() > 0)
{
if (btSocket == null)
{
toast("没有可用的连接1");
return;
}
try
{
OutputStream os = btSocket.getOutputStream();
os.write(add.getBytes());//获取所有的自己然后往外发送
toast("成功1");
}
catch (IOException e)
{
e.printStackTrace();
}
}
else
{
toast("没有数据");
}
}
});
mt12.setOnClickListener(new OnClickListener()//服务器端
{
public void onClick(View v)
{
String add = et2.getText().toString();//获取编辑框数据
if (add.length() > 0)
{
if (socket == null)
<span style="white-space:pre"> </span>{
toast("没有可用的连接2");
return;
}
try
{
OutputStream os = socket.getOutputStream();
os.write(add.getBytes());
toast("成功2");
}
catch (IOException e)
{
e.printStackTrace();
}
}
else
{
toast("没有数据");
}
}
});
//作为服务器端时。读取客户端发来的数据
private class ReadThread extends Thread
{
public void run()
{
byte[] buffer = new byte[1024];
int bytes;
InputStream mmInStream = null;
try
{
mmInStream = socket.getInputStream();
}
catch (IOException e1)
{
e1.printStackTrace();
}
while (true)
{
try
{
if( (bytes = mmInStream.read(buffer)) > 0 )
{
byte[] buf_data = new byte[bytes];
for(int i=0; i<bytes; i++)
{
buf_data[i] = buffer[i];
}
String s = new String(buf_data);
Message msg = new Message();
msg.obj = s;
msg.what = 1;
LinkDetectedHandler.sendMessage(msg);
}
}
catch (IOException e)
{
try
{
mmInStream.close();
}
catch (IOException e1)
{
e1.printStackTrace();
}
break;
}
}
}
}
private class ReadThread2 extends Thread//作为客户端端时。读取服务端发来的数据
{
@Override
public void run()
{
byte[] buffer = new byte[1024];
int bytes;
InputStream is = null;
try
{
is = btSocket.getInputStream(); //获取服务器发过来的所有字节
}
catch (IOException e)
{
e.printStackTrace();
}
while(true)
{
try
{//读取过程,将数据信息保存在ListView中...
if ((bytes = is.read(buffer)) > 0)
{
byte[] data = new byte[bytes];
for (int i = 0; i < data.length; i++)
{
data[i] = buffer[i];
}
String s = new String(data);
Message msg = new Message();
msg.obj = s;
msg.what = 1; //这里的meg.what=1...表示的是服务器发送过来的数据信息..
LinkDetectedHandler.sendMessage(msg);
}
}
catch (IOException e)
{
try
{
is.close();
}
catch (IOException e1)
{
e1.printStackTrace();
}
break;
}
}
}
}
//显示数据
private Handler LinkDetectedHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
toast((String)msg.obj);
}
};
public class TToast extends Thread//如果连接成功就会显示
{
public void run()
{
Looper.prepare();
toast("连接成功");
Looper.loop();
}
}
断开连接:这个关闭的线程不全,需要继续补充
private void closeServer()
{
<span style="white-space:pre"> </span>new Thread()
{
public void run()
{
if (mServerThread != null)
{
mServerThread.interrupt();
mServerThread = null;
}
try
{
if (socket != null)
{
socket.close();
socket = null;
}
if (mServerSocket != null)
{
mServerSocket.close();
mServerSocket = null;
}
}
catch (IOException e)
{
}
}
}.start();
}