Android蓝牙

来源:互联网 发布:utorrent mac版打不开 编辑:程序博客网 时间:2024/04/30 00:12

藍牙簡介

1.蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。
2.Bluetooth 技术在 2.4 GHz 波段运行,该波段是一种无需申请许可证的工业、科技、医学 (ISM)无线电波段。正因如此,使用 Bluetooth技术不需要支付任何费用
3.蓝牙的数据速率为1Mb/s。时分双工传输方案被用来实现全双工传输。 使用IEEE802.15协议。
 
藍牙支持的profile
1.Android藍牙使用的協議棧是Bluez,在linux各發行版本廣泛使用,根據Bluz官網最新信息,Bluez支持以下profile
2.Profiles provided by BlueZ:
3.A2DP 1.2 基于该协议就能通过以蓝牙方式传输高品质的音乐了
4.AVRCP 1.3 用于许可单个远程控制设备(或其它设备)控制所有用户可以接入的A/V设备。
5.DI 1.3  Device ID Profile
6.HDP 1.0 Health Device Profile 蓝牙技术在医疗和健康器械的应用
7.HID 1.0 人机接口设备,可支援滑鼠、鍵盤功能
8.HFP 1.5Hands-Free Profile免提配置文件
9.PAN 1.0 個人區域網路規範
10.SPP 1.1 序列埠規範用來取代有線的 RS-232 Cable
 
Android藍牙的架构
 
 
藍牙開啟過程
BluetoothAdapterMachine Framework状态机工作機制
 
右边是开启过程,左边是关闭过程。每个状态之间的是触发的事件
 
 
BlueZ通信
1.Android藍牙協議棧採用的是BlueZ,之間採用D-bus方式通信
2.首先在init.rc通过service启动d-bus的守护进程

service dbus /system/bin/dbus-daemon --system –nofork

    socket dbus stream 660bluetoothbluetooth    

    user bluetooth

    group bluetoothnet_bt_admin

3.androidbluetooth上层通过JNI调用到android_server_BluetoothService.cpp文件里的initializeNativeDataNative()函数,这里bluetooth用户获取系统总线
这个总线就是以后和bluez进行通信的渠道。譬如说discovery行为,在函数startDiscoveryNative()

        msg =dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,

                                       get_adapter_path(env, object),

                                       DBUS_ADAPTER_IFACE, "StartDiscovery");

然后在BlueZ会调用StartDiscovery
4.External\bluetooth\bluez\src\Adapter.c

    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命令

v1 . #  hciconfig(查看藍牙設備詳細信息)

     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

v2 . #  hciconfig hci0  up/down 开启关闭蓝牙

    [  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

v 3. hcitool scan  (掃描藍牙設備)

            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

v4. #  hciattachBlueZ核心子系统使用hciattach守护进程添加指定的硬件串口驱动。),它一般寫到init.rc裏面開機自啟動,也可以手動輸入命令啟動.以下是init.rc启动例子。

                   servicehciattach /system/bin/hciattach -n -s 3686400 /dev/tty01any 3686400      

                             user bluetooth

        group bluetoothnet_bt_admin

        disabled?

        oneshot

 

 

HCI命令是用戶直接控制藍牙模塊的方式,如果這些命令不能正常執行。毫無疑問是驅動移植沒做好。如果這些命令都正常運行,藍牙還沒用,那就是用戶上層的事情,包括BlueZ協議棧、Hal層都有可能、Framework