zoukankan      html  css  js  c++  java
  • Android蓝牙开发

    Android蓝牙开发

    近期做蓝牙小车,须要Android端来控制小车的运动。以此文记录开发过程。

    使用HC-06无线蓝牙串口透传模块。对于其它的蓝牙设备本文相同适用。


    蓝牙开发的流程:

    获取本地蓝牙适配器    ——>     打开蓝牙    ——>    搜索设备  ——>   连接设备  ——>   发送信息

    首先为了避免以往我们先写入蓝牙权限:

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

    要用到的蓝牙对象:

    private BluetoothAdapter adapter = null;//用于获取蓝牙适配器
    private BluetoothDevice mBtDevice = null;//用于获取蓝牙设备
    private BluetoothSocket mBtSocket = null;//用于建立通信


    获取蓝牙适配器:


    adapter = BluetoothAdapter.getDefaultAdapter();


    打开蓝牙:

    boolean enabled = adapter.enable();
    if(!enabled){
            adapter.enable();
    }

    搜索设备:


    adapter.startDiscovery();


    搜索到的设备会以广播的形式返回,所以我们须要定义一个广播接收器:

    private BroadcastReceiver blueRevever = new BroadcastReceiver(){
    
    			@Override
    			public void onReceive(Context context, Intent intent) {
    				// TODO Auto-generated method stub
    				String action = intent.getAction();
    				if(action.equals(BluetoothDevice.ACTION_FOUND)){
    					BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    					if(device.getBondState()!=BluetoothDevice.BOND_BONDED){
    						//获取未配对的设备名称和MAC地址
    						//依据搜索到的蓝牙设备的MAC地址,得到该设备
    						mBtDevice = adapter.getRemoteDevice(device.getAddress());  
    						//假设设备名称是指定的设备则给出提示
    						if(device.getName().equals("HC-06")){
    							Toast.makeText(MainActivity.this,device.getName(),Toast.LENGTH_LONG).show();
    						}
    					}
    					else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
    
    						Toast.makeText(MainActivity.this,"检測完成",Toast.LENGTH_LONG).show();
    					}
    				}}};

    广播返回不同设备及其所处的状态。getAction()方法用于获取状态,BOND_BONDED表示是已经配对的状态。(注意配对和连接是两个全然不同的概念,配对成功并非连接成功,只配对成功不可以发送信息)

    当然是用广播机制要注意注冊广播:
     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    
    	    registerReceiver(blueRevever, filter);
    
    	    filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    
    	    registerReceiver(blueRevever, filter);


    连接设备:


    由于堵塞连接会堵塞线程,所以我们须要重开一个新的线程用于建立连接:


    private class clientThread extends Thread{
      		public void run(){
      			try {
      				//取消搜索设备的动作。否则接下来的设备连接会失败
      				adapter.cancelDiscovery();
      				//依据device获取socket
      				mBtSocket = mBtDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
      				//连接socket
      				mBtSocket.connect();
      			} catch (IOException e) {
      				// TODO Auto-generated catch block
      				e.printStackTrace();
      				Toast.makeText(MainActivity.this,"连接失败!。。!

    !!!",Toast.LENGTH_LONG).show(); } } }


    此处的UUID用于连接HC-06是可行的。其它的设备未測试
    想使用时仅仅需创建一个clientThread对象,然后运行其run()方法就可以,例如以下:

    //创建连接的进程
    Thread mBtClientConnectThread = new clientThread();  
    //开启进程
    mBtClientConnectThread.start();  

    发送信息:


    public void sendMessageHandle(String msg)   
      	    {         
      	        if (mBtSocket == null)    
      	        {  
      	        	Toast.makeText(MainActivity.this,"没有连接!。",Toast.LENGTH_LONG).show();
      	                return;  
      	        }  
      	          
      	        try {  
      	            OutputStream os = mBtSocket.getOutputStream();   
      	            os.write(msg.getBytes()); //发送出去的值为:msg  
      	            Toast.makeText(MainActivity.this,"发送成功!

    ",Toast.LENGTH_LONG).show(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(MainActivity.this,"发送失败!

    !!

    。!!

    !!!

    ",Toast.LENGTH_LONG).show(); } }







    此处的UUID用于连接HC-06是可行的,其它的设备未測试
  • 相关阅读:
    Cleve Moler MATLAB 创始人金秋10月中国大学校园行
    [原]ASP.NET中使用JQUERYEASYUI后,解决ClientScript.RegisterStartupScript 所注册脚本执行两次
    [原]ASP.NET中使用后端代码注册脚本 生成JQUERYEASYUI 的界面错位
    [原]jqueryeasyui 关闭tab如何自动切换到前一个tab
    [原创]C# 实例Oracle 备份,带进度提示
    停止Oracle 服务开机自动重启
    最新县及县以上行政区划代码(截止2009年12月31日)
    单元测试学习:无返回值,触发委托
    [笔记]GetRequestStream()超时问题(出现假死,卡住)
    asp.net 页面 css中图片不存在引发的异常
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6782846.html
Copyright © 2011-2022 走看看