安卓蓝牙错误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 的相关文章

随机推荐

  • 在片段 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处理程序 我并不总是收到此错误 有时它连接正常 我无法确定是什么触发了这个问题 我什至在重新启动设备和我的重现应用程序后立即获