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

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

蓝牙连接分为两种情况。

一、手机与手机间通信

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

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


手机与手机间通信:

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

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

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

申明:

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

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

@Override
protected 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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值