Android如何使用PriorityQueue读取多个BLE特征

2023-11-26

有点卡在这里,可能需要你的帮助。我想一次读取多个 BLE 特性,有些人建议使用 PriorityQueue。我已经知道所有的 uuid 等,只需要一种方法可以一次读取多个。 谁能解释一下它究竟应该是什么样子?或者也许还有另一个更简单的解决方案?

预先感谢,这是我的代码:

public static final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {

    PriorityQueue<BluetoothGattCharacteristic> queue = new PriorityQueue<BluetoothGattCharacteristic>();

    // When connection state changes
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            Log.v(TAG, "Connected!");
            gatt.discoverServices();
        }
        if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.v(TAG, "Disconnected...");

        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {

        List<BluetoothGattService> services = gatt.getServices();
        BluetoothGattService rightService = null;

        for (int i = 0; i < services.size(); i++) {
            if (services.get(i).getCharacteristics().size() > 8) {
                rightService = services.get(i);
            }
        }

        List<UUID> uuidsList;

        UUID TRANSMISSION_POWER = rightService.getCharacteristics().get(4).getUuid();
        UUID BROADCASTING_INTERVAL = rightService.getCharacteristics().get(6).getUuid();
        UUID BEACON_NAME = rightService.getCharacteristics().get(8).getUuid();
        UUID CONNECTION_MODE = rightService.getCharacteristics().get(9).getUuid();
        //UUID SOFT_REBOOT = rightService.getCharacteristics().get(10).getUuid();

        uuidsList = new ArrayList<UUID>();

        uuidsList.add(TRANSMISSION_POWER);
        uuidsList.add(BROADCASTING_INTERVAL);
        uuidsList.add(BEACON_NAME);
        uuidsList.add(CONNECTION_MODE);
        //uuidsList.add(SOFT_REBOOT);

        queue.add(rightService.getCharacteristic(uuidsList.get(0)));
        queue.add(rightService.getCharacteristic(uuidsList.get(1)));
        queue.add(rightService.getCharacteristic(uuidsList.get(2)));

    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {

        Log.v(TAG, "CHARACTERISTIC VALUE___: " + characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0));
        onServicesDiscovered(gatt, 0);

    }

};

UPDATE:

即使将它们放在不同的线程上,它仍然只对一个 gatt.readCharacteristic(...) 做出反应。像下面这样:

// Gatt Callback
public static final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {

    // When connection state changes
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            Log.v(TAG, "Connected!");
            gatt.discoverServices();
        }
        if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.v(TAG, "Disconnected...");

        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {


        List<BluetoothGattService> services = gatt.getServices();

        /*
        DISPLAY ALL SERVICES AND CHARACTERISTICS

        for (int i = 0; i < services.size(); i++) {
            Log.v(TAG, "SERVICE____: " + services.get(i).getUuid());

            for (int k = 0; k < services.get(i).getCharacteristics().size(); k++) {
                Log.v(TAG, "CHARACTERISTIC____: " + services.get(i).getCharacteristics().get(k).getUuid());
            }

        }
        */

        BluetoothGattService rightService = null;

        for (int i = 0; i < services.size(); i++) {
            if (services.get(i).getCharacteristics().size() > 8) {
                rightService = services.get(i);
            }
        }

        List<UUID> uuidsList;

        UUID TRANSMISSION_POWER = rightService.getCharacteristics().get(4).getUuid();
        UUID BROADCASTING_INTERVAL = rightService.getCharacteristics().get(6).getUuid();
        UUID BEACON_NAME = rightService.getCharacteristics().get(8).getUuid();
        UUID CONNECTION_MODE = rightService.getCharacteristics().get(9).getUuid();
        //UUID SOFT_REBOOT = rightService.getCharacteristics().get(10).getUuid();

        uuidsList = new ArrayList<UUID>();

        uuidsList.add(TRANSMISSION_POWER);
        uuidsList.add(BROADCASTING_INTERVAL);
        uuidsList.add(BEACON_NAME);
        uuidsList.add(CONNECTION_MODE);
        //uuidsList.add(SOFT_REBOOT);


        class powerThread extends Thread{

            UUID uuid;
            BluetoothGatt gatt;
            BluetoothGattService service;
            public powerThread(UUID uuid, BluetoothGatt gatt, BluetoothGattService service) {
                this.gatt = gatt;
                this.service = service;
                this.uuid = uuid;
            }
            @Override
            public void run() {
                gatt.readCharacteristic(service.getCharacteristic(uuid));
            }
        }
        powerThread pt = new powerThread(TRANSMISSION_POWER, gatt, rightService);
        pt.run();


        class intervalThread extends Thread{

            UUID uuid;
            BluetoothGatt gatt;
            BluetoothGattService service;
            public intervalThread(UUID uuid, BluetoothGatt gatt, BluetoothGattService service) {
                this.gatt = gatt;
                this.service = service;
                this.uuid = uuid;
            }
            @Override
            public void run() {
                gatt.readCharacteristic(service.getCharacteristic(uuid));
            }
        }
        intervalThread it = new intervalThread(BROADCASTING_INTERVAL, gatt, rightService);
        it.run();


    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {

        Log.v(TAG, "CHARACTERISTIC VALUE___: " + characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0));

    }

};

对于任何可能遇到相同问题的人,这里有一个使用特征 List 的简单解决方案。

public static final BluetoothGattCallback readGattCallback = new BluetoothGattCallback() {

    List<BluetoothGattCharacteristic> chars = new ArrayList<>();

    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {

        if (newState == BluetoothProfile.STATE_CONNECTED) {
            Log.v(TAG, "Connected!");
            broadcastingInterval = 999;
            transmissionPower = 999;
            gatt.discoverServices();
        }
        if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.v(TAG, "Disconnected...");

        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {

        List<BluetoothGattService> services = gatt.getServices();
        BluetoothGattService rightService = null;

        for (int i = 0; i < services.size(); i++) {
            if (services.get(i).getCharacteristics().size() > 8) {
                rightService = services.get(i);
            }
        }

        chars.add(rightService.getCharacteristics().get(4));
        chars.add(rightService.getCharacteristics().get(6));

        requestCharacteristics(gatt);

    }

    public void requestCharacteristics(BluetoothGatt gatt) {
        gatt.readCharacteristic(chars.get(chars.size()-1));
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {

            if (characteristic.getUuid().toString().substring(7, 8).equals("5")) {
                transmissionPower = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0);
                Log.v(TAG, "tPOWER READ");

            } else if (characteristic.getUuid().toString().substring(7,8).equals("7")) {
                broadcastingInterval = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0);
                Log.v(TAG, "INTERVAL READ");
            }

            chars.remove(chars.get(chars.size() - 1));

            if (chars.size() > 0) {
                requestCharacteristics(gatt);
            } else {
                gatt.disconnect();
            }
        }
    }

};
  1. 创建特征列表
  2. 在 onServicesDiscovered 中,使用您想要读/写的特征填充列表
  3. 创建一个名为 requestCharacteristics(gatt) 的新方法并将 gatt 对象传递给它。将特征添加到列表后,从 onServicesDiscovered 调用此方法。
  4. 在 requestCharacteristics() 方法中调用 gatt.readCharacteristic(chars.get(chars.size()-1));
  5. 在 onCharacteristicRead 中检查列表的大小是否不为零,然后读取您的特征,删除列表的最后一项并再次调用 requestCharacteristic()。
  6. 就这样
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android如何使用PriorityQueue读取多个BLE特征 的相关文章

  • 提交后折叠搜索视图

    我在我的应用程序中使用 searchview 没有操作栏 提交查询文本后如何折叠搜索视图 我有这些听众 Override public boolean onQueryTextSubmit String query InputMethodMa
  • 将多个视频文件合并到一个文件中

    我有多个以相同帧速率和分辨率录制的视频 我想将两个视频合并为一个视频 因此结果文件将是大视频 我正在使用 MP4 解析器 api 并使用下面的代码 Movie countVideo new MovieCreator build Channe
  • 在Java中使用BufferedWriter写入文件时监视文件大小?

    我正在将一个可能很长的项目列表写入文件 我正在写的项目的长度是可变的 如果生成的文件大小大于10M 则应将其分成多个文件 为了提高性能 我目前使用 BufferedWriter 如下所示 final FileOutputStream fos
  • ChromeCast 无法播放 .m3u8 格式的 HLS

    应用程序中集成了 chromecast 一切正常 除了不播放 m3u8 格式的实时流媒体 url 而是播放 m3u8 格式的电影 url 我这样做是为了将 url 设置为 chromecast return new MediaInfo Bu
  • 已使用不兼容的格式定义属性(此处定义的原始属性)

    添加后无法构建项目 compile com android support design 24 2 0 一直报如下错误 看起来 问题在于支持矢量绘图 某处某些属性被添加两次 例如 构建的values xml文件包含
  • perl 和 java 正则表达式功能之间有什么区别?

    perl 和 java 在支持哪些正则表达式术语方面有什么区别 这个问题仅涉及正则表达式 并且特别排除了how可以使用正则表达式 即使用正则表达式的可用函数 方法 以及语言之间的语法差异 例如java要求转义反斜杠等 特别令人感兴趣的是 j
  • SlidingPaneLayout setCoveredFadeColor () 和 setSliderFadeColor()

    我正在使用SlidingPaneLayout并希望在滑块右窗格打开时在左窗格上设置灰色渐变颜色 在右窗格关闭且左窗格完全可见时在左窗格上设置透明渐变颜色 我知道这是默认行为SlidingPaneLayout 但使用默认实现时 我在横向模式下
  • java.lang.IllegalArgumentException:addChild:子名称“/”不唯一

    java lang IllegalArgumentException addChild 子名称 不唯一 通过在 tomcat webapps 文件夹中启用和禁用 saml 单点登录来替换现有 war 文件时遇到此问题 我正在使用 apach
  • 在 Java 中使用 Inflater 解压缩 gzip 数据

    我正在尝试使用以下方法解压缩 gzip 数据Inflater 根据文档 如果参数 nowrap 为 true 则 ZLIB 标头和校验和 字段将不会被使用 这提供了与 GZIP 和 PKZIP 使用的压缩格式 注意 使用 nowrap 选项
  • 在 Android 中使用 Fragment 时处理后按

    我在应用程序中使用 Android 滑动菜单和导航抽屉 并且在应用程序中使用片段而不是活动 当我打开抽屉时 单击一个项目会出现一个片段 我使用以下代码从一个片段移动到另一个片段 Fragment fragment null fragment
  • 如何告诉 IntelliJ 使用 Java 1.6 JDK 启动 gradle?

    一个简单的问题 即使经过几个小时的尝试和搜索 我也无法弄清楚 我安装了 Java 6 和 7 如何告诉 IntelliJ 使用 JDK 版本 1 6 启动 Gradle 构建 无论我做什么 IntelliJ 都会以以下方式开始我的 grad
  • Apache Kafka 是否提供异步订阅回调 API?

    我的项目正在将 Apache Kafka 视为老化的基于 JMS 的消息传递方法的潜在替代品 为了让这个过渡尽可能的顺利 如果替代的排队系统 Kafka 有一个异步订阅机制那就更理想了 类似于我们当前项目使用的JMS机制MessageLis
  • 如果没有按钮,Espresso 不会记录任何意图

    我正在尝试编写一个测试来验证使用浓缩咖啡启动的意图 问题是有意的 不记录任何意图 我有这个测试 Test public void shoulddosomething startActivity intended hasComponent h
  • 如何修改生成的SOAP请求?

    我正处于创建输出拦截器并从 SOAP 消息中获取 OuputStream 的阶段 但是 如何在将 SOAP 信封发送到端点之前对其进行修改呢 我想删除一些 xml 元素 一种方法是获取文档并通过 XSLT 转换运行它 您可以通过调用来获取拦
  • 如何处理在某些 Marshmallow 之前的设备上未自动授予 SYSTEM_ALERT_WINDOW 权限

    我收到一些小米设备 例如 Mi 2 运行 API 级别 21 不显示叠加层的报告 我的应用程序以 API 23 为目标 有several http forum xda developers com xiaomi mi 3 help link
  • Android 中的垂直(旋转)标签

    我需要两种在 Android 中显示垂直标签的方法 水平标签逆时针旋转 90 度 字母在侧面 带有字母的水平标签 如商店招牌 我是否需要为这两种情况 一种情况 开发自定义小部件 我可以使 TextView 以这种方式呈现吗 如果我需要完全自
  • JSP 和 scriptlet

    我知道现在使用 scriptlet 被认为是禁忌 没关系 我会同意Top Star的话 因为我目前只是Java新手 到目前为止我听到的是 它是为了让设计师的生活更轻松 但我想知道 这是否与JSP页面的性能有关 另一方面 如果只是为了 让设计
  • Android 2.2 中不带预览的相机捕获

    我需要捕获图像而不显示预览 我想在后台作为服务来完成它 可以这样做吗 是有可能实现的 您应该定义一个处理 Camera 对象的类 例如调用 Camera open 等 不要为相机对象提供以下行以禁用预览 mCamera setPreview
  • 在另一个布局中以编程方式膨胀布局

    我的 Android 应用程序需要帮助 我需要在另一个布局中膨胀一个布局 但我不知道该怎么做 我的xml代码是这样的 item xml 我需要膨胀多个 xml 取决于可变数量
  • Java,如何管理线程读取socket(websocket)?

    我有一个 WebSocket 服务器 我的服务器创建一个新线程来处理新连接 该线程一直处于活动状态 直到 websocket 中断 我的问题 对于 1 000 000 个连接 我需要 1 000 000 个线程 我如何通过一个线程处理多个

随机推荐

  • Keras 似乎在调用 fit_generator 后挂起

    我正在尝试适应 Keras 的实现SqueezeDet模型到一个新的数据集 对配置文件进行适当的更改后 我尝试运行训练脚本 但它似乎在调用后挂起fit generator 当我得到以下输出时 anaconda envs py35 lib p
  • EF4 Code First:如何仅更新特定字段

    如何仅更新实体上的某些字段 我有一个像这样的用户实体 public class User public string UserId get set public string PasswordHash get set public bool
  • 永久 PowerShell 变量

    有没有办法在 PowerShell 中定义变量 以便当我打开新的 PowerShell 窗口时 它会保持相同的值 我需要这个变量来保留其值 因为我需要时不时地重新启动我的服务器 并且我不想丢失这些值 储藏 variable export c
  • 为什么 xdebug 没有出现在 phpinfo() 中

    我正在尝试进行以下设置工作 Windows 7 64 位 XAMPP 1 7 4 XDebug php xdebug 2 1 0 5 3 vc9 x86 64 dll 当我从 Xampps 主页运行 phpinfo 时 XDebug 它没有
  • 使用go静态文件服务器时如何自定义处理找不到文件?

    所以我使用 go 服务器来提供单页 Web 应用程序 这适用于为根路由上的所有资产提供服务 所有 CSS 和 HTML 均已正确提供 fs http FileServer http Dir build http Handle fs 所以当网
  • 在 CouchDB 中按键返回唯一值

    有没有办法在 CouchDB 中执行以下操作 一种通过给定键返回唯一 不同值的方法 SELECT DISTINCT field FROM table WHERE key key1 key1 gt somevalue key1 gt some
  • 具有有关文件的自定义元数据的 ItemGroup

    我正在尝试创建一个 文件 任务项组 其中包含名为 TargetPath 的元数据属性 其中填充了文件的相对路径 Example 对于这些路径 D 测试 Blah exeD 测试 配置 fun configD Test en US my re
  • 未找到类异常 com.squareup.okhttp.logging.HttpLoggingInterceptor

    即使在添加依赖项并导入类之后 我仍然收到 java lang NoClassDefFoundError com squareup okhttp logging HttpLoggingInterceptor 有人可以帮忙吗 Gradle 构建
  • 在 Angular 中更新/合并 i18n 翻译文件

    我们最近决定为我们的应用程序支持多种语言 Angular 13 x 经过研究 我们决定使用angular localize看起来很适合我们的需求的包 一切似乎都在解决唯一的问题 即在后续的构建和更改中保持翻译文件最新 因此 请遵循 Angu
  • 取消 DataAdapter.Fill()

    设想 我们有一个附加到 DataAdapter 数据表 的 DataGridView 我们在单独的线程 使用 delegate 和 beginInvoke 中使用 adapter fill query datatable 将数据加载到数据表
  • 通过 Node JS 使用文件内容确定 MIME 类型

    似乎所有流行的 Node js MIME 类型库都只是使用文件扩展名 而不是通过查看文件来确定 MIME 类型 有没有一种好方法可以使用 Node 跳转到文件并智能地确定文件的 MIME 类型 以防扩展名不存在 确实感觉很可惜 最受欢迎的M
  • SQL Server Raiserror 不会在 .NET 客户端中引起异常

    我在 SQL Server 2005 数据库上有一个存储过程 其中有如下语句 IF Condition 0 BEGIN RAISERROR some error message 16 1 RETURN END 它是从 C 客户端调用的 如下
  • 如何将 List 绑定到 gridview?

    这可能是一个非常奇怪的问题 因为通常人们只将复杂类型绑定到网格视图 但我需要绑定一个 Int 列表 对于字符串也是如此 通常 由于要绑定的属性使用对象的属性名称 但是当使用 Int 或 String 时 该值正是对象本身 而不是属性 获取对
  • __init__.py 的目的是什么? [复制]

    这个问题在这里已经有答案了 创建 Python 包时 我被告知创建一个名为的空白文件init py 我不明白的是为什么我需要创建这个文件 这distutils构建脚本不会修改它 所以五个构建后它仍然是空白的 它的目的是什么 它向 Pytho
  • 了解 CSS 表格单元格和百分比宽度

    我正在检查 Github 如何显示以下菜单 如果您注意到 每个菜单项都具有相同的宽度 在CSS中 我们应该给它任何百分比值 这背后的原因是什么 请注意 父 div 没有给出 display table 属性 div border 1px s
  • Android - 在活动中嵌入 Unity3d 场景 - 需要取消注册接收器?

    我成为 SO 成员已经有一段时间了 但从未真正问过问题 所以这里 My Aim 我正在尝试制作一个包含两个活动的 Android 应用程序 第一个是菜单屏幕 使用标准 Android UI 元素 其中有一个用于打开游戏活动的按钮 游戏活动将
  • 如何获取Android指南针读数?

    既然 SENSOR ORIENTATION 已弃用 那么获取罗盘航向的最佳做法是什么 老方法就是这么简单 以下是获取指南针方向并将其显示在 TextView 中的基本示例 它通过实现 SensorEventListener 接口来实现这一点
  • 更改引导程序中活动类的颜色

    我正在尝试更改 html 代码中活动类的颜色 我正在创建导航侧边栏 这是我的代码 div class col sm 2 ul class nav nav pills nav stacked nav static li class activ
  • javascript:使用 window.open() 发送自定义参数,但它不起作用

  • Android如何使用PriorityQueue读取多个BLE特征

    有点卡在这里 可能需要你的帮助 我想一次读取多个 BLE 特性 有些人建议使用 PriorityQueue 我已经知道所有的 uuid 等 只需要一种方法可以一次读取多个 谁能解释一下它究竟应该是什么样子 或者也许还有另一个更简单的解决方案