蓝牙协议分析_基本概念及Android4.4 BT代码架构

Android系统之蓝牙 专栏收录该内容
4 篇文章 0 订阅

1. 前言

自1994年由爱立信推出至今,蓝牙技术已经走过了20个岁月。从最初的Bluetooth V1.0,到如今的Bluetooth V4.0(最新的为V4.1,2013年底发布),经历了近9个版本的修订后,发展为当前的状况。

说实话,如今的蓝牙4.0,简直是一个大杂烩:BR/EDR沿用旧的蓝牙规范;LE抄袭802.15.4;AMP直接使用802.11。而这一切的目的,就是以兼容性和易用性为基础,在功耗和传输速率之间左右为难。蜗蜗以为,这并不是优雅的设计。

不过没关系,存在即合理。因此蜗蜗就开出了这样一个专题,希望能够将蓝牙技术上上下下的知识,整理出来,以便在加深自己对蓝牙技术的理解的同时,能够给从事蓝牙相关工作的读者一点启发。

本文是这个专题的第一篇文章,主要基于蓝牙4.0规范(Core_V4.0.pdf),描述蓝牙技术的基本概念。

2. 蓝牙技术的概述

2.1 两种蓝牙技术:Basic Rate(BR)和Low Energy(LE)

蓝牙协议包括两种技术:Basic Rate(简称BR)和Low Energy(简称LE)。这两种技术,都包括搜索(discovery)管理、连接(connection)管理等机制,但它们是不能互通的!这也是蜗蜗抱怨蓝牙协议不优雅的原因之一。

厂商要么实现这两种技术中的一种,这时就只能和同样实现了这个技术的设备互通,而不能和实现另外一种技术的设备互通。如果厂商要确保能和所有的蓝牙设备互通,那么就只能同时实现两种技术,而不去管是否真的需要,这样就能碰到什么人说什么话了!

2.1.1 Basic Rate(BR)

Basic Rate是正宗的蓝牙技术,可以包括可选(optional)的EDR(Enhanced Data Rate)技术,以及交替使用的(Alternate)的MAC(Media Access Control)层和PHY层扩展(简称AMP)。说着真拗口,不过通过背后的应用场景,就好理解了:

蓝牙诞生之初,使用的是BR技术,此时蓝牙的理论传输速率,只能达到721.2Kbps。在那个年代,56Kbps的Modem就是高大上了,这个速度可以说是惊为天人了啊!但是科技变化太快了,BR技术转眼就过时了。那怎么办呢?缝缝补补一下,增强速度呗,Enhanced Data Rate就出现了。

使用EDR技术的蓝牙,理论速率可以达到2.1Mbps。这一次的升级换代,还算优雅,因为没有改变任何的硬件架构、软件架构和使用方式上的改变。

也许你也猜到了,EDR又落伍了,看看人家WIFI(WLAN),几十Mbps,上百Mbps,咱们才2.1Mbps,也太寒酸了吧!那怎么办呢?蓝牙组织想了个坏主意:哎,WIFI!把你的物理层和MAC层借我用用呗!这就是AMP(Alternate MAC and PHY layer extension)。艾玛,终于松口气了,我们可以达到24Mbps了。

不过呢,由于蓝牙自身的物理层和AMP技术差异太明显了,这次扩展只能是交替使用(Alternate)的,也就是说,有我(BR/EDR)没你(AMP)。嗯!不优雅!

埋个问题:只能交替使用,那它们怎么切换呢?蜗蜗会在后续的内容中,根据主流蓝牙芯片的解决方案,来探讨一下该问题。

【注1:细心的读者可能会注意到,这里特别强调了optional和alternate这两个字眼,这是蓝牙Spec的原话。它意味着,BR和EDR是可以同时存在的,但BR/EDR和AMP只能二选一。】

2.1.2 Low Energy(LE)

上面所讲的BR技术的进化路线,就是传输速率的加快、加快、再加快。但能量是守恒的,你想传的更快,代价就是消耗更多的能量。而有很多的应用场景,并不关心传输速率,反而非常关心功耗。这就是Bluetooth LE(称作蓝牙低功耗)产生的背景。

LE技术相比BR技术,差异非常大,或者说就是两种不同的技术,凑巧都加一个“蓝牙”的前缀而已。后面我们会详细的解释这种差异,以及LE的行为特征。

2.2 蓝牙系统的组成

蓝牙系统的组成,涉及到Bluetooth Application、Bluetooth Core、Bluetooth Host、Bluetooth Controller等词汇,不知道是因为对英文理解的歧义,还是因为蓝牙规范本身定义的歧义,蜗蜗理解这些词汇时感觉有点别扭。因此特意在这个章节中,对相关概念及其背后的意义进行说明。

蓝牙系统组成上图描述了蓝牙系统的组成, 我们需要注意如下特点:

1)图中所描述的蓝牙系统的组成部分,如Bluetooth Core和Bluetooth Application,如Host和Controller,都是指“逻辑实体”。所谓的“逻辑实体”,需要和日常生活中的“物理实体”区隔开。如在做电路设计时,一个蓝牙芯片、一个主控CPU,就是指物理实体。而蓝牙协议所描述的这些“逻辑实体”,不一定会和物理实体一一对应,如在实际应用中,Host和Bluetooth Application可能会位于同一个物理实体中(主控CPU),而Controller单独位于另一个物理实体中(蓝牙芯片)。

2)蓝牙协议规定了两个层次的协议,分别为蓝牙核心协议(Bluetooth Core)和蓝牙应用层协议(Bluetooth Application)。蓝牙核心协议关注对蓝牙核心技术的描述和规范,它只提供基础的机制,并不关心如何使用这些机制;蓝牙应用层协议,是在蓝牙核心协议的基础上,根据具体的应用需求,百花齐放,定义出各种各样的策略,如FTP、文件传输、局域网等等。

3)Bluetooth Core由两部分组成,Host和Controller。这两部分在不同的蓝牙技术中(BR/EDR、AMP、LE),承担角色略有不同,但大致的功能是相同的。Controller负责定义RF、Baseband等偏硬件的规范,并在这之上抽象出用于通信的逻辑链路(Logical Link);Host负责在逻辑链路的基础上,进行更为友好的封装,这样就可以屏蔽掉蓝牙技术的细节,让Bluetooth Application更为方便的使用。

4)在一个系统中,Host只有一个,但Controller可以一个,也可以有多个。如:单独的LE Controller;单独的BR/EDR Controller;单独的LE+BR/EDR Controller;在单独的BR/EDR Controller或LE+BR/EDR Controller基础上,增加一个活多个额外的AMP Controller。

【注2:有关Bluetooth Core的详细描述,蜗蜗会在下一篇文章中描述,本文就不再深入介绍了。】

3. BR/EDR vs LE vs AMP

From: http://www.wowotech.NET/bluetooth/bt_overview.html




二、蓝牙的协议框架
                     A2dp  Handset  opp Hid Health Pan Map  Dun... 
                                       |  |     |...
                                  CORE Stack Specification
                                          |
                                 Host Controller Interface
                                          |
                                        chip

三、Android 4.4(Kitkat)上蓝牙的启动流程

1.服务启动
系统启动时在SystemServer中注册蓝牙服务管理BluetoothManagerService服务:

            if (SystemProperties.get("ro.kernel.qemu").equals("1")) {
                Slog.i(TAG, "No Bluetooh Service (emulator)");
            } else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {
                Slog.i(TAG, "No Bluetooth Service (factory test)");
            } else if (!context.getPackageManager().hasSystemFeature
                       (PackageManager.FEATURE_BLUETOOTH)) {
                Slog.i(TAG, "No Bluetooth Service (Bluetooth Hardware Not Present)");
            } else if (disableBluetooth) {
                Slog.i(TAG, "Bluetooth Service disabled by config");
            } else {
                Slog.i(TAG, "Bluetooth Manager Service");
                bluetooth = new BluetoothManagerService(context);
                ServiceManager.addService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE, bluetooth);
            }

其它进程通过binder机制调用该服务,该服务属于综合服务管理类,包括AdapterService的启动、蓝牙适配器Adapter的管理等。

2.蓝牙启动模式

在4.4上蓝牙的启动模式分两种:QuietEnableMode和普通从“设置”里打开两种方式,前一中方式主要是为了NFC的Handover功能——在传递媒体大文件时nfc会打开蓝牙传送。

3.蓝牙关键服务启动和回调处理

下面就以在“设置”中打开为例描述下蓝牙的启动流程:

1)蓝牙所有的profiles位于上层代码中/packages/apps/Bluetooth目录下,常用的几个profiles包括A2dp、HeadSet、Opp、Hid、Pan等,并且Android 4.4上蓝牙协议栈采用的是BRCM和Google共同开发的bluedroid;

2)启动流程涉及代码结构Settings -> Bluetooth -> framework -> bluedroid -> hci -> chip,启动过程是先启动AdapterService并初始化bluedroid,然后启动所有的profile service(A2dpService、HeadsetService等),
成功加载所支持的profiles后使能bluedroid给蓝牙上电,蓝牙上电成功后回bluedroid回调类com_android_bluetooth_btservice_AdapterService.cpp的接口static void adapter_state_change_callback(bt_state_t status),通过JNI回调通知AdapterStateMachine更新Adapter状态,并且通知注册到AdapterService上回调:
void updateAdapterState(int prevState, int newState){
        if (mCallbacks !=null) {
            int n=mCallbacks.beginBroadcast();
            Log.d(TAG,"Broadcasting updateAdapterState() to " + n + " receivers.");
            for (int i=0; i <n;i++) {
                try {
                    mCallbacks.getBroadcastItem(i).onBluetoothStateChange(prevState,newState);
                }  catch (RemoteException e) {
                    Log.e(TAG, "Unable to call onBluetoothStateChange() on callback #" + i, e);
                }
            }
            mCallbacks.finishBroadcast();
        }
    }

mCallbacks该回调是BluetoothManagerService在成功bind到AdapterService时注册的回调mBluetoothCallback:
case MESSAGE_BLUETOOTH_SERVICE_CONNECTED:
                {
                    if (DBG) Log.d(TAG,"MESSAGE_BLUETOOTH_SERVICE_CONNECTED: " + msg.arg1);

                    mIsBluetoothServiceConnected = true;

                    IBinder service = (IBinder) msg.obj;
                    synchronized(mConnection) {
                        if (msg.arg1 == SERVICE_IBLUETOOTHGATT) {
                            mBluetoothGatt = IBluetoothGatt.Stub.asInterface(service);
                            break;
                        } // else must be SERVICE_IBLUETOOTH

                        //Remove timeout
                        mHandler.removeMessages(MESSAGE_TIMEOUT_BIND);

                        mBinding = false;
                        mBluetooth = IBluetooth.Stub.asInterface(service);

                        try {
                            boolean enableHciSnoopLog = (Settings.Secure.getInt(mContentResolver,
                                Settings.Secure.BLUETOOTH_HCI_LOG, 0) == 1);
                            if (!mBluetooth.configHciSnoopLog(enableHciSnoopLog)) {
                                Log.e(TAG,"IBluetooth.configHciSnoopLog return false");
                            }
                        } catch (RemoteException e) {
                            Log.e(TAG,"Unable to call configHciSnoopLog", e);
                        }

                        if (mConnection.isGetNameAddressOnly()) {
                            //Request GET NAME AND ADDRESS
                            Message getMsg = mHandler.obtainMessage(MESSAGE_GET_NAME_AND_ADDRESS);
                            mHandler.sendMessage(getMsg);
                            if (!mEnable) return;
                        }

                        mConnection.setGetNameAddressOnly(false);
                        //Register callback object
                        try {
                            mBluetooth.registerCallback(mBluetoothCallback); //注册Adapter状态变更的callback
                        } catch (RemoteException re) {
                            Log.e(TAG, "Unable to register BluetoothCallback",re);
                        }
...

而BluetoothManagerService注册该callback的目的是通知系统所有支持的profiles蓝牙的开启状态,用于更新每个profile和对应profile服务的bind,如通知BluetoothHeadset bind到HeadsetService上,通过binder机制获取HeadsetService的句柄进行相关操作:
BluetoothHeadset.java
final private IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
            new IBluetoothStateChangeCallback.Stub() {
                public void onBluetoothStateChange(boolean up) {
                    if (DBG) Log.d(TAG, "onBluetoothStateChange: up=" + up);
                    if (!up) {
                        if (VDBG) Log.d(TAG,"Unbinding service...");
                        synchronized (mConnection) {
                            try {
                                mService = null;
                                mContext.unbindService(mConnection);
                            } catch (Exception re) {
                                Log.e(TAG,"",re);
                            }
                        }
                    } else {
                        synchronized (mConnection) {
                            try {
                                if (mService == null) {
                                    if (VDBG) Log.d(TAG,"Binding service...");
                                    doBind();//绑定到HeadsetService
                                }
                            } catch (Exception re) {
                                Log.e(TAG,"",re);
                            }
                        }
                    }
                }
        };

那么既然profile要去bind到对应的service上,这些profile对应的Sercice又是什么时候注册的呢?
这个很关键,其实在我们使能蓝牙过程中,AdapaterStateMachine处于OffState状态,处理 msg.what == USER_TURN_ON
case USER_TURN_ON:
                   if (DBG) Log.d(TAG,"CURRENT_STATE=OFF, MESSAGE = USER_TURN_ON");
                   notifyAdapterStateChange(BluetoothAdapter.STATE_TURNING_ON);
                   mPendingCommandState.setTurningOn(true);
                   transitionTo(mPendingCommandState);
                   sendMessageDelayed(START_TIMEOUT, START_TIMEOUT_DELAY);
                   adapterService.processStart();//启动系统支持的所有profiles的services

对应调用AdapterService的接口:

    void processStart() {
        if (DBG) debugLog("processStart()");
        Class[] supportedProfileServices = Config.getSupportedProfiles();
        //Initialize data objects
        for (int i=0; i < supportedProfileServices.length;i++) {
            mProfileServicesState.put(supportedProfileServices[i].getName(),BluetoothAdapter.STATE_OFF);
        }
        mRemoteDevices = new RemoteDevices(mPowerManager, this);
        mAdapterProperties.init(mRemoteDevices);

        if (DBG) {debugLog("processStart(): Make Bond State Machine");}
        mBondStateMachine = BondStateMachine.make(this, mAdapterProperties, mRemoteDevices);

        mJniCallbacks.init(mBondStateMachine,mRemoteDevices);

        //FIXME: Set static instance here???
        setAdapterService(this);

        //Start profile services
        if (!mProfilesStarted && supportedProfileServices.length >0) {
            //Startup all profile services
            setProfileServiceState(supportedProfileServices,BluetoothAdapter.STATE_ON);
        }else {
            if (DBG) {debugLog("processStart(): Profile Services alreay started");}
            mAdapterStateMachine.sendMessage(mAdapterStateMachine.obtainMessage(AdapterState.STARTED));
        }
    }

以上就是profiles对应服务的注册。

3)BluetoothManagerService中处理两个callback:一个是来自BluetoothAdapter实例化时注册的回调mManagerCallback并添加到BluetoothManagerService类private final RemoteCallbackList<IBluetoothManagerCallback> mCallbacks中,该callback主要用于当BluetoothManagerService成功bind到AdapterService时BluetoothDevice获取AdapterService的句柄(BluetoothDevice获取的过程也是向BluetoothAdapter注册回调的机制);另一个来自于各个profile实现类如BluetoothHeadset注册的callback添加到BluetoothManagerService类private final RemoteCallbackList<IBluetoothStateChangeCallback> mStateChangeCallbacks中,用户通知每个profile adapter状态的变化如TURNING_ON、TURN_ON、TURNING_OFF、TURN_OFF等;


4)Bluetooth中采用的回调机的地方太多,从Settings中显示部分就多处采用回调来更新UI显示,如BluetoothSettings父类DeviceListPreferenceFragment在onResume()时向LocalBluetoothEventManager中注册callback:
@Override
    public void onResume() {
        super.onResume();
        if (mLocalManager == null) return;

        mLocalManager.setForegroundActivity(getActivity());
        mLocalManager.getEventManager().registerCallback(this);//注册回调

        updateProgressUi(mLocalAdapter.isDiscovering());
    }

不仅如此,在JNI和bluedroid的通信中也采用的时回调机制,如com_android_bluetooth_btservice_AdapterService.cpp类在初始化bluedroid时:
static bool initNative(JNIEnv* env, jobject obj) {
    ALOGV("%s:",__FUNCTION__);

    sJniCallbacksObj = env->NewGlobalRef(env->GetObjectField(obj, sJniCallbacksField));

    if (sBluetoothInterface) {
        int ret = sBluetoothInterface->init(&sBluetoothCallbacks);//初始化回调接口
        if (ret != BT_STATUS_SUCCESS) {
            ALOGE("Error while setting the callbacks \n");
            sBluetoothInterface = NULL;
            return JNI_FALSE;
        }
        if ( (sBluetoothSocketInterface = (btsock_interface_t *)
                  sBluetoothInterface->get_profile_interface(BT_PROFILE_SOCKETS_ID)) == NULL) {
                ALOGE("Error getting socket interface");
        }

        if ( (sBluetoothMceInterface = (btmce_interface_t *)
                  sBluetoothInterface->get_profile_interface(BT_PROFILE_MAP_CLIENT_ID)) == NULL) {
                ALOGE("Error getting mapclient interface");
        } else {
            if ( (sBluetoothMceInterface->init(&sBluetoothMceCallbacks)) != BT_STATUS_SUCCESS) {
                ALOGE("Failed to initialize Bluetooth MCE");
                sBluetoothMceInterface = NULL;
            }
        }

        return JNI_TRUE;
    }
    return JNI_FALSE;
}

初次看code时可能会感觉很绕,怎么会那么多回调呀?习惯了就好,这貌似时BRCM代码风格。

4.蓝牙关键类管理流程

                                                    —— A2dpProfile      < ———— >          BluetoothA2dp       <————>       A2dpService     <—————>    A2dpStateMachine   <————>  
                                                   |        (注册Listener监听profile的连接状态)          (bind到A2dpService)             (采用状态机管理)                 (jni机制)
                                                     com_android_bluetooth_a2dp <————> blueDroid <————> HCI
                                                   |...
                      —— LocalBluetoothProfile <——>|
                     |    (管理所有的profiles)      |
                     |                              —— HidProfile      < ———— >          BluetoothHid       <————>       HidService   <—————> com_android_bluetooth_hid <————> blueDroid <————> HCI
                     |                                    (注册Listener监听profile的连接状态)         (bind到HidService)               (jni机制)
                     |                                                                                                                                              —— AdapterStateMachine
LocalBluetoothManager|—— LocalBluetoothApater      <——>     BluetoothAdapter   <————>   BluetoothManagerService <————>          AdapterService           < ————> |                 均通过JniCallback回调
(上层本地蓝牙管理类)|      (本地Adpater)     (调用远端的实现)                (开启/关闭)   (蓝牙远端服务管理类)          (负责开启/关闭及其它profile服务的管理)        —— BondStateMachine
                     |
                     |
                      —— BluetoothEventManager               <————>                 CachedBluetoothDeviceManager
                                            (注册广播监听蓝牙状态变更、蓝牙设备状态)


关于 Android 中的 Bluetooth 协议栈的说明:


    Android 4.2 版本系统之前,Google 一直使用的是 Linux 官方 Bluetooth 协议栈,即知名老牌开源项目 BlueZ。BlueZ 实际上是由高通公司在2001年5月基于 GPL 协议发布的一个开源项目,该项目仅发布一个月后就被 Linux 之父 Linux Torvalds 纳入了 Linux 内核,并做为 Linux 2.4.6 内核的官方 Bluetooth 协议栈。随着 Android 设备的流行,BlueZ 也得到了极大的完善和扩展。例如 Android 4.1 版本系统中 BlueZ 的版本升级为4.93,它支持 Bluetooth 核心规范 4.0,并实现了绝大部分的 Profile。
    BlueZ 现在正处于其巅峰时期,但好景不长。从Android 4.2 即 Jelly Bean 开始,Google 便在 Android 源码中推出了它和博通公司一起开发的 BlueDroid 以替代 BlueZ。虽然因为时间及成熟度的原因,大部分手机厂商在 Android 4.2 中仍继续使用 BlueZ。但据笔者了解,BlueZ 的创始者,高通公司也将在基于其芯片的 Android 参考设计中去除 BlueZ,并仅支持BlueDroid。
BlueZ 的未来如何笔者姑且不论。不过,能让高通改弦易辙,BlueDroid 自有其合理之处。相比 BlueZ,BlueDroid 最值得称道的地方就是其框架结构变得更为简洁和清晰。另外,借助 HAL(Hardware Abstraction Layer,硬件抽象层),BlueDroid 终于不再和 DBUS 有任何瓜葛。下图所示为 Android 4.2 中 BlueDroid 的框架结构图:

android-4.2-bluedroid-structure


由上图可以看出,Android 4.2 中 BlueDroid 框架包括以下几个部分:
1.应用程序通过 android.bluetooth 包下的API来调用系统的 Bluetooth 功能。
2.应用层空间增加了一个名为 Bluetooth 的 App。它作为系统的 Bluetooth 核心进程而存在。其内部将通过 JNI 来调用 Bluetooth HAL 层以完成各种蓝牙请求。
3.Bluetooth HAL 也属于 Android 4.2 新增模块,它由蓝牙核心规范硬件抽象层和蓝牙应用规范硬件抽象层组成。由于 HAL 层的隔离作用,上层代码可轻松移植到不同芯片平台。
4.作为整个蓝牙服务的核心,Bluetooth Stack 模块则由 Bluetooth Application Layer(BTA)和Bluetooth Embedded System(BTE)两大部分组成。BTA 实现了蓝牙设备管理、状态管理及一些应用规范。而 BTE 则通过 HCI 与厂商蓝牙芯片交互以实现了蓝牙协议栈的通用功能和相关协议。另外,BTE 还包括一个统一内核接口(GKI),蓝牙芯片厂商可借助 GKI 快速轻松得移植蓝牙协议栈到其他操作系统或手机平台上。
5.Vendor Extentions(厂商扩展):开发者可以添加自定义扩展以实现厂商特定的模块和组件。


    除了 BlueDroid 外,在今年的 Google I/O 大会,谷歌公司还宣布将于与苹果、微软和黑莓等公司共同支持 Bluetooth Smart Ready(BSR,蓝牙智能就绪)和 Bluetooth Smart(BS,蓝牙智能)技术。这项技术使蓝牙设备或应用可以非常容易地连接全球成千上万的蓝牙设备,蓝牙使用者的生活也因此变得更加简单。BSR 和 BS 都是建立在蓝牙核心规范4.0和 GATT 应用规范。即将发布的 Android 4.3(MR2)支持 BSR 技术,使得 BS 的开发者可以轻易地将其设备和应用与 Android BSR 设备进行连接和发布。蓝牙使用者运用 BS 的智能应用配件(如健康监控或医疗设备)收集数据,再传送到支持 BSR 设备(如智能手机或平板)上。
    另外,蓝牙 SIG 也正在研发工具 Bluetooth Application Accelerator(蓝牙应用加速器)。据可靠消息,该工具将随 Android 4.3 发布,并将帮助开发者在 Android 4.3 上快速开发蓝牙应用,从而加快相关产品的研发时间。


总结
    本文对蓝牙核心规范、蓝牙应用规范以及 Android 4.2 中的蓝牙协议栈 BlueDroid 进行了一些简单介绍。从笔者了解的情况来看,BlueDroid 虽然对 BlueZ 大有取而代之的趋势,但现在它对蓝牙应用规范的支持还不够完善。例如 BlueDroid 仅支持 AVRCP 1.0,而非最新的 AVRCP 1.5。所以,国内某些芯片或手机厂商若能及早完成 BlueZ 相关模块到 BlueDroid 的移植工作,相信能帮助它们在竞争日趋白日化的移动世界中拔得先机。
    另外,作为一种成熟、低功耗无线通信技术的先锋,蓝牙未来在可穿戴设备领域中也将扮演越来越重要的作用。那时,蓝牙或许就会真正像“牙齿”一样成为各种设备中不可或缺的一部分了。


  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 扫一扫,分享海报

目录 1. 第一章蓝牙概述和金瓯蓝牙开发平台介绍......... PAGEREF _TOC120615555 \H 12 1.1 蓝牙概述................. PAGEREF _TOC120615556 \H 12 1.1.1 蓝牙技术的诞生与发展................. PAGEREF _Toc120615557 \h 12 1.1.2 蓝牙技术介绍................. PAGEREF _Toc120615558 \h 12 1.1.3 蓝牙协议体系结构........ PAGEREF _Toc120615559 \h 14 1.1.4 蓝牙应用模型协议栈................. PAGEREF _Toc120615560 \h 17 1.1.5 蓝牙技术的应用............ PAGEREF _Toc120615561 \h 19 1.2 金瓯蓝牙开发平台介绍......... PAGEREF _TOC120615562 \H 20 1.2.1 平台简介....... PAGEREF _Toc120615563 \h 20 1.2.2 功能说明....... PAGEREF _Toc120615564 \h 20 1.2.3 使用说明....... PAGEREF _Toc120615565 \h 21 2 1.2.4 HCI.... PAGEREF _Toc120615566 \h 22 1.2.5 SDP... PAGEREF _Toc120615567 \h 26 1.2.6 RFCOMM........... PAGEREF _Toc120615568 \h 27 1.2.7 开发................ PAGEREF _Toc120615569 \h 27 1.2.8 硬件说明....... PAGEREF _Toc120615570 \h 27 2. 第二章无线技术协议............... PAGEREF _TOC120615571 \H 27 2.1 概述........ PAGEREF _TOC120615572 \H 27 2.2 频段信道分配.... PAGEREF _TOC120615573 \H 27 2.3 发射机特性............. PAGEREF _TOC120615574 \H 27 2.3.1 基本数据速率................. PAGEREF _Toc120615575 \h 27 2.3.2 增强数据速率................. PAGEREF _Toc120615576 \h 27 2.4 接收机特性............. PAGEREF _TOC120615577 \H 27 2.4.1 基本速率....... PAGEREF _Toc120615578 \h 27 2.4.2 增强数据速率................. PAGEREF _Toc120615579 \h 27 3. 第三章基带协议...... PAGEREF _TOC120615580 \H 27 3.1 概述........ PAGEREF _TOC120615581 \H 27 3.1.1 蓝牙时钟....... PAGEREF _Toc120615582 \h 27 3.1.2 蓝牙设备编址................. PAGEREF _Toc120615583 \h 27 3.1.3 接入码............ PAGEREF _Toc120615584 \h 27 3.2 物理信道................. PAGEREF _TOC120615585 \H 27 3.2.1 物理信道定义................. PAGEREF _Toc120615586 \h 27 3.2.2 基本匹克网物理信道.... PAGEREF _Toc120615587 \h 27 3.2.3 自适应匹克网物理信道................. PAGEREF _Toc120615588 \h 27 3.2.4 寻呼扫描物理信道........ PAGEREF _Toc120615589 \h 27 3.2.5 查询扫描物理信道........ PAGEREF _Toc120615590 \h 27 3.2.6 频率选择....... PAGEREF _Toc120615591 \h 27 3.3 物理链路................. PAGEREF _TOC120615592 \H 27 3.3.1 链路管理....... PAGEREF _Toc120615593 \h 27 3.4 逻辑传输................. PAGEREF _TOC120615594 \H 27 3.4.1 概述................ PAGEREF _Toc120615595 \h 27 3.4.2 逻辑传输地址(LT_ADDR)........ PAGEREF _Toc120615596 \h 27 3.4.3 同步逻辑传输................. PAGEREF _Toc120615597 \h 27 3.4.4 异步逻辑传输................. PAGEREF _Toc120615598 \h 27 3.4.5 收发过程....... PAGEREF _Toc120615599 \h 27 3.4.6 活动状态下的从设备广播传输.... PAGEREF _Toc120615600 \h 27 3.4.7 休眠模式下从设备广播传输......... PAGEREF _Toc120615601 \h 27 3.5 逻辑链路................. PAGEREF _TOC120615602 \H 27 3.5.1 链路控制逻辑链路(LC)............ PAGEREF _Toc120615603 \h 27 3.5.2 ACL 控制逻辑链路(ACL-C)......... PAGEREF _Toc120615604 \h 27 3.5.3 用户异步/同步逻辑链路(ACL-U)............. PAGEREF _Toc120615605 \h 27 3.5.4 用户同步数据逻辑链路(SCO-S)............... PAGEREF _Toc120615606 \h 27 3.5.5 用户扩展同步数据逻辑链路(eSCO-S).... PAGEREF _Toc120615607 \h 27 3.5.6 逻辑链路优先级............ PAGEREF _Toc120615608 \h 27 3 3.6 分组........ PAGEREF _TOC120615609 \H 27 3.6.1 通用格式....... PAGEREF _Toc120615610 \h 27 3.6.2 位顺序............ PAGEREF _Toc120615611 \h 27 3.6.3 接入码............ PAGEREF _Toc120615612 \h 27 3.6.4 分组头............ PAGEREF _Toc120615613 \h 27 3.6.5 分组类型....... PAGEREF _Toc120615614 \h 27 3.6.6 净荷格式....... PAGEREF _Toc120615615 \h 27 3.6.7 分组概要....... PAGEREF _Toc120615616 \h 27 3.7 比特流流程............. PAGEREF _TOC120615617 \H 27 3.7.1 差错检验....... PAGEREF _Toc120615618 \h 27 3.7.2 数据白化....... PAGEREF _Toc120615619 \h 27 3.7.3 纠错................ PAGEREF _Toc120615620 \h 27 3.7.4 1/3 比例前向纠错码.......... PAGEREF _Toc120615621 \h 27 3.7.5 2/3 比例前向纠错码.......... PAGEREF _Toc120615622 \h 27 3.7.6 ARQ 方案........... PAGEREF _Toc120615623 \h 27 3.8 链路控制操作......... PAGEREF _TOC120615624 \H 27 3.8.1 状态概述....... PAGEREF _Toc120615625 \h 27 3.8.2 待机状态....... PAGEREF _Toc120615626 \h 27 3.8.3 连接建立子状态............ PAGEREF _Toc120615627 \h 27 3.8.4 设备发现子状态............ PAGEREF _Toc120615628 \h 27 3.8.5 连接状态....... PAGEREF _Toc120615629 \h 27 3.8.6 活动模式....... PAGEREF _Toc120615630 \h 27 3.8.7 呼吸模式....... PAGEREF _Toc120615631 \h 27 3.8.8 保持模式....... PAGEREF _Toc120615632 \h 27 3.8.9 休眠状态....... PAGEREF _Toc120615633 \h 27 3.9 音频........ PAGEREF _TOC120615634 \H 27 3.9.1 对数PCM 编译码器(LOG PCM CODEC)............... PAGEREF _Toc120615635 \h 27 3.9.2 连续变化斜率增量调制编译码器(CVSD CODEC)............... PAGEREF _Toc120615636 \h 27 3.9.3 错误处理....... PAGEREF _Toc120615637 \h 27 3.9.4 一般音频要求................. PAGEREF _Toc120615638 \h 27 4. 第四章链路管理协议............... PAGEREF _TOC120615639 \H 27 4.1 概述........ PAGEREF _TOC120615640 \H 27 4.2 一般规则................. PAGEREF _TOC120615641 \H 27 4.2.1 消息传输....... PAGEREF _Toc120615642 \h 27 4.2.2 同步................ PAGEREF _Toc120615643 \h 27 4.2.3 分组格式....... PAGEREF _Toc120615644 \h 27 4.2.4 事务................ PAGEREF _Toc120615645 \h 27 4.2.5 差错处理....... PAGEREF _Toc120615646 \h 27 4.2.6 过程规则....... PAGEREF _Toc120615647 \h 27 4.2.7 通用应答消息................. PAGEREF _Toc120615648 \h 27 4.2.8 LMP 消息限制条件............ PAGEREF _Toc120615649 \h 27 4.3 设备特征................. PAGEREF _TOC120615650 \H 27 4 4.3.1 概述................ PAGEREF _Toc120615651 \h 27 4.3.2 特征定义....... PAGEREF _Toc120615652 \h 27 4.3.3 特征掩码定义................. PAGEREF _Toc120615653 \h 27 4.3.4 链路管理相互对策........ PAGEREF _Toc120615654 \h 27 4.4 过程规则................. PAGEREF _TOC120615655 \H 27 4.4.1 连接控制....... PAGEREF _Toc120615656 \h 27 4.4.2 安全................ PAGEREF _Toc120615657 \h 27 4.4.3 信息请求....... PAGEREF _Toc120615658 \h 27 4.4.4 主从角色转换................. PAGEREF _Toc120615659 \h 27 4.4.5 操作模式....... PAGEREF _Toc120615660 \h 27 4.4.6 逻辑链路....... PAGEREF _Toc120615661 \h 27 4.4.7 测试模式....... PAGEREF _Toc120615662 \h 27 5. 第五章主机控制器接口协议. PAGEREF _TOC120615663 \H 27 5.1 主机控制接口协议概述......... PAGEREF _TOC120615664 \H 27 5.1.1 底层蓝牙软件栈............ PAGEREF _Toc120615665 \h 27 5.2 主机控制传输层概述.............. PAGEREF _TOC120615666 \H 27 5.2.1 USB 传输层....... PAGEREF _Toc120615667 \h 27 5.2.2 RS232 传输层... PAGEREF _Toc120615668 \h 27 5.2.3 HCI UART 传输层............. PAGEREF _Toc120615669 \h 27 5.2.4 HCI SD 传输层. PAGEREF _Toc120615670 \h 27 5.3 HCI 流控制.............. PAGEREF _TOC120615671 \H 27 5.4 HCI 数据格式......... PAGEREF _TOC120615672 \H 27 5.4.1 介绍................ PAGEREF _Toc120615673 \h 27 5.4.2 数据和参数格式............ PAGEREF _Toc120615674 \h 27 5.4.3 HCI 信息交换.... PAGEREF _Toc120615675 \h 27 5.5 开发平台上的命令和事件其详细分析............... PAGEREF _TOC120615676 \H 27 5.5.1 开发平台在执行HCI 初始化本地蓝牙设备命令后所产生的一些命令和事件:....... PAGEREF _Toc120615677 \h 27 5.5.2 开发平台在执行HCI 搜索蓝牙设备命令后所产生的命令和事件。........... PAGEREF _Toc120615678 \h 27 5.5.3 建立连接....... PAGEREF _Toc120615679 \h 27 5.5.4 传输ACL 数据1............ PAGEREF _Toc120615680 \h 27 5.5.5 传输ACL 数据2............ PAGEREF _Toc120615681 \h 27 5.5.6 断开连接....... PAGEREF _Toc120615682 \h 27 5.6 HCI 分组中数据的详细解释说明........... PAGEREF _TOC120615683 \H 27 5.6.1 HCI 链路控制命令............. PAGEREF _Toc120615684 \h 27 5.6.2 HCI 链路策略命令............. PAGEREF _Toc120615685 \h 27 5.6.3 主机控制器和基带命令................. PAGEREF _Toc120615686 \h 27 5.6.4 信息参数....... PAGEREF _Toc120615687 \h 27 5.6.5 状态参数....... PAGEREF _Toc120615688 \h 27 5.6.6 测试命令....... PAGEREF _Toc120615689 \h 27 5.6.7 事件................ PAGEREF _Toc120615690 \h 27 5.7 实现HCI 的部分源代码分析.......... PAGEREF _TOC120615691 \H 27 5.7.1 HCI 对上行数据流的处理过程......... PAGEREF _Toc120615692 \h 27 5 5.7.2 HCI 对下行数据流的处理过程......... PAGEREF _Toc120615693 \h 27 6. 第六章逻辑链路控制和适配协议......... PAGEREF _TOC120615694 \H 27 6.1 L2CAP 概述............ PAGEREF _TOC120615695 \H 27 6.1.1 L2CAP 特征....... PAGEREF _Toc120615696 \h 27 6.1.2 L2CAP 的设计.. PAGEREF _Toc120615697 \h 27 6.1.3 适用范围....... PAGEREF _Toc120615698 \h 27 6.2 主要操作................. PAGEREF _TOC120615699 \H 27 6.2.1 信道标识符... PAGEREF _Toc120615700 \h 27 6.2.2 设备间操作... PAGEREF _Toc120615701 \h 27 6.2.3 层间操作....... PAGEREF _Toc120615702 \h 27 6.2.4 操作方式....... PAGEREF _Toc120615703 \h 27 6.3 数据分组格式......... PAGEREF _TOC120615704 \H 27 6.3.1 面向连接信道................. PAGEREF _Toc120615705 \h 27 6.3.2 无连接数据信道............ PAGEREF _Toc120615706 \h 27 6.3.3 在重传/流控制模式下的面向连接信道........ PAGEREF _Toc120615707 \h 27 6.4 信令分组格式......... PAGEREF _TOC120615708 \H 27 6.4.1 命令拒绝(代码0x01 ). PAGEREF _Toc120615709 \h 27 6.4.2 连接请求(代码0x02) PAGEREF _Toc120615710 \h 27 6.4.3 连接应答(代码0x03 ). PAGEREF _Toc120615711 \h 27 6.4.4 配置请求(代码0x04 ). PAGEREF _Toc120615712 \h 27 6.4.5 配置应答(代码0X05 ).............. PAGEREF _Toc120615713 \h 27 6.4.6 断开请求(代码0x06)... PAGEREF _Toc120615714 \h 27 6.4.7 连接断开应答(代码0x07)............ PAGEREF _Toc120615715 \h 27 6.4.8 回应请求(代码0x08).. PAGEREF _Toc120615716 \h 27 6.4.9 回应应答(代码0x09).. PAGEREF _Toc120615717 \h 27 6.4.10 信息请求(代码0X0A)............... PAGEREF _Toc120615718 \h 27 6.4.11 信息应答(代码0X0B)................ PAGEREF _Toc120615719 \h 27 6.4.12 扩展特征掩码................. PAGEREF _Toc120615720 \h 27 6.5 配置参数选项......... PAGEREF _TOC120615721 \H 27 6.5.1 最大传输单位................. PAGEREF _Toc120615722 \h 27 6.5.2 刷新超时选项................. PAGEREF _Toc120615723 \h 27 6.5.3 服务质量选项................. PAGEREF _Toc120615724 \h 27 6.5.4 重传和流控制选项........ PAGEREF _Toc120615725 \h 27 6.6 状态机.... PAGEREF _TOC120615726 \H 27 6.6.1 状态机的常规规则........ PAGEREF _Toc120615727 \h 27 6.6.2 定时器事件... PAGEREF _Toc120615728 \h 27 6.7 常规操作过程......... PAGEREF _TOC120615729 \H 27 6.7.1 配置过程....... PAGEREF _Toc120615730 \h 27 6.7.2 分段和重组... PAGEREF _Toc120615731 \h 27 6.7.3 服务数据单元的封装.... PAGEREF _Toc120615732 \h 27 6.7.4 错误的L2CAP SDU 的传输.......... PAGEREF _Toc120615733 \h 27 6.7.5 刷新超时的操作............ PAGEREF _Toc120615734 \h 27 6.7.6 无连接数据信道............ PAGEREF _Toc120615735 \h 27 6.8 流控制和重传过程PAGEREF _TOC120615736 \H 27 6 6.8.1 信息恢复....... PAGEREF _Toc120615737 \h 27 6.8.2 流控制和重传PDU 类型的功能.. PAGEREF _Toc120615738 \h 27 6.8.3 变量和序列号码............ PAGEREF _Toc120615739 \h 27 6.8.4 重传模式....... PAGEREF _Toc120615740 \h 27 6.8.5 流控制模式... PAGEREF _Toc120615741 \h 27 6.9 L2CAP 层数据分析................. PAGEREF _TOC120615742 \H 27 6.9.1 L2CAP_PDU..... PAGEREF _Toc120615743 \h 27 6.9.2 信令信道的L2CAP_PDU 分析.... PAGEREF _Toc120615744 \h 27 6.9.3 L2CAP 层通过0x40 通道发送Hello World..... PAGEREF _Toc120615745 \h 27 6.10 L2CAP 层源代码分析............. PAGEREF _TOC120615746 \H 27 6.10.1 L2CAP 层重要数据结构定义........ PAGEREF _Toc120615747 \h 27 6.10.2 L2CAP 发送接收数据流程............ PAGEREF _Toc120615748 \h 27 6.10.3 一般的连接建立过程、配置过程和断开连接过程...... PAGEREF _Toc120615749 \h 27 7. 第七章串口仿真协议............... PAGEREF _TOC120615750 \H 27 7.1 介绍........ PAGEREF _TOC120615751 \H 27 7.1.1 概述................ PAGEREF _Toc120615752 \h 27 7.1.2 设备类型....... PAGEREF _Toc120615753 \h 27 7.1.3 字节序列....... PAGEREF _Toc120615754 \h 27 7.2 RFCOMM 服务概述................ PAGEREF _TOC120615755 \H 27 7.2.1 RS-232 控制信令............... PAGEREF _Toc120615756 \h 27 7.2.2 空MODEM 仿真............ PAGEREF _Toc120615757 \h 27 7.2.3 多串口仿真... PAGEREF _Toc120615758 \h 27 7.3 服务接口描述......... PAGEREF _TOC120615759 \H 27 7.3.1 服务定义模型................. PAGEREF _Toc120615760 \h 27 7.4 采用TS07.10 子集和对TS07.10 的修正后的RFCOMM....... PAGEREF _TOC120615761 \H 27 7.4.1 RFCOMM 的帧结构.......... PAGEREF _Toc120615762 \h 27 7.4.2 多路控制信道................. PAGEREF _Toc120615763 \h 27 7.4.3 汇聚层............ PAGEREF _Toc120615764 \h 27 7.5 流控制.... PAGEREF _TOC120615765 \H 27 7.5.1 L2CAP 流控制概述............ PAGEREF _Toc120615766 \h 27 7.5.2 有线端口的流控制........ PAGEREF _Toc120615767 \h 27 7.5.3 RFCOMM 流控制............... PAGEREF _Toc120615768 \h 27 7.5.4 端口仿真实体串行流控制............. PAGEREF _Toc120615769 \h 27 7.6 与其它实体的互操作.............. PAGEREF _TOC120615770 \H 27 7.6.1 端口仿真和端口代理实体............. PAGEREF _Toc120615771 \h 27 7.6.2 服务注册和搜索............ PAGEREF _Toc120615772 \h 27 7.6.3 低层约束....... PAGEREF _Toc120615773 \h 27 7.7 RFCOMM 层数据分析部分... PAGEREF _TOC120615774 \H 27 7.7.1 建立连接....... PAGEREF _Toc120615775 \h 27 7.7.2 收发数据....... PAGEREF _Toc120615776 \h 27 7.7.3 断开连接....... PAGEREF _Toc120615777 \h 27 7.8 RFCOMM 层源代码分析部分................ PAGEREF _TOC120615778 \H 27 7 7.8.1 传输过程和重要数据结构............. PAGEREF _Toc120615779 \h 27 7.8.2 建立连接、断开、数据传输分析PAGEREF _Toc120615780 \h 27 8. 第八章对象交换协议............... PAGEREF _TOC120615781 \H 27 8.1 OBEX 协议概述..... PAGEREF _TOC120615782 \H 27 8.2 OBEX 对象模型..... PAGEREF _TOC120615783 \H 27 8.2.1 OBEX 可选分组头.............. PAGEREF _Toc120615784 \h 27 8.2.2 头指示器(HI)详细描述............. PAGEREF _Toc120615785 \h 27 8.3 会话协议................. PAGEREF _TOC120615786 \H 27 8.3.1 会话协议概述................. PAGEREF _Toc120615787 \h 27 8.3.2 连接操作....... PAGEREF _Toc120615788 \h 27 8.3.3 连接断开操作................. PAGEREF _Toc120615789 \h 27 8.3.4 推(PUT)操作............. PAGEREF _Toc120615790 \h 27 8.3.5 拉(GET)操作............. PAGEREF _Toc120615791 \h 27 8.3.6 取消(Abort)操作...... PAGEREF _Toc120615792 \h 27 8.3.7 设置路径(Set Path)操作........... PAGEREF _Toc120615793 \h 27 8.4 蓝牙下的OBEX 协议.............. PAGEREF _TOC120615794 \H 27 8.4.1 OBEX OVER RFCOMM..... PAGEREF _Toc120615795 \h 27 8.4.2 OBEX over TCP/IP............. PAGEREF _Toc120615796 \h 27 9. 第九章服务发现协议............... PAGEREF _TOC120615797 \H 27 9.1 介绍........ PAGEREF _TOC120615798 \H 27 9.1.1 概述................ PAGEREF _Toc120615799 \h 27 9.1.2 SDP 能够提供的服务能力................. PAGEREF _Toc120615800 \h 27 9.2 概述........ PAGEREF _TOC120615801 \H 27 9.2.1 客户服务器交互............ PAGEREF _Toc120615802 \h 27 9.2.2 服务记录....... PAGEREF _Toc120615803 \h 27 9.2.3 服务属性....... PAGEREF _Toc120615804 \h 27 9.2.4 属性ID.......... PAGEREF _Toc120615805 \h 27 9.2.5 属性值............ PAGEREF _Toc120615806 \h 27 9.2.6 服务类............ PAGEREF _Toc120615807 \h 27 9.2.7 服务搜索....... PAGEREF _Toc120615808 \h 27 9.2.8 服务浏览....... PAGEREF _Toc120615809 \h 27 9.3 数据表示................. PAGEREF _TOC120615810 \H 27 9.3.1 数据元............ PAGEREF _Toc120615811 \h 27 9.3.2 数据元素类型描述符.... PAGEREF _Toc120615812 \h 27 9.3.3 数据元尺寸描述符........ PAGEREF _Toc120615813 \h 27 9.3.4 数据元举例... PAGEREF _Toc120615814 \h 27 9.4 协议说明................. PAGEREF _TOC120615815 \H 27 9.4.1 字节传输顺序................. PAGEREF _Toc120615816 \h 27 9.4.2 协议数据单元格式........ PAGEREF _Toc120615817 \h 27 9.4.3 局部应答和延续状态.... PAGEREF _Toc120615818 \h 27 9.4.4 出错处理....... PAGEREF _Toc120615819 \h 27 9.4.5 服务搜索处理................. PAGEREF _Toc120615820 \h 27 9.4.6 服务属性事务................. PAGEREF _Toc120615821 \h 27 8 9.4.7 服务搜索属性事务........ PAGEREF _Toc120615822 \h 27 9.5 服务属性定义......... PAGEREF _TOC120615823 \H 27 9.5.1 通用属性定义................. PAGEREF _Toc120615824 \h 27 9.5.2 “服务搜索服务器”服务类属性定义.............. PAGEREF _Toc120615825 \h 27 9.5.3 “浏览组描述符”服务类属性定义PAGEREF _Toc120615826 \h 27 9.6 SDP 层数据分析部分.............. PAGEREF _TOC120615827 \H 27 9.6.1 服务搜索请求................. PAGEREF _Toc120615828 \h 27 9.6.2 服务搜索响应................. PAGEREF _Toc120615829 \h 27 9.6.3 服务属性请求................. PAGEREF _Toc120615830 \h 27 9.6.4 服务属性应答................. PAGEREF _Toc120615831 \h 27 9.6.5 服务搜索属性请求........ PAGEREF _Toc120615832 \h 27 9.6.6 服务请求属性应答........ PAGEREF _Toc120615833 \h 27 9.7 SDP 层源代码分析部分......... PAGEREF _TOC120615834 \H 27 9.7.1 重要数据元和结构体.... PAGEREF _Toc120615835 \h 27 9.7.2 数据流程和几个重要的接口函数PAGEREF _Toc120615836 \h 27 10. 第十章电话控制协议控制. PAGEREF _TOC120615837 \H 27 10.1 概述..... PAGEREF _TOC120615838 \H 27 10.1.1 介绍................ PAGEREF _Toc120615839 \h 27 10.1.2 设备间操作... PAGEREF _Toc120615840 \h 27 10.1.3 层间操作....... PAGEREF _Toc120615841 \h 27 10.2 呼叫控制(CC)... PAGEREF _TOC120615842 \H 27 10.2.1 呼叫状态....... PAGEREF _Toc120615843 \h 27 10.2.2 建立呼叫....... PAGEREF _Toc120615844 \h 27 10.2.3 呼叫清除....... PAGEREF _Toc120615845 \h 27 10.3 组管理(GM)...... PAGEREF _TOC120615846 \H 27 10.3.1 概述................ PAGEREF _Toc120615847 \h 27 10.3.2 无线用户组(WUG)... PAGEREF _Toc120615848 \h 27 10.3.3 获取访问权限................. PAGEREF _Toc120615849 \h 27 10.3.4 配置分布....... PAGEREF _Toc120615850 \h 27 10.3.5 成员间快速访问............ PAGEREF _Toc120615851 \h 27 10.4 无连接TCS(CL)................. PAGEREF _TOC120615852 \H 27 10.5 补充服务(SS).... PAGEREF _TOC120615853 \H 27 10.5.1 呼叫线路识别................. PAGEREF _Toc120615854 \h 27 10.5.2 DTMF 启动和终止....... PAGEREF _Toc120615855 \h 27 10.5.3 注册重呼....... PAGEREF _Toc120615856 \h 27 10.6 报文格式................. PAGEREF _TOC120615857 \H 27 10.6.1 呼叫控制报文格式........ PAGEREF _Toc120615858 \h 27 10.6.2 组管理报文格式............ PAGEREF _Toc120615859 \h 27 10.6.3 TCS 无连接报文格式... PAGEREF _Toc120615860 \h 27 10.7 报文编码................. PAGEREF _TOC120615861 \H 27 10.7.1 概述................ PAGEREF _Toc120615862 \h 27 10.7.2 协议标识....... PAGEREF _Toc120615863 \h 27 10.7.3 报文类型....... PAGEREF _Toc120615864 \h 27 10.7.4 其它信息元... PAGEREF _Toc120615865 \h 27 9 10.8 报文出错处理......... PAGEREF _TOC120615866 \H 27 10.8.1 协议标识出错................. PAGEREF _Toc120615867 \h 27 10.8.2 报文太短或未被识别.... PAGEREF _Toc120615868 \h 27 10.8.3 报文类别或报文顺序出错............. PAGEREF _Toc120615869 \h 27 10.8.4 信息元出错... PAGEREF _Toc120615870 \h 27 10.9 协议参数................. PAGEREF _TOC120615871 \H 27 10.9.1 协议时钟....... PAGEREF _Toc120615872 \h 27 11. 第十一章蓝牙操作模式..... PAGEREF _TOC120615873 \H 27 11.1 概述........ PAGEREF _TOC120615874 \H 27 11.2 蓝牙串口操作模式PAGEREF _TOC120615875 \H 27 11.2.1 SPP 概述....... PAGEREF _Toc120615876 \h 27 11.2.2 SPP 链路....... PAGEREF _Toc120615877 \h 27 11.2.3 SPP 与各层协同工作性能要求.... PAGEREF _Toc120615878 \h 27 11.3 蓝牙头戴式设备操作模式..... PAGEREF _TOC120615879 \H 27 11.3.1 HSP 概述....... PAGEREF _Toc120615880 \h 27 11.3.2 HSP 功能描述................ PAGEREF _Toc120615881
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值