可能重复:
在Android上使用蓝牙的服务发现失败异常
好吧,过去两三天我一直在阅读很多话题,似乎没有人问过这个问题.
我正在为我的andriod设备编写PC端服务器,这是用于交换一些信息和一般调试.最终我将连接到SPP设备来控制微控制器.
我已经管理,使用以下(Android到PC)连接到rfcomm通道11并在我的Android设备和我的电脑之间交换数据.
方法m = device.getClass().getMethod("createRfcommSocket",new Class [] {int.class}); tmp =(BluetoothSocket)m.invoke(device,Integer.valueOf(11));
我尝试了createRfcommSocketToServiceRecord(UUID)方法,绝对没有运气.
对于PC端,我一直在使用C Bluez堆栈用于linux.我有以下代码注册服务并打开服务器套接字:
int main(int argc, char **argv)
{
struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 };
char buf[1024] = { 0 };
char str[1024] = { 0 };
int s, client, bytes_read;
sdp_session_t *session;
socklen_t opt = sizeof(rem_addr);
session = register_service();
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
loc_addr.rc_family = AF_BLUETOOTH;
loc_addr.rc_bdaddr = *BDADDR_ANY;
loc_addr.rc_channel = (uint8_t) 11;
bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr));
listen(s, …
Run Code Online (Sandbox Code Playgroud) 连接设备并按下按钮时hcidump的输出是:
HCI嗅探器 - 蓝牙数据包分析器版本2.2
设备:hci0 snap_len:1028过滤器:0xffffffff
HCI事件:模式更改(0x14)plen 6
状态0x00句柄21模式0x00间隔0
模式:活动
ACL数据:句柄21标志0x02 dlen 17
L2CAP(d):cid 0x0041 len 13 [psm 0]
<ACL数据:句柄21标志0x00 dlen 14
L2CAP(d):cid 0x0047 len 10 [psm 0]
<ACL数据:句柄21标志0x00 dlen 22
L2CAP(d):cid 0x0047 len 18 [psm 0]
<ACL数据:句柄21标志0x00 dlen 22
L2CAP (d):cid 0x0047 len 18 [psm 0]
HCI事件:已完成数据包的数量(0x13)plen 5
处理21个数据包1个
ACL数据:句柄21个标志0x02 dlen 18
L2CAP(d):cid 0x0041 len 14 [psm 0]
<ACL数据:句柄21标志0x00 dlen 14
L2CAP(d):cid 0x0047 len 10 [psm 0]
HCI事件:已完成数据包数(0x13)plen 5
句柄21数据包1
HCI事件:已完成数据包数(0x13)plen 5个
句柄21个数据包1个
HCI事件:已完成数据包的数量(0x13)plen …
是否可以修改此代码以包含蓝牙低功耗设备? https://code.google.com/p/pybluez/source/browse/trunk/examples/advanced/inquiry-with-rssi.py?r=1
我可以找到像我的手机和其他蓝牙4.0设备的设备,但不能找到任何BLE.如果无法修改,是否可以运行hcitool lescan并从python中的hci dump中提取数据?我可以使用这些工具查看我正在寻找的设备,并在hcidump中提供RSSI,这是我的最终目标.从BLE设备获取MAC地址和RSSI.
谢谢!
Linux 的 libbluetooth2-dev 的 Windows 等价物是什么?我正在尝试在我的英特尔 Edison 上运行 simple_scan.c 以进行支持 BlueZ 的蓝牙扫描,但我需要蓝牙库。这是 linux 的解决方案:bluetooth/bluetooth.h 在 Linux 中位于何处?. 但是我在哪里可以在我的 Windows 设备上下载等效的库?
对于从 BLE 设备读取数据块(9000 字节)的应用程序,我需要尽可能快地修改连接间隔。
我正在使用 Linux 内核 = 3.14.43 运行 BlueZ 堆栈 4.101
目前,我可以在连接设备后使用“hcitool lecup”来做到这一点,但这意味着先“连接”,然后使用“hcitool con”获取连接句柄,最后使用 min 和 max=6(最小值 = 7.5 毫秒)。
这工作正常,但“hcitool lecup”在需要数百毫秒的“连接”后需要大约 600 毫秒。当设备断开连接时,连接参数会重置,这意味着必须在每个连接上执行此序列。
使用 BlueZ 工具(hcitool 和 gatttool)是否可以在连接过程中直接传递连接参数,或者是否必须先连接然后在第二步中修改连接参数。
非常感谢
我在 Ubuntu 20.04 和 Raspberry Pi OS 5.10 上使用它,但这不是与 Linux 相关的问题。
当我使用名为 Bettercap 2 的 Go 程序( https://www.bettercap.org/和存储库: https: //github.com/bettercap/bettercap)扫描蓝牙设备时,我遇到了问题” ble.recon on”使用不同的蓝牙适配器。
当我使用 Realtek RTL8761b 驱动程序 ( MPOW MPBH456AB ) 与适配器一起使用时,您可以在亚马逊上找到它,效果很好,但是当我使用 NordicSemi nrf52840 适配器时 ( https://www.nordicsemi.com/Products/Development-hardware/nrf52840 -dongle)这是我的目标,用Zephyr RTOS的hci_usb示例(https://github.com/zephyrproject-rtos/zephyr/tree/main/samples/bluetooth/hci_usb)进行闪烁,该示例应该使用蓝牙来打开任何微控制器进入任何计算机都应该识别的常规蓝牙适配器时,它会抛出以下错误:
>> ble.recon on
panic: runtime error: slice bounds out of range [:1] with capacity 0
goroutine 1 [running]:
github.com/bettercap/gatt/linux/cmd.(*Cmd).SendAndCheckResp(0x1c637c0, 0xa0c760, 0x1c64fe8, 0x1c6501c, 0x1, 0x1, 0x0, 0x0)
/home/pi/go/pkg/mod/github.com/bettercap/gatt@v0.0.0-20210514133428-df6e615f2f67/linux/cmd/cmd.go:98 +0x1b4
github.com/bettercap/gatt/linux.(*HCI).resetDevice(0x18ac0a0, 0x93dc10, 0x18ac0a0)
/home/pi/go/pkg/mod/github.com/bettercap/gatt@v0.0.0-20210514133428-df6e615f2f67/linux/hci.go:273 +0x2f0
github.com/bettercap/gatt/linux.NewHCI(0xffffffff, 0x184fd01, …
Run Code Online (Sandbox Code Playgroud) 我将RedBearLab BLE屏蔽连接到Arduino UNO R3.我可以使用Rasp-Pi(附带的CSR4.0加密狗)中的gatttool连接到它.我有一些传感器(FSR)连接到模拟引脚,LED连接到Arduino中的数字引脚.我的目标是读取/写入通过BLE连接到Arduino的任何东西.
作为样本,我正在研究这个链接.看来我需要知道传感器的手柄,配置寄存器#等来读/写.但我不知道如何找到与连接到屏蔽的传感器相关的手柄/ uuid.
例如,我在下面看到.
[xx:xx:xx:xx:xx:xx][LE]> char-desc
handle: 0x0001, uuid: 2800
handle: 0x0002, uuid: 2803
handle: 0x0003, uuid: 2a00
handle: 0x0004, uuid: 2803
handle: 0x0005, uuid: 2a01
handle: 0x0006, uuid: 2803
handle: 0x0007, uuid: 2a04
handle: 0x0008, uuid: 2800
handle: 0x0009, uuid: 2800
handle: 0x000a, uuid: 2803
handle: 0x000b, uuid: 713d0003-503e-4c75-ba94-3148f18d941e
handle: 0x000c, uuid: 2803
handle: 0x000d, uuid: 713d0002-503e-4c75-ba94-3148f18d941e
handle: 0x000e, uuid: 2902
handle: 0x000f, uuid: 2800
handle: 0x0010, uuid: 2803
handle: 0x0011, uuid: 2a27
Discover …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 bluez DBus API 扫描蓝牙 LE 设备。我已经安装了 bluez-5.25 使用
--enable-experimental
Run Code Online (Sandbox Code Playgroud)
配置选项。我可以在构建中看到已经编译了支持。 HeartBeat、ThermoMeter 等接口出现在 DBus 中,但没有出现在
org.bluez.ProximityMonitor1
Run Code Online (Sandbox Code Playgroud)
界面。据我所知,需要此接口来永久扫描蓝牙 LE 设备并提供有关距离的信息。但我刚刚开始处理 bluez,所以我不确定。
DBus API 中是否提供了所有必要的东西?永久扫描 LE 设备需要什么?
In our system, we have a BLE Peripheral (in this example, running on RPi4) using BlueZ 5.50.
We have an iOS app that connects to this Peripheral as a Central.
This connection can be seen in btmon
, all looks ok:
> HCI Event: LE Meta Event (0x3e) plen 31 #189 [hci0] 1157.975252
LE Enhanced Connection Complete (0x0a)
Status: Success (0x00)
Handle: 1
Role: Slave (0x01)
Peer address type: Random (0x01)
Peer address: 51:A3:4E:3C:B5:D6 (Resolvable)
Local resolvable private address: 00:00:00:00:00:00 …
Run Code Online (Sandbox Code Playgroud) 通过查看代码示例,它看起来hci_get_route(NULL)
通常用于获取本地计算机上蓝牙设备的设备 ID。很好,我能理解。我想,我的困惑仅在具有多个蓝牙设备且参数为非hci_get_route()
NULL 的系统上才有意义。hci.c的源代码显示了以下实现:
int hci_get_route(bdaddr_t *bdaddr)
{
int dev_id;
dev_id = hci_for_each_dev(HCI_UP, __other_bdaddr,
(long) (bdaddr ? bdaddr : BDADDR_ANY));
if (dev_id < 0)
dev_id = hci_for_each_dev(HCI_UP, __same_bdaddr,
(long) (bdaddr ? bdaddr : BDADDR_ANY));
return dev_id;
}
Run Code Online (Sandbox Code Playgroud)
我不会在这里复制hci_for_each_dev()
、__other_bdaddr()
、 或的整个代码__same_bdaddr()
,但简而言之,如果提供非 NULL ,该函数将首先尝试查找地址与所提供的地址不bdaddr_t*
匹配的设备,然后,仅失败后,选择地址匹配的设备。我回顾了引入这个函数的提交,它略有不同,但仍然使用:__other_bdaddr
int hci_get_route(bdaddr_t *bdaddr)
{
if (bdaddr)
return hci_for_each_dev(HCI_UP, __other_bdaddr, (long) bdaddr);
else
return hci_for_each_dev(HCI_UP, NULL, 0);
}
Run Code Online (Sandbox Code Playgroud)
即使这个初始版本的出现,也是有意为之,做同样的事情,它只是不包括使用__same_bdaddr
.
鉴于没有这个函数的文档(我可以找到),似乎这个库的新手用户会期望使用参数bdaddr_t* …