黑马程序员:Android蓝牙高级操作(多连接)

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

最近一直在做与bluetooth相关的应用。主要涉及android手机蓝牙的多连接问题。网上几乎没有与蓝牙多连接相关的具体实现资料,所以我开始从android的官方文档入手,大半夜的一个人坐下面看那英文文档,真TMD不是滋味,现在回想下当年做的英语阅读理解真似一坨shit。不过功夫不负有心人,终于搞清楚了它的构架和通信模式。这里我先讲bluetooth的基本操作,然后再深入讲解它的多连接问题(大家期待的重头戏)。注意:我这里主要讲的是多连接的核心实现,至于蓝牙的一些基础操作,我只是简单的介绍。如果有不懂的可以参考其他资料。我也做了一个测试Demo,里面的代码基本参考的官方文档,若有疑问可以去官网上看看。我试过一次可以连接三个手机。当然这不一定是极限数据,因为设备有限。有条件的朋友可以修改下代码,做下压力测试。

Demo代码下载:

官方文档:

参考博客:

流程:

(1)蓝牙的介绍,相关API使用说明,使用蓝牙的准备工作。

(2)蓝牙的开启和关闭。

(3)设置设备可被搜索。

(4)搜索设备及广播接收器的注册。

(5)蓝牙的配对。

(6)蓝牙的连接服务端和客户端

(7)蓝牙的多连接操作。

讲解:

(1)蓝牙的介绍,相关API使用说明,使用蓝牙的准备工作。

蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术。理论上一个蓝牙设备可以连接7个蓝牙设备(我没试过,只是理论上)。首先可行性是没问题的。其他蓝牙信息我就不阐述了,大家问度娘吧!在android app上使用bluetooth时需在AndroidManifest.xml中加上权限:

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

我简单说下相关的API类,和常用的方法。

BluetoothAdapter:顾名思义,蓝牙适配器,蓝牙的打开、关闭、搜索都和它有关BluetoothAdapter.getDefaultAdapter()获取。

BluetoothDevice:看名字就知道,这个类是描述一个蓝牙设备,从它可以获取蓝牙的地址和设备名getAddress(),getName()。并且蓝牙设备有三种状态、、分别是已绑定,绑定中、未绑定。

BluetoothServerSocket:这是服务端,通过accept()返回BluetoothSocket。既然是Socket相信大家都再熟悉不过了吧!如果你不太清楚socket编程,那就先去看java基础吧!这里我也不能偏题。

BluetoothSocket:这是客户端,connect()与服务端进行连接。通过它回去输入输出流。

(2)蓝牙的开启和关闭。

打开蓝牙:

private void startBluetooth() {if (mBluetoothAdapter == null) {// 表明此手机不支持蓝牙Log.d(TAG, "device is not supported bluebooth");return;}if (!mBluetoothAdapter.isEnabled()) { // 蓝牙未开启,则开启蓝牙mBluetoothAdapter.enable();}}关闭蓝牙:if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {mBluetoothAdapter.disable();}(3)设置设备可被搜索。// 使本机蓝牙在300秒内可被搜索private void ensureDiscoverable() {if (mBluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);//设置被发现时间startActivity(discoverableIntent);}}(4)搜索设备及广播接收器的注册。

记得在onCreate()中注册,在onDestory()中unregisterReceiver(searchDevices);这是android广播机制的基础,不懂的可以回去看看android广播基础了。

private void register2Broadcast() {IntentFilter intent = new IntentFilter();intent.addAction(BluetoothDevice.ACTION_FOUND);// 用BroadcastReceiver来取得搜索结果intent.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);registerReceiver(searchDevices, intent);}private BroadcastReceiver searchDevices = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubString action = intent.getAction();if (BluetoothDevice.ACTION_FOUND.equals(action)) {BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);//addDevice2List(device); 获取BluetoothDevice后剩下的自己处理了}}};(5)蓝牙的配对。

这里我们用到的是java的反射机制。

private void paireDevice(BluetoothDevice device) {try {Method createBondMethod = BluetoothDevice.class.getMethod("createBond");createBondMethod.invoke(device);} catch (Exception e) {// TODO: handle exceptione.getStackTrace();}}(6)蓝牙的连接服务端和客户端总结成功的经验能够让人越来越聪明,

黑马程序员:Android蓝牙高级操作(多连接)

相关文章:

你感兴趣的文章:

标签云: