使用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 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 可变参数模板参数解包

    对于每个参数 我需要应用两个嵌套函数 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 系统 当仅连接一个适配器时 我的代码就像一个魅力