Android蓝牙协议指南
- 格式:pdf
- 大小:310.91 KB
- 文档页数:7
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蓝⽛SPP协议通信准备1.蓝⽛串⾏端⼝基于SPP协议(Serial Port Profile),能在蓝⽛设备之间创建串⼝进⾏数据传输2.SPP的UUID:00001101-0000-1000-8000-00805F9B34FB3.Android⼿机⼀般以客户端的⾓⾊主动连接SPP协议设备连接流程1.检测蓝⽛状态若蓝⽛未打开,则打开蓝⽛~bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();@Overrideprotected void onResume() {super.onResume();if (!bluetoothAdapter.isEnabled()) {// open blueToothIntent enableBtIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) {finish();return;}}2.注册设备搜索⼴播信息使⽤registerReceiver注册broadcastReceiver来获取搜索设备等消息IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(BluetoothDevice.ACTION_FOUND);intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);registerReceiver(receiver, intentFilter);// receiverprivate final BroadcastReceiver receiver = new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothDevice.ACTION_FOUND.equals(action)) {// find a deviceBluetoothDevice device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if (device.getBondState() != BluetoothDevice.BOND_BONDED) {//未配对设备newDeviceArrayAdapter.add(device.getName() + "\n" + device.getAddress());}else {//已经配对过的设备TextView tvPaired = (TextView)findViewById(_paired);tvPaired.setVisibility(View.VISIBLE);lvPairedDevices.setVisibility(View.VISIBLE);pairedDeviceArrayAdapter.add(device.getName() + "\n" + device.getAddress());}Log.i(TAG,"name:" + device.getName() + " address"+ device.getAddress());} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action){// search finishLog.i(TAG, "search finish!");}}};3.使⽤BlueAdatper搜索使⽤bluetoothAdapter搜索设备,bluetoothAdapter.startDiscovery()在搜索过程中,系统会发出三个⼴播信息:ACTION_DISCOVERY_START:开始搜索ACTION_DISCOVERY_FINISHED:搜索结束ACTION_FOUND:找到设备@Overridepublic void onClick(View v) {if (bluetoothAdapter.isDiscovering()) {bluetoothAdapter.cancelDiscovery();}bluetoothAdapter.startDiscovery();}4.获取搜索到的蓝⽛设备信息在BroadcastReceiver的onReceive()⾥取得搜索到的蓝⽛设备信息(如名称,MAC,RSSI)5.通过蓝⽛设备的MAC地址来建⽴⼀个BluetoothDevice对象:BluetoothDevice romoteDevice = bluetoothAdapter.getRemoteDevice(mDeviceAddress);6.由BluetoothDevice衍⽣BluetoothSocket通过BluetoothSocket的createRfcommSocketToServiceRecord()⽅法来选择连接的协议/服务,这⾥⽤的是SPP(UUID:00001101-0000-1000-8000-00805F9B34FB)try {bluetoothSocket = romoteDevice.createRfcommSocketToServiceRecord(UUID.fromString(SPP_UUID));} catch (IOException e) {e.printStackTrace();Toast.makeText(this, "socket init failed", Toast.LENGTH_SHORT).show();}7.使⽤BluetoothSocket来连接、读写蓝⽛设备读写可以归到⼀个独⽴线程去实现~try {bluetoothSocket.connect();Toast.makeText(this, "connect success", Toast.LENGTH_SHORT).show();} catch (IOException e2) {e2.printStackTrace();Toast.makeText(this, "connect failed", Toast.LENGTH_SHORT).show();try {bluetoothSocket.close();bluetoothSocket = null;} catch (IOException e) {e.printStackTrace();Toast.makeText(this, "socket close failed", Toast.LENGTH_SHORT).show();}return;}try {inputStream = bluetoothSocket.getInputStream();} catch (IOException e2) {e2.printStackTrace();Toast.makeText(this, "get inputstream failed", Toast.LENGTH_SHORT).show();return;}try {OutputStream os = bluetoothSocket.getOutputStream();byte[] osBytes = etInput.getText().toString().getBytes();for (int i = 0; i < osBytes.length; i++) {if (osBytes[i] == 0x0a)n++;}byte[] osBytesNew = new byte[osBytes.length+n];n = 0;for (int i = 0; i < osBytesNew.length; i++) {//mobile "\n"is 0a,modify 0d 0a then sendif (osBytesNew[i] == 0x0a) {osBytesNew[n] = 0x0d;n++;osBytesNew[n] = 0x0a;}else {osBytesNew[n] = osBytes[i]; }n++;}os.write(osBytesNew);} catch (Exception e) {e.printStackTrace();}。
蓝牙配对协议概述蓝牙配对协议是用于在蓝牙设备之间建立安全连接的协议。
通过配对,蓝牙设备可以进行加密通信,确保数据的保密性和完整性。
本文将介绍蓝牙配对协议的基本原理和常见的配对方式。
配对方式1. PIN码配对PIN码配对是最常见的蓝牙配对方式之一。
在PIN码配对过程中,主从设备之间通过输入PIN码进行配对。
通过输入相同的PIN码,设备之间可以验证彼此的身份,并建立安全连接。
1.1. 输入PIN码在PIN码配对过程中,首先需要主从设备之间共享一个PIN码。
设备可以事先设置一个PIN码,然后将其告知对方设备。
在配对过程中,设备会向对方设备发送PIN码请求。
对方设备接收到请求后,需要用户在设备上输入提前设定好的PIN码。
1.2. 验证PIN码设备接收到PIN码后,会对该PIN码进行验证。
如果验证通过,设备之间会建立安全连接。
否则,配对失败。
2. 口令配对口令配对是另一种常见的蓝牙配对方式。
在口令配对过程中,设备之间通过输入一个口令进行配对。
与PIN码配对类似,通过输入相同的口令,设备之间可以验证彼此的身份,并建立安全连接。
2.1. 输入口令在口令配对过程中,首先需要主从设备共享一个口令。
设备可以事先设置一个口令,并将其告知对方设备。
在配对过程中,设备会向对方设备发送口令请求。
对方设备接收到请求后,需要用户在设备上输入提前设定好的口令。
2.2. 验证口令设备接收到口令后,会对该口令进行验证。
如果验证通过,设备之间会建立安全连接。
否则,配对失败。
安全性与加密蓝牙配对协议的一个重要目标是确保通信的安全性。
在成功配对后,设备之间会建立一个称为“链接密钥”的共享密钥。
设备使用链接密钥来加密通信数据,以确保数据的保密性和完整性。
1. 加密算法蓝牙配对协议采用了一种称为“安全模型”的框架来支持多种加密算法。
具体采用哪种加密算法取决于设备的支持情况。
目前,比较常用的加密算法有AES-128和AES-256。
2. 加密密钥在配对过程中,设备之间会建立一个加密密钥。
蓝牙协议书规范# 蓝牙协议书规范## 第一条定义1.1 “蓝牙技术”指采用蓝牙标准进行无线通信的技术。
1.2 “协议书”指本文档所规定的蓝牙技术使用协议。
1.3 “用户”指使用蓝牙技术或服务的个人或实体。
## 第二条协议的生效2.1 本协议自用户接受之日起生效,用户通过点击“同意”按钮或使用蓝牙技术即视为接受本协议。
## 第三条用户资格3.1 用户应为具有完全民事行为能力的自然人、法人或其他组织。
3.2 用户应保证提供的信息真实、准确、完整。
## 第四条蓝牙技术的使用4.1 用户应按照蓝牙技术的标准和规定使用蓝牙设备和服务。
4.2 用户不得利用蓝牙技术进行任何违法活动,包括但不限于侵犯他人知识产权、隐私权等。
## 第五条数据保护5.1 用户在使用蓝牙技术过程中产生的数据,应遵守相关数据保护法规。
5.2 我们承诺采取合理措施保护用户数据的安全和隐私。
## 第六条知识产权6.1 本协议书及相关蓝牙技术中的所有知识产权归属于其合法所有者。
6.2 用户不得侵犯蓝牙技术的知识产权,包括但不限于商标、专利、著作权等。
## 第七条免责声明7.1 蓝牙技术提供的服务可能受到不可抗力因素的影响,我们不对因不可抗力导致的服务中断或数据丢失承担责任。
7.2 用户应自行承担使用蓝牙技术的风险,我们不对用户因使用蓝牙技术遭受的任何损失承担责任。
## 第八条协议的修改8.1 我们保留随时修改本协议的权利,修改后的协议一旦公布即生效。
8.2 用户应定期查看本协议的最新版本,继续使用蓝牙技术即视为接受修改后的协议。
## 第九条法律适用与争议解决9.1 本协议的解释、适用及争议解决均适用中华人民共和国法律。
9.2 如发生争议,双方应首先通过友好协商解决;协商不成的,可提交至有管辖权的人民法院通过诉讼方式解决。
## 第十条其他10.1 本协议未尽事宜,双方可另行协商确定。
10.2 本协议的任何条款如被认定为无效或不可执行,不影响其他条款的效力。
蓝牙协议中文版1. 引言蓝牙协议是一种无线通信技术,可以在短距离内实现设备之间的数据传输。
该协议已经成为现代电子设备中普遍使用的标准之一。
本文将介绍蓝牙协议的基本原理、通信方式以及相关的技术细节。
2. 蓝牙协议概述蓝牙协议是由蓝牙专业联盟(Bluetooth Special Interest Group,简称:SIG)制定的一种通信协议。
它定义了在2.4 GHz频段上进行无线通信的方式,可以实现设备之间的短距离数据传输。
蓝牙协议的特点包括低功耗、低成本、短距离通信等。
它可以用于连接手机、平板电脑、音频设备、电子手表等各种电子设备。
蓝牙协议还支持多种通信方式,包括点对点通信、广播通信和网状通信等。
3. 蓝牙协议的工作原理蓝牙协议使用频分多址(Frequency Division Multiple Access,简称:FDMA)和时分多址(Time Division Multiple Access,简称:TDMA)两种技术来实现多用户之间的共享信道。
在蓝牙协议中,设备之间通过广播和扫描的方式进行通信。
当设备处于广播模式时,它会发送广播消息,其他设备可以通过扫描接收到该消息。
当设备处于扫描模式时,它会主动搜索周围的设备并与之建立连接。
蓝牙协议还采用了分组(packet)的方式来传输数据。
每个分组包含了数据的有效载荷以及相应的控制信息。
设备之间通过分组来交换数据,以实现可靠的通信。
4. 蓝牙协议的通信方式蓝牙协议支持多种通信方式,包括点对点通信、广播通信和网状通信等。
在点对点通信中,两个设备可以直接建立连接并进行数据传输。
这种通信方式适用于需要进行双向数据传输的场景,例如蓝牙耳机与手机之间的通信。
广播通信是一种一对多的通信方式,一个设备可以向周围的多个设备发送广播消息。
其他设备可以通过扫描接收到该消息,但无法向发送广播的设备进行回复。
这种通信方式适用于需要向多个设备发送同样的信息的场景,例如广告推送。
网状通信是一种多对多的通信方式,多个设备可以相互之间建立连接并进行数据传输。
蓝牙所有协议规范蓝牙技术是一种短距离无线通信技术,最初由瑞典的爱立信公司在1994年开发。
它使用2.4GHz的ISM频段进行无线通信,具备低功耗、低成本和广泛的应用领域特点,被广泛应用于消费电子、医疗设备、汽车和工业领域等。
为了确保蓝牙设备之间的互操作性,蓝牙技术联盟制定了一系列的协议规范。
这些协议规范定义了蓝牙设备的通信协议、硬件接口和应用层协议等,确保了不同厂商的蓝牙设备可以互相配对和通信。
下面,我们将逐一介绍蓝牙技术联盟定义的一些重要的协议规范:1. 蓝牙核心规范(Bluetooth Core Specification)蓝牙核心规范定义了蓝牙设备之间的通信协议,包括物理层、链路层、控制层和应用层等。
它规定了蓝牙设备的基本功能和特性,确保了蓝牙设备之间的互通性。
2. 蓝牙配对协议(Bluetooth Pairing Protocol)蓝牙配对协议定义了蓝牙设备之间的配对过程和密钥生成算法。
在蓝牙设备进行配对时,配对协议确保了通信双方的身份验证和密钥交换,从而确保了蓝牙通信的安全性。
3. 蓝牙传输协议(Bluetooth Transport Protocol)蓝牙传输协议定义了蓝牙设备之间数据的传输方式和协议。
它规定了蓝牙设备之间的数据传输格式、数据包的结构和传输速率等,确保了蓝牙设备之间数据的可靠传输和处理。
4. 蓝牙音频协议(Bluetooth Audio Profile)蓝牙音频协议定义了蓝牙设备之间音频数据的传输和处理方式。
它规定了蓝牙设备之间音频数据的编码格式、音频传输通道和音频控制等,使得蓝牙设备可以实现音频的传输和播放功能。
5. 蓝牙物联网协议(Bluetooth Internet of Things Profile)蓝牙物联网协议定义了蓝牙设备在物联网应用中的通信协议和功能规范。
它包括了蓝牙设备的发现、连接、数据传输和远程控制等功能,使得蓝牙设备可以无线连接到物联网并实现远程监控和控制。
蓝牙配对协议书范本甲方(设备提供方):________________________乙方(设备使用方):_______________________鉴于甲方拥有蓝牙设备及相关技术,乙方需要使用甲方提供的蓝牙设备进行数据传输,双方本着平等互利的原则,经协商一致,就蓝牙设备配对事宜达成如下协议:1. 配对目的甲方同意将其拥有的蓝牙设备与乙方设备进行配对,以便乙方能够使用甲方的蓝牙设备进行数据传输。
2. 配对范围甲方提供的蓝牙设备仅限于乙方使用,乙方不得将配对信息泄露给第三方或用于非授权用途。
3. 配对条件乙方需提供有效的设备信息,包括但不限于设备型号、操作系统版本等,以便甲方进行配对。
4. 配对流程甲方将在收到乙方提供的有效设备信息后,启动配对流程。
配对成功后,甲方将提供配对凭证给乙方。
5. 配对凭证乙方应妥善保管配对凭证,该凭证是乙方使用甲方蓝牙设备的唯一凭证。
如凭证遗失,乙方应及时通知甲方,并按照甲方规定办理补发手续。
6. 配对期限本协议项下的配对服务有效期为自配对成功之日起一年。
期满后,乙方如需继续使用,应与甲方重新签订协议。
7. 保密条款双方应对在配对过程中知悉的对方商业秘密和技术秘密负有保密义务,未经对方书面同意,不得向第三方披露。
8. 违约责任如一方违反本协议约定,应承担违约责任,并赔偿对方因此遭受的一切损失。
9. 争议解决本协议在履行过程中如发生争议,双方应通过友好协商解决;协商不成时,任何一方均可向甲方所在地人民法院提起诉讼。
10. 其他本协议未尽事宜,双方可另行协商解决。
本协议自双方签字盖章之日起生效。
甲方代表(签字):________________________乙方代表(签字):_______________________签订日期:____年____月____日(注:本范本仅供参考,具体合同内容应根据实际情况由双方协商确定,并建议在签订前咨询法律专业人士。
)。
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位字段,提供常数和方法去确定在这个字段中编码的服务类和设备类(服务类可以有多个)。
每个蓝牙类可组成零至多个服务类,确切的说是一个设备类。
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位字段,提供常数和方法去确定在这个字段中编码的服务类和设备类(服务类可以有多个)。
每个蓝牙类可组成零至多个服务类,确切的说是一个设备类。
手机蓝牙支持协议怎么看?篇一:常用蓝牙协议介绍蓝牙协议HFP,HSP,A2DP,A VRCP,OPP,PBAP HFPHFP(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 配合使用。
A VRCP 定义了如何控制流媒体的特征。
包括暂停、停止、启动重放、音量控制及其它类型的远程控制操作。
Android之蓝牙驱动开发总结二Android Bluetooth架构 (1)2.1 Bluetooth架构图 (1)2.2 Bluetooth代码层次结构 (3)三Bluetooth协议栈分析 (4)3.1 蓝牙协议栈 (4)3.2 Android与蓝牙协议栈的关系 (5)四Bluetooth之HCI层分析 (5)4.1 HCI层与基带的通信方式 (6)4.2 包的分析及研究 (7)4.3 通信过程的研究与分析 (8)五Bluetooth之编程实现 (8)5.1 HCI层编程 (8)5.2 L2CAP层编程 (10)5.3 SDP层编程 (12)六Bluetooth之启动过程实现 (13)6.1 Bluetooth启动步骤 (14)6.2 Bluetooth启动流程 (14)6.3 Bluetooth数据流向 (14)6.4 Bluez控制流程 (14)6.5 Bluetooth启动过程分析 (15)七Bluetooth之驱动移植 (15)7.1 android系统配置 (15)7.2 启动项修改 (16)7.3 电源管理rfkill驱动 (16)7.4 Rebuild Android image and reboot (16)7.5 实现BT睡眠唤醒机制 (16)7.6 系统集成 (17)八Bluetooth之调试与编译 (17)8.1 Bluetooth驱动调试 (17)九Bluetooth之应用程序开发 (18)9.1 Bluetooth的API开发 (18)9.2 The Basics开发 (18)9.3 Bluetooth Permissions开发 (19)9.4 Setting Up Bluetooth服务 (19)9.5 Finding Devices服务 (20)9.6 Connecting Devices服务 (22)9.7 Managing a Connection服务 (26)9.8 Working with Profiles服务 (28)十总结与疑问 (29)一Bluetooth基本概念蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备、计算机及其终端设备、各种数字数据系统、甚至家用电器采用无线方式联接起来。
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包中类的简述:Android蓝牙模型原理及设备之间的连接已再【eoeAndroid特刊】第六期中有所说明,在此不做赘述。
详情请参见【eoeAndroid特刊】第六期4-6节。
二.协议简述蓝牙规范(SpecificationoftheBluetoothSystem)就是蓝牙无线通信协议标准,它规定了蓝牙应用产品应遵循的标准和需要达到的要求。
蓝牙协议规范遵循开放系统互连参考模型(OpenSystemInterconnetion/ReferencedModel,OSI/RM),从低到高地定义了蓝牙协议堆栈的各个层次。
在蓝牙规范中,中介协议是为高层应用协议或程序在蓝牙逻辑链路上工作提供了必要的支持,为应用曾提供了各种不同的标准接口。
android ble createbond用法概述及解释说明1. 引言1.1 概述本文将详细介绍Android BLE(蓝牙低功耗)中的createBond用法,并对其进行解释和说明。
蓝牙低功耗技术已经广泛应用于智能设备、无线音频设备以及其他物联网场景。
而createBond方法则是在Android平台上建立蓝牙设备绑定的一种关键方法。
1.2 文章结构文章主要分为四个部分:引言、Android BLE createBond用法、解释说明和结论。
首先,引言部分将对文章的背景和重点进行概述,并简要介绍文章结构。
然后,在Android BLE createBond用法部分,我们将详细讨论createBond方法的定义、作用以及使用步骤。
接下来,在解释说明部分,我们将探讨createBond 方法的参数和返回值,同时介绍与蓝牙配对相关的流程,并提供可能遇到的问题及相应的解决方案。
最后,在结论部分,我们会总结createBond方法的使用场景和优劣势,并展望其在未来发展中可能扮演的角色。
1.3 目的本文旨在帮助读者深入了解并掌握Android BLE中createBond方法的使用方式。
通过全面解析该方法,读者可以更好地理解其在蓝牙设备绑定过程中的作用和意义,并在实际开发中更加灵活地应用它。
同时,通过对createBond方法涉及的技术和流程进行解释和说明,读者还可以对蓝牙低功耗技术有更深入的理解,并为未来相关项目的设计和开发提供指导和参考。
总之,本文旨在为Android BLE开发者和研究人员提供一个全面而清晰的createBond用法指南。
2. Android BLE createBond用法2.1 什么是createBond方法createBond方法是Android BLE中的一个函数,用于建立与蓝牙设备的配对关系。
在Android开发中,BLE(Bluetooth Low Energy)是一种低功耗蓝牙技术,用于在设备之间进行短距离通信。
android蓝⽛简单开发⽰例教程⽬录概述1、权限申请2、打开蓝⽛3、接收蓝⽛状态的改变4、扫描其他的设备5、蓝⽛配对6、获取已经配对的设备7、连接设备概述前段时间学习了⼀些蓝⽛开发的知识,记录⼀下Android中蓝⽛的简单开发。
下⾯是最重要的两个类。
BluetoothAdapter : 蓝⽛适配器,通过getDefaultAdapter ()去获取⼀个实例,如果设备不⽀持蓝⽛的话,返回的是⼀个null对象,通过它,可以打开、关闭蓝⽛,扫描设备、向指定设备创建socket通道…BluetoothDevice : 代表⼀个设备对象,可以通过它获取设备的名字、地址、类型等,也可以创建匹配,建⽴socket通道等等。
1、权限申请<uses-permission android:name="android.permission.BLUETOOTH"/> 使⽤蓝⽛所需要的权限<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 使⽤扫描和设置蓝⽛的权限(申明这⼀个权限必须申明上⾯⼀个权限)Android6以上版本,扫描其他蓝⽛还需要位置权限// Android 9 以下版本<user-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>// Android 9 以上<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>2、打开蓝⽛mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();// 如果设备不⽀持蓝⽛if (mBluetoothAdapter == null){return;}// 设备⽀持蓝⽛功能,调⽤startActivityForResult去启动蓝⽛if (!mBluetoothAdapter.isEnabled()){unch(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));}打开蓝⽛功能是通过startActivity去启动的,但是startActivity这个函数已经过期了,所以我使⽤官⽅推荐的Activity Result替代它ActivityResultLauncher<Intent> startBlueTooth = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),new ActivityResultCallback<ActivityResult>() {@Overridepublic void onActivityResult(ActivityResult result) {if (result==null){Toast.makeText(BlueToothActivity.this, "open failed", Toast.LENGTH_SHORT).show();}else {if (result.getResultCode() == RESULT_CANCELED){Toast.makeText(BlueToothActivity.this,"⽤户取消",Toast.LENGTH_SHORT);}}}});3、接收蓝⽛状态的改变通过⼴播去接收蓝⽛状态的改变class BluetoothStateChangeReceiver extends BroadcastReceiver{public int DEFAULT_VALUE_BLUETOOTH = 1000;@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,DEFAULT_VALUE_BLUETOOTH); switch(state){case BluetoothAdapter.STATE_ON:Log.d(TAG, "onReceive: open");break;case BluetoothAdapter.STATE_OFF:Log.d(TAG, "onReceive: off");break;case BluetoothAdapter.STATE_TURNING_ON :Log.d(TAG, "onReceive: 正在打开");break;case BluetoothAdapter.STATE_TURNING_OFF:Log.d(TAG, "onReceive: 正在关闭");break;}}}}别忘了⼴播的注册和解注册IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);stateReceiver = new BluetoothStateChangeReceiver() ;registerReceiver(stateReceiver,filter);4、扫描其他的设备同样通过⼴播接收,action是BluetoothDevice.ACTION_FOUNDclass MyReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothDevice.ACTION_FOUND.equals(action)) {// 从intent对象中获取蓝⽛设备的信息BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);// 当发现新设备不存在于配对列表中时添加if (device.getBondState() != BluetoothDevice.BOND_BONDED) {blueNames.add(device.getName()+"\t"+device.getAddress());}blueAdpater.notifyDataSetChanged();Log.d(TAG, "onReceive: " + device.getName());}}}动态注册⼴播IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(mReceiver,filter);开启扫描mBluetoothAdapter.startDiscovery();5、蓝⽛配对public class BondReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())){BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);switch(device.getBondState()){case BluetoothDevice.BOND_BONDED:Log.d(TAG, "onReceive: 配对完成");break;case BluetoothDevice.BOND_BONDING:Log.d(TAG, "onReceive: 正在配对");break;case BluetoothDevice.BOND_NONE:Log.d(TAG, "onReceive: 取消配对");break;}}}}6、获取已经配对的设备已经配对的设备会被存储起来,通过BluetoothAdpater直接获取即可Set<BluetoothDevice> paireDevices = mBluetoothAdapter.getBondedDevices();if (paireDevices.size()>0){for (BluetoothDevice pairedDevice : pairedDevices) {blueNames.add(pairedDevice.getName()+" "+pairedDevice.getAddress());Log.d(TAG, "onClick: "+pairedDevice.getName());}}7、连接设备想要在两台设备之间创建连接,必须实现客户端和服务端机制,他们之间使⽤套接字机制进⾏连接,服务端开放服务器套接字,客户端通过MAC地址向服务端发起连接。
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蓝牙协议栈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使用Bluez,同时会带来一些有用的调式工具。
下面的片段为了提供一个建议的例子:hciconfig -a# print BT chipset address and features. Useful to check if you can communicate with your BT chipset.hcidump -XVt# print live HCI UART traffic.hcitool scan# scan for local devices. Useful to check if RX/TX works.l2ping ADDRESS# ping another BT device. Useful to check if RX/TX works.sdptool records ADDRESS # request the SDP records of another BT device.守护进程日志hcid(STDOUT)和hciattach(STDERR)的守护进程日志缺省是被写到/dev/null。
编辑init.rc和init.PLATFORM.rc在logwrapper下运行这些守护进程,把它们输出到logcat。
hciconfig -a 和 hcitool如果你编译你自己的system.img,除了hcitool扫描不行,hciconfig -a是可以工作的,尝试安装固件到蓝牙芯片。
XXX TBD工具BlueZ为调试和与蓝牙子系统通信提供很多设置命令行工具,包含下面这些:hciconfighcitoolhcidumpsdptooldbus-senddbus-monitor特性支持这一部分提供在每个android版本中的蓝牙的一些变化,主要是一些性能参数上的东西,就不翻译了。
Android 1.0 releasePlatform features∙Based on Bluez 3.36 and Linux Kernel 2.6.25∙Bluetooth 2.0+EDR host stack∙Headset Profile 1.0 in Audio Gateway role∙Handsfree Profile 1.5 in Audio Gateway roleo Three-way callingo Phonebook over AT commandsQualifications∙QDID B014524: Host stack (SDP, L2CAP, GAP, RFCOMM, SPP)∙QDID B014624: EPL for HTC Dream (HSP, HFP)Example products∙HTC Dream / T-Mobile G1Android 1.1 releaseNo Bluetooth changes since 1.0Android 1.5 release (cupcake)Platform features∙Based on Bluez 3.36 with Linux Kernel 2.6.27∙Bluetooth 2.0+EDR host stacko Support for auto-pairing with '0000' devices∙Headset Profile 1.1 in Audio Gateway role∙Handsfree Profile 1.5 in Audio Gateway roleo Three-way callingo Phonebook over AT commandso Volume synchronizationo eSCOo Extensive bug fixes and compatibility improvements∙Stereo Bluetooth (A2DP 1.2) in Source roleo AVDTP 1.2 in Acceptor and Initiator roleso GAVDTP 1.0 in Acceptor and Initiator roleso44.1 khz, stereo, software SBC codec∙Remote Control (AVRCP 1.0) in Target roleo AVCTP 1.3 in Target roleo play/pause/stop/prev/nextQualifications∙QDID B015261: Host stack (SDP, L2CAP, GAP, RFCOMM, SPP, AVCTP, AVRCP, GAVDP, AVDTP, A2DP) ∙QDID B015262: EPL for HTC Sapphire (HSP, HFP)Android 2.0/2.1 release (eclair)Platform features∙Based on Bluez 4.47 with Linux Kernel 2.6.29∙Bluetooth 2.1+EDR host stacko Support for auto-pairing with '0000' deviceso Support for Simple Secure Pairing∙Headset Profile 1.1 in Audio Gateway role∙Handsfree Profile 1.5 in Audio Gateway roleo Three-way callingo Phonebook over AT commandso Volume synchronizationo eSCOo Extensive bug fixes and compatibility improvements∙Stereo Bluetooth (A2DP 1.2) in Source roleo AVDTP 1.2 in Acceptor and Initiator roleso GAVDTP 1.0 in Acceptor and Initiator roleso44.1 khz, stereo, software SBC codec∙Remote Control (AVRCP 1.0) in Target roleo AVCTP 1.3 in Target roleo play/pause/stop/prev/next∙Object Push Profile version 1.1o Adds ability to transfer pictures, videoso Transfer of contacts using vCard is not supported in this release.∙Phone Book Address Profile version 1.0o Phone Book Server Equipment (PSE) role supported∙Using Java Bluetooth APIs, an Android application can peform the following:o Scan for other Bluetooth deviceso Query the local Bluetooth adapter for paired Bluetooth deviceso Establish RFCOMM channelso Connect to other devices through service discoveryo Transfer data to and from other deviceso Manage multiple connections∙Support for Bluetooth enabled car and desk dockso Framework support for routing Phone Call Audio and A2DP streaming using car and desk docks. Android 2.2 release (Froyo)Platform features∙Based on Bluez 4.47 with Linux Kernel 2.6.32∙No new profiles added.∙Added ability to share contacts using vCard∙Added ability to export all contacts - useful to transfer contacts to car kits∙Improved compatibility with headsets and car kits.Future releasesThis section offers a rough guide of which features the team is developing for the next release. This feature list may change without notice. It isn't possible to post scheduling advice to the mailing lists.∙More profiles...∙Improved compatibility with headsets and car kits∙Bluetooth emulator support∙Bluetooth Low Energy译者注:这里请大家注意一下红色部分,难道将来模拟器可以使用BT?开发须知HID支持Tethering - DUN and PAN 支持最后把官方链接附上:/porting/bluetooth.html。