• Android Bluetooth蓝牙开发:Bluetooth蓝牙设备之间的连接建立(3) Android Bluetooth蓝牙设备的连接编程模型和Java socket网络连接编程模型类型。Android不同设备间的蓝牙连接,首先在编程模型上分为“服务器端...
    

    Android Bluetooth蓝牙开发:Bluetooth蓝牙设备之间的连接建立(3)

    Android Bluetooth蓝牙设备的连接编程模型和Java socket网络连接编程模型类型。Android不同设备间的蓝牙连接,首先在编程模型上分为“服务器端(server)”和“客户端(client)”。

    一,Android Bluetooth蓝牙设备的“服务器端”。
    在蓝牙的服务端,类似Java网络编程中的ServerSocket,Android的蓝牙服务端叫做BluetoothServerSocket,蓝牙的BluetoothServerSocket作为服务器端,在一个线程中,绑定一个熟知的UUID(注意,此UUID是类似Java编程中的熟知端口号:80),然后等待客户端的连接请求(listenUsingRfcommWithServiceRecord),当BluetoothServerSocket接受客户端的连接请求后(accept),意味不同蓝牙设备间的数据传输连接建立,此时返回一个类似Java 网络编程的套接字,Android Bluetooth蓝牙的套接字:BluetoothSocket。
    综上,Android Bluetooth蓝牙的服务器连接阶段的编程,大体上可以简化为三个步骤:
    (a)Android Bluetooth蓝牙的BluetoothServerSocket首先需要监听:listenUsingRfcommWithServiceRecord 。注意,简单期间,可以绑定熟知的蓝牙特殊UUID:00001101-0000-1000-8000-00805F9B34FB
    (b)然后就是静静的accept等待传入的蓝牙客户端连接请求。由于是作为服务器端,极可能要接收若干客户端连接,所以一般在while循环里面accept。蓝牙accept类似Java的accept。
    (c)accept阻塞的等待传入的客户端连接请求,直到一个蓝牙连接请求传入,然后返回一个BluetoothSocket。此BluetoothSocket类似Java的socket。
    (a)(b)(c)三阶段的伪代码核心摘要:

    BluetoothServerSocket serverSocket;

    serverSocket=mBluetoothAdapter.listenUsingRfcommWithServiceRecord(tag, UUID);

       while (true) {
         BluetoothSocket socket = serverSocket.accept();
         if (socket.isConnected()) {
          Log.d(tag, "已建立与客户连接.");
         }
       }
      

    由于服务器端代码是在阻塞性的等待、接受客户端连接,所以需要把服务接收客户连接的代码放入单独的线程中处理。

    完整的服务器端代码:

    package zhangphil.bluetooth;
    
    import java.util.UUID;
    
    import android.app.ListActivity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothServerSocket;
    import android.bluetooth.BluetoothSocket;
    import android.os.Bundle;
    import android.util.Log;
    
    public class MainActivity extends ListActivity {
    
    	private BluetoothAdapter mBluetoothAdapter;
    
    	private final String tag = "zhangphil";
    	private final String MY_UUID = "00001101-0000-1000-8000-00805F9B34FB";
    
    	private class ServerThread extends Thread {
    
    		private BluetoothServerSocket serverSocket;
    
    		@Override
    		public void run() {
    
    			try {
    				serverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(tag, UUID.fromString(MY_UUID));
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    
    			Log.d(tag, "等待客户连接...");
    			while (true) {
    				try {
    					BluetoothSocket socket = serverSocket.accept();
    					
    					BluetoothDevice device = socket.getRemoteDevice();
    					Log.d(tag, "接受客户连接 , 远端设备名字:" + device.getName() + " , 远端设备地址:" + device.getAddress());
    
    					if (socket.isConnected()) {
    						Log.d(tag, "已建立与客户连接.");
    					}
    
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    
    		mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    		if (mBluetoothAdapter != null)
    			new Thread(new ServerThread()).start();
    	}
    }
    


    二,Android Bluetooth蓝牙的“客户端”。

    Android Bluetooth蓝牙“客户端”发起对服务器端的连接,首先要获得服务器蓝牙设备BluetoothDevice,该BluetoothDevice代表着服务器端的蓝牙设备,所以客户端可以先启动蓝牙扫描,扫描获得目标蓝牙设备BluetoothDevice,然后通过BluetoothDevice的createRfcommSocketToServiceRecord( UUID )返回BluetoothSocket,调用BluetoothSocket的连接方法connect,connect就是对蓝牙服务器的连接,当connect正常返回后,也就意味着两个点到点的不同蓝牙设备数据传输连接建立了。
    Android Bluetooth蓝牙的“客户端”对“服务器端”的连接请求建立,大体上可以简化为三个过程:
    (a)首先要获得蓝牙“服务器端”的BluetoothDevice,至于如何获得服务器蓝牙设备BluetoothDevice,可以是附录文章1那样的扫描获得,也可以是附录文章2中的配对获得。
    (b)得到蓝牙服务器端的BluetoothDevice后,调用createRfcommSocketToServiceRecord,这个过程可以简单的理解为创建一个类似Java的socket套接字对象一样,为后续的网络建立建立做准备。简单期间,此处也绑定一个蓝牙连接的熟知UUID:00001101-0000-1000-8000-00805F9B34FB
    (c)接下来就是重点的connect。connect也是阻塞性质的蓝牙连接,直到和蓝牙服务器端设备的连接建立为止(如果发生连接异常则将跳出)。
    (a)(b)(c)三阶段的伪代码核心摘要:


    BluetoothDevice device;

    BluetoothSocket socket;

    socket = device.createRfcommSocketToServiceRecord(UUID);

    socket.connect();
        

    完整的Android Bluetooth蓝牙客户端代码:

    package zhangphil.client;
    
    import java.util.UUID;
    
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.util.Log;
    
    public class MainActivity extends Activity {
    
    	private BluetoothAdapter mBluetoothAdapter;
    
    	private final String tag = "zhangphil";
    	private final String MY_UUID = "00001101-0000-1000-8000-00805F9B34FB";
    
    	// 广播接收发现蓝牙设备
    	private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    
    		@Override
    		public void onReceive(Context context, Intent intent) {
    			String action = intent.getAction();
    			if (BluetoothDevice.ACTION_FOUND.equals(action)) {
    
    				BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    
    				String name = device.getName();
    				if (name != null)
    					Log.d(tag, "发现设备:" + name);
    
    				if (name != null && name.equals("phil-pad")) {
    					Log.d(tag, "发现目标设备,开始线程连接!");
    
    					// 蓝牙搜索是非常消耗系统资源开销的过程,一旦发现了目标感兴趣的设备,可以考虑关闭扫描。
    					mBluetoothAdapter.cancelDiscovery();
    
    					new Thread(new ClientThread(device)).start();
    				}
    			}
    		}
    	};
    
    	private class ClientThread extends Thread {
    
    		private BluetoothDevice device;
    
    		public ClientThread(BluetoothDevice device) {
    			this.device = device;
    		}
    
    		@Override
    		public void run() {
    
    			BluetoothSocket socket = null;
    
    			try {
    				socket = device.createRfcommSocketToServiceRecord(UUID.fromString(MY_UUID));
    
    				Log.d(tag, "连接服务端...");
    				socket.connect();
    				Log.d(tag, "连接建立.");
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    
    		mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    
    		// 注册广播接收器。接收蓝牙发现讯息
    		IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    		registerReceiver(mReceiver, filter);
    
    		if (mBluetoothAdapter.startDiscovery()) {
    			Log.d(tag, "启动蓝牙扫描设备...");
    		}
    	}
    
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		unregisterReceiver(mReceiver);
    	}
    }


    三,Android Bluetooth蓝牙设备服务器端与客户端连接的过程。
    (a)首先要准备两个不同的Android设备,当然,这两个Android设备必须都有蓝牙。然后将服务器端安装在一个Android设备上,客户端则安装在另外一个不同的Android设备上。
    (b)注意设备的名字,在我写的这个Android Bluetooth蓝牙连接的例子中,根据服务器端蓝牙设备的名字进行过滤和匹配。我把服务器端的蓝牙设备名字设置成:phil-pad。在不同的蓝牙设备作为服务器端时候这个名字不同,必须做出相应的调整,否则匹配不到,将无法连接。
    (c)最好先运行服务器端代码,然后再启动客户端代码。代码为了更简洁的说明Android Bluetooth蓝牙连接功能,未做繁复的异常检测。启动代码前,请务必打开蓝牙。最好将两台设备进行配对好。


    蓝牙权限:

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


    附录文章:

    1,《Android Bluetooth蓝牙开发:发现Bluetooth蓝牙设备(1)》链接地址:http://blog.csdn.net/zhangphil/article/details/50524809
    2,《Android Bluetooth蓝牙开发:Bluetooth蓝牙设备配对Paired Bluetooth Devices(2)》链接地址:http://blog.csdn.net/zhangphil/article/details/50537796
    3,Android Bluetooth蓝牙开发Google官方文档链接地址:http://developer.android.com/intl/zh-cn/guide/topics/connectivity/bluetooth.html

    展开全文
  • android ble4.0绑定 2018-04-14 23:43:52
    蓝牙BLE4.0绑定 蓝牙绑定其实网上的方法都是大同小异的,都是用的反射的方法去绑定蓝牙设备,在API19以后,ble配对其实已经可以不用反射配对,直接bleDevice对象去用createBond,然后再在配对广播里面使用ble...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 在应用开发中有时会碰到操作蓝牙设备的需求,这时就需要获取手机已连接的蓝牙设备,其中"已连接"是广泛含义,其实蓝牙设备分为可链接设备(比如:蓝牙音箱 蓝牙耳机) 和可绑定设备(比如:手机 蓝牙自拍杆 蓝牙手表 ...
  • 蓝牙设备绑定与查找 2020-07-05 23:30:45
    本代码是用于蓝牙设备的查找与绑定,代码亲测有效,比较完整
  • Android连接经典蓝牙 2017-11-01 15:29:54
    公司的项目最近需要用到蓝牙开发的相关内容,因此特地查阅了Google官方文档的内容并进行二次整理,希望能对需要学习该部分的朋友有所帮助。 原文地址:...
  • 蓝牙配对绑定原理不再赘述了,终端的实现可以参照文章后的参考链接,本处主要记录总结下Android端的配对绑定实现过程。 1、动态注册系统广播,接收蓝牙配对请求 intentFilter = new IntentFilter(); intentFilter...
  • Android蓝牙开发前,首先要区分是经典蓝牙开发还是BLE(低功耗)蓝牙开发,它们的开发是有区别的,如果还分不清经典蓝牙和BLE(低功耗)蓝牙的小伙伴,可以先看Android蓝牙开发—经典蓝牙和BLE(低功耗)蓝牙的区别 ...
  • 经过一段时间的折腾,我的Android Studio终于可以正常工作了,期间遇到的坑记录在了文章《创建Android Studio 3.5第一个工程遇到的坑》。 我们在《Android蓝牙开发系列文章-策划篇》中对蓝牙专题的内容进行了大概的...
  • Android8.0 蓝牙系统 2018-11-28 20:39:45
    借助蓝牙Android 设备可以创建个人区域网络,以便通过附近的蓝牙设备发送和接收数据,在 Android 4.3 及更高版本中,Android 蓝牙堆栈可提供实现蓝牙低功耗 (BLE) 的功能。要充分利用 BLE API,请遵循 Android ...
  • Android实现蓝牙耳机连接 2018-09-16 11:52:11
    讲讲android对于蓝牙耳机连接技术的实现 今天涉及的内容有: 1. 流程讲解 2. 新建广播BluetoothReceiver,用于监听处理蓝牙连接过程中各状态 3. 在MainActivity中调用 4. 注意的点 5. 项目结构图和效果图 ...
  • 绑定(配对)和连接是两个不同的过程,绑定是指两个设备发现了对方的存在,可以获取到对方的名称、地址等信息,有能力建立起连接;连接是指两个设备共享了一个RFCOMM通道,有能力进行数据互传。确认绑定上了之后,才能...
  • 最近在做蓝牙开发,刚接触时傻傻的分不清经典蓝牙和低功耗蓝牙的区别,一直用开发低功耗蓝牙的方法去连接经典蓝牙设备,最后当然是一直连接不上了。在此记录下经典蓝牙和低功耗蓝牙的区别和联系。 Android中的蓝牙 ...
  • Android BLE蓝牙开发知识总结 1.蓝牙介绍 1.1什么是蓝牙?   蓝牙( Bluetooth® ):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF...
  • Android 9.0 蓝牙配对流程 2020-06-29 18:21:34
    DeviceListPreferenceFragment是蓝牙扫描到的设备列表,点击其中一个蓝牙设备,调用onPreferenceTreeClick方法开始蓝牙的配对过程。 /packages/apps/Settings/src/...
  • Android蓝牙设备的检测 2015-10-27 17:08:24
    Android蓝牙设备的检测  最近,在项目工作中,遇到一个与蓝牙设备相关的问题,需要在特定情况下,检测手机是否有接入其他蓝牙设备。搜了很多资料,都不满足我的功能要求。最后,还是在Android developer官网上...
  • Android 经典蓝牙开发 2020-04-24 19:07:51
    相信通过这三个步骤,您会很快上手一个 Android 经典蓝牙开发的 App。 蓝牙规范简介 蓝牙是一种无线技术标准,用来让固定与移动设备,在短距离间交换数据,以形成个人局域网(PAN)。其使用短波特高频(UHF)无线...
  • Android手机连接蓝牙设备后,不能通过搜索再次搜到,网上各种方法试了均无效,反射机制也用了没啥用,哪位大神可以帮忙
  • 【周记-Android移动端开发】手机蓝牙与下位机HC-05蓝牙模块通信系统 很久没有写博客了,计划一直都有,但总是被这样或者那样的事情给耽搁了,在此写下文字监督自己:不论长短,每周至少一篇!本文根据自己的实践...
  • Android蓝牙完全学习手册 2016-05-17 11:33:46
    1.前言市面上关于Android的技术书籍很多,几乎每本书也都会涉及到蓝牙开发,但均是上层应用级别的,而且篇幅也普遍短小。对于手机行业的开发者,要进行蓝牙模块的维护,就必须从Android系统底层,至少框架层开始,...
1 2 3 4 5 ... 20
收藏数 6,632
精华内容 2,652