blueZ5的dbus API开发

       最近我们领导让我做了个基于blueZ5的dbus接口的自动配对功能,之前没接触过,走了很多冤枉路,做点记录,也和大家一起探讨。

      首先,对于dbus的远程调用来说每次调用dbus_message_new_method_call函数来构造方法信息时都需要传入bus name,object path,interface,method name四个参数。对于bus name,interface,method name这三个参数都是固定的(可以在blueZ源码的doc目录下的文件中找到)而对于object path这个参数,需要通过远程调用某种方法来获取,而在blueZ4中获取的方法和blueZ5中有很大的区别。blueZ4中org.bluez.Adapter这个接口的object path是通过远程调用DefaultAdapter方法来获取的。而在blueZ5中通过“/”这个目录下的org.freedesktop.DBus.ObjectManager接口的GetManagedObject方法可以获取当前所能获取到的所有的object path,这个object path下的所有的interface以及interface可能存在的property。

     其次,之前对于整个过程没有很好的理解,特别是扫描完成后,如何获取到扫描到的蓝牙设备,刚开始一直以为需要扫描一段时间后远程调用某种方法去读,而且之前查资料看到org.bluez.Device1这个接口可以操作设备,所以一直觉得这个接口下面的property可以读取到所有扫描到的设备的信息,而且我一直觉得这个接口应该是在某个controller的object path下面的,可是却一直找不到这个接口,后来才发现在BLUEZ5中每扫描到一个设备会为这个设备添加一个object path,然后每个objec path下面会有org.bluez.Device1接口。以便我们获取设备的信息。而且不是我们主动去读的,需要我们注册一个调用dbus_connection_add_filter函数来添加一个过滤器(其实就是一个信息处理函数)。而每扫描到一个设备之后,service就会发一个信号出来,而这个过滤器就是处理信号信息的,另外需要通知dbus我们感兴趣的信息类型。当然光添加一个过滤器是没有用的,需要将“/”和agent的目录都注册到dbus中另外需要远程调用RegisterAgent方法注册一个代理才能收到需要的信号。

        再次,在告知dbus我们感兴趣的信息类型的时候blueZ4和blueZ5也有一些区别,在bluez4中通过dbus_bus_add_match函数和dbus_connection_flush告知通知dbus我们感兴趣的需要过滤器处理的信息,但是在blueZ5中需要远程调用AddMatch方法来确定。而AddMatch这个方法比较特殊,构造这个方法的时候bus name和interface都是org.freedesktop.DBus,object path为/org/freedesktop/DBus。

        最后,我还有一个问题没有明白,哪位大神要是了解可以帮我解答一下在调用dbus_connection_register_object_path函数来注册path的时候参数里面那个DBusObjectPathVTable结构体是做什么用的,我给这个结构体的message_function成员赋值了一个函数,可是这个函数一直没有被调用,我不知道这个结构体的作用,以及这个函数什么情况下会别调用,查了好些资料也没查到。看了blueZ源码中bluetoothctl部分,看到这个函数里面会检查某些方法是否被执行了,然后发了个信号出去。不知道什么意思。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值