github地址:https://github.com/qindachang/BluetoothLE-Multi-Library

BluetoothLE-Multi-Library

一个能够连接多台蓝牙设备的库,它可以作为client端,也可以为server端。支持主机/从机,外围设备连接。
在发送消息时,它内部支持队列控制,避免因蓝牙间隔出现操作失败的情况。

开始使用

1. 主机client

扫描

BluetoothLeScannerCompat scannerCompat = BluetoothLeScannerCompat.getScanner();
ScanSettings scanSettings = new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) .setReportDelay(int reportDelayMillis) //0 or above >0 .setUseHardwareBatchingIfSupported(false) .build(); //设置过滤扫描 List<ScanFilter> filters = new ArrayList<>(); ScanFilter builder = new ScanFilter.Builder().setDeviceName(deviceName).build(); filters.add(builder); ScanFilter builder = new ScanFilter.Builder().setDeviceAddress(deviceAddress).build(); filters.add(builder); ScanFilter builder = new ScanFilter.Builder() .setServiceUuid(ParcelUuid.fromString(serviceUUID.toString())).build(); filters.add(builder); scannerCompat.startScan(filters, scanSettings, scanCallback); 

扫描回调

private ScanCallback scanCallback = new ScanCallback() {@Override public void onScanResult(final int callbackType, final ScanResult result) { } @Override public void onBatchScanResults(final List<ScanResult> results) { } @Override public void onScanFailed(final int errorCode) { } };

连接

//创建连接的一个对象,后续将使用该对象来访问操作
private BluetoothLeConnector connector = BluetoothLe.newConnector(); private BluetoothGatt mBluetoothGatt; //配置连接对象 connector.setConfig(new BluetoothConfig.Builder() .enableQueueInterval(true)//开启操作时间间隔 .setQueueIntervalTime(BluetoothConfig.AUTO)//单位ms,这里为自动 .build()); //连接蓝牙 connector.connect(true, mBluetoothDevice); connector.connect(true, mBluetoothDevice, BluetoothLeConnector.TRANSPORT_AUTO);//最后一个参数设置连接通道 //开启indicate通知 connector.enableIndication(true,UUID_SERVICE,UUID_INDICATION); //开启notify通知 connector.enableNotification(true, UUID_SERVICE, UUID_NOTIFICATION); //写数据 connector.writeCharacteristic(new byte[]{0x01, 0x02}, UUID_SERVICE, UUID_WRITE); //自定义写数据 BluetoothGattService service = mBluetoothGatt.getService(UUID_SERVICE); BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID_WRITE); characteristic.setValue(byte[] value); characteristic.setValue(int value, int formatType, int offset); characteristic.setValue(int mantissa, int exponent, int formatType, int offset); characteristic.setValue(String value); connector.writeCharacteristic(characteristic); //读数据 connector.readCharacteristic(UUID_SERVICE, UUID_READ); //断开连接 connector.disconnect(); //关闭gatt connector.close(); 

回调监听

//连接状态监听
private ConnectListener mConnectListener = new ConnectListener() { @Override public void connecting() { } @Override public void connected() { } @Override public void disconnected() { } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { } @Override public void error(ConnBleException e) { } }; connector.addConnectListener(mConnectListener);

更多的回调监听如下:

mBleManager.addConnectListener(...)
mBleManager.addNotificationListener(...)
mBleManager.addIndicationListener(...) mBleManager.addWriteCharacteristicListener(...) mBleManager.addReadCharacteristicListener(...) mBleManager.addRssiListener(...)

移除回调监听(好的程序员要懂避免内存泄漏):

connector.removeListener(mConnectListener);


2. 从机Server

广播

private GattServer mGattServer = new GattServer();mGattServer.startAdvertising(UUID.fromString("0000fff0-0000-1000-8000-00805f9b34fb"));//该uuid可提供给主机client过滤扫描 mGattServer.stopAdvertising();

伺服器server

1. 启动startServer
mGattServer.startServer(context);

2. 关闭closeServer
mGattServer.closeServer();

3. 添加服务addService
List<ServiceProfile> list = new ArrayList<>();//设置一个写的特征 ServiceProfile profile = new ServiceProfile(); profile.setCharacteristicUuid(UUID.fromString("0000fff3-0000-1000-8000-00805f9b34fb")); profile.setCharacteristicProperties(BluetoothGattCharacteristic.PROPERTY_WRITE); profile.setCharacteristicPermission(BluetoothGattCharacteristic.PERMISSION_WRITE); profile.setDescriptorUuid(GattServer.CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID); profile.setDescriptorPermission(BluetoothGattDescriptor.PERMISSION_READ); profile.setDescriptorValue(new byte[]{0}); list.add(profile); //设置一个读的特征 ServiceProfile profile1 = new ServiceProfile(); profile1.setCharacteristicUuid(UUID.fromString("0000fff2-0000-1000-8000-00805f9b34fb")); profile1.setCharacteristicProperties(BluetoothGattCharacteristic.PROPERTY_READ); profile1.setCharacteristicPermission(BluetoothGattCharacteristic.PERMISSION_READ); profile1.setDescriptorUuid(GattServer.CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID); profile1.setDescriptorPermission(BluetoothGattDescriptor.PERMISSION_READ); profile1.setDescriptorValue(new byte[]{1}); list.add(profile1); //设置一个notify通知 ServiceProfile profile2 = new ServiceProfile(); profile2.setCharacteristicUuid(UUID.fromString("0000fff1-0000-1000-8000-00805f9b34fb")); profile2.setCharacteristicProperties(BluetoothGattCharacteristic.PROPERTY_NOTIFY); profile2.setCharacteristicPermission(BluetoothGattCharacteristic.PERMISSION_READ); profile2.setDescriptorUuid(GattServer.CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID); profile2.setDescriptorPermission(BluetoothGattDescriptor.PERMISSION_WRITE); profile2.setDescriptorValue(new byte[]{1}); list.add(profile2); final ServiceSettings serviceSettings = new ServiceSettings.Builder() .setServiceUuid(UUID.fromString("0000fff0-0000-1000-8000-00805f9b34fb"))//服务uuid .setServiceType(BluetoothGattService.SERVICE_TYPE_PRIMARY) .addServiceProfiles(list)//上述设置添加到该服务里 .build(); mGattServer.addService(serviceSettings);

回调监听

        mGattServer.setOnAdvertiseListener(new OnAdvertiseListener() {@Overridepublic void onStartSuccess(AdvertiseSettings settingsInEffect) { setContentText("开启广播 成功,uuid:0000fff0-0000-1000-8000-00805f9b34fb"); } @Override public void onStartFailure(int errorCode) { setContentText("开启广播 失败,uuid:0000fff0-0000-1000-8000-00805f9b34fb"); } @Override public void onStopAdvertising() { setContentText("停止广播,uuid:0000fff0-0000-1000-8000-00805f9b34fb"); } }); mGattServer.setOnServiceAddedListener(new OnServiceAddedListener() { @Override public void onSuccess(BluetoothGattService service) { setContentText("添加服务成功!"); } @Override public void onFail(BluetoothGattService service) { setContentText("添加服务失败"); } }); mGattServer.setOnConnectionStateChangeListener(new OnConnectionStateChangeListener() { @Override public void onChange(BluetoothDevice device, int status, int newState) { } @Override public void onConnected(BluetoothDevice device) { setContentText("连接上一台设备 :{ name = " + device.getName() + ", address = " + device.getAddress() + "}"); mBluetoothDevice = device; } @Override public void onDisconnected(BluetoothDevice device) { setContentText("设备断开连接 :{ name = " + device.getName() + ", address = " + device.getAddress() + "}"); } }); mGattServer.setOnWriteRequestListener(new OnWriteRequestListener() { @Override public void onCharacteristicWritten(BluetoothDevice device, BluetoothGattCharacteristic characteristic, byte[] value) { setContentText("设备写入特征请求 : device = " + device.getAddress() + ", characteristic uuid = " + characteristic.getUuid().toString() + ", value = " + Arrays.toString(value)); } @Override public void onDescriptorWritten(BluetoothDevice device, BluetoothGattDescriptor descriptor, byte[] value) { setContentText("设备写入描述请求 : device = " + device.getAddress() + ", descriptor uuid = " + descriptor.getUuid().toString() + ", value = " + Arrays.toString(value)); } }); 


Download

dependencies {compile 'will be come soon..'
}

转载于:https://www.cnblogs.com/Free-Thinker/p/9292231.html

BluetoothLE-Multi-Library 一个能够连接多台蓝牙设备的库,它可以作为client端,也可以为server端。支持主机/从机,外围设备连接。...相关推荐

  1. 微信小程序同时连接两台蓝牙设备

    微信小程序同时连接两台蓝牙设备 自己测试了微信小程序的蓝牙接口是否可以同时连接两台蓝牙设备并同时接收数据,实践测试发现,可以同时连接多台蓝牙设备但是不可以同时接收数据,监测接收数据的接口 wx.onB ...

  2. 蓝牙主机从机建立连接绑定过程

    蓝牙主机从机建立连接绑定过程 center与simplePeripheral建立连接过程 center首先进行osal_init_system()初始化各个任务,SimpleBLECentral_In ...

  3. 一台计算机连接两个投影,如何实现多台电脑连接一台投影仪并快速切换

    如何实现多台电脑连接一台投影仪并快速切换 多台电脑连接一台投影仪并快速切换这个需求其实在很早以前就被解决了,AWIND奇机无线投屏器可以让整个切换过程在3-5秒内完成.也就是投影机信号像电视机更换电视 ...

  4. 访问服务器80端口显示iis,iis服务器80端口一直与本机建立连接解决思路

    iis服务器80端口一直与本机建立连接解决思路 iis服务器80端口一直与本机建立连接解决思路 日期:2014-05-16 浏览次数:20995 次 iis服务器80端口一直与本机建立连接 iis服务 ...

  5. 子网掩码为255.255.255.0代表什么意思?如果一个网络的子网掩码为255.255.255.248,问该网络能够连接多少台主机?

    一.子网掩码为255.255.255.0代表什么意思? 答:有三种含义 1.看作为A类网的子网掩码,对于A类网络的IP地址,前8位表示网络号,后24位表示主机号,使用子网掩码255.255.255.0 ...

  6. 某公司申请到一个C类IP地址,但要连接6个的子公司,最大的一个子公司有 26台计算机,每个子公司在一个网段中,则子网掩码应设为?

    因为一个子网中有26台机器,那么子网的主机地址数量必须大于等于26,由于16=24<26<25=32,最少使用5位表示主机号,那么其它各位表示网络号,全1,即(11111111 11111 ...

  7. 用USB连接两台电脑

    程序下载网址 http://www.sknet-web.co.jp/down/USBlin15.EXE (双机对连) http://www.sknet-web.co.jp/down/USBpro15. ...

  8. 用计算机连接路由器,用路由器怎么连接两台电脑

    很多人使用路由器都是连接一台电脑使用,但如果电脑多了,例如像是两台电脑,这个时候用路由器怎么连接两台电脑?下面是学习啦小编整理的用路由器连接两台电脑的方法,供您参考. 用路由器连接两台电脑的方法 1. ...

  9. 一个路由再接另一个路由,让和别人合拉的一个网线可以多台电脑一起使用

    一个路由再接另一个路由,让和别人合拉的一个网线可以多台电脑一起使用 硬件:路由A(公家的路由),路由B(自家路由) 方法:让路由A拉过来的网线接到路由B的lan接口 步骤:1.先不要连接A路由,用一台 ...

最新文章

  1. 配置BGP本地优先级
  2. C++11中Thread类简单使用的例子
  3. 【MM模块】ASAP 项目实施方法简介
  4. UbuntuServer16.04LTS中安装Mysql并配置远程访问
  5. 使用read_html爬取网页表哥,Python笔记:用read_html()爬取table形式表格的网络数据...
  6. python可以调用windows资源吗_如何在Windows上用Python调用WinRar?还有问题吗
  7. convert.todatetime指定日期格式_JDK1.8新增日期时间类型
  8. Web前端期末大作业--汽车主题网页设计002(HTML+CSS+JavaScript+)实现
  9. java中example函数作用,MyBatis逆向工程中的Mapper接口以及Example的实例函数及详解...
  10. 【转】LiveWriter插入高亮代码插件介绍 基于SyntaxHighighter
  11. PHP强大自适应OA协同办公系统源码 含CRM客户管理系统+内部聊天工具
  12. 生态愿景与险企数字化进度——保险科技生态建设...
  13. 个人的信用体系(分层体系)调研
  14. 行尸走肉第一季/全集The Walking Dead迅雷下载
  15. LintCode 两个数组的交集
  16. 时序数据库为什么选 Prometheus
  17. Office的克星来了,用友、金蝶行动迅速,软件之争,谁是冠军
  18. 遍历一个文件夹下的所有文件和子文件夹
  19. 用友NC65产品的对账节点联查业务帐
  20. php tree view,VB.Net树视图(TreeView)

热门文章

  1. solve mass matrix in matlab
  2. 金融数据分析之pdfplumber提取年报PDF关键数据(其他PDF数据通用)
  3. 只显示小方格_excel中最有效率的插件——方方格子
  4. php yaf框架 校验登录,yaf框架是get或post请求的判断
  5. 服务器传文件的工具,向服务器传文件的工具
  6. Oracle拜年段子,oracle标题
  7. linux mysql5.5.50_linux下安装mysql5.5
  8. java 消息队列_消息队列-RabbitMQ在JAVA中的应用(1)
  9. 深入探讨PageRank(二):PageRank原理剖析
  10. 现代电子计算机诞生理论基础是什么,《计算机应用基础》习题集2