[英]Basic BLE client with D-Bus BlueZ
我正在使用(每个人都喜欢的)BlueZ 5.40编译并运行实验功能,我需要扫描LE设备,配对并连接到一个设备,并通过D-Bus API读取/写入特征。 我研究了hcitool,gatttool和bluetootctl的来源,并使用GDBus进行了基本应用。 但是,它有几个问题。
之后,我使用gatttool和simple-agent作为解决方法来创建对象路径,然后使用我的程序进行连接,但是遇到另一个问题:
每当我仅使用Connect和Disconnect功能时,一切似乎都可以正常工作,但是用于此类应用程序的功能却很有限。 所以我的问题是:
如何使用GDBus扫描LE设备? 如果无法实现,该如何手动添加设备或说服蓝牙为我完成此操作?
如何正确阅读特征?
即使缩短,代码也相当冗长,因此我将其放在pastebin上: http://pastebin.com/YNLMF0qC 。
使用g++ -std=c++11 $(pkg-config --cflags glib-2.0 gobject-2.0 gio-2.0) ./main.cpp $(pkg-config --libs glib-2.0 gobject-2.0 gio-2.0 bluez)
编译g++ -std=c++11 $(pkg-config --cflags glib-2.0 gobject-2.0 gio-2.0) ./main.cpp $(pkg-config --libs glib-2.0 gobject-2.0 gio-2.0 bluez)
终于正确了。
1.最近由BlueZ 5.41解决。 我的设备是“可扫描的”,但不是“可发现的”。 这意味着它广播了广告包,但是因为它不允许没有PIN的连接才能发现更多服务。 在BlueZ 5.41中,如果使用SetDiscoveryFilter设置任何过滤器,这些设备在扫描过程中也将变得可见。 这是https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/adapter-api.txt的最新内容(而且一点都不直观!):
设置发现过滤器后,将创建设备对象,因为将发现具有匹配条件的新设备,无论它们是可连接的还是可发现的,这都可以侦听不可连接和不可发现的设备。
"(a{sv})"
而不是“({{sv})””。 例如GVariant *args = g_variant_new_parsed("({'Transport': <%s>},)", "le");
对于SetDiscoveryFilter和GVariant *args = g_variant_new_parsed("({'offset': <%q>},)", offset);
工作正常。 您根本不应该使用Bluez C函数。 而是使用更新的GDBus函数。 在https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/adapter-api.txt中,您可以找到扫描方法。 呼叫StartDiscovery。 发现时将添加DBus设备。 收听添加接口的信号以检测新设备。 奇怪的是您说没有设备被检测到,因为它可以工作。
ReadValue方法应该起作用。 您阅读时是否已连接到设备?
还要使用hciconfig检查hci层是否已启动。 如果没有任何效果,则可以始终运行“ sudo btmon”以捕获发生的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.