Android蓝牙通信

这里使用的是RFCOMM协议,RFCOMM是一个简单的串行线性仿真协议,此协议提供RS232控制和状态信号。

也就是一个串口(COM)传输协议,波特率为9600,8位数据。所以手机蓝牙可以与另外的蓝牙设备进行通信。

两个设备进行通信,需要建立一个服务端和一个服务端,客户端连接上服务端之后,就可以收发数据。

源代码下载地址:http://download.csdn.net/detail/menghnhhuan/3901081

 

[html]  view plain copy print ?
  1. /* 一些常量,代表服务器的名称 */  
  2.     public static final String PROTOCOL_SCHEME_L2CAP = "btl2cap";  
  3.     public static final String PROTOCOL_SCHEME_RFCOMM = "btspp";  
  4.     public static final String PROTOCOL_SCHEME_BT_OBEX = "btgoep";  
  5.     public static final String PROTOCOL_SCHEME_TCP_OBEX = "tcpobex";  
  6.       
  7.     private BluetoothServerSocket mserverSocket = null;  
  8.     private ServerThread startServerThread = null;//开启服务线程  
  9.     private clientThread clientConnectThread = null;//客户端连接线程  
  10.     private BluetoothSocket socket = null;  
  11.     private BluetoothDevice device = null;  
  12.     private readThread mreadThread = null;//读取数据线程    
  13.     private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//蓝牙适配器  

 

开启服务端代码

[html]  view plain copy print ?
  1. startServerThread = new ServerThread();  
  2. startServerThread.start();  


开启客户端

[html]  view plain copy print ?
  1. device = mBluetoothAdapter.getRemoteDevice(address);      
  2. clientConnectThread = new clientThread();  
  3. clientConnectThread.start();  


服务端代码

[html]  view plain copy print ?
  1. //开启服务器  
  2. private class ServerThread extends Thread {   
  3.     public void run() {                   
  4.         try {  
  5.             /* 创建一个蓝牙服务器   
  6.              * 参数分别:服务器名称、UUID   */   
  7.             mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,  
  8.                     UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));     
  9.             Log.d("server", "wait cilent connect...");  
  10.               
  11.             /* 接受客户端的连接请求 */  
  12.             socket = mserverSocket.accept();  
  13.             Log.d("server", "accept success !");  
  14.               
  15.             //启动接受数据  
  16.             mreadThread = new readThread();  
  17.             mreadThread.start();  
  18.         } catch (IOException e) {  
  19.             // TODO Auto-generated catch block  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  
  23. };  


客户端代码:

[html]  view plain copy print ?
  1. //开启客户端  
  2. private class clientThread extends Thread {           
  3.     public void run() {  
  4.         try {  
  5.             //创建一个Socket连接:只需要服务器在注册时的UUID号  
  6.             // socket = device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID);  
  7.             socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));  
  8.             //连接                  
  9.             socket.connect();  
  10.             //启动接受数据  
  11.             mreadThread = new readThread();  
  12.             mreadThread.start();  
  13.         }   
  14.         catch (IOException e)   
  15.         {  
  16.             Log.e("connect", "", e);  
  17.             Message msg = new Message();  
  18.             msg.obj = "连接服务端异常!断开连接重新试一试。";  
  19.             msg.what = 0;  
  20.             LinkDetectedHandler.sendMessage(msg);  
  21.         }   
  22.     }  
  23. };  

发送和接收数据代码

[html]  view plain copy print ?
  1. //发送数据  
  2. private void sendMessageHandle(String msg)   
  3. {         
  4.     if (socket == null)   
  5.     {  
  6.         Toast.makeText(mContext, "没有连接", Toast.LENGTH_SHORT).show();  
  7.         return;  
  8.     }  
  9.     try {                 
  10.         OutputStream os = socket.getOutputStream();   
  11.         os.write(msg.getBytes());  
  12.     } catch (IOException e) {  
  13.         // TODO Auto-generated catch block  
  14.         e.printStackTrace();  
  15.     }             
  16. }  
  17. //读取数据  
  18.    private class readThread extends Thread {   
  19.        public void run() {  
  20.           
  21.            byte[] buffer = new byte[1024];  
  22.            int bytes;  
  23.            InputStream mmInStream = null;  
  24.              
  25.         try {  
  26.             mmInStream = socket.getInputStream();  
  27.         } catch (IOException e1) {  
  28.             // TODO Auto-generated catch block  
  29.             e1.printStackTrace();  
  30.         }     
  31.            while (true) {  
  32.                try {  
  33.                    // Read from the InputStream  
  34.                    if( (bytes = mmInStream.read(buffer)) > 0 )  
  35.                    {  
  36.                     byte[] buf_data = new byte[bytes];  
  37.                     for(int i=0; i<bytes; i++)  
  38.                     {  
  39.                         buf_data[i] = buffer[i];  
  40.                     }  
  41.                     String s = new String(buf_data);  
  42.                     Message msg = new Message();  
  43.                     msg.obj = s;  
  44.                     msg.what = 1;  
  45.                     LinkDetectedHandler.sendMessage(msg);  
  46.                    }  
  47.                } catch (IOException e) {  
  48.                 try {  
  49.                     mmInStream.close();  
  50.                 } catch (IOException e1) {  
  51.                     // TODO Auto-generated catch block  
  52.                     e1.printStackTrace();  
  53.                 }  
  54.                    break;  
  55.                }  
  56.            }  
  57.        }  
  58.    }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值