Android蓝牙

藍牙簡介

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 p rovided 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.5 Hands-Free Profile 免提配置文件
9.PAN 1.0 個人區域網路規範
10.SPP 1.1 序列埠規範用來取代有線的 RS-232 Cable
 
Android 藍牙的架构
Android蓝牙_第1张图片
 
 
藍牙開啟過程
Android蓝牙_第2张图片
BluetoothAdapterMachine Framework状态机 工作機制
Android蓝牙_第3张图片
 
右边是开启过程,左边是关闭过程。每个状态之间的是触发的事件
 
 
BlueZ 通信
1.Android 藍牙協議棧採用的是 BlueZ ,之間採用 D-bus 方式通信
2.首先在 init.rc 通过 service 启动 d-bus 的守护进程

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

    socket dbus stream 660 bluetoothbluetooth    

    user bluetooth

    group bluetoothnet_bt_admin

3.android bluetooth 上层通过 JNI 调用到 android_server_Bluetooth Service .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命令是异步处理的,並且也可以并行处理,所以后面的命令可能比前面的命令先结束。

 

 

Android蓝牙_第4张图片

 

HCI命令

v 1 . #  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

v 2 . #  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

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

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

                             user bluetooth

        group bluetoothnet_bt_admin

        disabled?

        oneshot

 

 

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

 

你可能感兴趣的:(Android蓝牙)