android蓝牙开发————实现服务端客户端通信

来源:互联网 发布:java语言的四个特点 编辑:程序博客网 时间:2024/06/05 20:17

蓝牙开发——客户端服务端通信
(本文demo下载地址:http://download.csdn.net/detail/gywuhengy/9816902)
一.新建一个工程作为服务端,里面大致要实现的功能有这几个:
(1)权限 android.permission.BLUETOOTH
(2)蓝牙适配器 BluetoothAdapter
(3)输入输出流
(4)客户端,服务端Socket

 // 蓝牙服务端socketprivate BluetoothServerSocket mServerSocket;// 蓝牙客户端socketprivate BluetoothSocket mSocket;

(5)两个线程类

// 线程类private ServerThread mServerThread;private ReadThread mReadThread;

(6)服务端线程代码

// 开启服务器private class ServerThread extends Thread {    public void run() {        try {            // 创建一个蓝牙服务器 参数分别:服务器名称、UUID            mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,                    UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));            Message msg = new Message();            msg.obj = "请稍候,正在等待客户端的连接...";            msg.what = STATUS_CONNECTING;            mHandler.sendMessage(msg);            //服务端接受            mSocket = mServerSocket.accept();            msg = new Message();            msg.obj = "客户端已经连接上!可以发送指令。";            msg.what = STATUS_CONNECT;            mHandler.sendMessage(msg);            // 启动接受数据            mReadThread = new ReadThread();            mReadThread.start();        } catch (IOException e) {            e.printStackTrace();        }    }}

(7)读写线程主要代码

 /** * 读取数据 */private class ReadThread extends Thread {    public void run() {        byte[] buffer = new byte[1024];        int bytes;        InputStream is = null;        try {            is = mSocket.getInputStream();            while (true) {                if ((bytes = is.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 = STATUS_ACCEPT;                    mHandler.sendMessage(msg);                    //同样  子线程不能刷新UI                    //tv_accept.setText(s);                }            }        } catch (IOException e1) {            e1.printStackTrace();        } finally {            try {                is.close();            } catch (IOException e1) {                e1.printStackTrace();            }        }    }}

(8)Handler消息处理

/** * 信息处理 */private Handler mHandler = new Handler() {    @Override    public void handleMessage(Message msg) {        String info = (String) msg.obj;        switch (msg.what) {            case STATUS_CONNECT:                //吐司出 连接状态                showToast(info);                break;            case STATUS_CONNECTING:                //吐司出 连接状态                showToast(info);                break;            case STATUS_ACCEPT:                //吐司出 连接状态                tv_accept.setText(info);                break;        }    }

二.创建客户端需要的大致内容:
(1)权限
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
(2)Spinner来加载配对设备
(3)

private BluetoothAdapter mBluetoothAdapter;private BluetoothDevice mDevice;//Spinner适配器private MySpinnerAdapter mySpinnerAdapter;//线程类private ClientThread mClientThread;private ReadThread mReadThread;// 蓝牙客户端socketprivate BluetoothSocket mSocket;

(4)客户端线程

 /** * 客户端线程 */private class ClientThread extends Thread {    public void run() {        try {            mSocket = mDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));            Message msg = new Message();            msg.obj = "请稍候,正在连接服务器:" + serverAdress;            msg.what = STATUS_CONNECTING;            mHandler.sendMessage(msg);            mSocket.connect();            msg = new Message();            msg.obj = "已经连接上服务端!可以发送信息。";            msg.what = STATUS_CONNECT;            mHandler.sendMessage(msg);            //TODO 启动接受数据  服务端返回数据(暂时用途不大)            mReadThread = new ReadThread();            mReadThread.start();            //注意子线程不能刷新            //UIViewRootImpl$CalledFromWrongThreadException:            //ll_bluetooth.setVisibility(View.VISIBLE);        } catch (IOException e) {            Message msg = new Message();            msg.obj = "连接服务端异常!";            msg.what = STATUS_ERROR;            mHandler.sendMessage(msg);            showToast("失去连接");        }    }}

(5)读写线程与服务端一样这里就不再赘述。。

三、注意当运行demo时需要先开启服务端。

0 0
原创粉丝点击