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

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() {
            @Override
            public 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

时间: 2024-10-29 13:51:06

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

com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。 java.net.ConnectException: Connection refused: connect

问题描述:最简单的数据库连接报错,到主机  的 TCP/IP 连接失败.(win 7 操作系统) 错误信息: com.microsoft.sqlserver.jdbc.SQLServerException: 到主机  的 TCP/IP 连接失败. java.net.ConnectException: Connection refused: connect package sqlconnect; import java.sql.*; public class sqlconnect { public

LinkedIn的即时消息:在一台机器上支持几十万条长连接

最近我们介绍了LinkedIn的即时通信,最后提到了分型指标和读回复.为了实现这些功能,我们需要有办法通过长连接来把数据从服务器端推送到手机或网页客户端,而不是许多当代应用所采取的标准的请求-响应模式.在这篇文章中会描述在我们收到了消息.分型指标和读回复之后,如何立刻把它们发往客户端. 内容会包含我们是如何使用Play框架和Akka Actor Model来管理长连接.由服务器主动发送事件的.我们也会分享一些在生产环境中我们是如何在服务器上做负载测试,来管理数十万条并发长连接的,还有一些心得.最

noVNC连接多台远程主机

noVNC是一个HTML5 VNC客户端,采用HTML5 websockets.Canvas和JavaScript实现,noVNC被普遍应用于各大云计算.虚拟机控制面板中,比如OpenStack Dashboard 和 OpenNebula Sunstone 都用的是 noVNC.前面说了 noVNC 采用 WebSockets 实现,但是目前大多数 VNC 服务器都不支持 WebSockets,所以 noVNC 是不能直接连接 VNC 服务器的,怎么办呢?这就需要一个代理来实现websocke

处理 允许远程协助连接这台计算机 灰色

系统为Windows Server 2008R2,下面记录处理这个问题的方法: 1)"计算机"->右键"管理"->"功能"->"添加功能" 2)勾选"远程协助",如图, 3)点击安装,直到安装完成后关闭窗口即可破解"允许远程协助连接这台计算机 灰色"的问题

如何通过直接网线接法连接两台电脑

如何通过直接网线接法连接两台电脑 1.制作水晶头 通过网线对两台电脑进行连接时,网线水晶头接法是:一端按 t568a 线序接,一端按 t568b 线序接.网线制作完成之后,通过网线水晶头连接电脑,这样两台电脑间的物理连接就形成了. 2.设置IP 物理连接的形成并不代表两台电脑可以进行通信,想使通过直接网线接法连接两台电脑进行数据传输,还必须进行相关的设置: 设置项 机器A 机器B IP 192.168.1.2 192.168.1.3 子网掩码 255.255.255.0 255.255.255.

Npcap:Nmap项目里一个为Windows而生的嗅探库 Npcap: Nmap Project&#39;s packet sniffing library for Windows

Introduction介绍 This Manual describes the programming interface and the source code of Npcap. It provides detailed descriptions of the functions and structures exported to programmers, along with complete documentation of the Npcap internals. Several

(转) linux虚拟机中和主机三种网络连接方式的区别

在介绍网络模式之前,关于网络的几个简单命令的使用 ifup eth0   //启动网卡eth0 ifdown eth0 //关闭网卡eth0 /etc/network/interfaces  //网络配置文件 /etc/init.d/networking  //网络服务位置 /etc/init.d/networking restart  //重启网络 /etc/resolv.conf //DNS配置文件 ifconfig eth0 192.168.5.111 //重新配置网卡eth0的ip 一.

反向代理:是指以代理server来接收Internet上的请求,然后将请求转发到内部网络的server上,并将结果返回给Internet上连接的client,此时的代理server对外就表现为反向代理server。

? ?Nginx安装好之后.開始使用它来简单实现反向代理与负载均衡的功能.在这之前.首先得脑补一下什么是反向代理和负载均衡. ? 反向代理:是指以代理server来接收Internet上的请求,然后将请求转发到内部网络的server上,并将结果返回给Internet上连接的client.此时的代理server对外就表现为反向代理server. ? ?通俗来讲,反向代理server就好比我们常说的中介.Internetclient能够看作是租房的客户,而内部网络的server好比是房东.租户通过中

CENTOS 配置好SVN服务环境后,其他服务器无法访问 Error: Can&#39;t connect to host &#39;192.168.1.103&#39;: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

CENTOS 配置好SVN服务环境后,其他服务器无法访问 根据 下面的步骤配置好服务后,使用本机可以正常 连接到 SVN 服务, 但是使用局域网的其他服务器访问时出现下面的错误, Error: Can't connect to host '192.168.1.103': 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败. 时由于防火墙配置问题, 需修改防火墙规则,或者使用下面的命令把防火墙服务关闭即可 service iptables stop 配置自动启动:把svnserv