博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Bluetooth蓝牙开发:Bluetooth蓝牙设备之间的连接建立(3)
阅读量:6458 次
发布时间:2019-06-23

本文共 6229 字,大约阅读时间需要 20 分钟。



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蓝牙连接功能,未做繁复的异常检测。启动代码前,请务必打开蓝牙。最好将两台设备进行配对好。

蓝牙权限:

附录文章:

1,《Android Bluetooth蓝牙开发:发现Bluetooth蓝牙设备(1)》链接地址:

2,《Android Bluetooth蓝牙开发:Bluetooth蓝牙设备配对Paired Bluetooth Devices(2)》链接地址:
3,Android Bluetooth蓝牙开发Google官方文档链接地址:

转载地址:http://pqizo.baihongyu.com/

你可能感兴趣的文章
创建一个多级文件目录
查看>>
Picasa生成图片幻灯片页面图文教程
查看>>
js获取当前时间的前一天/后一天
查看>>
[洛谷P3978][TJOI2015]概率论
查看>>
Python学习——编程语言介绍
查看>>
Python字符串的格式化
查看>>
C#反射---属性
查看>>
服务器常用的状态码及其对应的含义如下
查看>>
完美字符串
查看>>
zoom和transform:scale的区别
查看>>
邬建国教授受聘为浙江大学光彪教授
查看>>
过来人谈在美国大学里的中国研究生
查看>>
WCF核心技术
查看>>
R语言编程艺术
查看>>
SQL的bit列名转换成access是/否数据类型,True无效的问题
查看>>
技术普及帖:你刚才在淘宝上买了一件东西
查看>>
幸福框架:可扩展的、动态的、万能的 编号生成器
查看>>
黄聪:PHP 防护XSS,SQL,代码执行,文件包含等多种高危漏洞
查看>>
svn status 显示 ~xx
查看>>
常用HiveQL总结
查看>>