基于bluecore的手机蓝牙附件的设计实现
- 格式:pdf
- 大小:316.57 KB
- 文档页数:8
Linux下Bluez的编程实现1、蓝牙的各个协议栈的简介 (2)1.1、蓝牙技术 (2)1.1、蓝牙协议栈 (2)1.2、蓝牙技术的特点 (3)1.2.1、蓝牙协议栈体系结构 (3)1.2.2、蓝牙协议栈低层模块 (4)1.2.3、软件模块 (5)1.3、蓝牙的一些Profile (5)2、Bluez和D-Bus (7)2.1、Bluez和D-Bus体系结构 (7)2.2、D-Bus介绍 (8)2.3、Bluez的安全接口 (12)2.4、Bluez适配器接口 (15)2.5、Bluez配对 (16)2.6、Bluez绑定 (16)3、Bluez编程实现 (17)3.1、蓝牙开发关键技术剖析 (17)3.1.1、连接机制分析 (17)3.1.2、自动连接 (18)3.1.3、时钟设计 (18)3.1.4、配对列表管理 (19)3.1.5、蓝牙文件传输模式 (20)3.2、hci层介绍 (20)3.2.1、hci层介绍 (20)3.2.2、hci层编程 (20)3.3、L2CAP层编程 (25)3.3.1、L2CAP协议简介 (25)3.3.2、L2CAP编程方法 (25)3.4、SDP协议简介 (26)4、Openobex (28)4.1、Openobex简介 (28)4.2、Openobex与bluez编程实现 (29)5、Obexftp (31)5.1、obexftp简介 (31)5.2、基于Obexftp的应用程序开发 (31)6、参考资料 (32)1、蓝牙的各个协议栈的简介1.1、蓝牙技术蓝牙(Bluetooth)技术是由Ericsson、IBM、Intel、Nokia和Toshiba公司于1998年5月共同提出开发的,并联合成立了蓝牙特殊利益小组(SIG),负责开发无线协议规范并设定交互操作的需求。
其本质是设备间的无线链接,意在于代替有线电缆。
1.1、蓝牙协议栈协议栈是指一组协议的集合,举个例子,把大象装到冰箱里,总共要3步。
蓝⽛bluez的编程CC++蓝⽛ bluez 的编程 C C++简介bluez⽬录有⼀个libbluetooth.a⽂件有⼀个⽬录 lib⽬录⾥⾯存储这⽹络连接的部分代码基于库的代码编程.在linux下如果⾃带了蓝⽛,可以通过gcc **.c -lbluetooth 直接编出⼀个可执⾏⽂件.参考⽂献下⾯的连接提供了⼀个测试代码.另外,关于 ble 使⽤库的⽅式⼀直出现失败的情况,是因为,没有设置ble的相关参数,具体可以参考中的enable_advertising函数int device_id = hci_get_route(NULL);int device_handle = 0;if ((device_handle = hci_open_dev(device_id)) < 0) {perror("Could not open device");exit(1);}le_set_advertising_parameters_cp adv_params_cp = { 0 };adv_params_cp.min_interval = htobs(advertising_interval);adv_params_cp.max_interval = htobs(advertising_interval);adv_params_cp.chan_map = 7;uint8_t status;struct hci_request rq = { 0 };rq.ogf = OGF_LE_CTL;rq.ocf = OCF_LE_SET_ADVERTISING_PARAMETERS;rq.cparam = &adv_params_cp;rq.clen = LE_SET_ADVERTISING_PARAMETERS_CP_SIZE;rq.rparam = &status;rq.rlen = 1;int ret = hci_send_req(device_handle, &rq, 1000);if (ret < 0) {hci_close_dev(device_handle);fprintf(stderr, "Can't send request %s (%d)\n", strerror(errno), errno);return (1);}le_set_advertise_enable_cp advertise_cp = { 0 };advertise_cp.enable = 0x01;memset(&rq, 0, sizeof(rq));rq.ogf = OGF_LE_CTL;rq.ocf = OCF_LE_SET_ADVERTISE_ENABLE;rq.cparam = &advertise_cp;rq.clen = LE_SET_ADVERTISE_ENABLE_CP_SIZE;rq.rparam = &status;rq.rlen = 1;ret = hci_send_req(device_handle, &rq, 1000);if (ret < 0) {hci_close_dev(device_handle);fprintf(stderr, "Can't send request %s (%d)\n", strerror(errno), errno);return (1);}。
第27卷第161期电力系统通信・62‘2006年3月10日TelecommunicationsforElect而cPowersystemV01.27No.161Mar.10.2006基于BlueCore2一Extemal蓝牙芯片的监控系统设计许文昭(南京邮电大学,江苏南京210003)摘要:在简要介绍了蓝牙技术的通信方式、开发模式以及CSR公司的BlueCore2一Extemal蓝牙芯片的性能及其工作原理的基础上,提出了一种基于BlueCore2一External芯片的监控系统的设计方案,给出了该方案的硬件模块图并介绍了系统的软件开发环境和方法。
最后说明了该方案的应用场合,并提出了下一步的研究方向。
关键词:蓝牙;BlueCore2一External芯片;监控系统中图分类号:TN914文献标识码:B文章编号:1005—7641(2006)03~0062—030引言蓝牙(Bluetooth)是一种短距离无线数据与语音通信的开放性全球规范,用于替代数字设备和计算机外设间的电缆连线以及实现数字设备间的无线组网。
采用IsM频段(2.4GHz),使用小范围射频链路。
链路建立在跳频频谱上,可在同一通信带宽内无干扰地传输多个信道信息,实现终端之间的信息交换。
共存于同一信道的若干设备单元构成一个微微网(piconet),在微微网中,若某台设备的时钟和跳频序列用于其他设备,则称为主设备,否则为从设备。
一个微微网有1个主设备和多个从设备(不多于7个)。
在同一微微网中,所有用户均用一个跳频序列同步。
若干相互独立的微微网连接在一起,就构成蓝牙分布式网络(scattemet,也称散射网)。
各微微网由不同的跳频序列区分,在一个互连的分布式网络中,一个结点设备可同时存在于多个微微网中,但不能在2个微微网中同时处于激活状态(active)…。
蓝牙程序写在一个9mm×9mm的微芯片上,将其嵌人到手机、PDA和数码相机等移动终端中,就可以完成设备之间的无电缆连接,实现无线局域网(wLAN)和信息家电等构想。
基于CSR BC 5 MME嵌入式蓝牙耳机设计与实现作者:沈明合,黄联芬来源:《现代电子技术》2010年第14期摘要:随着无线通信技术的发展,蓝牙耳机解决了传统耳机线束缚的问题,得到了广泛应用,迅速改变了人们的生活方式。
为了切合实际开发需要,设计实现高性能蓝牙耳机成为迫切需求。
通过对蓝牙耳机性能的需求分析,选择了基于CSR BC 5 MME嵌入式系统平台,设计并实现了蓝牙耳机MMI的相关功能。
该平台性能优越,可定制性强,为后续产品的研发定下坚实的基础。
关键词:蓝牙耳机; 蓝牙技术; BlueCore 5; 耳机软件中图分类号:TN802 文献标识码:A文章编号:1004-373X(2010)14-0028-04Bluetooth Headset Design and Implementation Based on CSR BC5-MME SystemSHEN Ming-he, HUANG Lian-(1. GN Netcom Ltd. Research and Design Departmen, Xiamen University, Xiamen 361009, China;2. Information Science & Technology College, Xiament University, Xiamen 361005, China)Abstract: With the progress of Wireless Communication technology development, Bluetoothwhappen on short distance. It has already implemented in the world and got more and more impact. In order to meet the intention of company, the high performance in the Bluetooth headset is required. Based on analyzing the requirement, the CSR BC5-MME Embedded system has been chosen andbe foundation for the continuous product.Keywords: Bluetooth headset; Bluebooth technology; BlueCore 5; headset software0 引言蓝牙耳机提供了一个安全及无绳的途径来发送和接收呼叫并进行语音传输。
科技与创新┃Science and Technology&Innovation ·152·2023年第20期文章编号:2095-6835(2023)20-0152-03基于JAVA的共享蓝牙耳机小程序设计*丁玉青,孙逸飞,朱敏(安徽三联学院电子电气工程学院,安徽合肥230601)摘要:伴随着科技进步,手机已经成为现代人生活中不可缺少的设备,语音电话、刷视频、听音乐、学习工作等都离不开手机。
作为手机的伴生产品,耳机也成为了大多数人出行的标配。
耳机是对外界声音的隔绝,也是人们沟通心灵的工具,能自由选择聆听各种声音。
由于蓝牙耳机小巧,导致耳机的电量不足以支撑一天,因此需要随身携带充电电源,非常不便,为此设计了一款基于微信小程序的蓝牙耳机共享系统,让使用者无需随身携带蓝牙耳机。
考虑到卫生问题,系统也会给用户配备一次性耳套和酒精消毒纸巾,通过建立微信小程序,投放耳机柜,以租赁的方式运营,投入到商场、车站、图书馆等公共场合,为所有手机使用者提供便利的租赁橱柜。
关键词:JAV A;微信小程序;共享;蓝牙耳机中图分类号:TP311.1文献标志码:A DOI:10.15913/ki.kjycx.2023.20.047蓝牙耳机已成为大多数人出行的标配,它将蓝牙技术应用在免持耳机上,让使用者可以免除恼人电线的牵绊,以各种方式轻松高效地生活。
但由于蓝牙耳机体积较小且电量有限,因此往往会出现耳机没带或者没电的情况,影响人们的生活习惯或工作效率,十分不便。
针对此问题,为了实现蓝牙耳机的共享小程序,通过投放耳机租赁柜,以租售的方式给用户提供蓝牙耳机租售服务,投入到商场、车站、图书馆等公共场合,让需求者无需随身携带蓝牙耳机也可以实现“耳机自由”。
同时,考虑到卫生问题,系统也会给用户配备一次性耳套和酒精消毒纸巾。
目前共享平台主要通过微信小程序和APP实现,但是由于技术局限,开发独立的APP平台时,开发成本、运营维护、版本迭代等都是需要解决的难题。
摘要:通过对蓝牙高级音频分发框架(A2DP)协议栈进行系统地分析,提出了一种基于消息机制的协议方案,在无A2DP框架的蓝牙1.1协议栈基础上实现了轻型的A2DP应用框架,并且利用嵌入式蓝牙开发平台,实现了基本的点对点蓝牙立体声音频数据的传输。
关键词:蓝牙;高级音频分发框架;消息机制;立体声音频流引言近年来,随着蓝牙技术在电子产品中的日益普及,蓝牙音频设备也层出不穷,其中具有免提功能的蓝牙耳机和蓝牙音频网关的应用是最典型的例子。
但免提单元与音频网关进行音频传输建立起来的SCO连接,仅能支持64kbps电信级语音质量的音频流,这也就限制了蓝牙音频质量的提高,同时也影响了蓝牙的娱乐消费市场。
为了满足人们对高质量音频的需求,进一步扩大蓝牙产品市场,蓝牙特殊兴趣小组SIG组织,在蓝牙1.1规范的应用框架基础上又单独提出了高级音频分发框架(Advanced Audio Distribution Profile, A2DP)。
该框架利用了在L2CAP层建立起来的ACL异步无连接链路来传输高质量的单声道或者立体声音频数据,有效负载的传输速率可以达到300kbps~400kbps。
1 A2DP框架概述在娱乐消费市场中,A2DP实例化应用就是用音乐播放器把音频数据通过ACL连接发送到耳机或者音箱上。
目前的框架规范中,并不支持同步的一点对多点的广播式音频分发,而对于点对点音频的分发,又存在着两种不同的角色,一个是信源设备(SRC),这种设备作为发起者将数字音频流发送到Piconet网中;另一个是信宿设备,是接收信源发出的音频流的设备。
如果蓝牙音乐播放器是信源设备,那么与之交互的蓝牙耳机就是信宿设备,信源和信宿的区别就在于它是发起者还是接收者。
下面对该框架所涉及的具体协议和其依赖框架进行分析。
1.1 A2DP应用框架在典型的蓝牙音频相关框架的整体结构中,A2DP框架所处的位置如图1所示:图1 蓝牙音频框架整体结构服务发现应用框架(SDAP)所提供的功能是向其他蓝牙设备提供自身所具备的服务,并且能够使用远程设备所提供的服务和功能。
基于Bluecore的手机蓝牙附件的设计实现周尤北京邮电大学信息与通信工程学院,北京 (100876)E-mail: maemo8807@摘要:无线个域网(Wireless Personal Area Network,WPAN)是指提供个人及消费类电子设备之间进行互联的无线短距离专用网络。
无线个域网专注于便携式移动设备(如个人计算机、外围设备、PDA、手机、数码产品等消费类电子设备)之间的互联,以及这些设备与人之间的双向通信技术问题。
1999年推出,作为短距离数字语音和数据传输的开放式标准的蓝牙技术]6[正在成为目前的实现无线个域网的主流技术。
本文通过一个具有基本功能的手机附件的设计实现介绍了使用全球领先的蓝牙芯片供应商CSR公司的Bluecore系列芯片以及其Bluelab集成开发环境进行蓝牙设备开发的过程。
关键词:蓝牙;单芯片;CSR中图分类号:TP3121.引言手机蓝牙附件通过蓝牙与手机连接,通过蓝牙应用层profile扩充手机的功能,本文设计实现的蓝牙手机附件具有显示手机端信息的基本的功能,通过这一具有基本功能的蓝牙附件的设计实现,本文介绍了使用Bluecore系列芯片以及Bluelab IDE进行手机附件开发的过程。
Bluecore系列芯片是是全球领先的蓝牙芯片供应商CSR公司提供的集成了很多功能的SOC芯片。
到目前为止,已经出了6代蓝牙芯片。
Bluecore芯片最大的特点在于其双核结构,即芯片中有一个ARM核用来运行协议栈的之外,还有一个通用DSP核。
此外芯片所需的外围电路器件很少,可用作蓝牙单芯片的解决方案,即用户程序以及协议栈(包括底层和用户层profile)以固件的形式作为一个整体运行在一个Bluecore芯片上。
与Bluecore系列芯片配套的集成开发环境被称为Bluelab,Bluelab可以完成程序的编译链接与下载, Bluelab以库的形式向应用程序提供蓝牙上层的协议栈和Profile的实现,其协议栈层次图如下图所示]4[:图1 Bluelab协议栈结构图图中显示的是Bluelab蓝牙协议栈的实现形式,其中“Application”是对用户层次profile的实现,例如通用对象交换Profile (GOEP) 对象推送配置文件 (OPP) 串行端口Profile (SPP)等,“Connection Library”是和蓝牙协议有关的部分,而“Lower levels of Bluecore Stack”对上面两层提供支持,隐藏了硬件的细节,例如封装了对于芯片外部PIO的操作。
在Bluelab所提供的协议层次当中,与开发应用程序最相关的就是“Application”层,即蓝牙面向应用的profile层,向用户隐藏蓝牙通信的细节]3[。
CSR公司的Bluecore芯片以及Bluelab集成开发环境提供了蓝牙的单芯片解决方案,使得用户能够以最快的速度在自己的设备中集成蓝牙通信功能。
2.硬件部分的设计实现由于Bluecore芯片号称提供单芯片解决方案,于是硬件上的设计就变得非常简单。
项目中考虑到今后要加入对于音频的支持,就选取了具有多媒体处理能力的Bluecore5-MM芯片作为主处理器,Bluecore5-MM芯片需要外接一个16Mbit的flash芯片存储固件程序,同时根据项目的需要,还要通过IO管脚连接R80接口的液晶屏。
图2 Bluecore芯片以及系统框图作为系统主要部分的Bluecore5-MM芯片,具有芯片有以下特点]1[:对于蓝牙V2.0+EDR协议的支持;在主处理器核之外拥有一个DSP协处理器,称为Kalimba;16为内置立体声编解码模块;内置电源管理模块;内置电池充电模块;USB以及UART主机接口;可支持最大32M位的flash芯片;支持I2S,PCM以及SPDIF音频输入接口;音频增强降噪功能;支持与802.11协议共存。
该芯片可以提供单芯片蓝牙应用的完整方案,外围电路很少,由于芯片为双核结构,有利于芯片在处理蓝牙通信的同时进行一些应用程序的处理方便了项目在下一阶段增加音频功能。
3.软件模块的设计实现本文中提到的手机蓝牙附件通过蓝牙与手机连接并进行数据传输,并且实时显示手机发送的一些信息。
于是软件方面附件的功能可以分为与手机蓝牙通信的部分和数据的显示两部分。
根据设备的通信需求,蓝牙通信程序部分需采用用于设备之间传输数据对象OPP Profile: Object Push Profile]8[,由于OPP profile又细分为OPPC (client) 端和OPPS(server)端profile,这两个profile区别在于只有client端可以发起数据传输的过程,但是附件设备与手机通信的情景中,既有手机发起数据传输请求也有设备侧发起传输请求的需要,所以要在设备中实现OPPC和OPPS两个profile。
关于数据显示,在本项目是由芯片中的DSP核完成液晶的驱动,显示信息由运行在arm 核上的蓝牙部分软件接收到之后按一定格式发送到DSP侧显示,这样可以是软件的层次更清晰。
这必定要设计到Bluecore芯片arm图3 系统软件框图3.1 液晶驱动模块的设计实现液晶驱动模块运行在Bluecore芯片的DSP核上,Bluecore芯片的DSP核必须使用汇编语言进行开发。
液晶驱动模块在完成液晶的初始化操作之后,其入口就是一个消息处理函数display,这个函数接收或并且处理MessageId为DISPLAY_MESSAGE的消息,于是开始就要注册此消息处理函数:r1 = &$myfirst_long_message_struct;r2 = $DISPLAY_MESSAGE;r3 = &$display;call $message.register_handler;。
frame_loop:jump frame_loop;主程序在此循环等待显示消息的到来。
Display接收到的显示消息被分为显示文本行,显示字符以及显示图片三种类型,分别通过Disptext Dispdigit和Dispic函数完成。
其中显示字符和文本最终的函数最终是调用显示字符的函数Writechar,显示字符的Writechar从根本上也是靠现实图片来实现,即显示预先定义好的字库数据。
于是显示都集中到显示图片的问题上了,液晶驱动硬件显示图片的基础是在每个象素的位置按要求显示黑或白,即写入“0”或者“1”的过程,这是由函数Write0和Write1完成的。
液晶显示模块的函数调用关系图如下所示:图4 液晶驱动模块函数调用关系操作液晶写入显示数据的函数Write0和Write1是靠处理器PIO模拟R80接口LCD的驱动时序来完成的,最基本的操作即是能对任何一个PIO管脚置高置低的操作,这些基本操作是由下面汇编PIOSet函数完成的]2[:PIOSet:rLink;pushr1 = r1 XOR 65528; /* r1: operand address */r7 = r7 AND r1;r7 = r7 OR r2; /* r2: operand code */r7;=M[$PIO_OUT]r0=1;$timer.n_us_delay;callrLink;poprts;3.2 两核之间通信的实现由于Bluecore5芯片有arm和DSP协处理器两个处理器核,而项目中的蓝牙附件进行数据通信的蓝牙协议栈运行在arm核的VM之上,而驱动液晶进行显示的工作是由DSP核来完成得,于是在软件设计中要考虑到处理其的双核通信问题:首先要考虑的是两处理器核对于外设控制权的分配,要由arm侧把操作液晶的PIO控制权给DSP侧,DSP侧才能对这些PIO进行控制。
这需要用到在CSR的基本支持库中提供的相应函数:PioSetKalimba(65520,65520)把PIO4到PIO15管脚的控制权交由协处理器DSP。
PioSetDirKalimba32(65520,65520);设置DSP处理器控制管脚的输入输出方向。
Bluecore5芯片中的两个处理器核通信的基本机制是通过共享内存,在Bluelab环境中实现了相关的库函数处理两核之间的通信,其基本的通信方式是靠注册消息响应函数的方式处理对方发来的消息:Task MessageLongKalimbaTask 函数在ARM注册处理来自DSP消息的消息处理函数。
KalimbaSendLongMessage 用于发送消息给DSP侧。
$message.register_handler函数在DSP注册处理来自ARM消息的消息处理函数$message.send 用于发送消息给ARM侧。
由以上四个函数即建立了两个处理器核的双向通信消息响应机制,如图所示。
图5 Bluecore芯片双核通信示意图同时要注意到两个处理器核的地位不是完全对等,其中DSP为协处理器,arm侧需要对其进行启动]3[:FILE_INDEX index = FileFind (FILE_ROOT,kal,sizeof(kal)-1);KalimbaLoad(index);把DSP的程序固件加载进DSP内存。
KalimbaSendMessage(KALIMBA_MSG_GO, 0,0,0,0))发送KALIMBA_MSG_GO命令启动DSP程序的运行。
至此液晶驱动模块的设计编写已经完成,可以在arm侧VM上运行的程序中通过KalimbaSendLongMessage发送一定格式的显示消息把数据显示在液晶屏上。
3.3 蓝牙功能部分的设计实现在Bluelab集成环境中的库已经实现OPPC以及OPPS Profile的库]7[。
Bluelab集成开发环境中应用程序功能的实现采取了注册消息处理函数的机制使用Profile库所实现的功能,消息处理函数实现了一个状态及,各profile库向应用程序返回的状态值驱动这个状态机,从而使应用程序和profile库能够同步运行。
具体在初始化Profile库之前要声明一个任务(task)处理与库的交互,每个任务对应有一个消息处理函数,其中以switch 分支分别处理不同的消息,大体的程序实现架构如下:profile.task.handler = profile_handler;ConnectionInit(profile.task);static void profile_handler(Task task, MessageId id, Message message){switch(id){Case:CL_INIT_CFM:1);OppcInit(task,。
Case :OPPC_INIT_CFM:OppcConnect(state->session, &state->bd_addr, 0xFF);OPPC_CONNECT_CFM:Case:OppcPushObject()Case:OPPC_PUSH_COMPLETE_IND:Case:OPPC_DISCONNECT_IND:。