android设备终端与蓝牙模块(HC-06)的通讯编程思路

原创 2013年12月15日 17:08:26

蓝牙模块(HC-06):



在这个项目中,手机端作为客户端,去连接到蓝牙模块上。而接受蓝牙模块发过来的信息的时候,是没有必要再创建服务器端的,我们只要一个不断监听对方消息的循环就行。

 

注意:在socket.connect();之前,我们需要执行bluetoothadapter.canceldiscovery();,这是为了停掉搜索设备,否则连接可能会变得非常慢,并且容易失败。

 

蓝牙开发中的几个关键步骤:

1、开启手机上的蓝牙功能。

2、搜索附近存在的蓝牙设备。

3、创建蓝牙socket,由socket获取device

4、发送和读取数据。

5、清场(断开各种线程,注销广播接收器等)

 

//主线条

Adapter  ---->   device  ----->  socket

 

/* step1:取得默认的蓝牙适配器 */

private BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();

//step2:强制开启蓝牙设备

if(!mBtAdapter.isEnabled()){
mBtAdapter.enable();
}


//step3:注册广播接收器,注意:开启step4即搜索设备前,应先注册广播接收器

reg_broadcastreceiver();
 
private void reg_broadcastreceiver(){
 //Register for broadcasts when a device is discovered
        IntentFilter discoveryFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        this.registerReceiver(mReceiver, discoveryFilter);
        //System.out.println("***********" + mBtAddress);
        //Register for broadcasts when discovery has finished
        IntentFilter foundFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        this.registerReceiver(mReceiver, foundFilter);
}
 
  
    // The BroadcastReceiver that listens for discovered devices and
    // changes the title when discovery is finished
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) 
            {
                // Get the BluetoothDevice object from the Intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                
            	Log.d("BroadcastReceiver", "find device:"+device.getName()+"|"+device.getAddress());
                mBtAddress = device.getAddress();  
                                
        	 //step5:根据搜索到的蓝牙设备的MAC地址,得到该设备
        	 mBtDevice = mBtAdapter.getRemoteDevice(mBtAddress);
        	 //step6:开启客户端线程,线程里面完成了与SPP协议的连接 
        	 mBtClientConnectThread = new clientThread();
        	 mBtClientConnectThread.start();
        
        
           
            }  // When discovery is finished, change the Activity title
            else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) 
            {
               setTitle("搜索完成");
               
               Log.d("BroadcastReceiver", "find over");
            }
          
           
        }
    };
 


//step4: 开始搜索附近可以存在的蓝牙设备,之后系统会发送广播给广播接收器

mBtAdapter.startDiscovery();


//附加客户端线程 代码

 //客户端线程 
	private class clientThread extends Thread{
		public void run(){
			Log.d("mBtSocket", "start-->"+mBtSocket);
			try {
//step7,取消搜索设备的动作,否则接下来的设备连接会失败
				mBtAdapter.cancelDiscovery();
//step8,根据device获取socket
				mBtSocket = mBtDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
//step9,连接socket
				mBtSocket.connect();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				Log.e("connect", "", e);
				Log.d("clientThread", "连接失败");
				
			}
			Log.d("mBtSocket", "end-->"+mBtSocket);
		}
	}



//step10,发送数据.

sendMessageHandle(“要发送的数据”);

//step10, 读取数据

(由于接收数据的线程已经打开,所以当有数据到来时,数据就自动赋给变量S了,而此时S就是我们读取的数据 )


//step11,清场(清场动作放在ondestroy里面)

@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		
		//关闭客户端进程,取消广播接收器
    	shutdownClient();
        // Unregister broadcast listeners
        this.unregisterReceiver(mReceiver);
        //关闭读线程 
		if(mReadThread != null)
		{
			mReadThread.interrupt();
			mReadThread = null;
		}				
	}


/* 停止客户端连接 */
	private void shutdownClient() {
		new Thread() {
			public void run() {
				if(mBtClientConnectThread!=null)
				{
					mBtClientConnectThread.interrupt();
					mBtClientConnectThread= null;
				}
				if (mBtSocket != null) {
					try {
						mBtSocket.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					mBtSocket = null;
				}
			};
		}.start();
	}



	//发送数据
	public static void sendMessageHandle(String msg) 
	{		
		if (mBtSocket == null)  
		{
			Log.d("----------------------", "没有连接");
			return;
		}
		
		try {
			OutputStream os = mBtSocket.getOutputStream(); 
			os.write(msg.getBytes()); //发送出去的值为:msg
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}			
	}




附:发送数据和读取数据的代码
//发送数据
	public static void sendMessageHandle(String msg) 
	{		
		if (mBtSocket == null)  
		{
			Log.d("----------------------", "没有连接");
			return;
		}
		
		try {
			OutputStream os = mBtSocket.getOutputStream(); 
			os.write(msg.getBytes()); //发送出去的值为:msg
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}			
	}
	
	//读取数据
    private static class readThread extends Thread { 
        public void run() {
        	
            byte[] buffer = new byte[1024];
            int bytes;
            InputStream mmInStream = null;
            
			try {
				mmInStream = mBtSocket.getInputStream();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}	
            while (true) {
                try {
                    // Read from the InputStream
                    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);//接收的值inputstream 为 s
						
						if(s.equalsIgnoreCase("o")){ //o表示opend!
							isClosed = false;
						}
						else if(s.equalsIgnoreCase("c")){  //c表示closed!
							isClosed = true;						
						}
						
						
                    }
                } catch (IOException e) {
                	try {
						mmInStream.close();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
                    break;
                }
            }
        }
    }


Android通过蓝牙HC06与Arduino通信实例

本文基于《Android创建Service后台常驻服务并使用Broadcast通信》扩展蓝牙通信的功能,使用手机作为Client,HC06芯片作Service进行通信。 1)手动打开手机的蓝牙开关,打...
  • stayneckwind2
  • stayneckwind2
  • 2015年05月04日 23:23
  • 5199

android6.0手机蓝牙与ble蓝牙模块通信

好久没有写博客了,因为最近一直在家浪,今天就来记录一下这几天来学校学到的东西(其实在本科就已经开始靴子了,只是还没完全弄明白),以便以后忘了回来看看,也希望对搜索并阅读本文章的朋友有所帮助。 本科毕...
  • Y_15751004297
  • Y_15751004297
  • 2017年08月01日 21:41
  • 806

HC-06蓝牙模块设置和使用方法

HC-06的设置方法 1.给蓝牙上电          给HC-06上电之后,HC-06的指示灯会不停地闪烁,这个时候就标志着进入AT模式了   2.有线串口连接          这时,可...
  • uyy203
  • uyy203
  • 2016年02月03日 05:20
  • 19391

HC-06的设置方法

我在做蓝牙这一块的时候,很快地就实现了蓝牙与单片机的通信,但做到后面的时候,发现蓝牙传输数据太慢了。Hc-06的默认波特率是9600,这实在太慢,为了不影响与电脑的配对通信,又要有很快地传输速率,我需...
  • TXF1984
  • TXF1984
  • 2015年06月18日 21:13
  • 2159

[Arduino]HC-06蓝牙模块使用小结

简介蓝牙,顾名思义,蓝色的牙齿,并不能用来咬人,而是一种无线数据传输标准。 HC-05和HC-06是现在使用较多的两种蓝牙模块。两者之间的区别是HC-05是主从一体机,既能向自己的’主子’打小报告,...
  • mtobeiyf
  • mtobeiyf
  • 2016年08月02日 18:50
  • 9650

蓝牙模块(HC-06,BT-06)与 电脑通信

Hc-06,BT-06 都是在淘宝常见的蓝牙模块,
  • sjyhehe
  • sjyhehe
  • 2014年09月30日 22:17
  • 5903

HC-05无底板蓝牙模块连接51单片机,配置,安卓连接传输数据测试程序

使用无底板的HC-05蓝牙模块,包括连线,通过SSCOM32进行配置,编写安卓端的程序实现和蓝牙模块的通信,数据传输...
  • T_NULL
  • T_NULL
  • 2017年05月05日 09:49
  • 1850

STC89C52单片机通过HC-06蓝牙模块与Android手机通信

STC89C52单片机通过HC-06蓝牙模块与Android手机通信
  • itas109
  • itas109
  • 2013年05月23日 09:02
  • 18125

android设备终端与蓝牙模块(HC-06)的通讯编程思路

蓝牙模块(HC-06): 在这个项目中,手机端作为客户端,去连接到蓝牙模块上。而接受蓝牙模块发过来的信息的时候,是没有必要再创建服务器端的,我们只要一个不断监听对方消息的循环就行...
  • u012556077
  • u012556077
  • 2015年12月12日 15:02
  • 995

Android通过蓝牙HC06与Arduino通信实例

本文基于《Android创建Service后台常驻服务并使用Broadcast通信》扩展蓝牙通信的功能,使用手机作为Client,HC06芯片作Service进行通信。 1)手动打开手机的蓝牙开关,打...
  • stayneckwind2
  • stayneckwind2
  • 2015年05月04日 23:23
  • 5199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android设备终端与蓝牙模块(HC-06)的通讯编程思路
举报原因:
原因补充:

(最多只允许输入30个字)