我正在使用(每个人最喜欢的)BlueZ 5.40编译并运行实验性功能,我需要扫描LE设备,配对并连接到一个,并通过D-Bus API读/写特性。我研究了hcitool,gatttool和bluetootctl的来源,并使用GDBus做了一个基本的应用程序。但是,它有几个问题。
之后我使用gatttool和simple-agent作为解决方法来创建对象路径然后使用我的程序连接但是我遇到了另一个问题:
每当我只使用Connect和Disconnect功能时,一切似乎都运行良好,但对于这类应用程序的使用是有限的。 所以我的问题是:
如何使用GDBus扫描LE设备?如果那是不可能的,如何手动添加设备或说服bluetoothd为我做这件事?
如何正确阅读特征?
即使缩短后代码也很长,所以我把它放在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)
答案 0 :(得分:2)
最后做对了 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})”。例如,SetDiscoveryFilter的GVariant *args = g_variant_new_parsed("({'Transport': <%s>},)", "le");
和GVariant *args = g_variant_new_parsed("({'offset': <%q>},)", offset);
工作正常。 答案 1 :(得分:1)
您根本不应使用Bluez C功能。而是使用较新的GDBus函数。在https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/adapter-api.txt,您可以了解如何扫描。致电StartDiscovery。然后将在发现DBus设备时添加它们。收听接口添加的信号以检测新设备。很奇怪,你说没有检测到任何设备,因为它应该可以工作。
ReadValue方法应该有效。您在阅读时是否已连接到设备?
还要使用hciconfig检查hci图层是否为UP。如果没有任何作用,你可以随时运行&#34; sudo btmon&#34;了解正在发生的事情。