android蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程
- 格式:doc
- 大小:1.72 MB
- 文档页数:27
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==博通蓝牙方案篇一: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.rc[html] view plaincopy1. service hciattach /system/bin/hciattach -n /dev/sttybt0 sprd_shark2. socket bluetooth stream 660 bluetooth bluetooth3. user bluetooth4. group wifi bluetooth net_bt_admin net_bt inet net_raw net_admin system5. disabled6. oneshot篇二:android蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程Android bluetooth介绍(二)android 蓝牙代码架构及其uart 到rfcomm流程一、Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架)Android的蓝牙系统,自下而上包括以下一些内容如上图所示:1、串口驱动Linux的内核的蓝牙驱动程、Linux的内核的蓝牙协议的层2、BlueZ的适配器BlueZ的(蓝牙在用户空间的函式库)bluez代码结构Bluetooth协议栈BlueZ分为两部分:内核代码和用户态程序及工具集。
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 蓝牙开发原理
Android蓝牙开发原理主要有三个步骤:(1)启动蓝牙连接并配对设备;(2)使用Android API对蓝牙设备进行控制;(3)使用蓝牙API处理数据传输。
首先,在Android设备上打开蓝牙,并确保目标蓝牙设备也处于开启状态,然后在“添加设备”对话框中选择“蓝牙”选项进行配对。
配对成功后,可以通过蓝牙工具类BleController实现对蓝牙设备的控制,如扫描设备、连接设备、状态检测及数据读写等。
值得注意的是,安卓系统存在蓝牙漏洞,可能会让用户在无意间遭到黑客入侵。
因此,在使用蓝牙设备时,建议用户关闭蓝牙设备并避免进入蓝牙搜索画面,以降低风险。
此外,蓝牙数据传输主要通过UUID获取目标服务和characteristic,通过writeCharacteristic()和readCharacteristic()进行。
蓝牙40分为标准蓝牙和低功耗蓝牙(BLE),标准蓝牙用于手机,BLE用于可穿戴设备。
蓝⽛RFCOMM通信最近需要在某个开发板上⾯通过蓝⽛和⼿机蓝⽛连接,并通过RFCOMM通信。
还没有做过蓝⽛RFCOMM相关⼯作,因此先在linux PC上⾯调试⼀下流程,并在此记录调试过程。
⼀、说明RFCOMM协议基于L2CAP协议的串⾏(9针RS-232)仿真。
本⽂中实现了RFCOMM server和client通信。
⼆、设备linux主机(Ubuntu-14.04)、linux虚拟机(Ubuntu-14.04)、Android⼿机⼀台、不知名蓝⽛dongle_1(controller)、CSR 蓝⽛dongle_2(controller)。
Linux主机+dongle_1作为server端; linux虚拟机+dongle_2作为client端;Android⼿机作为client端。
三、环境搭建Server端:1. 安装bluez协议栈2. 查看bluetoothd进程是否启动:ps -ef|grep blueroot 1891 1 0 5⽉19 ? 00:00:00 /usr/sbin/bluetoothd如果没有启动,执⾏:/usr/sbin/bluetoothd -C &注:开始测试,如果把bluetoothd进程kill了,也能进⾏连接成功。
后来发现如果不启动bluetoothd,就连接不成功。
理论上说server端程序使⽤socket通信,应该不需要bluetoothd。
⾄今没有搞清楚原因。
3. 查看bluetooth service是否存在:service --status-all | grep blue如果不存在,执⾏:service bluetooth start4. 将dongle_1插⼊linux主机端;并配置。
1> 执⾏:hciconfig,观察dongle状态是否为UP RUNNING,如果不为UP RUNNING,则执⾏:hciconfig hci0 UP注:hci0是根据hciconfig打印的BD Address来确定的。
Android 蓝牙连接通信的工作原理可以分为几个主要步骤:1. 开启蓝牙模块:Android设备上的蓝牙功能由BluetoothAdapter类管理。
首先,需要获取BluetoothAdapter的实例,并调用其enable()方法来开启蓝牙模块。
2. 搜索蓝牙设备:开启蓝牙模块后,可以调用BluetoothAdapter的startDiscovery()方法开始搜索附近的蓝牙设备。
搜索过程中,设备会广播其信息,包括蓝牙设备的名称、地址、服务等信息。
3. 建立连接:当搜索到目标设备后,需要创建一个BluetoothDevice对象。
使用该对象调用connectGatt()方法来尝试与蓝牙设备建立连接。
此方法返回一个BluetoothGatt对象,用于后续的GATT通信。
4. GATT通信:GATT(Generic Access Profile)是蓝牙4.0及以上版本中定义的一套协议,用于在蓝牙设备之间传输数据。
通过BluetoothGatt对象,可以进行一系列GATT操作,如读取服务、读取特征值、写入特征值等。
GATT操作通常是异步的,需要通过回调函数来处理结果和状态变化。
5. 数据交换:一旦GATT连接建立,就可以通过BluetoothGatt的readCharacteristic()和writeCharacteristic()方法来读写数据了。
数据交换可以是特征值之间的直接读写,也可以是通过服务端点进行。
6. 断开连接:当通信完成后,应该断开与蓝牙设备的连接以节省能源。
可以调用disconnect()方法来断开连接。
断开连接后,应该释放相关的资源。
在整个过程中,蓝牙通信涉及到多种蓝牙技术,包括经典的蓝牙(Bluetooth Classic)、蓝牙低能耗(Bluetooth LE,也称为BLE)、蓝牙高级(Bluetooth High Speed)等。
不同的技术有不同的通信范围和速度要求。
另外,为了确保通信的安全性,蓝牙通信过程中可能还需要进行配对和认证操作。
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位字段,提供常数和方法去确定在这个字段中编码的服务类和设备类(服务类可以有多个)。
每个蓝牙类可组成零至多个服务类,确切的说是一个设备类。
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.rc[html]view plaincopy1.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结构体中的对比,找到对应的数组。
如果是其他蓝牙芯片,如博通、RDA、BEKN等着到其相对应的初始化配置函数。
1.struct uart_t uart[] = {2.{ "any", 0x0000, 0x0000, HCI_UART_H4,115200, 115200,3.FLOW_CTL, DISABLE_PM, NULL,NULL },4.{ "sprd_shark", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200,5.FLOW_CTL, DISABLE_PM, NULL,init_sprd_config },6.7.{ "ericsson", 0x0000, 0x0000, HCI_UART_H4,57600, 115200,8.FLOW_CTL, DISABLE_PM, NULL,ericsson },9.10.………………11. { "bk3211", 0x0000, 0x0000, HCI_UART_BCSP,115200, 921600, 0, DISABLE_PM, NULL, beken_init, NULL},12. { NULL, 0 }13.};注意:init_sprd_config这个函数在uart_init中用到,这个函数其实对我们具体芯片的初始化配置。
注释:HCI_UART_H4和HCI_UART_BCSP的区别如下图。
(3)、通过对前面参数的解析,把uart[i]中的数值初始化;1.u->speed = atoi(argv[optind]);2.break;(4)、初始化串口;1.n = init_uart(dev, u, send_break, raw);2.idh.code\external\bluetooth\bluez\tools\hciattach.c3./* Initialize UART driver */4.int init_uart(char *dev, struct uart_t *u, int send_break)5.{6.struct termios ti;7.int fd, i;8.fd = open(dev, O_RDWR | O_NOCTTY);//打开串口设备,其中标志9.//O_RDWR,可以对此设备进行读写操作;10.//O_NOCTTY:告诉Unix这个程序不想成为“控制终端”控制的程序,不说明这个标志的话,任何输入都会影响你的程序。
11.//O_NDELAY:告诉Unix这个程序不关心DCD信号线状态,即其他端口是否运行,不说明这个标志的话,该程序就会在DCD信号线为低电平时停止。
12.//但是不要以控制tty 的模式,因为我们并不希望在发送Ctrl-C13. 后结束此进程14. if (fd < 0) {15. perror(“Can’t open serial port”);16. return -1;17. }18. //drop fd’s data;19. tcflush(fd, TCIOFLUSH);//清空数据线20. if (tcgetattr(fd, &ti) < 0) {21. perror(“Can’t get port settings”);22. return -1;23. }24. cfmakeraw(&ti);25.cfmakeraw sets the terminal attributes as follows://此函数设置串口终端的以下这些属性,26.termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP27.|INLCR|IGNCR|ICRNL|IXON);28.termios_p->c_oflag &= ~OPOST;29.termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);30.termios_p->c_cflag &= ~(CSIZE|PARENB) ;31.termios_p->c_cflag |=CS8;32. ti.c_cflag |= CLOCAL;//本地连接,无调制解调器控制33. if (u->flags & FLOW_CTL)34. ti.c_cflag |= CRTSCTS;//输出硬件流控35. else36. ti.c_cflag &= ~CRTSCTS;37. if (tcsetattr(fd, TCSANOW, &ti) < 0) {//启动新的串口设置38. perror(“Can’t set port settings”);39. return -1;40. }41. /* Set initial baudrate */42. if (set_speed(fd, &ti, u->init_speed) < 0) {//设置串口的传输速率bps, 也可以使43.//用cfsetispeed 和cfsetospeed 来设置44. perror(“Can’t set initial baud rate”);45. return -1;46. }47. tcflush(fd, TCIOFLUSH);//清空数据线48. if (send_break)49. tcsendbreak(fd, 0);50.//int tcsendbreak ( int fd, int duration );Sends a break for51.//the given time.在串口线上发送0值,至少维持0.25秒。