android:手机之间蓝牙通信(四)

来源:互联网 发布:dapaolu域名更换 编辑:程序博客网 时间:2024/05/21 09:34

功能:蓝牙设备通信连接。

蓝牙连接分为两种情况。

一、手机与手机间通信

二、手机与蓝牙模块通信。

注意:蓝牙通信使用了多线程,必须掌握线程的创建使用才能使用蓝牙进行通信。


手机与手机间通信:

手机间蓝牙通信使用客户端和服务端。

客户端:搜索设备找到服务端,和服务端配对,连接服务端。

服务端:等待客户端与其配对并来连接。(配对和连接由同一端发起)

申明:

private BluetoothSocket btSocket;    // 客户端socketprivate BluetoothServerSocket mServerSocket; private ReadThread mReadThread;              // 服务端获取客户端传输的数据private ReadThread2 mReadThread2;// 客户端获取服务器传输的数据private ClientThread mClientThread; // 客户端运行线程private ServerThread mServerThread; // 服务端线程private BluetoothDevice device1;private BluetoothSocket socket;     // 服务器socketprivate 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();

服务端线程在程序运行时就启动了

@Overrideprotected 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();}



0 0
原创粉丝点击