安卓蓝牙错误133

2024-02-23

我正在尝试连接到 Android 上的蓝牙设备。我的状态收到 133onClientConnectionState处理程序。我并不总是收到此错误 - 有时它连接正常。我无法确定是什么触发了这个问题。我什至在重新启动设备和我的重现应用程序后立即获得了它。

我知道几个问题并建议解决此问题,包括(来自here https://stackoverflow.com/questions/20069507/gatt-callback-fails-to-register, here https://stackoverflow.com/questions/28894111/android-ble-gatt-error133-on-connecting-to-device, and here https://stackoverflow.com/questions/25330938/android-bluetoothgatt-status-133-register-callback):

  • 对所有 BT API 使用 UI 线程
  • 完成后请务必关闭 GATT

但我正在做这一切。更重要的是,我的设备是 Nexus 5(运行 Lollipop),根据某些人的说法,它甚至不需要在 UI 线程上进行 BT 交互。

我已经整理了最简单的重现。它是用 C# 编写的,但 Java 中的等效项应该是显而易见的:

[Activity(Label = "BluetoothGatt133ErrorRepro", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    protected override void OnCreate(Android.OS.Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.Main);
        var button = FindViewById<Button>(Resource.Id.button);
        button.Click += this.OnClick;
    }

    private async void OnClick(object sender, EventArgs e)
    {
        Action<string> log = message => Console.WriteLine($"***** #{Environment.CurrentManagedThreadId} {message}");

        log("Beginning");

        var bluetoothManager = (BluetoothManager)Application.Context.GetSystemService(Context.BluetoothService);
        var adapter = bluetoothManager.Adapter;
        var scanner = adapter.BluetoothLeScanner;
        var callback = new Callback();
        var filters = new List<ScanFilter>();
        var settings = new ScanSettings.Builder()
            .SetScanMode(global::Android.Bluetooth.LE.ScanMode.LowLatency)
            .Build();

        log("Starting scan");
        scanner.StartScan(filters, settings, callback);

        var result = await callback.Result;
        log($"Got device: {result.Device.Name}");

        var remoteDevice = adapter.GetRemoteDevice(result.Device.Address);
        var gattCallback = new GattCallback(log);

        log("Connecting GATT");

        var gatt = remoteDevice.ConnectGatt(Application.Context, true, gattCallback);
        gatt.Connect();

        await gattCallback.Result;

        log("Disconnecting GATT");

        gatt.Close();
        gatt.Dispose();
    }

    private sealed class Callback : ScanCallback
    {
        private readonly TaskCompletionSource<ScanResult> result;

        public Callback()
        {
            this.result = new TaskCompletionSource<ScanResult>();
        }

        public Task<ScanResult> Result => this.result.Task;

        public override void OnBatchScanResults(IList<ScanResult> results)
        {
            foreach (var result in results)
            {
                this.HandleResult(result);
            }
        }

        public override void OnScanResult(ScanCallbackType callbackType, ScanResult result)
        {
            this.HandleResult(result);
        }

        public override void OnScanFailed(ScanFailure errorCode)
        {
            this.result.TrySetException(new InvalidOperationException($"Failed with error code {errorCode}."));
        }

        private void HandleResult(ScanResult result)
        {
            if (result.Device.Name.Contains("elided"))
            {
                this.result.TrySetResult(result);
            }
        }
    }

    private sealed class GattCallback : BluetoothGattCallback
    {
        private readonly Action<string> log;
        private readonly TaskCompletionSource<bool> result;

        public GattCallback(Action<string> log)
        {
            this.log = log;
            this.result = new TaskCompletionSource<bool>();
        }

        public Task<bool> Result => this.result.Task;

        public override void OnConnectionStateChange(BluetoothGatt gatt, GattStatus status, ProfileState newState)
        {
            this.log($"Connection state changed to {newState} with status {status}.");

            this.result.TrySetResult(true);
        }
    }
}

这是运行此命令的输出(我也保留了 Android 的 BluetoothGatt 源的输出):

***** #1 Beginning
***** #1 Starting scan
07-01 11:53:21.458 D/BluetoothLeScanner(10377): onClientRegistered() - status=0 clientIf=5
***** #1 Got device: elided
***** #1 Connecting GATT
07-01 11:53:22.833 D/BluetoothGatt(10377): connect() - device: 00:00:DE:AD:BE:EF, auto: true
07-01 11:53:22.833 D/BluetoothGatt(10377): registerApp()
07-01 11:53:22.833 D/BluetoothGatt(10377): registerApp() - UUID=fa5bce8a-416d-47fe-9a8a-e44156f7e865
07-01 11:53:22.834 D/BluetoothGatt(10377): onClientRegistered() - status=0 clientIf=6
07-01 11:53:24.622 D/BluetoothGatt(10377): onClientConnectionState() - status=133 clientIf=6 device=00:00:DE:AD:BE:EF
***** #4 Connection state changed to Disconnected with status 133.
***** #1 Disconnecting GATT
07-01 11:53:24.707 D/BluetoothGatt(10377): close()
07-01 11:53:24.707 D/BluetoothGatt(10377): unregisterApp() - mClientIf=6

如您所见,我与蓝牙堆栈的所有交互都发生在主线程上(#1)。但尽管如此,我的状态仍然是 133onClientConnectionState处理程序。

我的清单具有以下权限:

  <uses-permission android:name="android.permission.BLUETOOTH" />
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
  <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我正在使用最新的 Marshmallow 工具进行编译,并且目标是 Marshmallow,最低目标为 4.0.3(API 级别 15)。

可能是什么原因造成的?


(注意:您可能已经在这样做了,但我不太熟悉 C#)

根据我的经验,您实际上并不只是在主线程上与 BLE 设备进行交互,而只是您不会同时向设备发送太多请求。

我曾经在 Android 上使用 BLE 时遇到过这个问题(并阅读了有关使用主线程的类似评论),这是因为我向远程 Gatt 发布了太多请求(读/写、通知/指示注册等)在接收 BluetoothGattCallback 对象中先前操作的回调之前,设备。我设置了自己的托管 gatt 操作队列(一个线程,该线程会阻塞,直到在 GattCallback 中收到该操作的回调,或者初始读/写操作返回 false,然后处理下一个排队操作或使用退避乘数重试),因为我还没有遇到这个问题。据我所知,Android 在“排队”操作方面做得不好,因此“isBusy”布尔值会在不知不觉中影响您(如果您没有注意到,请查看 BlueoothGattCharacteristic 写入方法)。我还注意到,您不想在回调对象中做太多工作,而是将回调委托给另一个线程或广播结果(这样您就不会阻塞 Binder 线程)。通常我只是复制字节有效负载,并将其传递给另一个 HandlerThread 进行解析。

另外,是的,断开和关闭确实非常重要。我通常使用服务来处理 BLE 交互,并在服务的 onDestroy 完成之前调用这两个交互。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓蓝牙错误133 的相关文章

  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 在片段 android 的 CursorLoader 中显示进度对话框

    美好的一天 正如标题所说 任何人都知道如何在从片段内的 CursorLoader 加载数据时实现进度对话框 找不到这方面的任何例子 任何有关如何操作的链接或指南将受到高度赞赏 谢谢 我认为 Michal 的解决方案非常适合通过以下方式显示不
  • MySQL STR_TO_DATE() 函数返回 null

    我想将日期格式转换为MMMM dd yyyy to yyyy MM dd 我尝试使用以下内容 SET dt to STR TO DATE dateTo d m Y 但返回一个NULL value 我如何将我的日期转换为yyyy MM ddM
  • WPF - 将位图转换为 ImageSource

    我需要转换一个System Drawing Bitmap into System Windows Media ImageSource类 以便将其绑定到 WizardPage 扩展 WPF 工具包 的 HeaderImage 控件中 位图被设
  • 行列反转所形成的矩阵左上象限的最大和

    我正在研究一个 HackerRank 问题 该问题在反转行和列后找到 2N x 2N 矩阵的左上象限中元素的最大总和 例如 如果矩阵是 M 112 42 83 119 56 125 56 49 15 78 101 43 62 98 114
  • 强制 JSON.NET 将 xml 转换为 json 数组 [重复]

    这个问题在这里已经有答案了 我正在使用 JSON NET 将一些 XML 转换为 JSON 我的 XML 看起来像这样
  • 在 Woocommerce 中仅显示特定客户所在国家/地区的价格

    我已经使用 woocommerce 开发了一个目录 但是我需要能够对从英国境外访问该网站的用户隐藏产品价格由于我无法控制的原因 我找到了一些插件 可以让我根据访问者位置更改产品价格 但没有任何插件可以让我隐藏价格 是否有任何我错过的插件或任
  • GlobalFilter 与 WebFilter

    我正在 Spring Cloud Gateway 中迈出第一步 在学习过程中 我想更好地了解GlobalFilter 具体来说 我打算每次都应用一些过滤器every route 阅读文档 参考 https cloud spring io s
  • 当表单具有背景图像时,如何解决控件不必要的闪烁?

    问题概述 当我尝试隐藏一些标签 文本框和按钮时 我遇到了这个问题 所有这些控件在隐藏时都会闪烁 但其他不涉及的控件都很好 我不想要这种效果 另外 这不会发生在Show 仅发生在Hide 我尝试过的 删除背景图像解决了这个问题 但我确实希望我
  • 在 iOS 8 上使用 NSKeyedUnarchiver 取消存档 UIImage 对象返回 CGSizeZero 图像

    我的代码在 iOS 7 上运行 NSData imageData NSKeyedArchiver archivedDataWithRootObject self imageView image UIImage imageCopy NSKey
  • 如何在 PHP 8.0 中使用 ssh2?

    在安装 php 8 更新之前 我通读了所有不兼容性 只是发现为时已晚 我还没有找到对 ssh2 扩展的支持 我希望我只是错过了一些东西 我已经用谷歌搜索了几个小时 所有可能的线索都没有找到 谁能告诉我 ssh2 扩展的 php 8 版本吗
  • Spring在单元测试中嵌入了ldap服务器

    我目前正在尝试使用嵌入式 LDAP 服务器进行单元测试 在 Spring Security 中 您可以快速定义一个嵌入式 ldap 服务器 以便使用标签以及从指定 ldif 加载的一些示例数据进行测试 我将使用 Spring Ldap 执行
  • 致命错误,因为传递的是 Error 实例而不是预期的 Exception 实例

    我刚刚安装了 xampp 和 php 7 0 4 以及新的 cakephp 3 2 6 我做了很多研究 我发现的一切都表明它们是兼容的 然而 当我用浏览器打开应用程序时 蛋糕就会回复内部错误 关于要做什么的唯一指示是 xampp 在 apa
  • 获取当前背景

    我想获取当前的背景并以此为基础做一个条件 例如 我有一个带有下一个箭头的xml 如果背景 R drawable A 我想在按下下一个按钮时将背景更改为R drawable B 我定义了我的相对布局如下 final RelativeLayou
  • python中a=b=c是什么? [复制]

    这个问题在这里已经有答案了 我很困惑 连续相等 可以在 python 中使用 例如 a b c 这个语言特性叫什么 有什么我可以读到的吗 能化成4个等号吗 a b c d 这只是一种声明方式a and b等于c gt gt gt c 2 g
  • 重写 editTextStyle 不适用于最新的材质组件基本样式

    在我的应用程序中 我使用Theme MaterialComponents Light NoActionBar作为基本样式 这种风格 我称之为AppTheme 我正在尝试覆盖editTextStyle提供自定义样式com google and
  • R 中的四参数 beta 分布

    R 中是否有内置函数可以计算四参数 beta 分布 即 具有两个形状参数和两个边界参数的分布 因此它不受 0 1 的限制 我自己做了一个 但很好奇这个功能是否已经存在 无需重新发明轮子 shp1 lt 20 shp2 lt 5 X lt s
  • Pandas/Python 根据条件添加行

    我希望根据某些条件在两个现有行之间的数据框中插入一行 例如 我的数据框 import pandas as pd df pd DataFrame Col1 A B D E Col2 B C E F Col3 1 1 1 1 看起来像 Col1
  • 高流量 Web 应用程序的最佳扩展方法?

    我们有一个新的网络应用程序项目 它将在网站 作为网络 上显示横幅广告 我们估计它每月可以处理 20 到 400 亿次展示 我们当前的语言是 ASP 但正在转向 PHP PHP 5 在扩展 Web 应用程序方面有限制吗 或者 我应该让我们的团
  • prolog 中递归的停止条件

    以下是我的知识库中的事实 http www doc gold ac uk mas02gw prolog教程 prolog页面 recursion html http www doc gold ac uk mas02gw prolog tut
  • 安卓蓝牙错误133

    我正在尝试连接到 Android 上的蓝牙设备 我的状态收到 133onClientConnectionState处理程序 我并不总是收到此错误 有时它连接正常 我无法确定是什么触发了这个问题 我什至在重新启动设备和我的重现应用程序后立即获