Android蓝牙功能及RFCOMMSDP简介
- 格式:docx
- 大小:44.48 KB
- 文档页数:6
蓝牙核心技术概述(四):蓝牙协议规范(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),将蓝牙技术应
用于音频设备,提供高质量音频传输。
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[蓝⽛]前⾔声明 欢迎转载,但请保留⽂章原始出处:)正⽂ ⼀、结构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 跟蓝牙耳机建立连接有两种方式。
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(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层允许应用程序查询设备所提供的服务列表,并进行相关服务的连接。
应用层是蓝牙协议栈中的最高层,它负责实现特定应用的功能和交互。
应用层可以根据需求选择不同的协议栈功能,提供不同的服务和功能。
总之,蓝牙协议栈是蓝牙技术中不可或缺的一部分,它提供了多个层次的协议和功能,用于建立蓝牙设备之间的连接和通信。
通过蓝牙协议栈,不同设备之间可以方便地进行数据传输、服务发现和互联互通。
蓝牙协议栈的设计和实现对于蓝牙技术的发展和应用至关重要。
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).通过无意识地连接本地设备周围的设备,并执行服务查询。
这两种实现方式都需要设备首先被发现、被连接、被查询它们所支持的服务。