Android蓝牙功能及RFCOMMSDP简介
蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)
蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)关键词:蓝牙核心技术协议 HCI L2CAP SDP RFCOMM作者:xubin341719(欢迎转载,请注明作者,请尊重版权,谢谢!)欢迎指正错误,共同学习、共同进步!!下载链接:Bluetooth PROFILE SPECIFICATIONS(基本涵盖所有蓝牙协议)、buletooth core 2.1-4.0 SPECIFICATION(三蓝牙版本的核心协议v2.1\v3.0\v4.0)、蓝牙核心技术与应用马建仓版(蓝牙协议相关初学者必读,开发者参考)蓝牙核心技术概述(一):蓝牙概述蓝牙核心技术概述(二):蓝牙使用场景蓝牙核心技术概述(三):蓝牙协议规范(射频、基带链路控制、链路管理)蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)蓝牙核心技术概述(五):蓝牙协议规范(irOBEX、BNEP、AVDTP、AVCTP)一、主机控制接口协议 HCI蓝牙主机-主机控模型蓝牙软件协议栈堆的数据传输过程:1、蓝牙控制器接口数据分组:指令分组、事件分组、数据分组(1)、指令分组如:Accpet Connection RequestOpcode为:0x0409参数长度为: 07参数中蓝牙地址为:00:0d:fd:5f:16:9f角色为:从设备 0x01大端数据模式指令为:09 04 07 9f 16 5f fd 0d 00 01(2)、事件分组如上图:Opcode :0x0409状态: 0x00总长度: 4字节命令状态:0x0f(3)、数据分组ACL 数据分组注:PB Packet_Boundary BC Broadcast Flag SCO 数据分组(4)、RS232分组指示器:2、HCI控制命令(1)、链路控制指令(2)、链路策略指令(4)、信息指令参数(5)、状态指令参数(6)、测试指令(7)、错误代码二、逻辑链路控制与适配协议 L2CAPL2CAP位于基带之上,将基带的数据分组转换为便于高层应用的数据分组格式,并提供协议复用和服务质量交换等功能。
蓝牙的协议标准
蓝牙的协议标准
蓝牙的协议标准主要包括以下几个方面:
1. 蓝牙规范:蓝牙技术联盟发布的蓝牙规范,包括了蓝牙芯片和设备的设计、接口、通信协议等方面的规范。
2. L2CAP协议:逻辑链路控制和适配层(L2CAP)协议,用
于对蓝牙连接进行协议处理和调度。
3. SDP协议:服务发现协议(SDP),用于在蓝牙设备之间进行服务发现和配置,为应用程序提供服务信息。
4. RFCOMM协议:串行端口协议(RFCOMM),用于在蓝牙设备之间建立虚拟串口,实现数据通信。
5. OBEX协议:对象交换协议(OBEX),用于在蓝牙设备之
间进行数据交换,如文件传输、名片传送等。
6. HSP协议:耳机协议(HSP),将蓝牙技术应用于音频设备,包括耳机、扬声器等。
7. HFP协议:免提协议(HFP),将蓝牙技术应用于车载通信
设备,提供免提电话等功能。
8. A2DP协议:高级音频分发协议(A2DP),将蓝牙技术应
用于音频设备,提供高质量音频传输。
安卓蓝牙中文翻译帮助文档
尔类型,它表明发现过程启动是否成功。这个发现过程通常包含了 12S 的扫描查询过程,接 下来就是包含了每个被发现设备的的页扫描来提取蓝牙设备的名字。
// Create a BroadcastReceiver for ACTION_FOUND private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
如果你将要初始化一个连接到远程设备,你就没有必要打开可见性。使能可见性仅仅只是让 你的应用程序作为服务端 Socket,它用来接受输入连接请求。因为远程设备在初始化连接之 前必须先发现这个设备。
连接设备 为了在你的应用程序里面让 2 个设备建立连接,你必须实行服务端和客户端连接机制。因为 一个设备必须打开一个 server socket 服务端套接字而另一个设备必须初始化这个连接(使 用 server 设备的物理地址来建立连接)。当 server 和 client 他们之间在同一个 RFCOMM 通 信通道之间有一个连接好了的 BluetoothSocket 的时候,server 和 client 服务端和客户端就被 认为是已经建立好了连接。在这个点上,每个设备就可以获得输入输出流,数据传输也可以 开始。关于这点我们在管理连接那节介绍,我们这节只讲如何在 2 个设备之间初始化连接。
android蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程
Android bluetooth介绍(二)android 蓝牙代码架构及其uart 到rfcomm 流程一、Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架)Android的蓝牙系统,自下而上包括以下一些内容如上图所示:1、串口驱动Linux的内核的蓝牙驱动程、Linux的内核的蓝牙协议的层2、BlueZ的适配器BlueZ的(蓝牙在用户空间的函式库)bluez代码结构Bluetooth协议栈BlueZ分为两部分:内核代码和用户态程序及工具集。
(1)、内核代码:由BlueZ核心协议和驱动程序组成Bluetooth协议实现在内核源代码 kernel/net/bluetooth中。
包括hci,l2cap,hid,rfcomm,sco,SDP,BNEP等协议的实现。
(2)、驱动程序:kernel/driver/bluetooth中,包含Linuxkernel对各种接口的Bluetooth device的驱动,如:USB接口,串口等。
(3)、用户态程序及工具集:包括应用程序接口和BlueZ工具集。
BlueZ提供函数库以及应用程序接口,便于程序员开发bluetooth应用程序。
BlueZ utils是主要工具集,实现对bluetooth设备的初始化和控制。
3、蓝牙相关的应用程序接口Android.buletooth包中的各个Class(蓝牙在框架层的内容-----java)同样下图也是一张比较经典的蓝牙代码架构图(google官方提供)二、蓝牙通过Hciattach启动串口流程:1、hciattach总体流程2、展讯hciattach代码实现流程:三、具体代码分析1、initrc中定义idh.code\device\sprd\sp8830ec_nwcn\init.sc8830.rc1.service hciattach /system/bin/hciattach -n /dev/sttybt0 sprd_shark2.socket bluetooth stream 660 bluetooth bluetoother bluetooth4.group wifi bluetooth net_bt_admin net_bt inet net_raw net_admin system5.disabled6.oneshotadb 下/dev/ttybt0(不同平台有所不同)PS 进程中:hicattch2、/system/bin/hciattach 执行的Main函数idh.code\external\bluetooth\bluez\tools\hciattach.cservice hciattach /system/bin/hciattach -n /dev/sttybt0sprd_shark 传进两个参数,/dev/sttybt0 和 sprd_shark1.i nt main(int argc, char *argv[])2.{3.………………4.for (n = 0; optind < argc; n++, optind++) {5.char *opt;6.7.opt = argv[optind];8.9.switch(n) {10. case 0://(1)、解析驱动的位置;11. dev[0] = 0;12. if (!strchr(opt, '/'))13. strcpy(dev, "/dev/");14. strcat(dev, opt);15. break;16.17. case 1://(2)、解析串口的配置相关参数;18. if (strchr(argv[optind], ',')) {19. int m_id, p_id;20. sscanf(argv[optind], "%x,%x",&m_id, &p_id);21. u = get_by_id(m_id, p_id);22. } else {23. u = get_by_type(opt);24. }25.26. if (!u) {27. fprintf(stderr, "Unknown device type or id\n");28. exit(1);29. }30.31. break;32.33. case 2://(3)、通过对前面参数的解析,把uart[i]中的数值初始化;34. u->speed = atoi(argv[optind]);35. break;36.37. case 3:38. if (!strcmp("flow", argv[optind]))39. u->flags |= FLOW_CTL;40. else41. u->flags &= ~FLOW_CTL;42. break;43.44. case 4:45. if (!strcmp("sleep", argv[optind]))46. u->pm = ENABLE_PM;47. else48. u->pm = DISABLE_PM;49. break;50.51. case 5:52. u->bdaddr = argv[optind];53. break;54. }55. }56.57.………………58. if (init_speed)//初始化串口速率;59. u->init_speed = init_speed;60.………………61. n = init_uart(dev, u, send_break, raw);//(4)、初始化串口;62.………………63.64. return 0;65.}(1)、解析驱动的位置;1.if (!strchr(opt, '/'))2.strcpy(dev, "/dev/");3.service hciattach /system/bin/hciattach -n /dev/sttybt0 sprd_shark4.dev = /dev/ttyb0(2)、解析串口的配置相关参数;获取参数对应的结构体;1.u = get_by_id(m_id, p_id);2.static struct uart_t * get_by_id(int m_id, int p_id)3.{4.int i;5.for (i = 0; uart[i].type; i++) {6.if (uart[i].m_id == m_id && uart[i].p_id== p_id)7.return &uart[i];8.}9.return NULL;10.}这个函数比较简单,通过循环对比,如传进了的参数sprd_shark和uart结构体中的对比,找到对应的数组。
Android中文API(70)——BluetoothDevice[蓝牙]
Android中⽂API(70)——BluetoothDevice[蓝⽛]前⾔声明 欢迎转载,但请保留⽂章原始出处:)正⽂ ⼀、结构public static class BluetoothDevice extends Object implements Parcelableng.Objectandroid.bluetooth.BluetoothDevice ⼆、概述 代表⼀个远程蓝⽛设备。
让你创建⼀个带有各⾃设备的BluetoothDevice或者查询其皆如名称、地址、类和连接状态等信息。
对于蓝⽛硬件地址⽽⾔,这个类仅仅是⼀个瘦包装器。
这个类的对象是不可改变的。
这个类上的操作会使⽤这个⽤来创建BluetoothDevice类的BluetoothAdapter类执⾏在远程蓝⽛硬件上。
为了获得BluetoothDevice,类,使⽤BluetoothAdapter.getRemoteDevice(String)⽅法去创建⼀个表⽰已知MAC地址的设备(⽤户可以通过带有BluetoothAdapter类来完成对设备的查找)或者从⼀个通过 BluetoothAdapter.getBondedDevices()得到返回值的有联系的设备集合来得到该设备。
注意:需要权限 参见 三、常量String ACTION_ACL_CONNECTED⼴播活动:指明⼀个与远程设备建⽴的低级别(ACL)连接。
总是包含附加域ACL连接通过Android蓝⽛栈⾃动进⾏管理需要权限接收常量值: "android.bluetooth.device.action.ACL_CONNECTED"String ACTION_ACL_DISCONNECTED⼴播活动:指明⼀个来⾃于远程设备的低级别(ACL)连接的断开总是包含附加域ACL连接通过Android蓝⽛栈⾃动进⾏管理需要权限接收常量值: "android.bluetooth.device.action.ACL_DISCONNECTED"String ACTION_ACL_DISCONNECT_REQUESTED⼴播活动:指明⼀个为远程设备提出的低级别(ACL)的断开连接请求,并即将断开连接。
蓝牙协议栈
蓝牙协议栈蓝牙协议栈是指蓝牙通信中的各种协议层,包括物理层、链路层、L2CAP、RFCOMM、SDP、AVDTP、AVCTP、AVRCP、HFP、A2DP、HID等。
物理层和链路层负责在无线频谱上传输数据和管理连接,而上层协议则在传输数据的基础上提供特定应用的功能。
蓝牙协议栈的物理层通信是通过无线电波传输数据的,频率为2.4GHz,可实现10米左右的无线通讯距离。
蓝牙链路层则负责管理蓝牙设备之间的连接,包括连接的建立、维护和断开。
链路层还负责数据的流控和纠错,保证传输的可靠性和稳定性。
L2CAP是蓝牙协议栈的核心协议之一,负责提供一个通用的数据承载层,可支持任意类型的应用层协议。
L2CAP提供了分段、合并、分组和重组等数据传输功能,并且还支持流和信道的管理。
RFCOMM是L2CAP的一个子协议,用于在蓝牙设备之间建立串行端口连接,可以通过该连接传输类似串口数据的应用数据。
SDP是蓝牙设备之间的服务发现协议,用于发现其他蓝牙设备提供的服务以及提供自己的服务。
SDP支持通过UUID标识服务,并提供查询、浏览和筛选服务的功能。
AVDTP、AVCTP、AVRCP是用于音频和视频传输的协议,包括传输的流管理、控制和协商等功能。
HFP是用于蓝牙通话的协议,支持语音通话、来电通知和通话音量等功能。
A2DP则是用于音频传输的协议,可实现蓝牙音频的无线传输和控制,支持立体声和高质量音频的传输。
HID是用于蓝牙无线输入设备的协议,包括键盘、鼠标、游戏手柄等,支持按键、指针、控制和LED等功能。
总的来说,蓝牙协议栈是由多个协议层组成的一个复杂的协议体系,这些协议层之间相互协作,构成了完整的蓝牙通讯系统。
蓝牙协议栈的设计和实现对整个蓝牙系统的性能和稳定性有着至关重要的影响,因此在实际应用中需要针对具体场景进行合理的选型和优化。
Android跟蓝牙耳机建立连接有两种方式
Android跟蓝牙耳机建立连接有两种方式Android 跟蓝牙耳机建立连接有两种方式。
1. Android 主动跟蓝牙耳机连BluetoothSettings 中和蓝牙耳机配对上之后,BluetoothHeadsetService 会收到BONDING_CREATED_ACTION,这个时候BluetoothHeadsetService 会主动去和蓝牙耳机建立RFCOMM 连接。
if(action.equals(BluetoothIntent.BONDING_CREATED_AC TION)) {if (mState ==BluetoothHeadset.STATE_DISCONNECTED) {// Lets try and initiate an RFCOMM connectiontry {mBinder.connectHeadset(address, null);} catch (RemoteException e) {}}} RFCOMM 连接的真正实现是在ConnectionThread 中,它分两步,第一步先通过SDPClient 查询蓝牙设备时候支持Headset 和Handsfree profile。
// 1) SDP querySDPClient client = SDPClient.getSDPClient(address);if (DBG) log("Connecting to SDP server (" + address + ")...");if (!client.connectSDPAsync()) {Log.e(TAG, "Failed to start SDP connection to " + address);mConnectingStatusHandler.obtainMessage(SDP_ERROR ).sendToTarget();client.disconnectSDP();return;}if (isInterrupted()) {client.disconnectSDP();return;}if (!client.waitForSDPAsyncConnect(20000)) { // 20 secs if (DBG) log("Failed to make SDP connection to " + address);mConnectingStatusHandler.obtainMessage(SDP_ERROR ).sendToTarget();client.disconnectSDP();return;}if (DBG) log("SDP server connected (" + address + ")");int headsetChannel = client.isHeadset();if (DBG) log("headset channel = " + headsetChannel);int handsfreeChannel = client.isHandsfree();if (DBG) log("handsfree channel = " + handsfreeChannel); client.disconnectSDP();第2步才是去真正建立RFCOMM 连接。
蓝牙sdp协议过程
蓝牙sdp协议过程蓝牙SDP协议过程蓝牙SDP(Service Discovery Protocol,服务发现协议)是蓝牙技术中用于设备间服务发现的一种协议。
它允许蓝牙设备在无需事先预知对方的详细信息的情况下,发现对方提供的服务,并建立通信连接。
本文将详细介绍蓝牙SDP协议的过程。
第一步:建立连接在进行服务发现之前,需要建立蓝牙设备间的连接。
这一步通常由L2CAP协议(Logical Link Control and Adaptation Protocol,逻辑链路控制与适配协议)完成。
L2CAP协议在建立连接时会为连接的两端分配一个唯一的Channel ID,以便后续传输的数据能够正确匹配。
第二步:发送服务发现请求一旦连接建立成功,客户端设备会发送一个服务发现请求到服务器设备。
这个请求中包含了客户端设备所需服务的一些信息,例如服务类型、UUID等。
UUID(Universally Unique Identifier,通用唯一标识符)用于标识不同的服务,确保能够准确匹配所需的服务。
第三步:服务发现服务器设备收到服务发现请求后,会根据请求中的信息进行服务发现。
服务器设备会检查自身提供的服务,寻找与请求匹配的服务。
如果找到匹配的服务,服务器设备会发送一个服务记录回应给客户端设备。
第四步:解析服务记录客户端设备收到服务记录回应后,需要解析其中的信息。
服务记录中包含了服务的详细信息,如服务名称、服务类型、服务UUID等。
客户端设备根据这些信息来判断是否满足自己的需求。
第五步:建立服务连接如果客户端设备找到了满足自己需求的服务,就可以建立服务连接了。
建立服务连接时,客户端设备会使用L2CAP协议为服务连接分配一个新的Channel ID,以便后续的数据传输。
第六步:服务数据交换一旦服务连接建立成功,客户端设备和服务器设备就可以进行数据交换了。
数据交换的具体方式取决于所使用的具体服务,可以是简单的数据传输,也可以是复杂的音频、视频传输等。
常用蓝牙协议介绍
常用蓝牙协议介绍蓝牙协议HFP,HSP,A2DP,AVRCP,OPP,PBAPHFPHFP(Hands-free Profile),让蓝牙设备可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否支持。
HSPHSP 描述了Bluetooth 耳机如何与计算机或其它Bluetooth 设备(如手机)通信。
连接和配置好后,耳机可以作为远程设备的音频输入和输出接口。
这是最常用的配置,为当前流行支持蓝牙耳机与移动电话使用。
它依赖于在64千比特编码的音频/ s的CVSD的或PCM以及AT命令从GSM 07.07的一个子集,包括环的能力最小的控制,接听来电,挂断以及音量调整。
典型的使用情景是使用无线耳机与手机进行连接。
可能会使用HSP的若干设备类型:耳机、手机、PDA 、个人电脑、手提电脑。
A2DPA2DP全名是Advanced Audio Distribution Profile 蓝牙音频传输模型协定!A2DP是能够采用耳机内的芯片来堆栈数据,达到声音的高清晰度。
有A2DP的耳机就是蓝牙立体声耳机。
声音能达到44.1kHz,一般的耳机只能达到8kHz。
如果手机支持蓝牙,只要装载A2DP协议,就能使用A2DP耳机了。
还有消费者看到技术参数提到蓝牙V1.0 V1.1 V1.2 V2.0——这些是指蓝牙的技术版本,是指通过蓝牙传输的速度,他们是否支持A2DP具体要看蓝牙产品制造商是否使用这个技术AVRCPAVRCP(Audio/Video Remote Control Profile),也就是音频/视频远程控制规范。
AVRCP 设计用于提供控制TV、Hi-Fi设备等的标准接口。
此配置文件用于许可单个远程控制设备(或其它设备)控制所有用户可以接入的A/V设备。
它可以与A2DP 或VDP 配合使用。
AVRCP 定义了如何控制流媒体的特征。
包括暂停、停止、启动重放、音量控制及其它类型的远程控制操作。
蓝牙协议栈
蓝牙协议栈蓝牙协议栈是指蓝牙技术中的一组协议层和协议规范,用于在蓝牙设备之间建立通信连接。
蓝牙协议栈包含了物理层、链路层、扩展逻辑层、L2CAP层、RFCOMM层、SDP层、应用层等多个层次,每个层次都有自己的功能和任务。
物理层是蓝牙协议栈最底层的一层,它负责传输数据的物理层面。
蓝牙技术使用的是2.4GHz频段,并采用频率跳转技术避免干扰,使通信更加稳定可靠。
物理层还包括了无线通信的调制解调和错误校验功能。
链路层是蓝牙协议栈中的第二层,它负责建立两个设备之间的连接,并管理数据的传输。
链路层也包括了设备发现、设备配对、连接管理等功能。
链路层通过在广播信道上进行设备发现,然后通过扫描信道上的设备地址进行配对,最终建立起点对点的连接。
扩展逻辑层是蓝牙协议栈中的第三层,它负责控制蓝牙设备的相关设置、配置和管理,比如设备的可见性、功率控制、安全设置、网络连接等。
L2CAP层是蓝牙协议栈中的第四层,它负责提供蓝牙设备之间的数据传输和流程控制。
L2CAP层允许更高层次的应用协议使用蓝牙链路,并提供了可靠的数据传输和错误检测功能。
RFCOMM层是蓝牙协议栈中的第五层,它负责提供蓝牙设备之间的串口通信。
RFCOMM层允许应用程序通过串口方式传输数据,并实现了虚拟串口的功能,方便应用程序的开发。
SDP层是蓝牙协议栈中的第六层,它负责在蓝牙设备之间提供服务的发现和查询。
SDP层允许应用程序查询设备所提供的服务列表,并进行相关服务的连接。
应用层是蓝牙协议栈中的最高层,它负责实现特定应用的功能和交互。
应用层可以根据需求选择不同的协议栈功能,提供不同的服务和功能。
总之,蓝牙协议栈是蓝牙技术中不可或缺的一部分,它提供了多个层次的协议和功能,用于建立蓝牙设备之间的连接和通信。
通过蓝牙协议栈,不同设备之间可以方便地进行数据传输、服务发现和互联互通。
蓝牙协议栈的设计和实现对于蓝牙技术的发展和应用至关重要。
Android蓝牙功能及RFCOSDP简介修订版
A n d r o i d蓝牙功能及R F C O S D P简介集团标准化小组:[VVOPPT-JOPP28-JPPTL98-LOPPNN]A n d r o i d2.0蓝牙功能及R F C O M M、S D P简介一.Android2.0蓝牙功能简介Google于2009年10月28日发布了AndroidSDK2.0版本。
对于开发人员来说,最关心的莫过于新版本添加了哪些新特性,API有哪些改动。
2.0版本发布前,最受关注的就是能否在新版本中添加蓝牙功能。
Google果然不负众望,在2.0版本中加入了蓝牙功能,使Android平台功能更加强大。
蓝牙模块实现了以下功能:蓝牙的打开/关闭。
设备和服务的探索。
使用RFCOMM连接远程设备发送/接收数据。
公布RFCOMM服务和监听接入的RFCOMM连接。
新版本添加了android.bluetooth包。
该包提供了一些用于管理蓝牙设备的功能类。
蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。
增强了写和修改本地服务发现协议(ServiceDiscoveryProtocol,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket的控制。
注意:不是所有的Android设备都能保证有蓝牙功能。
下面是android.bluetooth包中类的简述:BluetoothAdapter代表本地蓝牙适配器。
可以使用getDefaultAdapter()方法获得默认的本地蓝牙适配器。
使用BluetoothDevice类在远程蓝牙设备上进行操作。
BluetoothClass表示一个蓝牙类。
蓝牙类是一个32位字段,这些位的格式定义在。
这个类包含32位字段,提供常数和方法去确定在这个字段中编码的服务类和设备类(服务类可以有多个)。
每个蓝牙类可组成零至多个服务类,确切的说是一个设备类。
Android蓝牙功能及RFCOSDP简介
A n d r o i d蓝牙功能及R F C O S D P简介集团标准化小组:[VVOPPT-JOPP28-JPPTL98-LOPPNN]A n d r o i d2.0蓝牙功能及R F C O M M、S D P简介一.Android2.0蓝牙功能简介Google于2009年10月28日发布了AndroidSDK2.0版本。
对于开发人员来说,最关心的莫过于新版本添加了哪些新特性,API有哪些改动。
2.0版本发布前,最受关注的就是能否在新版本中添加蓝牙功能。
Google果然不负众望,在2.0版本中加入了蓝牙功能,使Android平台功能更加强大。
蓝牙模块实现了以下功能:蓝牙的打开/关闭。
设备和服务的探索。
使用RFCOMM连接远程设备发送/接收数据。
公布RFCOMM服务和监听接入的RFCOMM连接。
新版本添加了android.bluetooth包。
该包提供了一些用于管理蓝牙设备的功能类。
蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。
增强了写和修改本地服务发现协议(ServiceDiscoveryProtocol,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket的控制。
注意:不是所有的Android设备都能保证有蓝牙功能。
下面是android.bluetooth包中类的简述:BluetoothAdapter代表本地蓝牙适配器。
可以使用getDefaultAdapter()方法获得默认的本地蓝牙适配器。
使用BluetoothDevice类在远程蓝牙设备上进行操作。
BluetoothClass表示一个蓝牙类?。
蓝牙类是一个32位字段,这些位的格式定义在。
这个类包含32位字段,提供常数和方法去确定在这个字段中编码的服务类和设备类(服务类可以有多个)。
每个蓝牙类可组成零至多个服务类,确切的说是一个设备类。
蓝牙串口协议
蓝牙串口协议蓝牙串口协议(Bluetooth Serial Port Protocol)是蓝牙技术中的一种重要协议,它为蓝牙设备之间的串口通信提供了标准化的解决方案。
蓝牙串口协议广泛应用于各种蓝牙设备之间的数据传输和通信,如蓝牙耳机、蓝牙键盘、蓝牙打印机等。
本文将对蓝牙串口协议进行详细介绍,包括其基本原理、通信流程、应用场景等内容。
蓝牙串口协议是建立在蓝牙基础规范之上的协议,它定义了蓝牙设备之间通过串口进行数据传输的标准化方法。
通过蓝牙串口协议,不同厂商生产的蓝牙设备可以实现互联互通,无需考虑设备之间的兼容性问题。
蓝牙串口协议采用了一种称为RFCOMM(Radio Frequency Communication)的协议来模拟传统串口通信,使得蓝牙设备可以像使用传统串口一样进行数据传输。
在蓝牙串口协议中,通信的两端分别为主设备和从设备。
主设备负责发起通信请求和控制通信过程,而从设备则被动接受主设备的请求并进行响应。
在建立蓝牙串口通信时,主设备会向从设备发送连接请求,从设备接受请求后建立连接,之后双方可以进行数据传输。
蓝牙串口协议还定义了数据的传输格式和传输控制方法,确保数据的可靠传输和正确接收。
蓝牙串口协议在各种蓝牙设备中得到了广泛的应用。
例如,在蓝牙耳机中,蓝牙串口协议用于音频数据的传输,使得用户可以通过蓝牙耳机进行无线通话和音乐播放。
在蓝牙键盘中,蓝牙串口协议用于键盘输入数据的传输,实现了无线键盘与设备的连接。
在蓝牙打印机中,蓝牙串口协议则用于打印数据的传输,使得用户可以通过蓝牙连接打印机进行打印操作。
总之,蓝牙串口协议作为蓝牙技术中的重要协议,为各种蓝牙设备之间的串口通信提供了标准化的解决方案。
通过蓝牙串口协议,不同厂商生产的蓝牙设备可以实现互联互通,为用户提供了更便捷、更灵活的无线通信体验。
随着蓝牙技术的不断发展,蓝牙串口协议也将得到进一步完善和推广,为更多的蓝牙设备提供可靠的数据传输和通信解决方案。
Android蓝牙协议
Android蓝牙协议栈Android蓝牙协议栈使用的是BlueZ,支持GAP, SDP, and RFCOMM规范,是一个SIG认证的蓝牙协议栈。
Bluez 是GPL许可的,因此Android的框架内与用户空间的bluez代码通过D-BUS进程通讯进行交互,以避免专有代码。
Headset和Handsfree(v1.5)规范就在Android框架中实现的,它是跟Phone App紧密耦合的。
这些规范也是SIG认证的。
下面的图表提供了一个以库为导向的蓝牙栈视图。
实线框的是Android模块,红色虚线部分为合作伙伴指定模块(译者注:芯片商提供)。
下面的图表是以进程为导向视图:移植BlueZ是兼容蓝牙2.1的,可以工作在任何2.1芯片以及向后兼容的旧的蓝牙版本。
有要有两个方面:∙串口驱动 UART driver∙蓝牙电源开/关 Bluetooth Power On/Off串口驱动BlueZ核心子系统使用hciattach守护进程添加你的指定硬件串口驱动。
例如,MSM7201A,这个文件是在drivers/serial/msm_serial.c。
你还需要通过修改init.rc为hciattach来编辑命令行选项。
蓝牙电源开/关蓝牙芯片的电源开关方法1.0和Post 1.0是不同的,具体如下:∙ 1.0:Android框架写0或1到/sys/modules/board_[PLATFORM]/parameters/bluetooth_power_on∙Post 1.0:Android框架使用linux rfkill API,参考 arch/arm/mach-msm/board-trout-rfkill.c例子。
编译编译Android打开蓝牙支持,添加下面这行内容到BoardConfig.mk。
BOARD_HAVE_BLUETOOTH :=true解决问题调试调试你的蓝牙实现,可以通过读跟蓝牙相关的logs(adb logcat)和查找ERROR和警告消息。
Android蓝牙功能及RFCOMMSDP简介
Android 蓝牙功能及RFCOMM、SDP简介一.Android 蓝牙功能简介Google 于2009年10月28日发布了Android SDK 版本;对于开发人员来说,最关心的莫过于新版本添加了哪些新特性,API有哪些改动;版本发布前,最受关注的就是能否在新版本中添加蓝牙功能;Google果然不负众望,在版本中加入了蓝牙功能,使Android平台功能更加强大;蓝牙模块实现了以下功能:蓝牙的打开/关闭;设备和服务的探索;使用RFCOMM连接远程设备发送/接收数据;公布RFCOMM服务和监听接入的RFCOMM连接;新版本添加了包;该包提供了一些用于管理蓝牙设备的功能类;蓝牙的APIs允许应用程序连接或断开headset头戴式耳机,扫描其他蓝牙设备并与之配对;增强了写和修改本地服务发现协议Service Discovery Protocol ,SDP数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket的控制;注意:不是所有的Android设备都能保证有蓝牙功能;下面是包中类的简述:代表本地蓝牙适配器;BluetoothAdapter可以使用 getDefaultAdapter 方法获得默认的本地蓝牙适配器;使用 BluetoothDevice 类在远程蓝牙设备上进行操作;Android蓝牙模型原理及设备之间的连接已再eoeAndroid特刊第六期中有所说明,在此不做赘述;详情请参见eoeAndroid特刊第六期4-6节;二.协议简述蓝牙规范Specification of the Bluetooth System就是蓝牙无线通信协议标准,它规定了蓝牙应用产品应遵循的标准和需要达到的要求;蓝牙协议规范遵循开放系统互连参考模型Open System Interconnetion/Referenced Model, OSI/RM,从低到高地定义了蓝牙协议堆栈的各个层次;在蓝牙规范中,中介协议是为高层应用协议或程序在蓝牙逻辑链路上工作提供了必要的支持,为应用曾提供了各种不同的标准接口;这部分协议包括RFCOMM、SDP、IrDA、PPP/IP/TCP/UDP、TCS/AT等;串口仿真协议RFCOMM基于欧洲电信标准化协会European Telecommunication Standardization Institute, ETSI的标准制定;该协议用于模拟串行接口环境,使得基于串口的传统应用仅作少量的修改或者不做任何修改可以直接在该层上运行;通过提供串行端口仿真,RFCOMM 可以同时支持遗留串行端口应用程序以及其它应用程序中的 OBEX 协议;RFCOMM 是 ETSI TS 标准的一个子集,也具有一些蓝牙特定的适配性;RFCOMM 协议能在两台蓝牙设备之间同时维持多达 60 个连接;蓝牙设备中同时使用的连接数目取决于特定实施;由于有了 RFCOMM,完整的通信路径包括两个运行在不同设备通信端点上的应用程序及它们之间的通信段;上图显示了完整的通信路径RFCOMM 旨在覆盖利用串行端口设备的应用程序;在简单的配置中,通信段是一个设备至另一设置之间直接连接的蓝牙链路,参见下图;当通信段为另一网络时,蓝牙无线技术可作为设备和网络连接设备例如调制解调器之间的路径;RFCOMM 仅与直接连接设备或网络环境中的设备和调制解调器之间的连接有关;服务发现协议Service Discovery Protocol,SDP为实现蓝牙设备之间相互查询及访问对方提供的服务;服务发现应用是一个特定的由用户发起的应用;服务发现工作与两个在蓝牙设备中的SDP实例交互,其目的是使用某个特定的传输服务RFCOMM或者特定的用途文件传输、无线电话、LAN AP等;SDP直接支持以下几种服务查询:1.通过服务类进行服务查询;2.通过服务属性对服务进行查询;3.服务浏览;一般的服务发现应用都被以上的三种服务查询所覆盖;其中前两个代表了查询已知或者指定的服务,并对类似“服务A是否有效”或者“具有B和C特性的服务A是否有效”的问题作出了回答;后面的服务浏览代表了另外一种服务查询,对类似“有效的服务有哪些”或者“有效的类型A的服务有哪些”的问题给出解答;上面的服务查询段落可以被实现为两种方式:1.用户有意识地连接到某个设备,并查找这个设备上的服务;2.通过无意识地连接本地设备周围的设备,并执行服务查询;这两种实现方式都需要设备首先被发现、被连接、被查询它们所支持的服务;。
android BLE简介
一 BluetoothAdapter简介1.继承关系该类仅继承了Object类;2.该类作用BluetoothAdapter代表了移动设备的本地的蓝牙适配器, 通过该蓝牙适配器可以对蓝牙进行基本操作, 例如 :启动设备发现(startDiscovery),获取已配对设备(getBoundedDevices),通过mac蓝牙地址获取蓝牙设备(getRemoteDevice),从其它设备创建一个监听连接(listenUsingRfcommWithServiceRecord);BluetoothAdapter.getDefaultAdapter()该静态方法可以获取该适配器对象3.蓝牙权限android.permission.BLUETOOTH允许程序连接到已配对的蓝牙设备, 请求连接/接收连接/传输数据需要改权限, 主要用于对配对后进行操作;android.permission.BLUETOOTH_ADMIN允许程序发现和配对蓝牙设备, 该权限用来管理蓝牙设备, 有了这个权限, 应用才能使用本机的蓝牙设备, 主要用于对配对前的操作;优先级 : BLUETOOTH权限是BLUETOOTH_ADMIN权限的前提, 如果没有BLUETOOTH权限, 就不能使用BLUETOOTH_ADMIN权限;二 API详解1.常量介绍(1)开关状态值蓝牙关闭 : int STATE_OFF , 值为10, 蓝牙模块处于关闭状态;蓝牙打开中 : int STATE_TURNING_ON , 值为11, 蓝牙模块正在打开;蓝牙开启 : int STATE_ON , 值为12, 蓝牙模块处于开启状态;蓝牙开启中 : int STATE_TURNING_OFF , 值为13, 蓝牙模块正在关闭;蓝牙开关状态顺序 : STATE_OFF --> STATE_TURNING_ON --> STATE_ON -->STATE_TURNING_OFF --> STATE_OFF;(2)扫描状态值无功能状态 : int SCAN_MODE_NONE , 值为20, 查询扫描和页面扫描都失效, 该状态下蓝牙模块既不能扫描其它设备, 也不可见;扫描状态 : int SCAN_MODE_CONNECTABLE , 值为21, 查询扫描失效, 页面扫描有效, 该状态下蓝牙模块可以扫描其它设备, 从可见性来说只对已配对的蓝牙设备可见, 只有配对的设备才能主动连接本设备;可见状态 : int SCAN_MODE_CONNECTABLE_DISCOVERABLE, 值为23, 查询扫描和页面扫描都有效;查询扫描功能 : 其它设备可以扫描到本设备 , 指的是可见性可见;页面扫描功能 : 可以主动扫描其它设备;(3)蓝牙操作接收的广播开始搜索广播 : String ACTION_DISCOVERY_STARTED, 蓝牙适配器开始搜索远程设备, 值为"android.bluetooth.action.DISCOVERY_START", 蓝牙适配器开始搜索之后, 会先有12秒的查询扫描(12s内可见), 查询扫描后进行页面扫描(主动搜索), 需要BLUETOOTH权限;如果搜索到蓝牙设备, 就会收到BluetoothDevice.ACTION_FOUND广播, 可以从Intent中获取存放在其中的BluetoothDevice对象,intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);设备查找非常消耗资源, 在查找的过程中, 不能连接远程的蓝牙设备, 已经存在的连接也要限制带宽, 如果想要执行除查找外的其它操作, 之前最好调用cancelDiscovery();搜索完成广播 : String ACTION_DISCOVERY_FINISHED,蓝牙S适配器完成搜索发出的广播, 值为"android.bluetooth.adapter.action.DISCOVERY_FINISHED", 需要BLUETOOTH权限;蓝牙名称改变广播 : String ACTION_LOCAL_NAME_CHANGED, 本地的蓝牙适配器改变了自己的名称, 值为"android.bluetooth.adapter.action.LOCAL_NAME_CHANGED", 注意改变的是本设备名称, 不是远程设备的.这个广播包含一个EXTRA_LOCAL_NAME附加域, 需要BLUETOOTH权限;扫描模式变化广播 : String ACTION_SCAN_MODE_CHANGED, 蓝牙模块扫描模式发生了变化, 值为"android.bluetooth.adapter.action.SCAN_MODE_CHANGED", 该Intent对象包含了EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE, 两个附加域分别是新的和旧的扫描模式, 这里可以根据前后扫描模式的不同做出不同的操作, 需要BLUETOOTH权限;开关模式变化广播 : String ACTION_STATE_CHANGED, 蓝牙模块被打开或者关闭, 值为"android.bluetooth.adapter.action.STATE_CHANGED", 该广播的Intent中包含EXTRA_STATE和EXTRA_PREVIOUS_STATE两个附加域, 需要BLUETOOTH权限;(4)蓝牙操作请求的广播开启蓝牙 : String ACTION_REQUEST_ENABLE, 打开蓝牙, 值为"android.bluetooth.adapter.action.REQUEST_ENABLE",Intent intent = new Intent (BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, requestCode);可以在Activity中的onActivityResult()方法中处理结果, 如果蓝牙模块打开成功, 则返回结果吗RESULT_OK; 如果蓝牙模块打开失败, 则返回结果码RESULT_CANCELED;打开和关闭蓝牙模块, 都可以通过ACTION_STATE_CHANGED广播来监听;蓝牙可见 : String ACTION_REQUEST_DISCOVERABLE, 使蓝牙可见, 值为"android.bluetooth.adapter.action.REQUEST_DISCOVERABLE", 默认的可见时间为120s,可以在广播中添加附加域, 设置任意的可见时间, 附加域为EXTRA_DISCOVERABLE_DURATION, 需要BLUETOOTH权限;可以在Activity中的onActivityResult()方法中处理结果, 如果蓝牙模块设置可见成功, 则返回结果吗RESULT_OK; 如果蓝牙模块设置可见失败, 则返回结果码RESULT_CANCELED;Intent discoverableIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0); startActivityForResult(discoverableIntent,resultCode)(5)附加域附加域是放在Intent中的, 使用Intent.putExtra(附加域,附加值)方法添加附加域;扫描模式附加域 : 这两个附加域的值是扫描模式, 可以为SCAN_MODE_NONE,SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE;String EXTRA_SCAN_MODE : 值为"android.bluetooth.adapter.extra.SCAN_MODE"; String EXTRA_PREVIOUS_SCAN_MODE : 值为"android.bluetooth.adapter.extra.PREVIOUS_SCAN_MODE";开关状态附加域 : 这两个附加域的值是开关状态, 可以为STATE_OFF, STATE_ON,STATE_TURNING_OFF, STATE_TURNING_ON;String EXTRA_STATE : 值为"android.bluetooth.adapter.extra.STATE";String EXTRA_PREVIOUS_STATE : 值为"android.bluetooth.adapter.extra.PREVIOUS_STATE";蓝牙名称附加域 : String EXTRA_LOCAL_NAME , 存放ACTION_LOCAL_NAME_CHANGED附加域的附加值 , 值为"android.bluetooth.adapter.extra.LOCAL_NAME";可见时间附加域 : String EXTRA_DISCOVERABLE_DURATION, 存放的是ACTION_REQUEST_DISCOVERABLE广播的可见时长, 值为"android.bluetooth.adapter.extra.DISCOVERABLE_DURATION";(6)错误码int ERROR , 这个值用来标记错误 , 方便自己使用的 , 没有实际意义;2.State状态相关方法(1)获取蓝牙适配器public static sychronized BluetoothAdapter getDefaultAdapter();返回值 : 本地蓝牙适配器 BluetoothAdapter对象;(2)获取state状态方法public int getState();作用 : 获取是否可用返回值 : 返回当前的State状态值, STATE_ON, STATE_OFF, STATE_TURNING_ON,STATE_TURNING_OFF;权限 : BLUETOOTH;(3)蓝牙是否可用public boolean isEnable();作用 : 获取当前设备蓝牙模块是否可用;返回值 : 返回当前蓝牙模块是否可用, true 可用, false 不可用;权限 : BLUETOOTH权限;(4)打开蓝牙public boolean enable();作用 : 打开本地蓝牙适配器;返回值 : 如果打开成功则返回true, 如果打开失败返回false;权限 :BLUETOOTH_ADMIN权限;(5)关闭蓝牙public boolean disable();作用 : 关闭本地设备蓝牙;返回值 : 如果关闭蓝牙成功, 返回true; 如果关闭蓝牙失败, 返回false;权限 : BLUETOOTH_ADMIN权限;3. 扫描相关方法(1)开始扫描public boolean startDiscovery();作用 : 开始查找远程蓝牙设备, 先进行12秒的查询扫描(被动可见), 之后进行页面扫描(主动搜索); 搜索过成功不能尝试对远程设备的连接, 同时已连接的设备的带宽也会被压缩, 等待时间变长; 使用cancelDiscovery()可以终止搜索;返回值 : 如果成功则返回true, 失败返回false;权限 : BLUETOOTH_ADMIN权限;(2)是否在扫描中public boolean isDiscovering();作用 : 是否正在搜索;返回值 : 如果设备正在搜索, 返回true; 如果设备没有进行蓝牙搜索, 返回false;权限 : BLUETOOTH权限;(3)取消查找public boolean cancelDiscovery();作用 : 取消蓝牙搜索; 在进行connect()方法的时候, 必须调用这个方法, 蓝牙搜索是一个服务进行, 在搜索中的时候, 不能进行连接;返回值 : 如果取消成功, 则返回true; 如果取消失败, 返回false;(4)获取扫描模式public int getScanMode();作用 : 获取当前蓝牙的扫描模式;返回值 : SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_DISCOVERABLE;4.与蓝牙设备相关的方法(1)检查蓝牙地址public boolean checkBluetoothAddress(String address);作用 : 检查蓝牙地址是否合法, 蓝牙地址字母必须大写, 例如 : "00:43:A8:23:10:F0";参数 : 17位的字符串, 例如 : "00:43:A8:23:10:F0";返回值 : 如果蓝牙地址合法返回true, 反之返回false;(2)获取本地蓝牙地址public String getAddress();作用 : 返回本地蓝牙的MAC地址;返回值 : 本地的硬件地址;(3)获取本地蓝牙名称public String getName();返回值 : 本地蓝牙设备的名称;(4)获取绑定的蓝牙集合public Set<BluetoothDevice> getBoundedDevices();作用 : 获取已经配对的蓝牙设备的集合, 如果蓝牙未被打开, 则返回null;(5)获取远程蓝牙设备public BluetoothDevice getRemoteDevice(String address);作用 : 根据蓝牙的物理地址获取远程的蓝牙设备, 如果地址不合法, 就会产生异常;返回值 : 获取到的BluetoothDevice对象;(6)创建监听public BluetoothServerSocket listenUsingRfcommonWithServiceRecord(String name, UUID uuid);作用 : 创建一个监听Rfcommon端口的蓝牙监听, 使用accept()方法监听, 并获取BluetoothSocket对象; 该系统会根据一个服务名称(name)和唯一的识别码(uuid)来创建一个SDP服务, 远程蓝牙设备可以根据唯一的UUID来连接这个SDP服务器;参数 : name : SDP服务器名称, UUID, SDP记录下的UUID;返回值 : 正在监听蓝牙端口;权限 : BLUETOOTH;三常用用法1.打开蓝牙//第一种打开方法:调用enable 即可boolean result = mBluetoothAdapter.enable();//第二种打开方法,调用系统API去打开蓝牙if (!mBluetoothAdapter.isEnabled()) //未打开蓝牙,才需要打开蓝牙{Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, REQUEST_OPEN_BT_CODE);//会以Dialog样式显示一个Activity ,我们可以在onActivityResult()方法去处理返回值}第一种方法打开蓝牙, 没有任何提示, 直接就打开了;第二种方法发送广播, 会弹出一个对话框, 选择是否打开蓝牙, 选择是蓝牙才打开;2.设置可见private void setDiscoverable() {Intent bluetoothIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);bluetoothIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600);mContext.startActivity(bluetoothIntent);}发送ACTION_REQUEST_DISCOVERABLE广播, 同时在EXTRA_DISCOVERABLE_DURATION附加域中加入可见时间, 单位是秒;发送这个广播, 会弹出一个对话框, 显示是否可见3600秒;。
蓝牙测试仪的测试模式都有哪些
蓝牙测试仪的测试模式都有哪些蓝牙测试仪(Bluetooth Tester)是专门用来测试蓝牙设备的一种测试仪器。
蓝牙测试仪可以在不同的测试模式下对蓝牙设备进行测试和评估。
在本文中,我们将介绍蓝牙测试仪的一些测试模式。
RFCOMM 测试模式RFCOMM(Radio Frequency Communication)是一种传输控制协议,用于在两个设备之间进行串行数据通信。
RFCOMM测试模式用于测试基于RFCOMM协议的蓝牙设备。
在RFCOMM测试模式下,蓝牙测试仪将向设备发送RFCOMM帧,并检测设备的响应。
该测试模式旨在测试RFCOMM协议的实现是否符合标准。
L2CAP 测试模式L2CAP(Logical Link Control and Adaptation Protocol)是一种逻辑链路控制和适配协议,用于在两个设备之间建立逻辑链路。
L2CAP测试模式用于测试基于L2CAP的蓝牙设备。
在L2CAP测试模式下,蓝牙测试仪将发送L2CAP帧,并检测设备的响应。
该测试模式旨在测试L2CAP协议的实现是否符合标准。
SDP 测试模式SDP(Service Discovery Protocol)是一种服务发现协议,用于在蓝牙设备之间发现服务。
SDP测试模式用于测试基于SDP的蓝牙设备。
在SDP测试模式下,蓝牙测试仪将发送SDP消息并检查设备的响应。
该测试模式旨在测试SDP协议的实现是否符合标准。
GAP 测试模式GAP(Generic Access Profile)是一种通用访问协议,用于管理蓝牙设备之间的连接和配对。
GAP测试模式用于测试基于GAP的蓝牙设备。
在GAP测试模式下,蓝牙测试仪将发送GAP消息,并检查设备的响应。
该测试模式旨在测试GAP协议的实现是否符合标准。
HFP 测试模式HFP(Hands-Free Profile)是一种允许蓝牙设备进行无线通话的协议。
HFP测试模式用于测试基于HFP的蓝牙设备。
蓝牙协议概述 (2)
蓝牙协议概述一、引言蓝牙技术是一种无线通信技术,旨在实现不同设备之间的数据传输和通信。
蓝牙协议是一种规范,定义了蓝牙设备之间的通信方式和数据交换格式。
本协议旨在提供对蓝牙协议的概述,包括其发展背景、技术特点、应用范围等方面的内容。
二、发展背景蓝牙技术的发展源于对设备之间无线通信的需求。
在过去的几十年中,人们对无线通信的需求不断增加,而传统的有线通信方式无法满足这一需求。
蓝牙技术的浮现填补了这一空白,使得设备之间可以通过无线方式进行数据传输和通信。
三、技术特点1. 低功耗:蓝牙技术采用了低功耗的设计,使得设备可以长期运行而不需要频繁充电或者更换电池。
2. 短距离通信:蓝牙技术适合于短距离通信,通常在10米以内。
这使得蓝牙设备可以在相对较小的范围内进行通信,提高了通信的安全性。
3. 多设备连接:蓝牙技术支持多设备同时连接,使得设备之间可以实现多对一或者一对多的通信方式。
4. 高速数据传输:蓝牙技术的传输速率较高,可以满足大多数设备之间的数据传输需求。
四、应用范围蓝牙技术已广泛应用于各个领域,包括但不限于以下几个方面:1. 个人消费电子产品:蓝牙技术被广泛应用于智能手机、平板电脑、耳机、音箱等个人消费电子产品,实现了设备之间的无线连接和数据传输。
2. 汽车领域:蓝牙技术被应用于汽车中,实现了车载设备、手机和音频设备之间的无线连接,提供了便捷的通信和娱乐功能。
3. 医疗领域:蓝牙技术被应用于医疗设备中,实现了设备之间的数据传输和监测功能,提高了医疗设备的效率和准确性。
4. 工业控制领域:蓝牙技术被应用于工业控制设备中,实现了设备之间的无线通信和数据传输,提高了工业控制系统的灵便性和可靠性。
五、蓝牙协议的组成蓝牙协议由多个子协议组成,每一个子协议负责不同的功能。
以下是蓝牙协议的主要子协议:1. LMP(Link Manager Protocol):负责管理蓝牙设备之间的连接和断开操作,以及设备之间的身份验证和加密功能。
Android蓝牙开发(整理)
Android蓝牙开发学习之前先了解两个基本概念:1.RFCOMM协议:一个基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议。
此协议提供RS232控制和状态信号,如基带上的损坏,CTS以及数据信号等,为上层业务(如传统的串行线缆应用)提供了传送能力。
RFCOMM是一个简单传输协议,其目的是针对如何在两个不同设备上的应用之间保证一条完整的通信路径,并在它们之间保持一通信段。
RFCOMM是为了兼容传统的串口应用,同时取代有线的通信方式,蓝牙协议栈需要提供与有线串口一致的通信接口而开发出的协议。
RFCOMM协议提供对基于L2CAP协议的串口仿真,基于ETSI07.10。
可支持在两个BT设备之间同时保持高达60路的通信连接。
RFCOMM只针对直接互连设备之间的连接,或者是设备与网络接入设备之间的互连。
通信两端设备必须兼容于RFCOMM协议,有两类设备:DTE (Data Terminal Endpoint,通信终端,如PC,PRINTER)和DCE (Data Circuit Endpoint,通信段的一部分,如Modem)。
此两类设备不作区分。
2.MAC硬件地址MAC(Medium/MediaAccess Control, 介质访问控制)MAC地址是烧录在NetworkInterfaceCard(网卡,NIC)里的.MAC地址,也叫硬件地址,是由48比特长(6字节),16进制的数字组成.0-23位叫做组织唯一标志符(organizationally unique,是识别LAN(局域网)节点的标识.24-47位是由厂家自己分配。
其中第40位是组播地址标志位。
网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。
Android平台提供的蓝牙API去实现蓝牙设备之间的通信,蓝牙设备之间的通信主要包括了四个步骤:设置蓝牙设备、寻找局域网内可能或者匹配的设备、连接设备和设备之间的数据传输。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A n d r o i d蓝牙功能及R F C O M M S D P简介文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]
A n d r o i d2.0蓝牙功能及R F C O M M、S D P简介一.Android2.0蓝牙功能简介
Google于2009年10月28日发布了AndroidSDK2.0版本。
对于开发人员来说,最关心的莫过于新版本添加了哪些新特性,API有哪些改动。
2.0版本发布前,最受关注的就是能否在新版本中添加蓝牙功能。
Google果然不负众望,在2.0版本中加入了蓝牙功能,使Android平台功能更加强大。
蓝牙模块实现了以下功能:
蓝牙的打开/关闭。
设备和服务的探索。
使用RFCOMM连接远程设备发送/接收数据。
公布RFCOMM服务和监听接入的RFCOMM连接。
新版本添加了android.bluetooth包。
该包提供了一些用于管理蓝牙设备的功能类。
蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。
增强了写和修改本地服务发现协议(ServiceDiscoveryProtocol,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket的控制。
注意:不是所有的Android设备都能保证有蓝牙功能。
下面是android.bluetooth包中类的简述:
BluetoothAdapter代表本地蓝牙适配器。
可以使用getDefaultAdapter()方法获得默认的本地蓝牙适配
器。
Android蓝牙模型原理及设备之间的连接已再【eoeAndroid特刊】第六期中有所说明,在此不做赘述。
详情请参见【eoeAndroid特刊】第六期4-6节。
二.协议简述
蓝牙规范(SpecificationoftheBluetoothSystem)就是蓝牙无线通信协议标准,它规定了蓝牙应用产品应遵循的标准和需要达到的要求。
蓝牙协议规范遵循开放系统互连参考模型(OpenSystemInterconnetion/ReferencedModel,OSI/RM),从低到高地定义了蓝牙协议堆栈的各个层次。
在蓝牙规范中,中介协议是为高层应用协议或程序在蓝牙逻辑链路上工作提供了必要的支持,为应用曾提供了各种不同的标准接口。
这部分协议包括RFCOMM、SDP、IrDA、(PPP/IP/TCP/UDP)、(TCS/AT)等。
2.1串口仿真协议(RFCOMM)
基于欧洲电信标准化协会(EuropeanTelecommunicationStandardizationInstitute,ETSI)的TS07.10标准制定。
该协议用于模拟串行接口环境,使得基于串口的传统应用仅作少量的修改或者不做任何修改可以直接在该层上运行。
通过提供串行端口仿真,RFCOMM可以同时支持遗留串行端口应用程序以及其它应用程序中的OBEX协议。
RFCOMM是ETSITS07.10标准的一个子集,也具有一些蓝牙特定的适配性。
RFCOMM协议能在两台蓝牙设备之间同时维持多达60个连接。
蓝牙设备中同时使用的连接数目取决于特定实施。
由于有了RFCOMM,完整的通信路径包括两个运行在不同设备(通信端点)上的应用程序及它们之间的通信段。
上图显示了完整的通信路径
RFCOMM旨在覆盖利用串行端口设备的应用程序。
在简单的配置中,通信段是一个设备至另一设置之间(直接连接)的蓝牙链路,参见下图。
当通信段为另一网络时,蓝牙无线技术可作为设备和网络连接设备(例如调制解调器)之间的路径。
RFCOMM仅与直接连接设备或网络环境中的设备和调制解调器之间的连接有关。
2.2服务发现协议(ServiceDiscoveryProtocol,SDP)
为实现蓝牙设备之间相互查询及访问对方提供的服务。
服务发现应用是一个特定的由用户发起的应用。
服务发现工作与两个在蓝牙设备中的SDP实例交互,其目的是使用某个特定的传输服务(RFCOMM)或者特定的用途(文件传输、无线电话、LANAP等)。
SDP直接支持以下几种服务查询:
1).通过服务类进行服务查询;
2).通过服务属性对服务进行查询;
3).服务浏览。
一般的服务发现应用都被以上的三种服务查询所覆盖。
其中前两个代表了查询已知或者指定的服务,并对类似“服务A是否有效?”或者“具有B和C特性的服务A是否有效?”的问题作出了回答。
后面的服务浏览代表了另外一种服务查询,对类似“有效的服务有哪些?”或者“有效的类型A的服务有哪些”的问题给出解答。
上面的服务查询段落可以被实现为两种方式:
1).用户有意识地连接到某个设备,并查找这个设备上的服务;
2).通过无意识地连接本地设备周围的设备,并执行服务查询。
这两种实现方式都需要设备首先被发现、被连接、被查询它们所支持的服务。