蓝牙传输项目(蓝牙socket通信)

时间:2024-02-24 12:18:00

蓝牙socket通信,参考了

http://blog.csdn.net/lovoo/article/details/51576246

的博客,了解到进行通信的几个重要步骤:

1)首先开启蓝牙

2)搜索可用设备

3)创建蓝牙socket,获取输入输出流

4)读取和写入数据

其中 开启蓝牙 和 搜索设备 不需多说,可以咯看我的博客  http://www.cnblogs.com/sovagxa/p/7620380.html   

 

创建蓝牙socket,获取输入输出流:

(1)确定一个服务器端,一个客户端。

(2)服务器端serversocket等待接收客户端的连接,若一直没有连接,则为阻塞状态,故等待连接的代码应该放在子线程中进行

(3)服务器端接受连接之后返回一个socket来管理对话,用outputstream和inputstream进行接收和发送

(4)客户端选择一个服务器(远程蓝牙设备device)用socket尝试连接,若服务器端一直没有接受连接,则为阻塞状态,故尝试连接的代码应该放在子线程中进行

(5)客户端尝试连接成功后使用该socket管理对话,用outputstream和inputstream进行接收和发送

(6)接收黛娜要一直循环检测接收,故要放在子线程中,当服务器接收连接或个护短连接成功时开始执行

 

客户端尝试连接代码:

    /**
     * 客户端,进行连接的线程
     * @author Administrator
     *
     */
    class ClientThread extends Thread{
        @Override
        public void run(){
            try {
                //创建一个socket尝试连接,UUID用正确格式的String来转换而成*
                socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
                Utils.sonUiStateMsg("正在连接,请稍后......");
                //该方法阻塞,一直尝试连接*
                socket.connect();
                Utils.sonUiStateMsg("连接成功");
                //进行接收线程
                new ReadMsg().start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Utils.sonUiStateMsg("连接失败");
                e.printStackTrace();
            }
        }
    }

 

 

 服务器端等待连接代码    

 

     /**
   * 服务端,接收连接的线程 *
@author Administrator * */ class ServiceThread extends Thread{ @Override public void run(){ try { //先用本地蓝牙适配器创建一个serversocket * serSocket= bluetoothAdapter.listenUsingRfcommWithServiceRecord(bluetoothAdapter.getName(), UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); Utils.sonUiStateMsg("正在等待连接"); if(socket!=null){Utils.sonUiStateMsg("连接成功");} //等待连接,该方法阻塞* socket=serSocket.accept(); Utils.sonUiStateMsg("连接成功");
new ReadMsg().start(); } catch (IOException e) { // TODO Auto-generated catch block // Toast.makeText(getApplicationContext(), "IOExeption", 1).show(); System.out.println("IOExeption"); Utils.sonUiStateMsg("连接失败"); e.printStackTrace(); } } }

 

 

循环接收消息代码:

    /**
     * 循环读取信息的线程
     * @author Administrator
     *
     */
    class ReadMsg extends Thread{
        @Override
        public void run(){
            byte[] buffer = new byte[1024];//定义字节数组装载信息
            int bytes;//定义长度变量
            InputStream in=null;
            try {
                //使用socket获得输入流*
                in = socket.getInputStream();
                //一直循环接收处理消息*
                while(true){
                    if((bytes=in.read(buffer))!=0){
                        byte[] buf_data = new byte[bytes];
                        for (int i = 0; i < bytes; i++){
                            buf_data[i]=buffer[i];
                        }
                        String msg=new String(buf_data);//最后得到String类型消息
                        Utils.sonUiInfoMsg(msg);
                    }
                    
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Utils.sonUiStateMsg("连接已断开");
            }finally{
                try {
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

 

 

 发送消息代码:

    /**
     * 发送消息
     * @param msg:发送的消息
     */
    public void sendMessage(String msg) {
        if(socket==null){Toast.makeText(getApplicationContext(), "未建立连接", 0).show();return;}//防止未连接就发送信息
        try {
            //使用socket获得outputstream*
            OutputStream out=socket.getOutputStream();
            out.write(msg.getBytes());//将消息字节发出
            out.flush();//确保所有数据已经被写出,否则抛出异常
            Toast.makeText(getApplicationContext(), "发送:"+msg, 0).show();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), "发送失败", 0).show();
        }
    }

 

 以上代码中注释最后*号的都是核心代码

项目下载链接 https://files.cnblogs.com/files/sovagxa/%E8%93%9D%E7%89%99%E4%BC%A0%E8%BE%93.rar  (迅雷下载)

测试时用两台手机测试,一个作为服务器端,一个作为客户端。