Linux系统上低功耗蓝牙遥控器开发项目笔记

来源:互联网 发布:淘宝有平板客户端吗 编辑:程序博客网 时间:2024/05/16 08:04

BLUEZ版本:bluez5.30

自定义宏CLOSE_TEST,用于关闭部分源代码。

BLE遥控器的MAC地址:7C:66:9D:8A:48:BF


DBUS通信:

generic_message会根据method的name,调用对应的函数来处理消息。

g_dbus_proxy_method_call会在blutoothctl工具中调用,用于扫描配对等一系列操作,它的实现函数可作为应用层编写扫描配对操作等实现代码的示例。


扫描:

1.扫描设备时,扫描到一个设备就会调用一次device_found_callback。

2.bluetoothd启动后,会调用trigger_passive_scanning函数,即适配器默认启动被动式扫描来监听远端设备的广播。如果使用bluetoothctl工具开启scan on方式,则适配器会关闭被动扫描后启动主动式扫描。使用scan off停止扫描时,会调用src/adapter.c文件中的stop_discovery函数,并在其中启动被动式扫描。

3.g_dbus_register_interface在device_new中被调用。

4.load_devices会加载断电前保存在文件中的的已配对设备。


配对:
1.bluez中会调用new_long_term_key_callback保存配对LE设备的密钥。

2.配对完成后,bluez中会调用device_svc_resolved函数来通知应用层设备配对的属性已发生变化。

3.会调用input_device_register来添加org.bluez.Input1接口。

4.应用层发送取消配对消息,bluez中使用的是src/adapter.c文件中remove_device函数来完成取消配对的。

5.应用层发送配对请求消息,bluez中使用的是src/device.c文件中pair_device函数来完成配对的。

6.设备配对后,重启bluetoothd时程序会调用load_devices来加载已配对设备。

7.配对后将秘钥保存到文件中,则设备的绑定状态被设置为true。

8.device_browse_gatt中关掉部分代码if (!device->le_state.svc_resolved)的相关判断,以解决配对BLE遥控器失败的问题。

 

连接和断开连接:
1.使用bluetoothctl工具connect [addr]方式连接遥控器,bletoothd会调用src/device.c中的device_connect函数,disconnect[addr]命令会调用同样C文件中的device_disconnect函数。
2.连接成功后调用device_add_connection函数来发送消息通知APP层连接事件

3.process_auth_queue会在遥控器休眠再次连接时调用,目前存在拒绝遥控器连接的情况。
取消连接后再次连接时会调用btd_request_authorization函数。

4.btd_adapter_remove_bonding函数会在取消连接时调用,该函数实现的是取消配对功能,需要确定是否取消连接后再次去连接不成功与此有关。

5.btd_service_connect中会去调用input_device_connect函数来连接遥控器。

6.device_attach_att,连接成功后会回调connected_callback。如果连接BLE遥控器后,断电遥控器,会调用att_disconnected_cb函数,提示断开连接的原因是connection time out,如果重新上电遥控器,机顶盒会自动重连遥控器,bluez中会调用stop_passive_scanning完成连接工作。

7.断开连接时,发送应答消息给APP层的函数是device_remove_connection。


蓝牙中primary service、descriptor、characteristic的查找
1.查找首要服务

   opcode为BT_ATT_OP_READ_BY_GRP_TYPE_REQ,pdu由start_handle(2个字节)+end_handle(2个字节)+GATT_PRIM_SVC_UUID(值为0x2800)共6个字节数据。

   通过bt_att_send函数发送,并设置响应回调函数read_by_grp_type_cb。在收到服务器端数据时,该回调函数会被调用,在里面可以获得数据总长度list_length及每组数据的长度data_length,如果发现本次收到的PDU数据的终止句柄last_handle不等于设置的end_handle,则在回调中再次使用bt_att_send查找首要服务,不过这次设置的start_handle值就应该是last_handle+1了。


2.查找某服务的characteristic

    opcode为ATT_OP_READ_BY_TYPE_REQ,pdu组成为opcode(1byte)+ start_handle(2 byte)+end_handle(2byte)+character_uuid(值为0x2803)

    通过bt_att_send函数发送,并设置响应回调函数char_discovered_cb。传递到该回调函数的pdu组成为opcode(ATT_OP_READ_BY_TYPE_RESP,1byte)+elen(1byte,代表每组数据的长度)+attribute_data_list(长度不固定)

    attribute_data_list数据由多组数据组成,每组数据的结构如下:

    handle(2byte)+property(1byte)+value_handle(2byte)+uuid(2byte或者16byte)

 


 3.查找某characteristic的所有descriptor

     opcode为ATT_OP_FIND_INFO_REQ,pdu组成为opcode(1byte)+start_handle(2byte)+end_handle(2byte)。

     通过bt_att_send函数发送,并设置响应回调函数desc_discovered_cb。传递到该回调函数的pdu组成为opcode(ATT_OP_FIND_INFO_RESP,1byte)+fomat(1byte,代表UUID是2字节还是16字节)+descriptor_data_list(长度不固定)

     descriptor_data_list数据由多组数据组成,每组数据的结构如下:

     handle(2byte)+UUID(2byte或者16byte)





./dbus-send --system --print-reply --dest=org.bluez  /org/bluez/hci0   org.freedesktop.DBus.Properties.Get  string:'org.bluez.Adapter1' string:'Address'



0 0