藍牙簡介
service dbus /system/bin/dbus-daemon --system –nofork
socket dbus stream 660 bluetoothbluetooth
user bluetooth
group bluetoothnet_bt_admin
msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,
get_adapter_path(env, object),
DBUS_ADAPTER_IFACE, "StartDiscovery");
Static GDBUSMethodTableadapter_method[]={
……
{“StartDiscovery”,””,””,adater_start_discovery}
……
}
这里会调用注册的对应函数adater_start_discovery继续完成discovery任务
Discovery完成之后会发出消息,在android_server_bluetoothEventLoop.cpp event_fileter()会接受并处理消息
藍牙HCI
主机控制接口(Host Controller Interface),属于蓝牙协议栈的一部分。蓝牙规范(官方spec)包含一个符合标准的接口定义(HCI),它为主机(上層)提供了直接控制 蓝牙硬件模块的方法和途径。通过HCI 可以把蓝牙模块和主机连接在一起,同時HCI命令也可提供給內外部使用,對藍牙模塊進行直接控制。
以下是主機和藍牙模塊雙向通信採用的方式
HCI命令数据包 (上層往下) 命令(command)由HCI驱动程序发至主机控制器
HCI事件数据包 (下層往上) 主机控制器以事件(event)方式通知HCI驱动程序
HCI命令是异步处理的,並且也可以并行处理,所以后面的命令可能比前面的命令先结束。
HCI命令
hci0: Type: BR/EDR Bus: UART
BD Address: D0:07:90:44:FB:B2 ACL MTU: 1021:4 SCO MTU: 180:4
DOWN
RX bytes:467 acl:0 sco:0 events:18 errors:0
TX bytes:99 acl:0 sco:0 commands:19 errors:0
[ 335.474273] (stc): st_register(2)
[ 335.478149] (stc): add_channel_to_table: id 2
[ 335.483062] (stc): st_register(3)
[ 335.487091] (stc): add_channel_to_table: id 3
[ 335.492004] (stc): st_register(4)
[ 335.495819] (stc): add_channel_to_table: id 4
[ 345.500885] (stc): remove_channel_from_table: id 2
[ 345.506317] (stc): remove_channel_from_table: id 3
[ 345.511962] (stc): remove_channel_from_table: id 4
Scanning ...
20:D6:07:C0:E5:98 Nexus S
34:15:9E:8C:41:BE "Eason MacBook
88:53:2E:69:B1:20 IANC-20810824
88:53:2E:69:F6:71 IANC-20901345-H
service hciattach /system/bin/hciattach -n -s 3686400 /dev/tty01any 3686400
user bluetooth
group bluetoothnet_bt_admin
disabled?
oneshot
HCI命令是用戶直接控制藍牙模塊的方式,如果這些命令不能正常執行。毫無疑問是驅動移植沒做好。如果這些命令都正常運行,藍牙還沒用,那就是用戶上層的事情,包括BlueZ協議棧、Hal層都有可能、Framework。