当前位置:天才代写 > tutorial > 安卓教程 > Bluetooth 4.0之Android 解说

Bluetooth 4.0之Android 解说

2021-02-05 14:01 星期五 所属: 安卓教程 浏览:493



Android服务平台包含了对手机蓝牙互联网tcp协议的适用,它愿意一个无线设备跟其他的无线设备开展无线网络的数据传输。应用软件根据Android手机蓝牙API出示訪问手机蓝牙的作用。

这种API会把应用软件无线网络连接到其他的无线设备上,具备点和点和多一点无线网络特点。
应用手机蓝牙API,Android应用软件能够运作下边作用:
1.  扫描仪其他无线设备
2.  查看当地早已匹配的蓝牙适配器
3.  创建RFCOMM安全通道
4.  根据服务发现来联接其他机器设备
5.  在机器设备间传输数据
6.  管理方法好几个手机蓝牙
基本
文中详细介绍怎样使用Android的手机蓝牙API来结束应用手机蓝牙通讯所需要的四项关键每日任务:设定手机蓝牙、搜索已匹配或地区内能用的无线设备、联接机器设备、机器设备间传输数据。
所有的能用的API都是在android.bluetooth库中。

下边概述的详细介绍建立手机蓝牙所需要的类和插口:
BluetoothAdapter
意味着当地蓝牙适配器(手机蓝牙无线网络)。BluetoothAdapter是所有手机蓝牙互动的通道。

应用这一类。你能发觉其他的无线设备,查看已匹配机器设备的目录,应用已经知道的MAC地址来实例化一个BluetoothDevice目标,并且建立一个BluetoothServerSocket目标来监视与其他机器设备的通讯。
BluetoothDevice
意味着一个远程控制的无线设备。应用这一类根据BluetoothSocket或查看例如名字、详细地址、类和匹配情况等机器设备信息内容来要求跟远程控制机器设备的联接。
BluetoothSocket
意味着手机蓝牙socket的插口(类似TCP的Socket)。它是愿意一个应用软件跟还有一个无线设备根据键入流和輸出流开展数据传输的节点。
BluetoothServerSocket
意味着一个开启的监视传到要求的服务项目插口(类似于TCP的ServerSocket)。

为了更好地联接2个Android机器设备,一个机器设备务必用这一类开启一个服务项目插口。当远程控制无线设备要求跟本机器设备创建联接要求时。BluetoothServerSocket会在联接被接受时回到一个被联接的BluetoothSocket目标。
BluetoothClass
描绘描述了无线设备的一般性特点和作用。

这一类是一个只是读的特性集,这种特性界定了机器设备的关键和主次机器设备类和服务项目。但是,这一类并不确保描绘描述了机器设备所适用的所有的手机蓝牙配备和服务项目,但是那样的对机器设备种类的提醒是有意的。
BluetoothProfile
    意味着一个手机蓝牙配备的插口。

手机蓝牙配备是根据手机蓝牙通讯的机器设备间的无线网络接口规范。一个样例是免提通话的配备。

许多其他的配备探讨,可以看下面的用配备来工作中。
BluetoothHeadset
    出示对应用无线蓝牙耳机的手机的适用。它同一情况下包含了Bluetooth Headset和Hands-Free(v1.5)的配备。
BluetoothA2dp
    界定如何把高质量的声频根据手机蓝牙从一个机器设备流入还有一个机器设备。“A2DP”是Advanced Audio Distribution Profile的简称。
BluetoothHealth
    意味着一个保健养生机器设备配备的操纵手机蓝牙服务项目的代理商。
BluetoothHealthCallback
    用以完成BluetoothHealth回调函数的抽象类。

你务必承继这一类,并完成它的回调函数方式,来接受应用软件的注册情况和手机蓝牙安全通道情况转变 的升级。
BluetoothHealthAppConfiguration
    意味着手机蓝牙有关的第三方保健养生应用软件所注册的与远程控制手机蓝牙保健养生机器设备开展通讯的配备。

BluetoothProfile.ServiceListener
    BluetoothProfile IPCclient联接或断掉服务项目的通告插口(它是实行特珠配备的內部服务项目)。

Android的中国联通性—Bluetooth(二)

手机蓝牙管理权限
为了更好地在你的应用软件中应用蓝牙功能。最少要申明2个手机蓝牙管理权限(BLUETOOTH和BLUETOOTH_ADMIN)中的一个。
为了更好地运作不管怎样手机蓝牙通讯(如要求联接、接受联接和传输数据)。你务必申请办理BLUETOOTH管理权限。
为了更好地运行机器设备发觉或维护保养蓝牙设置,你务必申请办理BLUETOOTH_ADMIN管理权限。大部分必须这一管理权限的应用软件,但是为能够发觉当地的无线设备。

这一管理权限所授于的其他工作能力应当不被应用。除非是是电池管理的应用软件,它会在依据客户的要求来修改蓝牙设置。留意:假定你应用了BLUETOOTH_ADMIN管理权限,那麼必必须有BLUETOOTH管理权限。

在你的运用程序清单文档里申明手机蓝牙管理权限。例如:
<manifest … >
  <uses-permission android:name="android.permission.BLUETOOTH" />
  …
< /manifest>
有关申明应用软件管理权限的许多其他信息内容,请參阅<uses-permission>

设定手机蓝牙
在应用软件能够运用手机蓝牙安全通道通讯以前,需要确定机器设备是不是适用手机蓝牙通讯。假定适用,要保证它是能用的。

假定不兼容手机蓝牙,那麼你应该有好的禁止使用所有蓝牙功能。假定适用手机蓝牙,但是被禁止使用的。那麼你需要不在放弃你的应用软件的状况下。要求客户开启蓝牙功能,那样的设定要应用BluetoothAdapter目标,在下面2个流程中结束。
1. 得到BluetoothAdapter目标
BluetoothAdapter目标是所有手机蓝牙主题活动都需要的。要得到这一目标,就需要启用静态数据的getDefaultAdapter()方式。

这类方式会回到一个意味着机器设备自身的蓝牙适配器的BluetoothAdapter目标。

全部系统软件有一个蓝牙适配器,你的应用软件能够应用这一目标来开展互动。

假定getDefaultAdapter()方式回到null,那麼该机器设备不兼容手机蓝牙,你的解决还要在这里完毕。例如:
BluetoothAdapter mBluetoothAdapter =BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter ==null){
// Device does not support Bluetooth
}
2. 开启蓝牙功能
下面,你需要保证手机蓝牙是能用的。启用isEnabled()方式来查验当今手机蓝牙是不是能用。假定这类方式回到false。那麼手机蓝牙是被禁止使用的。要申请办理开启蓝牙功能,就需要启用含有ACTION_REQUEST_ENABLE实际操作用意的startActivityForResult()方式。它会给系统配置发一个开启蓝牙功能的要求(不停止你的应用软件)。

例如:
if(!mBluetoothAdapter.isEnabled()){
    Intent enableBtIntent =newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
这时候会表明一个要求客户开启蓝牙功能的提示框,如图所示1所见到的:

图1.开启蓝牙功能的提示框。
假定客户回应“Yes”,那麼系统软件会開始开启蓝牙功能,结束运行全过程(有可能不成功),聚焦点会回到让你的应用软件。
传送给startActivityForResult()方式的REQUEST_ENABLE_BT变量定义,是一个你的应用软件中界定的整数金额(它务必超过0),系统软件会把它做为requestCode參数回到到你的onActivityResult()回调函数完成中。

假定蓝牙功能开启取得成功,你的Activity会在onActivityResult()回调函数中接受到RESULT_OK結果,假定手机蓝牙沒有被运行(或是客户回应了“No”),那麼该結果编号是RESULT_CANCELED。
可选择地。你的应用软件还可以监视ACTION_STATE_CHANGED广播节目Intent。无论手机蓝牙情况什么时候更改,系统软件都是会广播节目这一Intent。这一广播节目包含的额外字段名EXTRA_STATE和EXTRA_PREVIOUS_STATE中各自指出了新的和旧的手机蓝牙情况。这种额外字段名中很有可能的值是:STATE_TURNING_ON、STATE_ON、STATE_TURNING_OFF和STATE_OFF。监视这一广播节目针对在应用软件实行时检測手机蓝牙的情况是好用的。

提醒:开启可发觉工作能力会自身积极运行蓝牙功能。

假定你方案在运作手机蓝牙主题活动以前,要自始至终开启机器设备的可发觉体制。就可以绕过上边的第二步,实际请參阅下面“开启手机蓝牙可发觉”。

Android的中国联通性—Bluetooth(三)

搜索机器设备
应用BluetoothAdapter目标。能够根据机器设备发觉或查看已匹配的机器设备目录来寻找远程控制的无线设备。
机器设备发觉是一个扫描仪全过程,该全过程检索当地地区内能用的无线设备,随后要求一些彼此之间有关的一些信息内容(这一全过程被称为“发觉”、“查看”或“扫描仪”)。但是,当地地区内的无线设备只是有在他们也开启了可发觉作用时,才会回应发觉要求。假定一个机器设备是可发觉的,那麼它会根据共享资源一些信息内容(如设备名称、类型和唯一的MAC地址)来回应发觉要求。应用这种信息内容,运作发觉解决的机器设备能够有挑选的复位跟被发觉机器设备的联接。

一旦跟远程控制的机器设备创建的初次联接。匹配要求便会自身积极的被呈现给客户。

当机器设备结束匹配,有关机器设备的基本资料(如设备名称、类型和MAC地址)便会被储存。并能够应用手机蓝牙API来载入。应用已经知道的远程控制机器设备的MAC地址。在不管怎样情况下都能够复位一个联接,而不需要运作发觉解决(假如机器设备在可联接的范畴内)。
要记牢匹配和联接中间的差别。匹配代表着2个机器设备对彼此之间存有性的认知。他们中间有一个共享资源的用以认证的联接密匙,用这一密匙2个机器设备中间创建被数据加密的联接。联接代表着当今机器设备间共享资源一个RFCOMM安全通道,并且能够被用以机器设备间的传送数据。当今Android手机蓝牙API在RFCOMM联接被创建以前,规定机器设备中间匹配。

(在应用手机蓝牙API复位数据加密联接时。匹配是自身积极被运作的。


下边章节目录详细介绍如何发觉已匹配的机器设备,或发觉新的应用了可发觉作用的机器设备。
留意:默认设置Android机器设备是不能发觉的。

客户能够根据系统配置在限制的時间内变为可发觉的机器设备,或是应用软件能够要求客户开启可发觉性,而不离去应用软件。

如何开启可发觉性。会在下文来探讨。
查看匹配机器设备
在运作机器设备发觉以前。应当先查看已匹配的机器设备结合,看来期待的机器设备是不是已经知道的。启用getBondedDevices()方式来结束这一件工作中。这类方式会回到一个意味着已匹配机器设备的BluetoothDevice目标的结合。

例如。你能查看所有的匹配机器设备,随后应用一个ArrayAdapter目标把每一个已匹配机器设备的名字表明给客户。

Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if(pairedDevices.size()>0){
    // Loop through paired devices
    for(BluetoothDevice device : pairedDevices){
        // Add the name and address to an array adapter to show in a ListView
        mArrayAdapter.add(device.getName()+"\n"+ device.getAddress());
    }
}
从BluetoothDevice目标来复位一个联接所需要的所有信息内容便是MAC地址。在这个示例中。MAC地址被做为ArrayAdapter的一部分来储存,并表明给客户。接着,该MAC地址能够被获取用以复位联接。
发觉机器设备
简易的启用startDiscovery()方式就可以開始发觉机器设备。该全过程是多线程的。并且该方式会立刻回到一个布尔运算值来指出发觉解决是不是被取得成功的运行。一般 发觉全过程会查看扫描仪大概12秒,下面获得扫描仪发觉的每一个机器设备的手机蓝牙名字。
为了更好地接受每一个被发觉机器设备的的信息内容,你的应用软件务必注册一个ACTION_FOUND种类的广播节目信号接收器。相对每一个无线设备,系统软件都是会广播节目ACTION_FOUND种类的Intent。这一Intent会带上EXTRA_DEVICE和EXTRA_CLASS额外字段名。这一2个字段名各自包含了BluetoothDevice和BluetoothClass目标。例如,下述演试了你如何注册和处理设备发觉时的广播节目:
// Create a BroadcastReceiver for ACTION_FOUND
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Add the name and address to an array adapter to show in a ListView
            mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
    }
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don’t forget to unregister during onDestroy
警示:运作机器设备发觉,针对蓝牙适配器而言是一个厚重的全过程,它会耗费很多的資源。

一旦发觉要联接机器设备,在试着联接以前一定要确定用cancelDiscovery()方式来停止发觉实际操作。此外,假定早已有一个跟机器设备的联接,那麼运作发觉会显著的减少联接的能用网络带宽,因而在有联接的情况下不应该运作发觉解决。

Android的中国联通性—Bluetooth(四)

开启机器设备的可发觉性
假定要让当地机器设备可以被其他机器设备发觉。那麼就需要启用ACTION_REQUEST_DISCOVERABLE实际操作用意的startActivityForResult(Intent, int)方式。这类方式会向系统配置传出一个开启可发觉方式的要求(不停止应用软件)。

默认设置状况下,机器设备的可发觉方式会不断120秒。根据给Intent目标添加EXTRA_DISCOVERABLE_DURATION额外字段名,可以界定不一样延迟时间。

运用程序流程可以设定的较大 延迟时间是3600秒,0代表着机器设备自始至终是可发觉的。不管怎样低于0或超过3600秒的值都是会自身积极的被设为120秒。例如,下边编码把延迟时间设定为300秒:
Intent discoverableIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
如图2所见到的,申请办理客户开启机器设备的可发觉方式时。会表明那样一个提示框。假定回应“Yes”。那麼机器设备的可发觉方式会不断特定的時间,而且你的Activity会接受含有結果编码相当于可发觉机器设备延迟时间的onActivityResult()回调函数方式的启用。假定客户回应“No”或有产生不正确。则結果编码相当于RESULT_CANCELED.
图2.开启可发觉性提示框。
留意:假定机器设备沒有打开蓝牙功能,那麼打开机器设备的可发觉方式会自身积极打开手机蓝牙。
在可发觉方式下,机器设备会静静地把那样的方式维持到特定的时间。假定你要想在可发觉方式被更改时得到通告,那麼你可以注册一个ACTION_SCAN_MODE_CHANGED种类的Intent广播节目。这一Intent目标中包含了EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE额外字段名,他们会各自对你说新老逐行扫描。他们每一个很有可能的值是:SCAN_MODE_CONNECTABLE_DISCOVERABLE。SCAN_MODE_CONNECTABLE或SCAN_MODE_NONE,他们各自指出机器设备是在可发觉方式下,還是在可发觉方式下但依然可接受联接,或是是在可发觉方式下并不可以接受联接。

假定你需要复位跟远程控制机器设备的联接,你没需要开启机器设备的可现性。只是有在你要想将你的应用软件做为服务器端来接受键入联接时。才需要开启可发觉性,因为远程控制机器设备在跟你的设备连接以前务必能够发觉它。
联接机器设备
为了更好地让2个机器设备上的2个应用软件中间创建联接,你务必同一情况下完成服务器端和client体制,因为一个机器设备务必打开服务port。同一情况下还有一个机器设备务必复位跟服务器端机器设备的联接(应用服务器端的MAC地址来复位一个联接)。

当服务器端和client在一样的RFCOMM安全通道上有一个BluetoothSocket联接时。才能够被感觉是服务器端和client中间创建了联接。这时候。每一个机器设备能够得到键入和輸出流。并且能够彼此之间開始传输数据。
服务器端机器设备和client机器设备彼此之间获得需要的BluetoothSocket的方式是不一样的。服务器端会在接受键入联接的情况下接受到一个BluetoothSocket目标。client会在开启跟服务器端的RFCOMM安全通道时接受到一个BluetoothSocket目标。
一种完成技术性是自身积极的提前准备一个机器设备做为服务器端,便于在每一个机器设备都是会有一个服务项目套接字被开启。并监视联接要求。当还有一个机器设备复位一个跟服务器端套接字的联接时,它便会变为一个client。也有一种方式,一个机器设备是搞清楚的”host”联接。并且根据规定开启一个服务项目套接字,而其他的机器设备只是是简易的复位联接。
留意:假定2个机器设备以前沒有匹配,那麼Android架构会在联接全过程期内,自身积极的表明一个匹配要求通告或提示框给客户,如图所示3所见到的。因而在尝试联接机器设备时,你的应用软件不需要关注机器设备是不是被匹配。FRCOMM的探究性学习联接会一直阻塞,一直到客户取得成功的匹配。或是是因客户回绝匹配或匹配请求超时而不成功。

图3.蓝牙配对提示框

Android的中国联通性—Bluetooth(五)
做为联接的服务器端
如果你要想联接2个机器设备时。一个务必根据拥有一个开启的BluetoothServerSocket目标来做为服务器端。服务项目套接字的主要用途是监视键入的联接要求,并且在一个联接要求被接受时,出示一个BluetoothSocket联接目标。

在从BluetoothServerSocket目标中获得BluetoothSocket时。BluetoothServerSocket能够(并且也应当)被废料。除非是你要想接受许多其他的联接。

下边是创建服务项目套接字和接受一个联接的基础全过程。

1. 启用listenUsingRfcommWithServiceRecord(String, UUID)方式来得到一个BluetoothServerSocket目标。该方式中的String參数是一个可鉴别的你的服务器端的名字,系统软件会自身积极的把它载入机器设备上的Service Discovery Protocol(SDP)数据库查询实体线(该名字是随便的,并且能够简易的应用你的应用软件的名字)。

UUID參数也会被包含在SDP实体线中,并且是跟client设备连接的基础协议书。换句话说,当client试着跟服务器端联接时,它会带上一个它要想联接的服务器端能够唯一鉴别的UUID。

只是有在这种UUID完全配对的状况下,联接才很有可能被接受。

2. 根据启用accept()方式。运行联接要求。

这是一个阻塞启用。只是有在联接被接受或产生出现异常的状况下,该方式才回到。只是有在推送联接要求的远程控制机器设备所带上的UUID跟监视服务项目套接字所注册的一个UUID配对的情况下,该联接才被接受。联接取得成功。accept()方式会回到一个被联接的BluetoothSocket目标。

3. 除非是你要想接受其他联接,不然要启用close()方式。

该方式会释放出来服务项目套接字及其它所占有的所有資源,但不容易关掉被联接的早已有accept()方式所回到的BluetoothSocket目标。

跟TCP/IP不一样。每一个RFCOMM安全通道一次只是愿意联接一个client,因而在大部分状况下。在接受到一个联接套接字以后。立刻启用BluetoothServerSocket目标的close()方式是有些道理的。
accept()方式的启用不应该在主Activity的UI进程中被运作,因为该启用是阻塞的。这会阻拦应用软件的其他互动。

一般 在由应用软件所管理方法的一个新的进程中应用BluetoothServerSocket目标或BluetoothSocket目标来工作中。

要停止例如accept()这类阻塞启用方式。就需要从还有一个进程中启用BluetoothServerSocket目标(或BluetoothSocket目标)的close()方式。这时候阻塞会立刻回到。

留意在BluetoothServerSocket或BluetoothSocket目标上的所有方式全是线程安全的。
演试示例
下边是一个被简单化的接受联接要求的服务器端部件:
private class AcceptThread extends Thread {
    private final BluetoothServerSocket mmServerSocket;

    public AcceptThread() {
        // Use a temporary object that is later assigned to mmServerSocket,
        // because mmServerSocket is final
        BluetoothServerSocket tmp = null;
        try {
            // MY_UUID is the app’s UUID string, also used by the client code
            tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
        } catch (IOException e) { }
        mmServerSocket = tmp;
    }

    public void run() {
        BluetoothSocket socket = null;
        // Keep listening until exception occurs or a socket is returned
        while (true) {
            try {
                socket = mmServerSocket.accept();
            } catch (IOException e) {
                break;
            }
            // If a connection was accepted
            if (socket != null) {
                // Do work to manage the connection (in a separate thread)
                manageConnectedSocket(socket);
                mmServerSocket.close();
                break;
            }
        }
    }

    /** Will cancel the listening socket, and cause the thread to finish */
    public void cancel() {
        try {
            mmServerSocket.close();
        } catch (IOException e) { }
    }
}
在这个示例中,只是期待有一个进入联接,因而联接一旦被接受。并获得了一个BluetoothSocket目标,应用软件便会把得到的BluetoothSocket目标发给一个单独的进程。随后关掉BluetoothServerSocket目标并终断循环系统。
留意。在accept()方式回到BluetoothSocket目标时,套接字早已是被联接的。因而你没应当再启用像client那般启用connect()方式了。
应用软件中的manageConnectedSocket()方式是一个自身定义方法,它会复位用以传输数据的进程。
一般 ,一旦你监视结束进入联接,就应当关掉BluetoothServerSocket目标。在这个演试示例中,close()方式是在得到BluetoothSocket目标以后被启用的。你很有可能还想要出示一个公共性方式,便于在你的进程中能够关掉你要想停止监视的服务项目套接字事情中的独享BluetoothSocket目标。

做为联接的client
为了更好地复位一个与远程控制机器设备(拥有开启的服务项目套接字的机器设备)的联接。最先务必获得个意味着远程控制机器设备的BluetoothDevice目标。

随后应用BluetoothDevice目标来获得一个BluetoothSocket目标,并复位该联接。

下边是一个关键的联接全过程:
1. 根据启用BluetoothDevice的createRfcommSocketToServiceRecord(UUID)方式。得到一个BluetoothSocket目标。

这类方式会复位一个联接到BluetoothDevice目标的BluetoothSocket目标。传送给这类方式的UUID參数务必与服务器端机器设备开启BluetoothServerSocket目标时需应用的UUID相符合。在你的应用软件中简易的应用硬编码开展核对。假定配对。服务器端和client编码就可以运用这一BluetoothSocket目标了。

2. 根据启用connect()方式来复位联接。在这个启用中。为了更好地寻找配对的UUID,系统软件会在远程控制的机器设备上运作一个SDP查看。假定查看取得成功,并且远程控制机器设备接受了该联接要求。那麼它会在联接期内共享资源应用RFCOMM安全通道,并且connect()方式会回到。这类方式是一个阻塞启用。

假定因为一些缘故,连接失败或网络连接超时(大概在12秒以后),便会抛出去一个出现异常。
因为connect()方式是阻塞启用,这一联接全过程自始至终应当在单独与主Activity进程以外的进程中被运作。
留意:在启用connect()方式时,应当自始至终保证机器设备沒有已经运作机器设备发觉实际操作。假定是在发觉实际操作的全过程中。那麼联接试着会显著的减缓。并且更好像要不成功的模样。
演试示例
下边是复位手机蓝牙进程的一个关键的示例:
private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;

    public ConnectThread(BluetoothDevice device) {
        // Use a temporary object that is later assigned to mmSocket,
        // because mmSocket is final
        BluetoothSocket tmp = null;
        mmDevice = device;

        // Get a BluetoothSocket to connect with the given BluetoothDevice
        try {
            // MY_UUID is the app’s UUID string, also used by the server code
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) { }
        mmSocket = tmp;
    }

    public void run() {
        // Cancel discovery because it will slow down the connection
        mBluetoothAdapter.cancelDiscovery();

        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException) {
            // Unable to connect; close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeException) { }
            return;
        }

        // Do work to manage the connection (in a separate thread)
        manageConnectedSocket(mmSocket);
    }

    /** Will cancel an in-progress connection, and close the socket */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
}
在创建联接以前要启用cancelDiscovery()方式。在联接以前应当自始至终启用这类方式,并且无需具体的查验手机蓝牙发觉解决是不是已经实行也是安全性的(假定要想查验。启用isDiscovering()方式)。
manageConnectedSocket()方式是一个应用软件中自身界定的方式,它会复位传输数据的进程。

当应用完BluetoothSocket目标时,要自始至终启用close()方式来开展清除工作中。那样做会立刻关掉被联接的套接字,并清除所有的內部資源。

Android的中国联通性—Bluetooth(六)

管理方法联接
如果你取得成功的联接了2个(或许多其他)机器设备时。每一个机器设备都是有一个被联接的BluetoothSocket目标。它是优良的開始,因为你能在机器设备中间共享资源数据信息。应用BluetoothSocket目标来传送随便数据信息的全过程是简易的:
1. 各自根据getInputStream()和getOutputStream()方式来得到根据套接字来解决传送每日任务的InputStream和OutputStream目标。
2. 用read(byte[])和write(byte[])方式来读写能力流中的数据信息。

自然,有很多其他完成关键点要考虑到。最先和前提条件,针对所有数据流分析的读写能力应当应用专用型的进程。

它是关键的,因为read(byte[])和write(byte[])方式是阻塞式启用。

Read(byte[])方式在从数据流分析中载入一些数据信息以前一直是阻塞的。write(byte[])方式一般不是阻塞的,但是针对流的操纵。假定远程控制机器设备并不是充足快的启用read(byte[])方式。并且正中间缓存文件被填满,那麼write(byte[])方式也会被阻塞。因而,你的进程中的主循环系统应该是专用型于从InputStream目标中获取数据。

在进程类中有一个单独的公共性方式用以复位对OutputStream目标的载入实际操作。
演试示例
private class ConnectedThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        mmSocket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        // Get the input and output streams, using temp objects because
        // member streams are final
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    public void run() {
        byte[] buffer = new byte[1024];  // buffer store for the stream
        int bytes; // bytes returned from read()

        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);
                // Send the obtained bytes to the UI activity
                mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                break;
            }
        }
    }

    /* Call this from the main activity to send data to the remote device */
    public void write(byte[] bytes) {
        try {
            mmOutStream.write(bytes);
        } catch (IOException e) { }
    }

    /* Call this from the main activity to shutdown the connection */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
}
上例中,构造器用以获得必需的流目标,并且一旦被运作。进程便会等候根据InputStream目标传到的键入。

当read(byte[])方式从数据流分析中回到特定字节数的数据信息时,应用来源于父亲类的Handler把该数据信息会被发给主Activity,随后回到再次等候流中的许多其他的字节数。

推送輸出数据信息如同在主Activity中启用进程的write()方式一样简易,并且给该方式传到要推送的字节数。

随后这类方式简易的启用write(byte[])方式把数据信息发给远程控制机器设备。
进程的cancel()方式是尤为重要的,便于该联接在不管怎样情况下能够根据关掉BluetoothSocket目标来停止。这类方式在应用完手机蓝牙时应当自始至终被启用。

应用配备来工作中
从Android3.0開始,手机蓝牙API就包含了对用手机蓝牙配备来开展工作中的适用。Bluetooth Profile是机器设备中间根据手机蓝牙开展通讯的无线网络接口规范。

之中一个演试示例是Hands-Free配备。

针对一个联接到无线蓝牙耳机的手机,手机和无线蓝牙耳机都务必适用Hands-Free配备。
你能完成BluetoothProfile插口。来撰写你自己的适用独特手机蓝牙配备的类。Android手机蓝牙API出示了对下边手机蓝牙配备的完成:
· Headset(手机耳机):该配备出示了对用以手机的无线蓝牙耳机的适用。Android出示了BluetoothHeadset类。这一类是一个代理商,它根据进程间通信(IPC)来操纵无线蓝牙耳机服务项目。

它包含了Bluetoot Headset和Hands-Free(v1.5)配备。

BluetoothHeadset类包含了对AT命令的适用。

有关AT命令的许多其他探讨,可以看“Vendor-specific AT commands”。
· A2DP:Advanced Audio Distribution Profile的简称。

它界定如何收尘高质量的声频。并让声频流在根据手机蓝牙在机器设备中间传送。Android出示了BluetoothA2dp类,它一个根据IPC来操纵的手机蓝牙A2DP服务项目的代理商。
· Health Device:Android4.0(API Level 14)中引进了对Bluetooth Health Device Profile(HDP)的适用。

它能够使你建立一个跟适用手机蓝牙的保健养生机器设备开展手机蓝牙通讯的应用软件,这种保健养生包括:心跳心电监护仪、心率測检仪、电子温度计、体重计等。

相对它适用的机器设备的目录和他们相对的机器设备数据信息标准,手机蓝牙同盟的网站:www.bluetooth.org。留意,这种值也是參考了ISO/IEEE11073-20601[7]标准中取名编号标准配件中的名叫MDC_DEV_SPEC_PROFILE_*标准。
下边是应用配备开展工作中的基础流程
1. 获得默认设置的电源适配器。
2.应用getProfileProxy()方式来创建一个与配备相符合的配备代理商目标的联接。在下列的演试示例中。配备代理商目标是一个BluetoothHeadset目标案例。
3.建立一个BluetoothProfile.ServiceListener窃听器,该窃听器会在他们联接到server或终断与server的联接时。通告BluetoothProfile的IPCclient。

4.在onServiceConnected()事情中。得到对配备代理商目标的处理权;
5.一旦得到配备代理商目标,就可以用它来监控联接的情况,并运作与配备相关的其他实际操作。
例如,下边编码精彩片段表明如何联接一个BluetoothHeadset代理商目标。便于操纵Headset配备:
BluetoothHeadset mBluetoothHeadset;

// Get the default adapter
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

// Establish connection to the proxy.
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET);

private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
    public void onServiceConnected(int profile, BluetoothProfile proxy) {
        if (profile == BluetoothProfile.HEADSET) {
            mBluetoothHeadset = (BluetoothHeadset) proxy;
        }
    }
    public void onServiceDisconnected(int profile) {
        if (profile == BluetoothProfile.HEADSET) {
            mBluetoothHeadset = null;
        }
    }
};

// … call functions on mBluetoothHeadset

// Close proxy connection after use.
mBluetoothAdapter.closeProfileProxy(mBluetoothHeadset);

Android的中国联通性—Bluetooth(七)

身心健康机器设备配备
Android4.0(APILevel 14)中引进了对Bluetooth Health Device Profile(HDP)适用,这次使你建立跟适用手机蓝牙的身心健康机器设备开展手机蓝牙通讯的应用软件,如心跳心电监护仪、心率測检仪、电子温度计、体重计等。

Bluetooth Health API包含了BluetoothHealth、BluetoothHealthCallbackhe和BluetoothHealthAppConfiguration等类。
在应用的Bluetooth Health API中。有利于了解下边重要的HDP定义:
定义
详细介绍
Source
HDP中界定的一个人物角色,一个Source是一个把医疗数据(如休重、血弹、人体体温等)传送给例如Android手机上或平板等的机器设备。
Sink
HDP中界定的一个人物角色,在HDP中。一个Sink是一个接受医疗数据的小机器设备。

在一个Android HDP应用软件中。Sink用BluetoothHealthAppConfiguration目标来意味着。

Registration
指的是给特殊的身心健康机器设备注册一个Sink。

Connection
指的是身心健康机器设备和Android手机上或平板中间开启的通讯安全通道。
建立HDP应用软件
下边是建立Android HDP运用中所牵涉到的基础流程:
1. 得到BluetoothHealth代理商目标的引入。

类似于基本的手机耳机和A2DP配备机器设备,务必启用含有BluetoothProfile.ServiceListener和HEALTH配备种类參数的getProfileProxy()方式来创建与配备代理商目标的联接。
2. 建立BluetoothHealthCallback目标。并注册一个饰演Health Sink人物角色的应用软件配(BluetoothHealthAppConfiguration)。
3. 创建跟身心健康机器设备的联接。一些机器设备会复位联接,在这类机器设备中开展这一个步是沒有必需的。
4. 当取得成功的联接到身心健康机器设备时,就可以应用文档描绘描述来读写能力身心健康机器设备。所接受到的数据信息需要应用身心健康管理工具来表述。这一管理工具完成了IEEE 11073-xxxxx标准。

5. 结束之上流程后。关掉身心健康安全通道,并销户应用软件。

该安全通道在长期性被闲置不用时,也会被关掉。

 

    关键字:

天才代写-代写联系方式