关于Ble通信库BluetoothKit的使用 以及可能出现的问题分析


  首先,这个库是用于BLE(低功耗蓝牙)通信的,地址:https://github.com/dingjikerbo/BluetoothKit


当然,也可以选择根据andorid提供的底层接口自己完成这部分的通信,这个库优点在于确实很方便使用,基本都是回调就能完成。作者好像也是前就职于阿里?

 介绍下用法:

   先在gradle加入:

compile ‘com.inuker.bluetooth:library:1.4.0‘

  在Menifest中配置:

  (ps:在6.0以上需要使用动态权限)

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

<uses-feature
    android:name="android.hardware.bluetooth_le"
    android:required="true" />

<application
    android:label="@string/app_name">
    <service
        android:name="com.inuker.bluetooth.library.BluetoothService" />
</application>

  核心类BluetoothClient,创建一个这样的单例对象,可以借用其例子中的ClientManager类

BluetoothClient mClient = new BluetoothClient(context); //自己写
BluetoothClient mClient = ClientManager.getClient(); //借用作者的ClientManager

  一般都需要做个扫描界面来选择设备吧,这个库是支持普通蓝牙和低功耗蓝牙混扫的

SearchRequest request = new SearchRequest.Builder()
        .searchBluetoothLeDevice(3000, 3)   // 先扫BLE设备3次,每次3s
        .searchBluetoothClassicDevice(5000) // 再扫经典蓝牙5s
        .searchBluetoothLeDevice(2000)      // 再扫BLE设备2s
        .build();

mClient.search(request, new SearchResponse() {
    @Override
    public void onSearchStarted() {

    }

    @Override
    public void onDeviceFounded(SearchResult device) {     //发现设备
        Beacon beacon = new Beacon(device.scanRecord);     //beacon用于解析广播
        BluetoothLog.v(String.format("beacon for %s\n%s", device.getAddress(), beacon.toString()));     //device对象就包括了设备的mac地址和蓝牙名称 ,将device放在list里面 按mac地址做唯一区别
    }

    @Override
    public void onSearchStopped() {
      //扫描停止
    }

    @Override
    public void onSearchCanceled() {
      //扫描取消
    }
});

手动停止扫描:

mClient.stopSearch();

 

 通过上面的代码我们可以完成设备的扫描,获取到扫描结果,也可以得到目标设备的mac地址;

 广播的作用是可以不连接设备,就能够获取到设备的一些信息,比如电量或者其他的一些厂家信号;

言归正传,我们得到了mac地址就可以连接设备了,通过一些代码既可以完成连接设备:

//连接参数
BleConnectOptions options = new BleConnectOptions.Builder()
        .setConnectRetry(2)   // 连接如果失败重试2次
        .setConnectTimeout(3000)   // 连接超时3s
        .setServiceDiscoverRetry(2)  // 发现服务如果失败重试3次
        .setServiceDiscoverTimeout(2000)  // 发现服务超时2s
        .build();

mClient.connect(MAC, options, new BleConnectResponse() {
    @Override
    public void onResponse(int code, BleGattProfile data) {

    }
});

 个人建议不能确定双方通信都及其正常的情况下,是需要设置连接参数的,可以保证连接的成功率。如果要监听蓝牙连接状态可以注册回调,只有两个状态:连接和断开,建议把监听设置放在连接前面

mClient.registerConnectStatusListener(MAC, mBleConnectStatusListener);

private final BleConnectStatusListener mBleConnectStatusListener = new BleConnectStatusListener() {

    @Override
    public void onConnectStatusChanged(String mac, int status) {
        if (status == STATUS_CONNECTED) {
      //连接
        } else if (status == STATUS_DISCONNECTED) {
      //断开
        }
    }
};

mClient.unregisterConnectStatusListener(MAC, mBleConnectStatusListener);

  也可以通过mClient获取连接状态:

int status = mClient.getConnectStatus(MAC)

  连接成功后一般都要打开notify使能,以便获得硬件回复的数据:

//打开notifymClient.notify(MAC, serviceUUID, characterUUID, new BleNotifyResponse() {    //是notify的UUID
    @Override
    public void onNotify(UUID service, UUID character, byte[] value) {
        //硬件回复的数据在这里,统一处理      handleResult(value);
    }

    @Override
    public void onResponse(int code) {
        if (code == REQUEST_SUCCESS) {
      //我一般都在打开notify成功后才开始发送数据
        }
    }
});

//关闭notify
mClient.unnotify(MAC, serviceUUID, characterUUID, new BleUnnotifyResponse() {
    @Override
    public void onResponse(int code) {
        if (code == REQUEST_SUCCESS) {

        }
    }
});

  写数据,只有通过mClient.write写数据才有可能收到notify回来的数据,如果通过writeNoRsp写是不可能收到的,作者注明writeNoRsp建议用于固件升级:

mClient.write(MAC, serviceUUID, characterUUID, bytes, new BleWriteResponse() {
    @Override
    public void onResponse(int code) {
        if (code == REQUEST_SUCCESS) {

        }
    }
});

  这样就可以实现write-->notify的读写操作了。

  说一些我遇到的问题:

  1.android6.0以上动态权限不仅需要蓝牙相关权限,还需要GPS权限,必须保证GPS也打开,才能正常搜索;

  2.连接速度问题,经测试,这个库在nexus5上连接较慢,底层从发现设备到发现服务有时候甚至需要2,3s左右;

  3.部分设备有时候出现 notify 返回 -1,尝试过在连接的时候把扫描停止了,有好转,不过并未彻底解决;

时间: 2024-08-05 07:06:49

关于Ble通信库BluetoothKit的使用 以及可能出现的问题分析的相关文章

清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)

目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程,与TCP和UDP相关的有: 1.http://www.cnblogs.com/xiaozhi_5638/p/3167794.html 2.http://www.cnblogs.com/xiaozhi_5638/p/3169641.html 3.http://www.cnblogs.com/xiaoz

消息通信库ZeroMQ 4.0.4安装指南

消息通信库ZeroMQ 4.0.4安装指南 一.ZeroMQ介绍 ZeroMQ是一个开源的消息队列系统,按照官方的定义,它是一个消息通信库,帮助开发者设计分布式和并行的应用程序. 首先,我们需要明白,ZeroMQ不是传统的消息队列系统(比如ActiveMQ.WebSphereMQ.RabbitMQ等).ZeroMQ可以帮助我们建立自己的消息队列系统,它只是一个库.ZeroMQ可以运行于带x86处理器或ARM处理器的机器上,支持40多种编程语言. 消息队列,从技术的角度来讲,是以先进先出FIFO算

【Android高级】Android组件间通信库EventBus学习

最近偶然在论坛上看了一个比较厉害的库EventBus,感觉使用起来很爽,不用考虑在Activity还是Fragment,不用担心是不是UI线程,随便怎么通信都行,有网友笑说这简直是Android开发中的第五大组件,通信起来像广播那样神通,但又比广播轻量级多了,所以在这里记下来,以后开发就方便多了. 项目地址:https://github.com/greenrobot/EventBus EventBus主要特点 1. 事件订阅函数不是基于注解(Annotation)的,而是基于命名约定的,在And

acl 通信库之非阻塞网络编程实例讲解

一.概述 acl 库的 C 库(lib_acl) 的 aio 模块设计了完整的非阻塞异步 IO 通信过程,在 acl 的C++库(lib_acl_cpp) 中封装并增强了异步通信的功能,本文主要描述了 acl C++ 库之非阻塞IO库的设计及使用方法,该异步流的设计思路为:异步流类与异步流接口类,其中异步流类对象完成网络套接口监听.连接.读写的操作,异步流接口类对象定义了网络读写成功/超时回调. 连接成功回调.接收客户端连接回调等接口:用户在进行异步编程时,首先必须实现接口类中定义的纯方法,然后

BLE通信过程中,一次连接间隔最多可以发多少包,BLE的最大通信速度为多少

最大吞吐量(简单了解) 兼容IOS的情况下,20ms间隔,最大通信速率 6KBytes/S,单独安卓为7.5ms间隔时,通信速率为16KBytes/S IOS一个连接间隔最多交互4次: 安卓一个连接间隔最多交互6次: 可参考LightBlue的引用(详细了解) https://punchthrough.com/blog/posts/maximizing-ble-throughput-on-ios-and-android 关于BLE,在通信过程中,首次通信,Master和Slave交互一次是20个

openssl 升级欧卡国际平台搭建安装编译libwebsocket通信库

欧卡国际平台搭建论坛:haozbbs.com Q1446595067 libwebsocket Ubuntu 16.04中遇到下面报错.error: 'TLSv1_2_client_method官网也碰到同样的问题https://github.com/warmcat/libwebsockets/issues/1098但是也没有明确给出解决方案,通过尝试发现是因为目前系统自带的openssl库不兼容libwebsocket代码,因此进行重新安装,使用源码安装指定的版本,由于源码安装过程中目录不正确

10 C++ Boost ASIO网路通信库 TCP/UDP,HTTP

  tcp 同步服务器,显示服务器端时间 tcp 同步服务器,提供多种选择 多线程的tcp 同步服务器 tcp 同步客户端 boost 域名地址解析 tcp异步服务器 tcp 异步客户端 UDP同步服务器 UDP同步客户端 UDP异步服务器 UDP异步客户端 HTTP同步客户端 HTTP异步客户端 同步实验: 异步实验 多线程异步实验 tcp 同步服务器,显示服务器端时间 [email protected]:~/boost$ cat main.cpp  #include <ctime> #in

Android组件间通信库EventBus学习

项目地址: https://github.com/greenrobot/EventBus EventBus主要特点 1. 事件订阅函数不是基于注解(Annotation)的,而是基于命名约定的,在Android 4.0之前的版本中,注解解析起来比较慢 , 事件响应函数默认以“onEvent”开始,可以在EventBus中修改这个值,但是不推荐这么干2. 事件响应有更多的线程选择EventBus可以向不同的线程中发布事件,在ThreadMode 枚举中定义了4个线程,只需要在事件响应函数名称“on

网络库crash以及boost asio strand dispath分析

最近在做服务器的稳定性的相关测试,服务器的网络底层使用的是boost asio,然后自己做的二次封装以更好的满足需求. 服务器昨天晚上发现crash了一次,之前测试了将近半个多月,有一次是莫名的退出了,不过由于是新的测试服,忘记将ulimit -c进行修改了,所以没有coredump,这次又发生了. coredump如下: #0 0x0000000000000091 in ?? () #1 0x0000000000459729 in ClientHandler::HandleConnect(cp