草庐IT

Android:捕获 BLE 连接失败/断开连接?

coder 2023-12-07 原文

因此,在正常情况下,我能够很好地连接到 BLE 设备。我想做的是处理异常情况,比如当与设备的连接失败或已建立的连接丢失时(可能它被扔下悬崖或被公共(public)汽车撞了)

我正在使用 CyPress BLE 模块对此进行测试,我正在进行的其中一项测试是断开模块的电源。但是,onConnectionStateChange 永远不会被调用!我所看到的所有响应都是成功的连接。它会花费数小时尝试连接并且从不明显放弃。我会延迟取消连接尝试,但无法取消蓝牙设备(据我所知)的连接尝试!据我所知,它会一直尝试直到电池电量耗尽。

这是我的 onConnectionStateChange 现在在 Gatt 回调中的样子。请注意,我正在 try catch 并记录涉及任何类型的连接状态更改的任何类型的回调......除非连接成功,否则永远不会被调用。请注意,这是代码不在 Activity 本身上。它在一个由单例持有的对象中。 (我想保持跨多个 Activity 的连接)

        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            mGatt = gatt;
            Logy.CallPrint(LOGY_ENABLE, CLASSNAME, "Status: "+status+ " Newstate: "+newState);
            switch(status)
            {
                case BluetoothGatt.GATT_SUCCESS:
                    mReconnectAttempts = MAX_ATTEMPTS;

                    if(newState == BluetoothGatt.STATE_CONNECTED)
                    {
                        DispatchEvent(Event.Type.BT_ON_CONNECT);
                        bIsConnected = true;
                        gatt.discoverServices();
                    } else if (newState == BluetoothGatt.STATE_DISCONNECTED)
                    {
                        DispatchEvent(Event.Type.BT_ON_DISCONNECT);
                        bIsConnected = false;
                    }
                    break;
                default:
                    if(newState == BluetoothGatt.STATE_DISCONNECTED)
                    {
                        bIsConnected = false;
                        if(mReconnectAttempts > 0)
                        { // if we have attempts left, auto attempt to reconnect
                            DispatchEvent(Event.Type.BT_RECONNECTING);
                            mReconnectAttempts--;
                            gatt.connect();
                            bIsConnected = false;
                        }
                        else
                        {
                            mReconnectAttempts = MAX_ATTEMPTS;
                            DispatchEvent(Event.Type.BT_ON_CONNECT_FAIL);
                            bIsConnected = false;
                        }
                    } else {
                        Logy.CallPrint(LOGY_ENABLE, CLASSNAME, "onConnectionStateChange: Failed?");
                    }
            }

            super.onConnectionStateChange(gatt, status, newState);
        }

无法检测断开连接是我代码中其他地方的一个问题,例如我在其中显示一个进度对话框,指示应用程序正在连接到 BLE 设备。好吧,该对话框永远不会消失,因为永远不会抛出“On Connect Fail”事件。

最佳答案

我想你要找的是Bluetooth Supervision timeout这是根据 Bluetooth LE specifications :

a parameter that defines the maximum time between two received Data Packet PDUs before the connection is considered lost

默认 Supervision timeoout在 Android 上设置为 20 秒(取决于 Android 版本和设备)。例如,hereSupervision Timeout 的值在 Android 5.1 上。

没有用于设置此参数的 API,因此您必须等待 20 秒(取决于您的 Android 版本和设备)才能获取 onConnectionStateChange回调状态 BluetoothGatt.STATE_DISCONNECTED关闭 BLE 模块后

关于Android:捕获 BLE 连接失败/断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38666462/

有关Android:捕获 BLE 连接失败/断开连接?的更多相关文章

  1. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  2. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  3. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  4. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  5. ruby - 如何让Ruby捕获线程中的语法错误 - 2

    我正在尝试使用ruby​​编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?

  6. 安卓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,打开命令窗口,并将路

  7. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  8. ruby-on-rails - 无法在 Rails 助手中捕获 block 的输出 - 2

    我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e

  9. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  10. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

随机推荐