草庐IT

android - 在 Android 中与低功耗蓝牙设备配对

coder 2023-12-03 原文

是否可以自动连接到低功耗蓝牙 (BLE) 设备?

Android documentation表示 [BluetoothDevice.connectGatt()]( https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context , bool 值,android.bluetooth.BluetoothGattCallback))有一个自动连接参数:

boolean indicating whether to automatically connect to the BLE device as soon as it becomes available

但是,要调用它,您首先需要一个 BluetoothDevice。据我所知,获得此信息的唯一方法是扫描可用设备。每次都设置扫描以连接到设备似乎不是一种理想的方式。另外,我尝试使用 nRF Control Master Panel使用 autoConnect = true 连接到我的外围设备,但这并没有连接到设备。然而,在没有 autoConnect 的情况下连接确实可以连接,而且我已经成功地以这种方式从外围设备读取数据和向外围设备写入数据。

蓝牙中将两个设备配对的一般方式。但是,搜索我的 BLE 设备并使用 BluetoothDevice.createBond()似乎不起作用。在我的 ACTION_BOND_STATE_CHANGED 回调中,EXTRA_BOND_STATEEXTRA_PREVIOUS_BOND_STATE 只是从 BOND_BONDING 变为 BOND_NONE 并返回。我没有读出错误或任何东西 - 所以也许我在这里遗漏了一些东西。这是回调:

private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {

            final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
            final int prevState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR);

            Log.e(TAG, "prevState " + prevState + ", state " + state);
        }
    }
};

所以这种绑定(bind)似乎不起作用。

我的问题是:我是否在配对或自动连接方面做错了什么?或者我目前如何让它工作是唯一正确的方式?每次都必须扫描设备,看看设备是否在那里,如果是,读取数据并明天再回来查看,否则一小时左右再回来查看,这似乎是一个真正的痛苦(和电池耗尽)。蓝牙的重点是只要靠近就应该直接配对,不是吗?

最佳答案

无需重新扫描即可正常工作。您根本不需要配对。只需为您从第一次连接获取的 gatt 对象再次调用 BluetoothGatt.connect()。 一旦 ble 设备再次可用,您将在 BluetoothGattCallback 中收到 onConnectionStateChange 事件。如果您使用自动连接选项,您甚至不需要调用 BluetoothGatt.connect() 方法。只需监控您的 cllback,如果您长时间未看到任何连接,请不要忘记使用 close() 关闭 BluetoothGatt。

是的,要获得第一个连接,您应该使用 BluetoothAdapter.startLeScan 扫描蓝牙设备,而不是常见的蓝牙设备扫描。

关于android - 在 Android 中与低功耗蓝牙设备配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29723332/

有关android - 在 Android 中与低功耗蓝牙设备配对的更多相关文章

  1. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby-on-rails - 禁用设备的 :confirmable on-the-fly to batch-generate users - 2

    Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation

  4. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  5. ruby - 在 ruby​​ 中与 << 相反 - 2

    我正在使用准备一个巨大的字符串循环中的运算符。最后我想删除最后2个字符。some_loopstr我认为上面的最后一个操作也会消耗内存和时间,但我不确定。就是想看看有没有和效果相反的操作所以我可以从同一个字符串中删除最后两个字符。 最佳答案 事实上,字符串切片已经是一种快速且内存高效的操作,因为只有在真正需要时才会复制字符串内容。请参阅“Seeingdouble:howRubysharesstringvalues”中的详细说明。请注意,这是对字符串操作的某种经典优化;Youhaveitinjavatoo我们经常在C中使用类似的技巧。所

  6. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  7. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

  8. ruby - 如何查看移动设备是否已注册 - 2

    我正在使用适用于AmazonSNS的AmazonAWSRubySDK,但我在使用已注册的设备时遇到了一些问题。有时,当设备再次注册时,我会收到类似AWS::SNS::Errors::InvalidParameterInvalidparameter:TokenReason:Endpointarn:aws:sns:us-east-1:****alreadyexists这样的错误具有相同的Token,但具有不同的属性。。如何检查端点是否已存在,更重要的是,如何获取给定token的端点? 最佳答案 感谢BvdBijl的想法,我做了一个扩展方

  9. AiBote 2022 新研发的自动化框架,支持 Android 和 Windows 系统。速度非常快 - 2

    Ai-Bot基于流行的Node.js和JavaScript语言的一款新自动化框架,支持Windows和Android自动化。1、Windowsxpath元素定位算法支持支持Windows应用、.NET、WPF、Qt、Java和Electron客户端程序和ie、edgechrome浏览器2、Android支持原生APP和H5界面,元素定位速度是appium十倍,无线远程自动化操作多台安卓设备3、基于opencv图色算法,支持找图和多点找色,1080*2340全分辨率找图50MS以内4、内置免费OCR人工智能技术,无限制获取图片文字和找字功能。5、框架协议开源,除官方node.jsSDK外,用户可

  10. Android Gradle 7.1+新版本依赖变化 - 2

    前一段时间由于工作需要把可爱的小雪狐舍弃了,找到了小蜜蜂。但是新版本的小蜜蜂出现了很多和旧版本不一样的位置。1.功能位置迁移,原来在工程build.gradle的buildscript和allprojects移动至setting.gradle并改名为pluginManagement和dependencyResolutionManagement。里面的东西依旧可以按照原来的copy过来。pluginManagement{repositories{gradlePluginPortal()google()mavenCentral()}}dependencyResolutionManagement{r

随机推荐