aicareles / android-ble Goto Github PK
View Code? Open in Web Editor NEWAndroid-BLE蓝牙框架,提供了扫描、连接、使能/除能通知、发送/读取数据、接收数据,读取rssi,设置mtu等蓝牙相关的所有操作接口,内部优化了连接队列,以及快速写入队列, 并支持多服务通讯,可扩展配置蓝牙相关操作。
License: Apache License 2.0
Android-BLE蓝牙框架,提供了扫描、连接、使能/除能通知、发送/读取数据、接收数据,读取rssi,设置mtu等蓝牙相关的所有操作接口,内部优化了连接队列,以及快速写入队列, 并支持多服务通讯,可扩展配置蓝牙相关操作。
License: Apache License 2.0
分包发送,WriteRequest每次写完,还有有延迟呀
如何配置只扫描指定UUID的设备?
很感谢您写的这个demo,对我工作中使用蓝牙帮助很大,
我在Ble 开发中有些问题网上很少有答案,比如蓝牙传输速率,
传输速率提高分两个方向:
1 Android 穿到 外围设备的速率,可以通过requestMtu,在
onMtuChanged 回调中获取申请了多少Mtu, 默认23, 减去1个op, 2个句柄,=20个字节(网上都说最多传20个字节...)
2 外为设备传给Android, 如果每次传20个字节,最少间隔7.5ms, 1.25ms一个步距(5个),
每个间隔时间最多传6个包, 120个字节. 因为外围设备(大多是单片机和蓝牙模块透传的) 写数据也有延迟,10字节/1ms, 最后是 没调成120字节/16ms,可以稳定传输20k数据.
扫描连接在Ble: Service connection successful 执行之前会导致连接不成功
能否有一个Ble: Service connection successful的回调
华为mate10,emui10,启动扫描的时候,callback的onLeScan一次回调都没有,时间到了会回调onStop,而直接进入系统的蓝牙界面是可以扫描到设备的
这个OTA升级是什么协议的?支持Nordic的升级协议吗
最近在做蓝牙相关的,无论之前使用插件还是自己手写还是最终发现您的工程,无一例外的在安卓上都有丢包的情况,看见您最近解决的问题是丢包问题,所以还是想跟您说一下,有可能的话可以共同探讨下,解决这个问题
我的app里,业务是这样的,app启动后,会启动一个定时器,这个定时器会不断的去判断保存在本地的蓝牙设备是否连接上,如果没有连接上,就直接根据保存在本地的mac地址连接(不经过扫描过程),Android 10之前的版本一直都比较顺利,从Android 10出来后,很多用户反馈蓝牙连接不上设备,我这边自己测试Android 10,不断循环一下操作:
连接上了设备之后,重启设备。
多连接十几次后,就连接不上了,然后手机的蓝牙开关可以关闭,但是打不开了,只能重启手机,大神知道这个是什么原因吗?
我这是要做一个蓝牙开锁项目,不能只单纯传string字符串,能发数据流吗
通过蓝牙设备发送notify消息,但是手机端接收不到,但是通过nrf测试软件可以接收到消息,消息properties:NOTIFY,是我哪里的配置错了吗?
mBle = Ble.options()//开启配置
.setLogBleExceptions(true)//设置是否输出打印蓝牙日志(非正式打包请设置为true,以便于调试)
.setThrowBleException(true)//设置是否抛出蓝牙异常
.setAutoConnect(false)//设置是否自动连接
.setFilterScan(true)//设置是否过滤扫描到的设备
.setConnectFailedRetryCount(3)
.setConnectTimeout(10 * 1000)//设置连接超时时长(默认10*1000 ms)
.setScanPeriod(12 * 1000)//设置扫描时长(默认10*1000 ms)
.setUuidService(UUID.fromString("0000ffe0-0000-1000-8000-00805f9b34fb"))//主服务的uuid
.setUuidWriteCha(UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb"))//可写特征的uuid
.setUuidReadCha(UUID.fromString("0000ffe2-0000-1000-8000-00805f9b34fb"))//可读特征的uuid
.setUuidNotify(UUID.fromString("0000ffe2-0000-1000-8000-00805f9b34fb"))
.create(this);
mBle.connect(address.toUpperCase(), connectCallback);
private BleConnectCallback<BleDevice> connectCallback = new BleConnectCallback<BleDevice>() {
@Override
public void onConnectionChanged(BleDevice device) {
if (device.isConnected()) {
mBleDevice = device;
setNotify(device);
}
}
@Override
public void onConnectException(BleDevice device, int errorCode) {
super.onConnectException(device, errorCode);
progressDialog.dismiss();
Toast.makeText(LockActivity.this, "连接异常,异常状态码:" + errorCode, Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectTimeOut(BleDevice device) {
super.onConnectTimeOut(device);
progressDialog.dismiss();
Toast.makeText(LockActivity.this, "连接超时", Toast.LENGTH_SHORT).show();
}
};
private void setNotify(BleDevice device) {
mBle.startNotify(device, new BleNotiftCallback<BleDevice>() {
@Override
public void onChanged(BleDevice device, BluetoothGattCharacteristic characteristic) {
Toast.makeText(LockActivity.this, "Notify success", Toast.LENGTH_SHORT).show();
if (characteristic != null && characteristic.getValue() != null && characteristic.getValue().length == 17) {
TypeBean typeBean = BleUtils.newInstance().read(characteristic.getValue());
if (typeBean != null) {
if (Constants.READ_4 == typeBean.getType()) {
if (typeBean.getLockType() == Constants.Lock0 || typeBean.getLockType() == Constants.Lock3) {
if (tipDialog != null) {
tipDialog.dismiss();
}
}
} else if (Constants.READ_6 == typeBean.getType()) {
write06.add(typeBean.getData());
if (typeBean.isOk()) {
byte[] data = new byte[write06.size() * 10];
int size = 0;
for (byte[] bytes : write06) {
for (int i = 0; i < bytes.length; i++) {
data[size + i] = bytes[i];
}
size += bytes.length;
}
byte[] sendData = SocketUtils.write06(data);
write06 = new ArrayList<>();
mThreadPool.execute(() -> {
try {
outputStream = socket.getOutputStream();
outputStream.write(sendData);
outputStream.flush();
inputStream = socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
}
}
}
});
}
这是我的代码
UUID是正确的
系统原生的设置能搜索出来 但是这个库搜索不出来
怎么设置下,扫描列表只返回支持ble的设备,因为有很多name是空的
我现在就在做在一块的东西,可以请教几个问题吗,留下您的联系方式。
问什么没有暴露蓝牙配对相关的接口
频繁断开重连时会导致重连时不走任何一个回调方法(v3.0.5)
原因:单个设备在短时间内多次连接,止步于
if (connectedAddressList.contains(address)) {
BleLog.d(TAG, "This is device already connected.");
return true;
}
解决方法:重连前调用
for (vo in mBle?.connetedDevices!!){
if(vo.address.contains(device.address)){
mBle?.bleRequest?.close(device.address)
}
}
然后再进行重连操作
问个问题,能把android手机开发成ble center吗,而不是常见的peripheral?
java.lang.NoClassDefFoundError: cn.com.heaton.blelibrary.ble.request.AdvertiserRequest$4
at cn.com.heaton.blelibrary.ble.request.AdvertiserRequest.(AdvertiserRequest.java:95)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1208)
at cn.com.heaton.blelibrary.ble.request.Rproxy.init(Rproxy.java:44)
at cn.com.heaton.blelibrary.ble.proxy.RequestProxy.bindProxy(RequestProxy.java:42)
at cn.com.heaton.blelibrary.ble.Ble.init(Ble.java:96)
at cn.com.heaton.blelibrary.ble.Ble.create(Ble.java:108)
at cn.com.heaton.blelibrary.ble.Ble.create(Ble.java:103)
at cn.com.heaton.blelibrary.ble.Ble$Options.create(Ble.java:806)
at com.uhf.demo.bluetooth.BleManager.(BleManager.java:78)
at com.uhf.demo.bluetooth.BleManager.from(BleManager.java:56)
at com.uhf.demo.connect.ConnectActivity.initData(ConnectActivity.java:124)
at com.uhf.demo.base.BaseActivity.onCreate(BaseActivity.java:89)
at android.app.Activity.performCreate(Activity.java:5274)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2151)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
at android.app.ActivityThread.access$800(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5095)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)
BleRequestImpl
这个可以自定义他不香吗?现在又很多高版本的api都不支持!!!!
android 9.0手机Ble.options().setAutoConnect(true)设置后一个BLE扫描相关线程在后台一直运行,且该线程的CPU占用高达12%,导致app刚运行一会儿,手机通知栏会提醒app高耗电。能否优化,谢谢!
现在依赖的是2.6.1版本,调用已连接设备列表返回的为空集合,但是设置中蓝牙列表是有两条连接过的设备,下载别人的App也能获取到的,所以不知道为什么没有返回,请告知
1.希望作者可以删除一下
如题
是否是使用released()函数,之后再进行init
java.lang.NoClassDefFoundError: cn.com.heaton.blelibrary.ble.request.ScanRequest$2
at cn.com.heaton.blelibrary.ble.request.ScanRequest.(ScanRequest.java:120)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1215)
at cn.com.heaton.blelibrary.ble.request.Rproxy.init(Rproxy.java:36)
at cn.com.heaton.blelibrary.ble.proxy.RequestProxy.bindProxy(RequestProxy.java:39)
at cn.com.heaton.blelibrary.ble.Ble.init(Ble.java:88)
at cn.com.heaton.blelibrary.ble.Ble.create(Ble.java:98)
at cn.com.heaton.blelibrary.ble.Ble$Options.create(Ble.java:790)
at com.xxx.MainActivity.onCreate(MainActivity.java:38)
at android.app.Activity.performCreate(Activity.java:5356)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2338)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2426)
at android.app.ActivityThread.access$800(ActivityThread.java:158)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5390)
在BluetoothLeService类中的disconnect()方法
public void disconnect(final String address) {
if (mBluetoothAdapter == null || mBluetoothGattMap.get(address) == null) {//这里的条件为null
Log.e(TAG, mBluetoothGattMap.get(address).getDevice().getAddress());//这里用null掉方法了
Log.w(TAG, "BluetoothAdapter not initialized");
return;
}
文档写的真是乱,能不能好好整理一下。。
当关闭的状态开启软件,软件里面手动开启蓝牙,回调进行扫描蓝牙设备就会
04-08 11:59:36.397 9594-9594/com.prohua.bluetooth D/BluetoothAdapter: STATE_ON
04-08 11:59:36.397 9594-9594/com.prohua.bluetooth D/BluetoothLeScanner: could not find callback wrapper
在bleActivity的 oncreateview方法中的那个动态权限申请感觉就没有执行,第一次进来也没有弹出权限对话框啊,而且用你的demo可以搜索到手机,但是连接不上
源码清晰明了。。。BUG存在。已反馈
1、BluetoothScannerImplLollipop 中stopScan 会优先回调(super.stopScan())给调用方,是否应该放到scanner.stopScan(scannerCallback);后面
有一个场景是这样的,搜索指定设备,没有搜索到(搜索超时)时,希望继续搜索,所以我在onStop的回调中执行了startScan进行重新搜索,但是此时scanner.stopScan(scannerCallback)还未执行到,又开始了下次搜索,会报错SCAN_FAILED_ALREADY_STARTED
2、在超时扫描onStop前关闭蓝牙,然后开启蓝牙不会继续扫描设备了 isScaning一直是true.
ScanRequest 中stopScan isEnableInternal 当蓝牙关闭时判断为false ,导致没有走后面的停止流程
此问题demo可复现
Notify:使用最新的AndroidBLE v3.0.0版本,在6.0系统上 蓝牙连接成功后,在onReady回调中设置通知,设备立即返回的通知可以接收,但是在8.0及以上系统无效,没办法立即接收到设备发送的通知,有遇到过的嘛?
1.有时候连接不上设备,必须重启蓝牙才可以连接,这是为什么呢
2.第一次连接成功后,notify没有数据,必须断掉,第二次连接就有了
java.lang.reflect.UndeclaredThrowableException
at $Proxy3.connect(Unknown Source)
at cn.com.heaton.blelibrary.ble.Ble.connect(Ble.java:134)
能不能给一个链接呢,谢谢。
最近在做蓝牙,比对了几个库, 你这个用倒是比较好用,就是扫描结果比人家少了好多...
红米 4.4.4 报错
连接之后返回:连接异常,异常状态码2031这是什么意思呢
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.