使用bluez5读取蓝牙低能耗信标的RSSI

2024-04-15

我想在 2 个蓝牙 le USB 适配器上同时读取蓝牙低功耗信标的 RSSI。我使用的是带有 bluez 5 和 LogiLink BT0015 适配器(CSR 芯片)的 fedora 20 系统。

当仅连接一个适配器时,我的代码就像一个魅力,但在连接第二个适配器后,我收到输入/输出错误。

有人知道代码有什么问题吗?

还有其他方法读取 RSSI 吗?

#include <rssi.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>

#include <time.h>
#include <unistd.h>

class Adapter {
    const char* bt_addr;
    int hci_deviceid;

    int hciSocket;
    uint16_t hciHandle;

    int l2capSock;
    struct sockaddr_l2 sockAddr;
    struct l2cap_conninfo l2capConnInfo;
    socklen_t l2capConnInfoLen;

    void init();

public:
    Adapter(int hci_deviceid, const char* bt_addr);
    Adapter(const char * bt_addr);

    int getHciDeviceId();
    int8_t read_rssi(int to);
};

Adapter::Adapter(int hci_deviceid, const char* bt_addr) {
    this->hci_deviceid = hci_deviceid;
    this->bt_addr = bt_addr;
    init();
}
Adapter::Adapter(const char* bt_addr) {
    this->bt_addr = bt_addr;
    if (hci_get_route(NULL) >= 0)
        this->hci_deviceid = hci_get_route(NULL);
    init();
}

void Adapter::init(){
    int result;

    printf("INIT with: %s via hci%d\n", bt_addr, hci_deviceid);


    hciSocket = hci_open_dev(hci_deviceid);
    printf("HCISOCKET: %d\n", hciSocket);
    printf("l2capSock %s\n", (l2capSock == -1) ? strerror(errno) : "success");

    // create socket
    l2capSock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
    printf("L2CAPSOCK: %d\n", l2capSock);
    printf("l2capSock %s\n", (l2capSock == -1) ? strerror(errno) : "success");


    // bind
    memset(&sockAddr, 0, sizeof(sockAddr));
    sockAddr.l2_family = AF_BLUETOOTH;
    bacpy(&sockAddr.l2_bdaddr, BDADDR_ANY);
    sockAddr.l2_cid = htobs(ATT_CID);

    result = bind(l2capSock, (struct sockaddr*) &sockAddr, sizeof(sockAddr));
    printf("BIND: %d\n", result);
    printf("bind %s\n", (result == -1) ? strerror(errno) : "success");

    // connect
    memset(&sockAddr, 0, sizeof(sockAddr));

    sockAddr.l2_family = AF_BLUETOOTH;
    str2ba(bt_addr, &sockAddr.l2_bdaddr);
    sockAddr.l2_bdaddr_type = BDADDR_LE_RANDOM; // BDADDR_LE_PUBLIC/RANDOM
    sockAddr.l2_cid = htobs(ATT_CID);

    result = connect(l2capSock, (struct sockaddr *) &sockAddr,
            sizeof(sockAddr));
    printf("CONNECT L2CAPSOCK: %d\n", result);
    printf("connect %i %s\n", result,
            (result == -1) ? strerror(errno) : "success");

    l2capConnInfoLen = sizeof(l2capConnInfo);
    getsockopt(l2capSock, SOL_L2CAP, L2CAP_CONNINFO, &l2capConnInfo,
            &l2capConnInfoLen);
    hciHandle = l2capConnInfo.hci_handle;

    printf("GETSOCKOPT L2CAPSOCK: %d\n", result);
    printf("getsockopt %i %s\n", result,
            (result == -1) ? strerror(errno) : "success");
}

int Adapter::getHciDeviceId(){
    return hci_deviceid;
}

int8_t Adapter::read_rssi(int to) {
    int8_t rssi = 200;

    int result = hci_read_rssi(hciSocket, hciHandle, &rssi, to);
    printf("hci_read_rssi: %i %s\n", result,
            (result == -1) ? strerror(errno) : "success");

    return rssi;
}

void sleep(int ms){
    clock_t end_time = clock() + ms * CLOCKS_PER_SEC/1000;
    while (clock() < end_time) {}
}


int main(int argc, const char* argv[]) {

    Adapter myAdapter(0, argv[1]);
    Adapter myAdapter2(1, argv[1]);

    int counter = 0;

    while (true) {
        printf("%d: Adapter %d: RSSI: %i ", counter, myAdapter.getHciDeviceId(), myAdapter.read_rssi(100));
        printf("%d: Adapter %d: RSSI: %i ", counter, myAdapter2.getHciDeviceId(), myAdapter2.read_rssi(100));

        sleep(1000);
        counter++;
    }
}

header:

#ifndef RSS_H_
#define RSS_H_

#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <stdint.h>

struct sockaddr_l2 {
  sa_family_t l2_family;
  unsigned short l2_psm;
  bdaddr_t l2_bdaddr;
  unsigned short l2_cid;
  uint8_t l2_bdaddr_type;
};

#define L2CAP_CONNINFO 0x02
struct l2cap_conninfo {
  uint16_t hci_handle;
  uint8_t dev_class[3];
};
#define ATT_CID 4

#endif /* RSS_H_ */

log:

2 Adapters Connected, using hci1:

root@dduck-virtual-machine:~/git/Rssi/Rssi/build# ./rssi 90:03:B7:CA:27:92
INIT with: 90:03:B7:CA:27:92 via hci1
HCISOCKET: 3
l2capSock success
L2CAPSOCK: 4
l2capSock success
BIND: 0
bind success
CONNECT L2CAPSOCK: 0
connect 0 success
GETSOCKOPT L2CAPSOCK: 0
getsockopt 0 success
hci_read_rssi: 0 success
0: Adapter 1: RSSI: -57 hci_read_rssi: 0 success
1: Adapter 1: RSSI: -57 hci_read_rssi: 0 success
2: Adapter 1: RSSI: -57 hci_read_rssi: 0 success
3: Adapter 1: RSSI: -57 hci_read_rssi: 0 success
4: Adapter 1: RSSI: -57 hci_read_rssi: 0 success

2 Adapters connected, using hci0:
root@dduck-virtual-machine:~/git/Rssi/Rssi/build# ./rssi 90:03:B7:CA:27:92
INIT with: 90:03:B7:CA:27:92 via hci0
HCISOCKET: 3
l2capSock success
L2CAPSOCK: 4
l2capSock success
BIND: 0
bind success
CONNECT L2CAPSOCK: 0
connect 0 success
GETSOCKOPT L2CAPSOCK: 0
getsockopt 0 success
hci_read_rssi: -1 Input/output error
0: Adapter 0: RSSI: -56 hci_read_rssi: -1 Input/output error
1: Adapter 0: RSSI: -56 hci_read_rssi: -1 Input/output error
2: Adapter 0: RSSI: -56 hci_read_rssi: -1 Input/output error

2 adapters connected, using both (hci0, hci1):
root@dduck-virtual-machine:~/git/Rssi/Rssi/build# ./rssi 90:03:B7:CA:27:92
INIT with: 90:03:B7:CA:27:92 via hci0
HCISOCKET: 3
l2capSock success
L2CAPSOCK: 4
l2capSock success
BIND: 0
bind success
CONNECT L2CAPSOCK: 0
connect 0 success
GETSOCKOPT L2CAPSOCK: 0
getsockopt 0 success
INIT with: 90:03:B7:CA:27:92 via hci1
HCISOCKET: 5
l2capSock success
L2CAPSOCK: 6
l2capSock success
BIND: 0
bind success
CONNECT L2CAPSOCK: -1
connect -1 Device or resource busy
GETSOCKOPT L2CAPSOCK: -1
getsockopt -1 Transport endpoint is not connected
hci_read_rssi: -1 Input/output error
0: Adapter 0: RSSI: -56 hci_read_rssi: -1 Input/output error
0: Adapter 1: RSSI: -56 hci_read_rssi: -1 Input/output error
1: Adapter 0: RSSI: -56 hci_read_rssi: -1 Input/output error
1: Adapter 1: RSSI: -56 hci_read_rssi: -1 Input/output error

1adapter connected, using hci0:
root@dduck-virtual-machine:~/git/Rssi/Rssi/build# ./rssi 90:03:B7:CA:27:92
INIT with: 90:03:B7:CA:27:92 via hci0
HCISOCKET: 3
l2capSock success
L2CAPSOCK: 4
l2capSock success
BIND: 0
bind success
CONNECT L2CAPSOCK: 0
connect 0 success
GETSOCKOPT L2CAPSOCK: 0
getsockopt 0 success
hci_read_rssi: 0 success
0: Adapter 0: RSSI: 127 hci_read_rssi: 0 success
1: Adapter 0: RSSI: -55 hci_read_rssi: 0 success
2: Adapter 0: RSSI: -56 hci_read_rssi: 0 success

hciconfig:
hci1:   Type: BR/EDR  Bus: USB
    BD Address: 00:1A:7D:DA:71:03  ACL MTU: 310:10  SCO MTU: 64:8
    UP RUNNING PSCAN ISCAN 
    RX bytes:612 acl:0 sco:0 events:37 errors:0
    TX bytes:943 acl:0 sco:0 commands:37 errors:0
    Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
    Link policy: RSWITCH HOLD SNIFF PARK 
    Link mode: SLAVE ACCEPT 
    Name: 'ubuntu-0'
    Class: 0x6c0100
    Service Classes: Rendering, Capturing, Audio, Telephony
    Device Class: Computer, Uncategorized
    HCI Version: 4.0 (0x6)  Revision: 0x22bb
    LMP Version: 4.0 (0x6)  Subversion: 0x22bb
    Manufacturer: Cambridge Silicon Radio (10)

hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:1A:7D:DA:71:04  ACL MTU: 310:10  SCO MTU: 64:8
    UP RUNNING PSCAN 
    RX bytes:687 acl:0 sco:0 events:45 errors:0
    TX bytes:997 acl:0 sco:0 commands:43 errors:0
    Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
    Link policy: RSWITCH HOLD SNIFF PARK 
    Link mode: SLAVE ACCEPT 
    Name: 'dduck-virtual-machine-0'
    Class: 0x600100
    Service Classes: Audio, Telephony
    Device Class: Computer, Uncategorized
    HCI Version: 4.0 (0x6)  Revision: 0x22bb
    LMP Version: 4.0 (0x6)  Subversion: 0x22bb
    Manufacturer: Cambridge Silicon Radio (10)

None

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

使用bluez5读取蓝牙低能耗信标的RSSI 的相关文章

  • 金特 + XNA (C#)

    是否可以使用jint http jint codeplex com操作使用 XNA C 创建的 3D 环境 并向该环境添加功能 再次使用 jint 作为 Jint 的贡献者 我会推荐你Jint http jint codeplex com
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • Xamarin.Forms UWP 项目中标题栏和选项卡之间令人恼火的空白

    我几乎是新手Xamarin Forms我正在开发一个相当简单的跨平台应用程序 该应用程序在 Android 中显示得足够好 但在 UWP 中却出现了一个愚蠢的空白 该项目由一个 TabbedPage 组成 其中包含 4 个 Navigati
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • 可变参数模板参数解包

    对于每个参数 我需要应用两个嵌套函数 obj apply someFilter arg arg is one argument but here should be an unpacking of args 我不知道如何为这种情况编写拆包
  • 比较两个 NSString 对象时如果“a == b”为 false

    我有一个带有可访问方法的类 该方法传回NSString当被叫时 MyClass getMyString 该类中的字符串变量实际上是在didSelectRowAtIndexPath 像这样的表的一部分 myString cell textLa
  • MySQL 将行值合并为单行

    我需要为表创建一个选择查询 该表合并 Number 列上每组的行 以获得包含所有可用但最新 按 ID 列的单行 这就是我的意思 我需要一张这样的表 ID Number Date 1 Date 2 Date 3 1 1 2011 10 01
  • VB.NET Array Contains 方法不起作用

    在 VB NET 中 我试图确定给定的字符串是否存在于字符串数组中 根据我的研究 数组有一个我可以使用的 包含 方法 因此代码如下所示 Dim fileTypesZ As String PDF TXT DOC DOCX XLS XLSX J
  • Swift 中的按钮文本下划线

    我有 UIButton 在界面生成器中 我将其标题设置为 属性 如何在 Swift 代码中使其标题带有下划线 IBOutlet weak var myBtn UIButton 我创建了一个在此按钮的 touchUpInside 事件上调用的
  • 将外部数据源与 Cucumber 功能文件集成

    我是 Cucumber 及其用于 BDD 的功能文件的新手 我想知道是否有任何方法可以直接给出外部数据文件 例如 CSV 文件 的文件路径 并获取用于创建测试脚本的参数值 您可以向功能添加带有参数的标签 data path data jso
  • Retrofit 2.0 如何解析嵌套的 JSON 对象?

    我们的团队决定使用改造2 0 http square github io retrofit 我正在对这个库进行一些初步研究 如标题所述 我想通过 Android 应用程序中的 Retrofit 2 0 解析一些嵌套的 JSON 对象 例如
  • bash + for循环+输出索引号和元素

    这是我的数组 ARRAY one two three 如何打印数组以便得到如下输出 index i element i 使用printf or for我在下面使用的循环 1 one 2 two 3 three 一些笔记供我参考 打印数组的1
  • 如何在java中读取和写入对象到文本文件?

    我有一个对象数组 我想将它们写入文本文件中 这样我以后就可以将对象读回到数组中 我该怎么做呢 使用序列化 反序列化不起作用 public static void readdata ObjectInputStream input null t
  • 如何在 Chrome 扩展中加载 Google Analytics 和 Facebook SDK?

    我正在使用 Kango 框架开发 chrome 扩展 我想同时使用 Google Analytics 和 facebook SDK 我编辑了清单文件以包含以下内容 content security policy script src sel
  • 左边补零

    我想在字符串中向左填充每个数字 必须是 8 位数字 e g asd 123 rete gt asd 00000123 rete 4444 my text gt 00004444 my text 是否可以使用正则表达式来做到这一点 尤其Reg
  • 如何使用 Twitter Bootstrap 指定多个 javascript 模式参数?

    我有一个使用 Twitter Bootstrap 创建的模式 我想用javascript打开 现在我有以下内容 但是 我还想包括背景和键盘属性 Twitter 的文档将选项显示为 my modal modal keyboard true m
  • 自定义 SAML 应用程序出现 AWS SSO“无访问错误”

    我正在尝试使用 AWS SSO 设置自定义 SAML 2 0 应用程序 但是 我从网络选项卡中收到以下错误 Status code 403 message No access type com amazonaws switchboard p
  • Spring Boot:使用不同的 Tomcat 版本

    在 Spring Boot 文档中有一个部分将 Tomcat 7 x 或 8 0 与 Gradle 结合使用 https docs spring io spring boot docs current reference html howt
  • 从 Java 类生成 XML 模式(或相反)

    我想为我的项目生成一些 XML 模式 我有一些 Java 类 例如 package com fortresswars entity import com fortresswars entity properties Armor import
  • Corona/Box2D 检测与非移动静态物体的碰撞

    出于发帖原因 这是我正在尝试做的事情的简单版本 在屏幕上我有一个简单的圆形对象 它是静态的并且不会移动 然后用户可以拖放一条直线 如果该线穿过该圆圈 我希望触发碰撞事件 看来除非其中一个物体正在移动 否则永远不会检测到碰撞 绘制线条时能否检
  • 如何在 ggplot2 中围绕轴刻度标签创建一个框?

    出于多种原因 我试图复制下面所示的怪诞情节 它违反了良好数据可视化的许多规则 因此出于培训目的 我的目标是使用ggplot2并解构它 一次删除或修改一个选择不当的功能 使用底部复制的数据和图下方的代码 我已经接近目标 但无法弄清楚如何包含一
  • 通过数据管道截断 DynamoDb 或重写数据

    可以通过数据管道转储 DynamoDb 也可以将数据导入 DynamoDb 导入进展顺利 但数据始终附加到 DynamoDb 中已存在的数据 目前 我找到了扫描 DynamoDb 并逐一或通过批量删除项目的工作示例 但无论如何 对于大量数据
  • 高尔夫代码:ASCII 艺术编号 [重复]

    这个问题在这里已经有答案了 可能的重复 代码高尔夫 横幅生成 https stackoverflow com questions 2985540 code golf banner generation 发布您将数字转换为 ASCII 艺术数
  • 使用bluez5读取蓝牙低能耗信标的RSSI

    我想在 2 个蓝牙 le USB 适配器上同时读取蓝牙低功耗信标的 RSSI 我使用的是带有 bluez 5 和 LogiLink BT0015 适配器 CSR 芯片 的 fedora 20 系统 当仅连接一个适配器时 我的代码就像一个魅力