蓝牙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 (迅雷下载)
测试时用两台手机测试,一个作为服务器端,一个作为客户端。