Bluez的编译过程与方法
- 格式:ppt
- 大小:114.50 KB
- 文档页数:27
蓝⽛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);}。
Android上成功实现了蓝牙的一些Profile前段时间做蓝牙方面的开发,Google的Android只实现了Handset/Handfree和A2DP/AVRCP等Profile,而其它常用的Profile如HID/DUN/SPP/OPP/FTP/PAN等却没有实现,并且Google方面关于何时实现也没有一个时间表。
前段时间我实现了HID/DUN/SPP三个Profile,下一步实现OPP/FTP等Profile。
具体的开发其实也简单,我是参照A2DP的代码进行的相关Profile的实现。
Android的Handset/Handfree的实现方式和A2DP/AVRCP的方式有很大的不同,Handset/Handfree是直接在bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,而A2DP/AVRCP是在bluez的audio plugin基础上开发的,所以大大降低了实现的难度。
其实bluez的audio plugin上也有Handset/Handfree的实现,但不知道为什么Google没有用它,而要在RFCOMM Socket上自己实现一个,这使得Handset/Handfree的实现显得比较复杂。
HID要用到bluez的input plugin,Android已经把它编译进去了,在system/lib/bluez-plugin/input.so下,与input.so一起的还有audio.so库,那是供A2DP/AVRCP用的。
参照frameworks/base/core/jni /android_server_BluetoothA2dpService.cpp,自己写一个HID用的的.cpp文件,其中跟A2DP一样利用 DBUS调用input.so库的CreateDevice/Connect/Disconnect 等函数,具体源码在external/bluez /utils/input/manager.c和external/bluez/utils/input/device.c 中。
蓝牙介绍一、蓝牙简介是一个短距离无线通信标准,适用于手机、计算机和其他电子设备之间的通信。
蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。
采用时分双工传输方案实现全双工传输。
在 Linux 中,通常使用的蓝牙协议栈实现是 BlueZ(其他协议还有很多,NOKIA,BCM 都有开发,这里就不一一列举了)。
蓝牙基本知识:➢采用跳频技术,数据包短,抗信号衰减能力强;➢采用快速跳频和前向纠错方案以保证链路稳定,减少同频干扰和远距离传输时的随机噪声影响;➢使用2.4GHzISM频段,无须申请许可证;➢可同时支持数据、音频、视频信号;蓝牙2.0:2004年推出,虽然传输距离短,传输速度慢,但是已经基本满足数据传输需求。
蓝牙3.0:2009年推出,传输速度达24Mbps,是蓝牙2.0 的八倍。
能轻松用于录像机至高清电视,pc至打印机之间的资料传输。
蓝牙4.0:2010年推出,传输距离达100m,(3.0传输距离10m)。
功耗低,成本低。
二、蓝牙协议简介1,HCI协议编程HCI是沟通上层协议以及程序与底层硬件协议的通道。
所以,通过HCI发送的Command 都是上层协议或者应用程序发送给Bluetooth Dongle的。
它命令Bluetooth Dongle(或其中的硬件协议)去做什么何种动作。
➢得到Host上插入Dongle数目以及Dongle信息:分配一个空间给 hci_dev_list_req。
这里面将放所有Dongle信息。
struct hci_dev_list_req *dl;struct hci_dev_req *dr;struct hci_dev_info di;int i;if (!(dl = malloc(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t)))) {perror("Can't allocate memory");exit(1);}dl->dev_num = HCI_MAX_DEV;dr = dl->dev_req;// 打开一个HCI socket.if ((ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) {perror("Can't open HCI socket.");exit(1);}// 使用HCIGETDEVLIST,得到所有dongle的Device ID。
linux蓝牙编程bluez 收藏从别的地方转了一篇蓝牙编程的,感觉比较详细,接下来自己慢慢验证一下。
实战Linux Bluetooth编程实战Linux Bluetooth编程(一)协议栈概述前言:随着嵌入式系统的飞速发展,很多嵌入式平台上需要Bluetooth设备和应用。
但在Linux 下如何对Bluetooth编程,一直没有一份很好的中文文档。
Sam结合自己的工作,一步一步将一些有用的东西记录下来,希望对其它Linux下Bluetooth编程的朋友有点帮助。
一:Bluetooth基本概念:Bluetooth是爱立信、诺基亚、东芝、IBM和Intel 5家公司在1998年联合推出的一项无线网络技术。
其宗旨是提供一种短距离、低成本的无线传输应用技术。
在行业协会筹备阶段,需要一个极具有表现力的名字来命名这项高新技术。
行业组织人员,在经过一夜关于欧洲历史和未来无限技术发展的讨论后,有些人认为用Blatand国王的名字命名再合适不过了。
Blatand国王将现在的挪威,瑞典和丹麦统一起来;就如同这项即将面世的技术,将标准不一的短距离无线传输技术统一起来。
Intel负责半导体芯片和传输软件的开发,爱立信负责无线射频和移动电话软件的开发,IBM 和东芝负责笔记本电脑接口规格的开发。
蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备、计算机及其终端设备、各种数字数据系统、甚至家用电器采用无线方式联接起来。
它的传输距离为10cm~10m,如果增加功率或是加上某些外设便可达到100m的传输距离。
它采用2.4GHz ISM频段和调频、跳频技术,使用权向纠错编码、ARQ、TDD和基带协议。
TDMA每时隙为0.625μs,基带符合速率为1Mb/s。
蓝牙支持64kb/s实时语音传输和数据传输,语音编码为CVSD,发射功率分别为1mW、2.5mW和100mW,并使用全球统一的48比特的设备识别码。
由于蓝牙采用无线接口来代替有线电缆连接,具有很强的移植性,并且适用于多种场合,加上该技术功耗低、对人体危害小,而且应用简单、容易实现,所以易于推广。
蓝牙协议栈BlueZ的移植与开发
欧阳鑫;于红岩;吕杨
【期刊名称】《微计算机信息》
【年(卷),期】2007(023)005
【摘要】蓝牙技术是当前国内外科技界和产业界研究开发的热点技术,其应用范围包括手机、PDA、信息家电设备等领域,蓝牙技术在嵌入式系统上必将得到广泛的应用.而要在嵌入式系统上提供蓝牙开发支持,蓝牙协议栈的移植是关键.本文分析了蓝牙协议栈BlueZ体系结构,详细介绍了在S3C2410开发板上移植BlueZ的步骤,建立了嵌入式蓝牙应用开发平台,并提出了用BlueZ开发蓝牙应用程序的思路.【总页数】3页(P221-222,132)
【作者】欧阳鑫;于红岩;吕杨
【作者单位】650051,昆明理工大学信息工程与自动化学院;650051,昆明理工大学信息工程与自动化学院;650051,昆明理工大学信息工程与自动化学院
【正文语种】中文
【中图分类】TP368.1
【相关文献】
1.蓝牙协议栈BlueZ移植及GPS实现 [J], 郑春芳;郭秋丽
2.基于Bluez蓝牙协议栈的个域网用户节点的研究 [J], 吴亚萍;高军;傅仲逑
3.改进的Androi d蓝牙协议栈在功能移植上的应用 [J], 李满玲
4.蓝牙协议栈BlueZ的移植与开发 [J], 欧阳鑫;于红岩;吕杨
5.基于BlueZ协议栈的蓝牙语音接入系统实现与性能分析 [J], 陈舫;宋铁成;沈连丰;胡静;夏玮玮
因版权原因,仅展示原文概要,查看原文内容请购买。
Dbus移植步骤1.进入dbus的目录运行./configure --host=arm-linux--prefix=/bluetooth/dbus2.出现错误can not run test program while cross compiling[mystic@moolenaar]$ . checking for getpeereid... nochecking abstract socket namespace... configure: error: cannot run test program while cross compilingSee `config.log' for more details.执行./configure时要在宿主系统中运行一些测试程序,因为是交叉编译所以这个测试是一定通不过的。
不过没问题,我们可以在configure 时指定cache-file文件来屏障掉测试程序,在下面编译glib包时会遇到同样的问题。
处理方法:在源码包根目录下执行[mystic@moolenaar]$ echo ac_cv_have_abstract_sockets=yes >arm-linux.cache或者自己新建一个文件,vim arm-linux.cache在里面输入:ac_cv_have_abstract_sockets=yes[mystic@moolenaar]$ ./configure --host=arm-linux--prefix=/bluetooth/dbus --cache-file=arm-linux.cache参数解释:--prefix指定编译好的文件存放的路径,默认会放到/usr/bin下--host 指定编译器的类型,这里指定为arm-linux交叉编译,默认是本机的gcc编译--cache 指定测试的信息写的地方,这里是写到了arm-linux.cache里面一会会提示缺少xml库,下载libxlm2,解压后:./configure –-prefix=/bluetooth/libxml –-host=arm-linuxmake ->make install编译完成后一定要检查libxml/lib下的库文件的格式是否是ARM的,否则不能用。
(转自:/index.html)Linux下Bluez的编程实现1、蓝牙的各个协议栈的简介 (2)1.1、蓝牙技术 (2)1.1、蓝牙协议栈 (2)1.2、蓝牙技术的特点 (4)1.2.1、蓝牙协议栈体系结构 (4)1.2.2、蓝牙协议栈低层模块 (4)1.2.3、软件模块 (5)1.3、蓝牙的一些Profile (6)2、Bluez和D-Bus (7)2.1、Bluez和D-Bus体系结构 (7)2.2、D-Bus介绍 (9)2.3、Bluez的安全接口 (13)2.4、Bluez适配器接口 (15)2.5、Bluez配对 (16)2.6、Bluez绑定 (17)3、Bluez编程实现 (18)3.1、蓝牙开发关键技术剖析 (18)3.1.1、连接机制分析 (18)3.1.2、自动连接 (18)3.1.3、时钟设计 (19)3.1.4、配对列表管理 (20)3.1.5、蓝牙文件传输模式 (20)3.2、hci层介绍 (20)3.2.1、hci层介绍 (20)3.2.2、hci层编程 (21)3.3、L2CAP层编程 (25)3.3.1、L2CAP协议简介 (25)3.3.2、L2CAP编程方法 (26)3.4、SDP协议简介 (27)4、Openobex (28)4.1、Openobex简介 (28)4.2、Openobex与bluez编程实现 (29)5、Obexftp (32)5.1、obexftp简介 (32)5.2、基于Obexftp的应用程序开发 (32)6、参考资料 (32)1.1、蓝牙技术蓝牙(Bluetooth)技术是由Ericsson、IBM、Intel、Nokia和T oshiba公司于1998年5月共同提出开发的,并联合成立了蓝牙特殊利益小组(S IG),负责开发无线协议规范并设定交互操作的需求。
其本质是设备间的无线链接,意在于代替有线电缆。
1.1、蓝牙协议栈协议栈是指一组协议的集合,举个例子,把大象装到冰箱里,总共要3步。
BlueZ学习BLUEZ学习BlueZ是Linux官⽅蓝⽛协议栈。
它是⼀个基于GNU General Public License (GPL)发布的开源项⽬,从Linux2.4.6开始便成为Linux 内核的⼀部分。
BlueZ⽀持蓝⽛核⼼层和协议,它灵活、⾼效,以模块化⽅式实现,具有以下特点:完整的模块化实现均衡的多处理安全⽀持多线程数据处理⽀持多个蓝⽛设备硬件抽象向所有层提供标准socket接⼝提供设备和服务级安全保证BlueZ包含多个相互独⽴的模块:Linux内核蓝⽛⼦系统核⼼L2CAP 和 SCO ⾳频内核层RFCOMM, BNEP, CMTP 和 HIDP内核实现HCI UART, USB, PCMCIA 和虚拟设备驱动通⽤蓝⽛和SDP库和守候进程配置和测试⼩⼯具协议解码和分析⼯具BlueZ内核模块,程序开发库和⼩⼯具能在⽀持Linux的多种硬件架构系统上运⾏,既⽀持单核也⽀持多核处理器。
BlueZ主要⽀持以下系统平台:Intel and AMD x86AMD64 and EM64T (x86-64)SUN SPARC 32/64bitPowerPC 32/64bitIntel StrongARM and XScaleHitachi/Renesas SH processorsMotorola DragonBall现在市⾯上的很多Linux发⾏版都⽀持BlueZ,基本上任何⼀个Linux系统都兼容BlueZ,如:Debian GNU/LinuxUbuntu LinuxFedora Core / Red Hat LinuxOpenSuSE / SuSE LinuxMandrake LinuxBlueZ的源代码可以从/doc/9284b341b90d6c85ed3ac603.html /download/下载,其中Linux 2.4 and 2.6系列内核已经包含BlueZ内核模块源程序,因此要使⽤BlueZ只需下载最新稳定的Linux内核源码就⾏了。
Android平台开发-Bluezfunctionporting-蓝牙功能移植一、Bluez编译配置支持在BoardConfig.mk中添加:BOARD_HAVE_BLUETOOTH := true。
二、启动hciattachBlueZ核心子系统使用hciattach守护进程添加指定的硬件串口驱动。
修改init.rc来启动hciattach:service hciattach /system/bin/hciattch -n -s 115200 /dev/ttyS2 bcm2035 115200user bluetoothgroup bluetooth net_bt_admindisabled同时也要启动dbus daemon,因为bluez需要dbus与其它进程通讯的。
三、Bluez控制流程class bluetoothsetting是UI的入口,通过按button scan进入搜索状态,applicaton层调用bluetoothdevice, 接着就是bluetoothservice 的调用,bluetoothservice调用native方法,到此全部的java程序结束了。
下面的调用都是JNI, cpp实现的。
android_server_bluetoothservice.cpp里面实现了native 方法,最终通过dbus封装,调用HCID deamon 的function DiscoverDevice。
Bluetooth的启动流程是:1. 打开蓝牙电源,通过rfkill来enable;(system/bluetooth/bluedroid/bluetooth.c)2. 启动service hciattch -n -s 115200 /dev/ttyS2 bcm2035 115200;3. 检测HCI是否成功(接受HCIDEVUP socket来判断或hciconfig hci0 up);4. hcid deamon start up。