收藏 分享(赏)

android-bluetooth详解.doc

上传人:cjc2202537 文档编号:202247 上传时间:2018-03-23 格式:DOC 页数:16 大小:113.50KB
下载 相关 举报
android-bluetooth详解.doc_第1页
第1页 / 共16页
android-bluetooth详解.doc_第2页
第2页 / 共16页
android-bluetooth详解.doc_第3页
第3页 / 共16页
android-bluetooth详解.doc_第4页
第4页 / 共16页
android-bluetooth详解.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、对于 Android 的英文帮助文档,总是看了记不住,远不如对中文资料那么印象深,所以下面的叙述都是对 Android 帮助文档 Bluetooth 的翻译。一、BluetoothAndroid 平台包含了对 Bluetooth 协议栈的支持,允许机器通过 Bluetooth 设备进行无线数据交换。应用框架通过 Android Bluetooth API 访问 Bluetooth 功能模块。 这些 API 能让应用无线连接其他 Bluetooth 设备,实现点对点和多点之间的通信。运用蓝牙 API, Android 应用程序可以完成如下操作:1、扫描其他 Bluetooth 设备。2、查询配对

2、 Bluetooth 设备的本地 Bluetooth 适配器。3、建立 RFCOMM 通道。4、通过服务探索连接到其他设备。5、与其他设备进行数据传输。6、管理多个连接二、The Basics本文描述如何使用 Android Bluetooth APIs 完成 Bluetooth 通讯的 4 个必要任务:设置Bluetooth,搜寻本地配对或者可用的 Bluetooth 设备,连接 Bluetooth 设备,与 Bluetooth设备进行数据传输。所有可用的 Bluetooth APIs 都包含在 android.bluetooth 包中。下面是建立 Bluetooth 连接需要用到的类和接口

3、的总结:1、BluetoothAdapter描述本地 Bluetooth 适配器(Bluetooth 接收器)。BluetoothAdapter 是所有 Bluetooth 相关活动的入口。运用 BluetoothAdapter 可以发现其他 Bluetooth 设备,查询连接(或配对)的设备列表,用已知 MAC 地址实例化一个 BluetoothDevice 对象,创建一个BluetoothServerSocket 对象侦听其他设备的通信。2、BluetoothDevice描述一个远程 Bluetooth 设备。可以用它通过一个 BluetoothSocket 请求一个远程设备的连接,或者查

4、询远程设备的名称、地址、类、连接状态等信息。3、BluetoothSocket描述一个 Bluetooth Socket 接口(类似于 TCP Socket)。应用通过 InputStream 和OutputStream.与另外一个 Bluetooth 设备交换数据,即它是应用与另外一个设备交换数据的连接点。4、BluetoothServerSocket描述一个开放的 socket 服务器,用来侦听连接进来的请求(类似于 RCP ServerSocket)。为了连接两个 Android 设备,一个设备必须使用该类来开启一个 socket 做服务器,当另外一个设备对它发起连接请求时并且请求被接受

5、时,BluetoothServerSocket 会返回一个连接的 BluetoothSocket 对象。5、BluetoothClass描述一个 Bluetooth 设备的一般规格和功能。这个是用来定义设备类和它的服务的只读属性集。然而,它并不是可靠的描述设备支持的所有 Bluetooth 配置和服务,而只是一些设备类型的有用特征。6、BluetoothProfile描述 Bluetooth Profile 的接口。Bluetooth Profile 是两个设备基于蓝牙通讯的无线接口描述。(对 Bluetooth Profile 的详细解释,来自百度:为了更容易的保持 Bluetooth 设备

6、之间的兼容,Bluetooth 规范中定义了 Profile。Profile 定义了设备如何实现一种连接或者应用,你可以把 Profile 理解为连接层或者应用层协议。 比如,如果一家公司希望它们的Bluetooth 芯片支援所有的 Bluetooth 耳机,那么它只要支持 HeadSet Profile 即可,而无须考虑该芯片与其它 Bluetooth 设备的通讯与兼容性问题。如果你想购买 Bluetooth 产品,你应该了解你的应用需要哪些 Profile 来完成,并且确保你购买的 Bluetooth 产品支持这些Profile。)7、BluetoothHeadset提供移动电话的 Blu

7、etooth 耳机支持。包括 Bluetooth 耳机和 Hands-Free (v1.5) profiles。8、BluetoothA2dp定义两个设备间如何通过 Bluetooth 连接进行高质量的音频传输。A2DP(Advanced Audio Distribution Profile):高级音频传输模式。9、BluetoothProfile.ServiceListener一个接口描述,在与服务连接或者断连接的时候通知 BluetoothProfile IPC(这是内部服务运行的一个特定的模式)。三、Bluetooth Permissions要使用 Bluetooth 功能,至少需要 2

8、 个 Bluetooth 权限:BLUETOOTH 和BLUETOOTH_ADMIN.BLUETOOTH:用来授权任何 Bluetooth 通信,如请求连接,接受连接,传输数据等。BLUETOOTH_ADMIN:用来授权初始化设备搜索或操作 Bluetooth 设置。大多数应用需要它的唯一场合是用来搜索本地 Bluetooth 设备。本授权的其他功能不应该被使用,除非是需要修改 Bluetooth 设置的“power manager(电源管理) ”应用。注意:需要 BLUETOOTH_ADMIN 权限的场合,BLUETOOTH 权限也是必需的。需要在 manifest 文件中声明 Blueto

9、oth 权限,示例如下:. 四、Setting Up Bluetooth在用 Bluetooth 通讯之前,需要确认设备是否支持 Bluetooth,如果支持,还得确保Bluetooth 是可用的。如果设备不支持 Bluetooth,需要优雅的将 Bluetooth 置为不可用。如果支持 Bluetooth,但没有开启,可以在应用中请求开启 Bluetooth。该设置使用 BluetoothAdapter.通过两个步骤完成。1、获取 BluetoothAdapterBluetoothAdapter 是每个 Bluetooth 的 Activity 都需要用到的。用静态方法getDefaultA

10、dapter()获取 BluetoothAdapter,返回一个拥有 Bluetooth 适配器的BluetoothAdapter 对象。如果返回 null,说明设备不支持 Bluetooth,关于 Bluetooth 的故事到此就结束了(因为你干不了什么了)。示例:BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter = null) / Device does not support Bluetooth 2、Enable Bluetooth接下来,就是确

11、保 Bluetooth 功能是开启的。调用 isEnabled()来检查 Bluetooth 当前是否是开启的。用 ACTION_REQUEST_ENABLE action Intent 调用 startActivityForResult()来请求开启 Bluetooth,这会通过系统设置发出一个 Bluetooth 使能请求(并且不会停止本应用程序)。示例:if (!mBluetoothAdapter.isEnabled() Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startAct

12、ivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 用户请求使能 Bluetooth 时,会显示一个对话框。选择“Yes” ,系统会使能 Bluetooth,并且焦点会返回你的应用程序。如果使能 Bluetooth 成功,你的 Activity 会在 onActivityResult()回调函数中收到RESULT_OK 的结果码。如果 Bluetooth 使能因发生错误(或用户选择了“No”)而失败,收到的结果码将是 RESULT_CANCELED。作为可选项,应用也可以侦听 ACTION_STATE_CHANGED broadcast Int

13、ent,这样无论Bluetooth 状态何时被改变系统都会发出 broadcast(广播)。该广播包含附加的字段信息EXTRA_STATE 和 EXTRA_PREVIOUS_STATE 分别代表新的和旧的 Bluetooth 状态,该字段可能的值为 STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF, 和STATE_OFF。应用运行时,侦听 ACTION_STATE_CHANGED 广播来检测 Bluetooth 状态的改变是很有用的。提示:启用 Bluetooth 可被发现功能能够自动开启 Bluetooth。如果在完成 Activity 之前需要持续

14、的使能 Bluetooth 可被发现功能,那么上面的第 2 步就可以忽略。五、Finding Devices使用 BluetoothAdapter 可以通过设备搜索或查询配对设备找到远程 Bluetooth 设备。Device discovery(设备搜索)是一个扫描搜索本地已使能 Bluetooth 设备并且从搜索到的设备请求一些信息的过程(有时候会收到类似“discovering”,“inquiring”或“scanning”)。但是,搜索到的本地 Bluetooth 设备只有在打开被发现功能后才会响应一个 discovery 请求,响应的信息包括设备名,类,唯一的 MAC 地址。发起搜寻

15、的设备可以使用这些信息来初始化跟被发现的设备的连接。一旦与远程设备的第一次连接被建立,一个 pairing 请求就会自动提交给用户。如果设备已配对,配对设备的基本信息(名称,类,MAC 地址)就被保存下来了,能够使用Bluetooth API 来读取这些信息。使用已知的远程设备的 MAC 地址,连接可以在任何时候初始化而不必先完成搜索(当然这是假设远程设备是在可连接的空间范围内)。需要记住,配对和连接是两个不同的概念:配对意思是两个设备相互意识到对方的存在,共享一个用来鉴别身份的链路键(link-key),能够与对方建立一个加密的连接。连接意思是两个设备现在共享一个 RFCOMM 信道,能够相

16、互传输数据。目前 Android Bluetooth APIs 要求设备在建立 RFCOMM 信道前必须配对(配对是在使用Bluetooth API 初始化一个加密连接时自动完成的)。下面描述如何查询已配对设备,搜索新设备。注意:Android 的电源设备默认是不能被发现的。用户可以通过系统设置让它在有限的时间内可以被发现,或者可以在应用程序中要求用户使能被发现功能。1、Querying paired devices在搜索设备前,查询配对设备看需要的设备是否已经是已经存在是很值得的,可以调用getBondedDevices()来做到,该函数会返回一个描述配对设备 BluetoothDevice

17、 的结果集。例如,可以使用 ArrayAdapter 查询所有配对设备然后显示所有设备名给用户:Set 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 L

18、istView mArrayAdapter.add(device.getName() + “n“ + device.getAddress(); BluetoothDevice 对象中需要用来初始化一个连接唯一需要用到的信息就是 MAC 地址。2、Discovering devices要开始搜索设备,只需简单的调用 startDiscovery()。该函数时异步的,调用后立即返回,返回值表示搜索是否成功开始。搜索处理通常包括一个 12 秒钟的查询扫描,然后跟随一个页面显示搜索到设备 Bluetooth 名称。应用中可以注册一个带 CTION_FOUND Intent 的 BroadcastRec

19、eiver,搜索到每一个设备时都接收到消息。对于每一个设备,系统都会广播 ACTION_FOUND Intent,该 Intent 携带着而外的字段信息 EXTRA_DEVICE 和 EXTRA_CLASS,分别包含一个BluetoothDevice 和一个 BluetoothClass。下面的示例显示如何注册和处理设备被发现后发出的广播:/ Create a BroadcastReceiver for ACTION_FOUND private final BroadcastReceiver mReceiver = new BroadcastReceiver() public void onR

20、eceive(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

21、and address to an array adapter to show in a ListViewmArrayAdapter.add(device.getName() + “n“ + device.getAddress(); ; / Register the BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter); / Dont forget to unregister during onDest

22、roy警告:完成设备搜索对于 Bluetooth 适配器来说是一个重量级的处理,要消耗大量它的资源。一旦你已经找到一个设备来连接,请确保你在尝试连接前使用了 cancelDiscovery()来停止搜索。同样,如果已经保持了一个连接的时候,同时执行搜索设备将会显著的降低连接的带宽,所以在连接的时候不应该执行搜索发现。3、Enabling discoverability如果想让本地设备被其他设备发现,可以带 ACTION_REQUEST_DISCOVERABLE action Intent 调用 startActivityForResult(Intent, int) 方法。该方法会提交一个请求通

23、过系统刚设置使设备出于可以被发现的模式(而不影响应用程序)。默认情况下,设备在 120秒后变为可以被发现的。可以通过额外增加 EXTRA_DISCOVERABLE_DURATION Intent自定义一个值,最大值是 3600 秒,0 表示设备总是可以被发现的(小于 0 或者大于 3600则会被自动设置为 120 秒)。下面示例设置时间为 300:Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAd

24、apter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent);询问用户是否允许打开设备可以被发现功能时会显示一个对话框。如果用户选择“Yes”,设备会在指定时间过后变为可以被发现的。Activity 的 onActivityResult()回调函数被调用,结果码等于设备变为可以被发现所需时长。如果用户选择“No” 或者有错误发生,结果码会是Activity.RESULT_CANCELLED。提示:如果 Bluetooth 没有启用,启用 Bluetooth 可被发现功能能够自动开启 Bluetooth。在规

25、定的时间内,设备会静静的保持可以被发现模式。如果想在可以被发现模式被更改时受到通知,可以用 ACTION_SCAN_MODE_CHANGED Intent 注册一个BroadcastReceiver,包含额外的字段信息 EXTRA_SCAN_MODE 和EXTRA_PREVIOUS_SCAN_MODE 分别表示新旧扫描模式,其可能的值为SCAN_MODE_CONNECTABLE_DISCOVERABLE(discoverable mode),SCAN_MODE_CONNECTABLE(not in discoverable mode but still able to receive conn

26、ections), SCAN_MODE_NONE(not in discoverable mode and unable to receive connections)。如果只需要连接远程设备就不需要打开设备的可以被发现功能。只在应用作为一个服务器socket 的宿主用来接收进来的连接时才需要使能可以被发现功能,因为远程设备在初始化连接前必须先发现了你的设备。六、Connecting Devices为了建立两个设备之间的应用的连接,需要完成服务器端和客户端,因为一个设备必须打开一个服务器 socket 而另外一个设备必须初始化连接(用服务器端的 MAC 地址)。服务器和客户端在各自获得一个基于

27、同一个 RFCOMM 信道的已连接的 BluetoothSocket 对象后就被认为连接已经建立。这个时候,双方设备可以获取输入输出流,数据传输可以开始了。本节描述如何在两个设备之间初始化连接。服务器设备和客户端设备用不同的方式获取各自需要的 BluetoothSocket 对象。服务器端的在接收一个进来的连接时获取到,客户端的在打开一个与服务器端的 RFCOMM 信道的时候获取到。一个实现技巧是自动把每个设备作为服务器,这样就拥有了一个打开的 socket 用来侦听连接。然后任一设备就能够发起与另一个设备的连接,并成为客户端。另外,一个设备也可以明确的成为“host”,并打开一个服务端 so

28、cket,另一个设备可以简单的发起连接。注意:如果两个设备之前没有配对,那么在连接处理过程中 Android 应用框架会自动显示一个配对请求的通知或对话框给用户。因此,当尝试连接设备时,应用不需要关心设备是否已经配对。RFCOMM 连接会阻塞直到用户成功将设备配对(如果用户拒绝配对或者配对超时了连接会失败)。1、Connecting as a server如果要连接两个设备,其中一个必须充当服务器,通过持有一个打开的BluetoothServerSocket 对象。服务器 socket 的作用是侦听进来的连接,如果一个连接被接受,提供一个连接好的 BluetoothSocket 对象。从 Bl

29、uetoothServerSocket 获取到BluetoothSocket 对象之后,BluetoothServerSocket 就可以(也应该)丢弃了,除非你还要用它来接收更多的连接。下面是建立服务器 socket 和接收一个连接的基本步骤:1.通过调用 listenUsingRfcommWithServiceRecord(String, UUID)得到一个BluetoothServerSocket 对象。该字符串为服务的识别名称,系统将自动写入到一个新的服务发现协议(SDP)数据库接入口到设备上的(名字是任意的,可以简单地是应用程序的名称)项。 UUID 也包括在SDP 接入口中,将是客

30、户端设备连接协议的基础。也就是说,当客户端试图连接本设备,它将携带一个 UUID 用来唯一标识它要连接的服务,UUID 必须匹配,连接才会被接受。2.通过调用 accept()来侦听连接请求。这是一个阻塞的调用,知道有连接进来或者产生异常才会返回。只有远程设备发送一个连接请求,并且携带的 UUID 与侦听它 socket 注册的 UUID 匹配,连接请求才会被接受。如果成功,accept()将返回一个连接好的 BluetoothSocket 对象。3.除非需要再接收另外的连接,否则的话调用 close()。close()释放 server socket 和它的资源,但不会关闭连接 accept

31、()返回的连接好的BluetoothSocket 对象。与 TCP/IP 不同,RFCOMM 同一时刻一个信道只允许一个客户端连接,因此大多数情况下意味着在 BluetoothServerSocket 接受一个连接请求后应该立即调用 close()。accept()调用不应该在主 Activity UI 线程中进行,因为这是个阻塞的调用,会妨碍其他的交互。经常是在在一个新线程中做 BluetoothServerSocket 或 BluetoothSocket 的所有工作来避免 UI 线程阻塞。注意所有 BluetoothServerSocket 或 BluetoothSocket 的方法都是线

32、程安全的。示例:下面是一个简单的接受连接的服务器组件代码示例: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 t

33、he apps 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 s

34、ocket = 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

35、 */ public void cancel() try mmServerSocket.close(); catch (IOException e) 本例中,仅仅只接受一个进来的连接,一旦连接被接受获取到 BluetoothSocket,就发送获取到的 BluetoothSocket 给一个单独的线程,然后关闭 BluetoothServerSocket 并跳出循环。注意:accept()返回 BluetoothSocket 后,socket 已经连接了,所以在客户端不应该呼叫connnect()。manageConnectedSocket()是一个虚方法,用来初始化线程好传输数据。通常应该在

36、处理完侦听到的连接后立即关闭 BluetoothServerSocket。在本例中,close() 在得到 BluetoothSocket 后马上被调用。还需要在线程中提供一个公共的方法来关闭私有的BluetoothSocket,停止服务端 socket 的侦听。2、Connecting as a client为了实现与远程设备的连接,你必须首先获得一个代表远程设备 BluetoothDevice 对象。然后使用 BluetoothDevice 对象来获取一个 BluetoothSocket 来实现来接。下面是基本的步骤:1.用 BluetoothDevice 调用 createRfcommS

37、ocketToServiceRecord(UUID)获取一个BluetoothSocket 对象。这个初始化的 BluetoothSocket 会连接到 BluetoothDevice。UUID 必须匹配服务器设备在打开 BluetoothServerSocket 时用到的 UUID(用listenUsingRfcommWithServiceRecord(String, UUID)。可以简单的生成一个 UUID 串然后在服务器和客户端都使用该 UUID。2.调用 connect()完成连接当调用这个方法的时候,系统会在远程设备上完成一个 SDP 查找来匹配 UUID。如果查找成功并且远程设备接

38、受连接,就共享 RFCOMM 信道,connect()会返回。这也是一个阻塞的调用,不管连接失败还是超时(12 秒)都会抛出异常。注意:要确保在调用 connect()时没有同时做设备查找,如果在查找设备,该连接尝试会显著的变慢,慢得类似失败了。实例:下面是一个完成 Bluetooth 连接的样例线程: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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报