Code Monkey home page Code Monkey logo

android-ble's People

Contributors

aicareles avatar ficat avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-ble's Issues

关于提高Android ble 传输速率反馈,

很感谢您写的这个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的回调

华为手机10的系统扫描问题

华为mate10,emui10,启动扫描的时候,callback的onLeScan一次回调都没有,时间到了会回调onStop,而直接进入系统的蓝牙界面是可以扫描到设备的

丢包

最近在做蓝牙相关的,无论之前使用插件还是自己手写还是最终发现您的工程,无一例外的在安卓上都有丢包的情况,看见您最近解决的问题是丢包问题,所以还是想跟您说一下,有可能的话可以共同探讨下,解决这个问题

Android 10的连接问题

我的app里,业务是这样的,app启动后,会启动一个定时器,这个定时器会不断的去判断保存在本地的蓝牙设备是否连接上,如果没有连接上,就直接根据保存在本地的mac地址连接(不经过扫描过程),Android 10之前的版本一直都比较顺利,从Android 10出来后,很多用户反馈蓝牙连接不上设备,我这边自己测试Android 10,不断循环一下操作:
连接上了设备之后,重启设备。
多连接十几次后,就连接不上了,然后手机的蓝牙开关可以关闭,但是打不开了,只能重启手机,大神知道这个是什么原因吗?

关于notify消息接收问题

通过蓝牙设备发送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是正确的

未限制点击事件时,频繁断开重连时会导致重连时不走任何一个回调方法

频繁断开重连时会导致重连时不走任何一个回调方法(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)
}
}
然后再进行重连操作

java.lang.NoClassDefFoundError: cn.com.heaton.blelibrary.ble.request.AdvertiserRequest$4

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)

ble 扩展定制问题

BleRequestImpl 这个可以自定义他不香吗?现在又很多高版本的api都不支持!!!!

蓝牙获取已连接设备异常

现在依赖的是2.6.1版本,调用已连接设备列表返回的为空集合,但是设置中蓝牙列表是有两条连接过的设备,下载别人的App也能获取到的,所以不知道为什么没有返回,请告知

java.lang.NoClassDefFoundError: cn.com.heaton.blelibrary.ble.request.ScanRequest$2

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)

NullPointerException

在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

关于stopScan的问题

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

Notify:使用最新的AndroidBLE v3.0.0版本,在6.0系统上 蓝牙连接成功后,在onReady回调中设置通知,设备立即返回的通知可以接收,但是在8.0及以上系统无效,没办法立即接收到设备发送的通知,有遇到过的嘛?

连接问题

1.有时候连接不上设备,必须重启蓝牙才可以连接,这是为什么呢
2.第一次连接成功后,notify没有数据,必须断掉,第二次连接就有了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.