Bluez的编译过程与方法

合集下载

Bluez的编译过程与方法

Bluez的编译过程与方法

编译前说明及注意事项
• 1、四种方案均可,所选库根据编译器及库 之间的兼容性而定,库版本并不唯一 • 2、所选各库版本尽量偏低,避免带来意想 不到的错误,导致无法编译通过 • 3、dbus库可依赖expat或libxml,默认是 expat,建议用expat • 4、glib库版本过高,可能会用到zlib库 • 5、bluez-4.x以上版本,编译时需要用到 linux内核中的/include/linux/sockios.h
编译方案选择与说明
• • • • • • 二、 bluez-lib+bluez-utils+libxml方案 bluez-lib-3.36.tar.gz libxml2-2.7.4.tar.gz dbus-1.0.2.tar.gz glib-2.16.5.tar.bz2 bluez-utils-3.36.tar.gz
编译方案选择与说明
• 三、bluez-4.x + libxml方案 • libxml2-2.6.31.tar.gz dbus-1.0.2.tar.gz glib-2.22.3.tar.bz2 bluez-4.48.tar.gz
编译方案选择与说明
• 四、bluez-4.x + expat方案 • expat-2.0.1.tar.gz dbus-1.0.3.tar.gz glib-2.22.0.tar.bz2 bluez-4.48.tar.gz
Bluez介绍
• bluez新的版本不像旧的那样有什么bluezutil、bluez-lib什么的,就一个bluez4.48。
编译方案选择与说明
• • • • • • 一、 bluez-lib+bluez-utils+expat方案 bluez-lib-3.36.tar.gz expat-2.0.1.tar.gz dbus-1.2.16.tar.gz glib-2.22.4.tar.bz2 bluez-utils-3.36.tar.gz

蓝牙bluez的编程CC++

蓝牙bluez的编程CC++

蓝⽛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

Android上成功实现了蓝牙的一些Profile

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 蓝牙编程 bluez

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的移植与开发

蓝牙协议栈BlueZ的移植与开发

蓝牙协议栈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], 陈舫;宋铁成;沈连丰;胡静;夏玮玮
因版权原因,仅展示原文概要,查看原文内容请购买。

bluez编译移植

bluez编译移植

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的,否则不能用。

Linux下Bluez的编程实现

Linux下Bluez的编程实现

(转自:/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学习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-蓝牙功能移植

Android平台开发-Bluezfunctionporting-蓝牙功能移植

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。

bluez 交叉编译--测试通过(参考了网上的教程,并做了修改)

bluez 交叉编译--测试通过(参考了网上的教程,并做了修改)

bluez 交叉编译--测试通过(参考了网上的教程,并做了修改)arm-linux-gcc 4.3.3==========================================我用到的几个库:bluez-lib-3.36.tar.gzexpat-2.0.1.tar.gzdbus-1.2.16.tar.gzglib-2.22.4.tar.bz2libusb-0.1.12.tar.gzbluez-utils-3.36.tar.gz====================================================/opt/libs 和/opt/utils是我自己编译时用的路径,你可以随便的选取。

1,编译安装bluez-lib-3.36.tar.gz这个库不需要什么依赖,直接解压,配置,编译然后安装即可。

#tar zxvf bluez-lib-3.36.tar.gz#./configure --prefix=/opt/libs --host=arm-linux --target=arm-linux CC=arm-linux-gcc #make#make install2,编译安装expat-2.0.1.tar.gz这个库是后面的dbus依赖的,你也可以用libxml2来代替expat,官方网站上说dbus必须依赖于他们中的一个,我这里用的是expat-2.0.1.tar.gz。

#tar zxvf expat-2.0.1.tar.gz#./configure --prefix=/opt/libs --host=arm-linux --target=arm-linux CC=arm-linux-gcc #make#make install3,编译安装dbus-1.2.16.tar.gz#tar zxvf dbus-1.2.16.tar.gz#echo ac_cv_have_abstract_sockets=yes>arm-linux.cache#./configure --prefix=/opt/libs --host=arm-linux --target=arm-linuxCC="arm-linux-gcc -I/opt/libs/include -L/opt/libs/lib" --cache-file=arm-linux.cache --with-x=no#make#make install=======================================================4,编译安装glib-2.22.4.tar.bz2#tar -zxjf glib-2.22.4.tar.bz2#echo ac_cv_type_long_long=yes>arm-linux.cache#echo glib_cv_stack_grows=no>>arm-linux.cache#echo glib_cv_uscore=no>>arm-linux.cache#echo c_cv_func_posix_getpwuid_r=yes>>arm-linux.cache#echo ac_cv_func_posix_getgrgid_r=yes>>CC="arm-linux-gcc -I/opt/libs/include -L/opt/libs/lib" --cache-file=arm-linux.cache有错误:checking for posix getpwuid_r... configure: error: in `/home/yan/glib-2.22.4': configure: error: cannot run test program while cross compilingSee `config.log' for more details.#echo ac_cv_func_posix_getwuid_r=yeschecking for gmtime_r... (cached) yeschecking for posix getpwuid_r... (cached) yeschecking for posix getgrgid_r... configure: error: in `/home/yan/glib-2.22.4': configure: error: cannot run test program while cross compilingSee `config.log' for more details.#echo ac_cv_func_posix_getgrgid_r=yes>>arm-linux.chace我的经验是以下三种方法都可以试试:#echo ac_cv_func_posix_getwuid_r=yes#echo ac_cv_func_posix_getwuid_r=yes>>#echo ac_cv_func_posix_getwuid_r=yes>>arm-linux.cache#make有错误:> giounix.c: In function `g_io_unix_read':> giounix.c:181: `SSIZE_MAX' undeclared (first use in this function)> giounix.c:181: (Each undeclared identifier is reported only once> giounix.c:181: for each function it appears in.)> make[3]: *** [giounix.lo] Error 1[root@localhost glib-2.22.4]# find ./|grep giounix./glib/giounix.c./glib/.deps/giounix.Plo./glib/.libs/giounix.o./glib/giounix.lo在glib/giounix.c中加入:#include <bits/posix1_lim.h>#make install如果出现找不到的东西将安装好的lib/pkconfig/下面的文件拷贝到/usr/lib/pkconfig下正确配置的./configure --prefix=/opt/glib --host=arm-linux --target=arm-linux CC="arm-linux-gcc -I/opt/libs/include -L/opt/libs/lib"--cache-file=arm-linux.cache ac_cv_have_abstract_sockets=yesac_cv_type_long_long=yes glib_cv_stack_grows=no glib_cv_uscore=noac_cv_func_posix_getpwuid_r=yes ac_cv_func_posix_getgrgid_r=yes===================================================================== ===================编译安装bluez-utils-3.36.tar.gz#tar zxvf bluez-utils-3.36.tar.gzCC="arm-linux-gcc -I/opt/libs/include -L/opt/libs/lib" --disable-audio#make有错误:In file included from/opt/toolchains/arm920t-eabi/lib/gcc/arm-angstrom-linux-gnueabi/4.1.2/../../../../arm-a ngstrom-linux-gnueabi/include/stdlib.h:969,from ../eglib/gmain.h:4,from ../eglib/glib.h:1,from glib-helper.c:41:/opt/toolchains/arm920t-eabi/lib/gcc/arm-angstrom-linux-gnueabi/4.1.2/../../../../arm-a ngstrom-linux-gnueabi/include/bits/stdlib.h:70:3: error: #error "Assumed value of MB_LEN_MAX wrong"make[2]: *** [glib-helper.o] Error 1make[2]: Leaving directory `/home/yan/bluez-utils-3.36/common'make[1]: *** [all-recursive] Error 1make[1]: Leaving directory `/home/yan/bluez-utils-3.36'make: *** [all] Error 2解决方法:[root@localhost opt]# find ./|grep stdlib.h./toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/stdlib.h./toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/bits/stdlib.h在/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/bits/stdlib.h中将#define STDLIB_MB_LEN_MAX 16改为#define STDLIB_MB_LEN_MAX 1#make install====================================================./configure --prefix=/opt/bluez-utils --host=arm-linux --target=arm-linuxCC="arm-linux-gcc -I/opt/libs/include -L/opt/libs/lib" --disable-audio这样Bluez协议栈就编译好了。

蓝牙协议栈BlueZ的移植与开发

蓝牙协议栈BlueZ的移植与开发

蓝牙协议栈BlueZ的移植与开发*欧阳鑫 于红岩 吕杨(昆明理工大学信息工程与自动化学院,昆明,650051)摘要:蓝牙技术是当前国内外科技界和产业界研究开发的热点技术,其应用范围包括手机、PDA、信息家电设备等领域,蓝牙技术在嵌入式系统上必将得到广泛的应用。

而要在嵌入式系统上提供蓝牙开发支持,蓝牙协议栈的移植是关键。

本文分析了蓝牙协议栈BlueZ体系结构,详细介绍了在S3C2410开发板上移植BlueZ的步骤,建立了嵌入式蓝牙应用开发平台,并提出了用BlueZ 开发蓝牙应用程序的思路。

关键字:蓝牙技术;蓝牙协议栈BlueZ;移植;S3C2410;Linux中图分类号:TP368.1 文献标识码:ABlueZ Porting and ProgrammingOu Yangxin,Yu Hongyan,Lv Yang(College of Information Engineering and Automation,Kunming University of Scienceand Technology,Kunming 650051,China)Abstract: Bluetooth technology is the focused on by the domestic and overseas research institutes. This technology is widely used in mobile phone, PDA, and Information Appliance devices. In the future,bluetooth technology will be widely used in embedded system. Built some bluetooth applications on embedded system,the key technology is porting bluetooth protocol suites to platform. In this paper,we study the BlueZ architecture,describe the steps of Porting BlueZ to S3C2410 Platform in detail,and build the embedded bluetooth application programming platform. In the end, we also give the idea of bluetooth programming.Keywords: bluetooth technology,bluetooth protocol suites BlueZ,porting, S3C2410, Linux1引言蓝牙技术是一项低价格、低功耗的射频技术,它能使蓝牙设备实现近距离无线通信。

Linux下基于Bluez

Linux下基于Bluez

Linux下基于Bluez硬件:Moto H670 蓝⽛⽿机(CSR chip)/ Broadcom v2.0 adapter软件:bluez-4.26 / bluez-gnome-1.8 / linux kernel 2.6.281)蓝⽛⽿机配对,打开你的蓝⽛⽿机,进⼊配对模式,我是⽤blue-wizard,就是blue-gnome这个东西来配对,实在是找不到其它⽅法。

以前bluez-3.x 在/var/lib/bluetooth/xx/pincodes⾥直接写pincode就可以了,现在好像不⾏了,⽽且在配对前,最好把那个pincodes删掉,⾄少要把跟你蓝⽛⽿机地址相关的那条pincode去掉。

2)运⾏ bluetoothd第⼀次使⽤,可以在后⾯加 -n -d 看调试信息3)在HOME⽬录下,建⽴ .asoundrc这个⽂件,如下:pcm.headset {type bluetoothdevice "00:1A:0E:1A:0E:90"profile "voice"}4)测试蓝⽛⽿机aplay -D headset demo.wav 或者在Skype ⾥选择headset就可以了NOTE:在配置中,我的蓝⽛⽿机,就是播放的时候,死在那⾥,怎么都不出声⾳,你可以在bluetoothd的调试信息⾥看到 " State changed/org/bluez/19016/hci0/dev_00_1A_0E_1A_0E_90: HEADSET_STATE_CONNECT_IN_PROGRESS ->HEADSET_STATE_CONNECTED" 也能从HEADSET_STATE_CONNECTED 到 HEADSET_STATE_PLAYING" 就是不出声⾳。

这时候,你要看看是不是你的蓝⽛适配器有问题,我的Broadcom就是如此。

libz 静态编译

libz 静态编译

要将libz静态编译到您的应用程序中,您需要按照以下步骤进行操作:
1. 下载libz库:从官方网站或可信的源获取libz库的源代码。

确保您下载的版本与您的应用程序兼容。

2. 解压libz库:将下载的libz库源代码解压到您选择的目录中。

3. 配置libz库:打开终端或命令提示符,进入libz库的解压目录,并运行以下命令以配置静态编译选项:
```bash
./configure --static
```
4. 编译libz库:运行以下命令以编译libz库:
```go
make
```
5. 安装libz库:运行以下命令以将libz库安装到您的系统中:
```
make install
```
6. 在您的应用程序中使用libz库:将编译生成的静态库文件(通常为`.a`文件)链接到您的应用程序中。

您可以使用相关的编译选项(如`-L`用于指定库的路径,`-l`用于指定库的名称)来确保正确链接。

例如,假设您的应用程序源代码文件名为`myapp.c`,可以使用以下命令编译并链接libz库:
```css
gcc myapp.c -o myapp -L/path/to/libz -lz -static
```
上述命令中的`/path/to/libz`应替换为您实际安装libz库的路径。

7. 运行您的应用程序:运行生成的可执行文件(如上述命令中的`myapp`),您的应用程序将使用静态编译的libz库进行加载和运行。

请注意,具体的步骤可能因操作系统、编译器和环境而有所不同。

上述步骤提供了一般的指导,您可能需要根据您的具体情况进行调整。

基于Bluez的应用程序的开发

基于Bluez的应用程序的开发

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使用流程分析

蓝牙驱动及Bluez使用流程分析

Tech蓝牙驱动分析 及Bluez使用流程分析GuideRevision HistoryDate <01/11/2010> Issue <0.5> First draft Description Author Wylhistory目录1. 2. 3. ABSTRACT .................................................................................................................................................. 4 INTRODUCTION ........................................................................................................................................ 4 蓝牙驱动介绍 ............................................................................................................................................... 4 3.1 串口驱动介绍 ........................................................................................................................................ 5 32 初始化.................................................................................................................................................... 5 . 3.2.1 模块上电 ........................................................................................................................................ 5 3.2.2 PSKEY的设置 ................................................................................................................................. 6 3.3 HCIATTACH的工作原理 .......................................................................................................................... 7 3.3.1 Hci_uar和bcsp层的加入 ................................................................................................................. 9 3.3.2 hci层的加入.................................................................................................................................. 10 3.3.3 hci_attach的内核处理 .................................................................................................................. 11 4. 数据在驱动的传递流程.............................................................................................................................. 13 4.1 4.2 4.3 4.4 4.5 5. UART层的数据接收.............................................................................................................................. 13 HCI_UART的数据接收 .......................................................................................................................... 14 BCSP层的处理 ...................................................................................................................................... 15 HCI层及以上的处理............................................................................................................................. 15 数据流程的总结 .................................................................................................................................. 17扫描过程的分析 ......................................................................................................................................... 18 5.1 用户使用例子 ...................................................................................................................................... 18 5.2 用HCITOOL扫描时的逻辑 ..................................................................................................................... 18 5.2.1 上层逻辑 ...................................................................................................................................... 18 5.2.2 内核层逻辑 .................................................................................................................................. 19 5.3 通过DBUS触发的逻辑 .......................................................................................................................... 21 5.3.1 上层逻辑之adapter dbus方法的建立 ........................................................................................... 21 5.3.2 上层扫描方法的调用 ................................................................................................................... 22 5.3.3 Dbus触发的扫描对应于内核层的处理 ........................................................................................ 25 5.3.4 上层的扫描数据收集 ................................................................................................................... 26 5.3.5 Hci_send_frame的讨论 ................................................................................................................. 286.A2DP的使用过程........................................................................................................................................ 28 6.1 如何使用.............................................................................................................................................. 28 6.2 服务的激活 .......................................................................................................................................... 29 6.3 设备的创建 .......................................................................................................................................... 30 6.3.1 ............................................................................................................................................................. 33 6.3.2 ............................................................................................................................................................. 33 6.3.3 ............................................................................................................................................................. 33 6.3.4 ............................................................................................................................................................. 33 6.4 设备的连接 .......................................................................................................................................... 33 ©Tech, 2010-1-11 Page 2 of 466.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 7.L2cap的连接................................................................................................................................. 34 AVDTP_DISCOVER的发送逻辑................................................................................................... 35 AVDTP_GET_CAPABILITIES命令的发送.................................................................................... 36 AVDTP_SET_CONFIGURATION的逻辑 ...................................................................................... 37 AVDTP_OPEN函数逻辑 ............................................................................................................... 38 AVDTP_START的逻辑 .................................................................................................................. 40HANDSFREE的使用过程 .......................................................................................................................... 42 7.1 7.2 7.3 7.4 使用流程.............................................................................................................................................. 42 HEADSET的连接.................................................................................................................................... 42 SCO的打开 ........................................................................................................................................... 45 数据的流动 .......................................................................................................................................... 468. 9.总结 ............................................................................................................................................................. 46 未讨论 ......................................................................................................................................................... 46©Tech, 2010-1-11Page 3 of 461. 2.Abstract介绍一下bluez的驱动架构以及上层的使用流程.Introduction主要分成几个部分: Bluez驱动整体框架, 数据在驱动的传递流程, A2dp的上层逻辑, Handsfree的上层逻辑 主要软硬件配置如下: 内核:2.6.21 硬件:pxa310 蓝牙芯片:CSR BC4 BlueZ:3.223.蓝牙驱动介绍从整体上来说,我们的蓝牙是一个模块,它需要和CPU通讯以交换信息,所以它需要一个接口,在 我们的平台上它用的UART口, 当然还有USB接口的, 我没做过, 所以不讨论; 另外一方面蓝牙还要和modem 这边传递数据,比如传递语音,这也要一个接口才行,因为我们的蓝牙芯片只提供了PCM接口,所以或者 是modem的输出就是数字接口,或者就需要把modem输出的数字接口经过一定的转化,比如引入一个中间 的codec把模拟接口转化成数字接口,再接到我们的蓝牙芯片,我们的板子就是后一种实现方案;而蓝牙 驱动要做哪些事呢?在我刚接手的时候,也是一头雾水,蓝牙驱动这说法,太抽象了,因为我们用的是蓝 牙模块,并非是独立的芯片,它所该有的功能都有了;从协议层的角度来说radio层,BB层,LC,LM层, HCI层都不需要我们去管, 都应该是已经被实现在蓝牙模块里面了,需要我们关注的本质就是cpu和蓝牙模 块之间的接口, 以及在这个接口上传递的数据格式, 也就是说数据包的格式, 数据包的处理, 而后者在linux 驱动层里面是已经有完整实现的,只需要在配置的时候选上: HCI UART driver BCSP protocol support 就可以了,不过有时候模块供应商会做一些修改,也可以用他们已经修改过的代码; 对于前者,也就是接口的问题,对我来说本质上就是串口的驱动,这个显然linux的代码里面早就已经实现 了的,也不需要我去操心,看看下面这个图就明白了:©Tech, 2010-1-11Page 4 of 46上面写明了internal ROM,也即是说是蓝牙模块内部的事情了,那我也就不管了; 经过这一番分析之后,剩下的事情就是初始化蓝牙模块了,那肯定少不了的上电,然后是模块重启, 还缺点什么呢? 蓝牙驱动和别的驱动一样,也要设一些寄存器,差别在于,它的寄存器被称为PSKEY,也就是说有 一步是PSKEY设置,这步是通过bccmd来完成的; 好像完了,但是还差一步,这步估计不好想到,仔细想想,假设现在蓝牙模块以及就绪了,数据从 蓝牙模块通过串口传递到了主板,但是这些数据是如何传递到蓝牙的协议层的呢?有点奇怪啊?这步是通 过hciattach来完成的; 总结一下,蓝牙驱动的三个步骤: 1, 串口驱动必须要先就绪,这是cpu和蓝牙模块之间的桥梁,没有这步,后面的都无法进行,包括 PSKEY的设置,数据的传递都是通过串口的,所以这步是根本; 2, 初始化,包括模块上电,PSKEY的设置; 3, 通过hciattach建立串口和蓝牙协议层之间的数据连接通道; 下面分别介绍! 3.1串口驱动介绍串口驱动本身很复杂,请参阅附录里面的文档“串口驱动分析”,这里可以简单介绍一下: 从上到下就是: TTY层 Uart层 Uart对应的Port层 对蓝牙来说, 数据先从串口驱动上来通过ldisc进入到蓝牙的hci_uart层, 然后交给更上面的协议层了; 这个过程后面会详细介绍;32 .初始化模块上电在我们的平台上是通过一个GPIO来控制的,在函数lin2008_poweron_wifibt_board里面会进 ©Tech, 2010-1-11 Page 5 of 463.2.1行上电的操作以及对应的reset动作,当然这步得需要看spec,通常是先高再低再高; 函数如下: static int wifibt_power_status; int lin2008_poweron_wifibt_board(void) { if (!wifibt_power_status) { pxa3xx_mfp_set_configs(lin2008_wifibt_pins, ARRAY_SIZE(lin2008_wifibt_pins)); pxa3xx_gpio_set_direction(MFP_WIFI_V18_ENABLE, GPIO_DIR_OUT); pxa3xx_gpio_set_direction(MFP_WLAN_RESETN, GPIO_DIR_OUT); pxa3xx_gpio_set_level(MFP_WIFI_V18_ENABLE, 1); pxa3xx_gpio_set_level(BT_RESET_GPIO, 1); pxa3xx_gpio_set_level(MFP_WLAN_RESETN, 1); mdelay(1); pxa3xx_gpio_set_level(BT_RESET_GPIO, 0); pxa3xx_gpio_set_level(MFP_WLAN_RESETN, 0); // bt need > 5 ms to reset mdelay(5); pxa3xx_gpio_set_level(BT_RESET_GPIO, 1); pxa3xx_gpio_set_level(MFP_WLAN_RESETN, 1); wifibt_power_status++; return 0; } wifibt_power_status++; return 1; } 因为用的是wifi和蓝牙合体的模块,所以里面也包含了对wifi的初始化; 3.2.2 PSKEY的设置 它的原理就是通过串口(前面已经建立起来的)发送命令给蓝牙模块,对于串口必须要知道的是要 能通讯,必须得设好波特率,另外一方面蓝牙模块的晶振频率也必须要设,否则它不知道该怎么跳 了;当然不同的芯片可能初始化的过程也不一样,也许还要下载firmware等等;在我们的平台上这步 是通过bccmd来完成的,比如下面这些设置: // PSKEY_ANA_FREQ &01fe = 9C40 // PSKEY_UART_BAUD_RATE &01be = 0EBF关于pskey的设置,请看附录“pskeys.html”,里面有更加全面的介绍; 下面来看看bccmd的工作过程: 我们调用的命令为: bccmd -t bcsp -d /dev/ttyS1 psload -r csr.psr 它的流程如下:©Tech, 2010-1-11Page 6 of 46从这个图可以看出,它的原理就是打开/dev/ttyS1然后根据用户传入的命令调用不同的处理函数,比 如对于psload就是读入配置文件并解析,再根据蓝牙芯片所识别的包类型(在这里是bcsp)拼凑发送 给底层的数据包,最后通过ubcsp_poll函数把数据发送出去; 经过这步的设置基本上蓝牙模块以及可以正常工作了; 但是还没有和上面的协议层建立纽带关系,也就是说从uart1收到的数据还没有传给hci层;3.3Hciattach的工作原理如何把uart1也就是蓝牙模块传上来的数据交给hci层,在驱动里面是通过一个叫做disc的机制完成 的,这个机制本意是用来做过滤或者限制收上来的字符的,但是在蓝牙驱动里面则直接把数据传给了蓝牙 协议层,再也不回到串口的控制了; 调用的命令为: hciattach -s 921600 /dev/ttyS1 bcsp 921600 下面看看这句话到底是什么意思? 先看上层的使用逻辑:©Tech, 2010-1-11Page 7 of 46最最关键的就是这两个ioctl了,那就是参数为TIOCSETD和HCIUARTSETPROTO的ioctl,下面需要看看内核 里面对于这两个ioctl的处理逻辑, 不过看这个逻辑之前需要先理一下驱动的逻辑架构, 否则你就会晕头转向, 请看下图:©Tech, 2010-1-11Page 8 of 46这是数据的流动过程,最底层的也就是和硬件打交道的是uart层了,它的存在和起作用是通过串口 驱动来保证的,这个请参阅附录,但是其它的层我们都不知道什么时候work的,下面来看看: 3.3.1 Hci_uar和bcsp层的加入 如图所示:©Tech, 2010-1-11Page 9 of 46Hci_uart层做的事情其实很简单。

[BlueZ]2、使用bluetoothctl搜索、连接、配对、读写、使能notify蓝牙。。。

[BlueZ]2、使用bluetoothctl搜索、连接、配对、读写、使能notify蓝牙。。。

[BlueZ]2、使⽤bluetoothctl搜索、连接、配对、读写、使能notify蓝⽛。

星期三, 05. 九⽉ 2018 02:03上午 - beautifulzzzz⽬录1、前⾔上⼀篇讲了如何编译安装BlueZ-5,本篇主要在于玩BlueZ,⽤命令⾏去操作BLE设备:2、gatttool —— ⽼⼯具趟坑刚开始跟着操作gatttool,发现坑太多(主要原因是⼯具⽼了):采⽤sudo gatttool -b 4D:69:98:0E:91:5E -I 去连接发现会报错:Error: connect error: Connection refused (111)最终参考LINK-11发现需要加random选项():➜ ~ sudo gatttool -b 4D:69:98:0E:91:5E -I[4D:69:98:0E:91:5E][LE]> connectAttempting to connect to 4D:69:98:0E:91:5EError: connect error: Connection refused (111)[4D:69:98:0E:91:5E][LE]> exit➜ ~ sudo gatttool -t random -b 4D:69:98:0E:91:5E -I[4D:69:98:0E:91:5E][LE]> connectAttempting to connect to 4D:69:98:0E:91:5EConnection successful[4D:69:98:0E:91:5E][LE]>(gatttool:3104): GLib-WARNING **: Invalid file descriptor.过⼀回会10S⾃动断开,⽹上说这个⼯具⽼了,不建议⽤了():There are new tools to use with GATT, bluetoothctl/bluetoothd is the preferred since with that you have GAP, etc, but if want to use a stand alone tool then I suggest you use btgatt-client.3、bluetoothctl——NB的新⼯具命令⾏进⼊bluetoothctl操作环境():bluetoothctl我在⼿机上⽤lightblue模拟⼀个BLE设备ty_prod,之后对其service进⾏修改,调⽤scan on进⾏搜索还是⽼的,最终发现要先⽤remove移除之前的设备,之后再scan就会出现[NEW] Device 72:3B:E1:81:4E:4F ty_prod设备注:⽤lightblue模拟的设备的MAC不是固定的注:我发现在lightblue中⽆论怎么模拟BLE设备,⼀旦被连上搜索到的service都是IPone的[bluetooth]# devicesDevice 28:ED:6A:A0:26:B7 ty_prodDevice 58:71:33:00:00:24 Bluetooth KeyboardDevice 00:1A:7D:DA:71:0A SHEN-PCDevice 94:87:E0:B3:AC:6F Mi Phone[bluetooth]# remove 28:ED:6A:A0:26:B7...[bluetooth]# scan onDiscovery started[NEW] Device 72:3B:E1:81:4E:4F ty_prod[bluetooth]# scan off...Discovery stopped[bluetooth]# connect 72:3B:E1:81:4E:4FAttempting to connect to 72:3B:E1:81:4E:4F[CHG] Device 72:3B:E1:81:4E:4F Connected: yesConnection successful[ty_prod]索性就⽤IPhone⾃带的服务做测试了~[ty_prod]# infoDevice 28:ED:6A:A0:26:B7 (public)Name: tuya_mdev_testAlias: tuya_mdev_testAppearance: 0x0040Icon: phonePaired: yesTrusted: noBlocked: noConnected: yesLegacyPairing: noUUID: Fax (00001111-0000-1000-8000-00805f9b34fb)UUID: Generic Access Profile (00001800-0000-1000-8000-00805f9b34fb)UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)UUID: Current Time Service (00001805-0000-1000-8000-00805f9b34fb)UUID: Device Information (0000180a-0000-1000-8000-00805f9b34fb)UUID: Battery Service (0000180f-0000-1000-8000-00805f9b34fb)UUID: Vendor specific (7905f431-b5ce-4e99-a40f-4b1e122d00d0)UUID: Vendor specific (89d3502b-0f36-433a-8ef4-c502ad55f8dc)UUID: Vendor specific (9fa480e0-4967-4542-9390-d343dc5d04ae)UUID: Vendor specific (d0611e78-bbb4-4591-a5f8-487910ae4366)[CHG] Device 28:ED:6A:A0:26:B7 ServicesResolved: no[CHG] Device 28:ED:6A:A0:26:B7 Connected: no我们⽤Current Time Service,列出所有attributes操作如下:[tuya_mdev_test]# menu gatt[tuya_mdev_test]# list-attributes 28:ED:6A:A0:26:B7...Primary Service/org/bluez/hci0/dev_47_B1_26_C1_81_18/service004100001805-0000-1000-8000-00805f9b34fbCurrent Time ServiceCharacteristic/org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char004500002a0f-0000-1000-8000-00805f9b34fbLocal Time InformationCharacteristic/org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char004200002a2b-0000-1000-8000-00805f9b34fbCurrent TimeDescriptor/org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042/desc004400002902-0000-1000-8000-00805f9b34fbClient Characteristic Configuration...上⾯Current Time Service对应的服务如下图:我们选择Current Time进⾏操作UUID:0x2A2B[ty_prod]# select-attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042[tuya_mdev_test:/service0041/char0042]# readAttempting to read /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042[CHG] Attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042 Value:e2 07 09 05 01 24 11 03 f1 02 .....$....e2 07 09 05 01 24 11 03 f1 02 .....$....[tuya_mdev_test:/service0041/char0042]# attribute-infoCharacteristic - Current TimeUUID: 00002a2b-0000-1000-8000-00805f9b34fbService: /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041Value:e2 07 09 05 01 2e 01 03 f5 02 ..........Notifying: yesFlags: readFlags: notify读出结果⼤致意思应该是:2018-9/5-1:36:17 周三读取⼀下0x180A的Device Information:[tuya_mdev_test:/service0006/char0007]# select-attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047/char004a [tuya_mdev_test:/service0047/char004a]# attribute-infoCharacteristic - Model Number StringUUID: 00002a24-0000-1000-8000-00805f9b34fbService: /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047Flags: read[tuya_mdev_test:/service0047/char004a]# readAttempting to read /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047/char004a[CHG] Attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047/char004a Value:69 50 68 6f 6e 65 36 2c 32 iPhone6,269 50 68 6f 6e 65 36 2c 32 iPhone6,2当然写、使能notify也很简单,看help即可。

libz 静态编译

libz 静态编译

libz 静态编译【实用版】目录1.编译器简介2.静态编译的定义与特点3.libz 库的作用4.libz 静态编译的步骤5.静态编译的优缺点正文1.编译器简介编译器是一种将源代码转换为可执行文件的程序。

在 Linux 系统中,常用的编译器有 gcc、g++等。

编译器在将源代码转换为可执行文件时,需要调用各种库函数以完成特定的功能。

库函数可以分为动态链接库和静态链接库两种。

2.静态编译的定义与特点静态编译是指在编译时将库函数直接链接到可执行文件中,而不是在运行时动态调用。

这种方式使得可执行文件在运行时不依赖于外部库文件。

静态编译的优点在于可执行文件独立,无需额外的库文件支持;缺点在于可执行文件体积较大,不利于代码的维护和升级。

3.libz 库的作用libz 库是 Linux 系统中的一个压缩库,提供了各种压缩和解压缩算法的实现,如 gzip、bzip2 等。

它广泛应用于数据备份、网络传输等场景,为用户提供了方便的数据压缩和解压缩功能。

4.libz 静态编译的步骤静态编译 libz 库的步骤如下:(1)获取 libz 源代码:通过 git 等工具从 libz 官方仓库下载源代码。

(2)配置编译环境:根据系统类型和编译器选择合适的编译选项。

例如,对于 gcc 编译器,可以使用`-static`选项指定静态编译。

(3)编译 libz 库:使用编译器编译 libz 源代码,生成静态库文件。

例如,使用`gcc -static -o libz.a zlib.c`命令编译 libz 库。

(4)链接可执行文件:在编译可执行文件时,将静态库文件链接到可执行文件中。

例如,使用`gcc -o my_program my_program.c -llibz`命令编译包含 libz 库的程序。

5.静态编译的优缺点静态编译的优点在于可执行文件独立,无需额外的库文件支持,便于携带和部署。

缺点在于可执行文件体积较大,不利于代码的维护和升级。

Arduino编译总结

Arduino编译总结

Arduino编译总结⾸先导⼊到单⽚机的是⼆进制⽂件,之所以要编译为HEX⽂件,是因为hex⽂件带校验,在传输制、存储过程中有错误的话,容易提前发现,⽽⼆进制⽂件就不能,假如在存储中由于某⼀位或⼏位数受损,那么下载时照样按受损的⽂件导⼊到单⽚机。

⼆进制:bin ⼋进制:oct ⼗进制:dec ⼗六进制:hexArduino构建过程总述为了⽣成可在Arduino板⼦上运⾏的程序,需要经过以下⼏个步骤:1. Arduino IDE对代码进⾏转换,确保⽣成正确的C/C++代码(两种常⽤的编程语⾔)。

2. 通过编译器(avr-gcc)将上⼀步⽣成的可读代码,编译成机器能识别的指令(或称之为⽬标⽂件)。

3. 通过链接器,将上⼀步产⽣的⽬标⽂件与标准Arduino库⽂件(提供基础函数,如digitalWrite()或Serial.print())共同链接,⽣成⼀个Intel Hex⽂件,该⽂件中的指定内容将写⼊到Arduino板上的可编程内存中。

4. 将上⼀步产⽣的HEX⽂件上传⾄Arduino板:可以使⽤USB或串⼝,通过板上已有的bootloader传输到Arduino板,也可以通过其它编程器直接烧写。

多⽂件程序⼀个Arduino程序可以包含多个⽂件(IDE中的多个标签页,⼀个标签页代表⼀个⽂件)。

单击IDE顶部滚动条的右向箭头即可管理各⽂件。

⽂件标签页的扩展名有4种类型:⽆扩展名、.c、.cpp或.h(若是其它扩展名,将被转换为下划线)。

程序编译完后,所有⽆扩展名的⽂件标签页将被合并在⼀起,⽣成“主程序⽂件”。

.c或.cpp扩展名的⽂件将被单独编译。

为了打开.h标签页,必须#include该⽂件(使⽤双引号""⽽⾮尖括号< >)。

主程序⽂件的处理在传给avr-gcc编译器之前,Arduino IDE将对主程序⽂件(IDE中所有⽆扩展名的标签页合并结果)进⾏转换操作:1. 在主程序⽂件的头部,加⼊#include "WProgram.h"(0023版本)或#include "Arduino.h"(1.0版本)。

libz 静态编译

libz 静态编译

libz 静态编译
摘要:
1.静态编译简介
2.libz静态编译的优缺点
3.libz静态编译的具体步骤
4.遇到的问题及解决方案
5.总结
正文:
libz静态编译是一种将库文件编译到可执行文件中的方式,这样可以减少程序运行时的库文件查找和加载时间,提高程序的运行效率。

本文将详细介绍libz静态编译的相关内容。

libz静态编译的优缺点:
优点:减少了库文件查找和加载的时间,提高了程序的运行效率。

缺点:可执行文件会变得更大,因为库文件被包含在了可执行文件中。

libz静态编译的具体步骤:
1.安装libz库文件
2.配置编译器
3.编译libz库文件
4.将libz库文件链接到可执行文件
在实际操作过程中,可能会遇到一些问题。

例如,在编译libz库文件时可能会遇到“无法打开文件”的错误,这可能是因为文件路径设置不正确。

解决
这个问题的方法是检查文件路径设置,确保编译器可以找到libz库文件。

总的来说,libz静态编译是一种提高程序运行效率的方法,但同时也需要注意一些可能出现的问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译前的目录位置说明
• • • • 1、指定安装位置 /home/hdl/autobuild/hdl/Bluetooth/lib 2、Linux-2.6.28内核之include /home/hdl/autobuild/hdl/test/kernel/Linux2.6.28/include
编译过程与方法
• 解决办法: • bluez-4.48\network\Makefile中去掉`-fvisibility=hidden'
编译过程遇到问题及解决办法
• • • • • • • • • • • • • • • 编译bluez-4.48 CC main.lo CC manager.lo CC server.lo CC bridge.lo CC connection.lo CC common.lo CCLD Making all in serial CC main.lo cc1: error: unrecognized option `-fvisibility=hidden' make[2]: *** [main.lo] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2 [hdl@vsserver1 bluez-4.48]$
编译前说明及注意事项
• 1、四种方案均可,所选库根据编译器及库 之间的兼容性而定,库版本并不唯一 • 2、所选各库版本尽量偏低,避免带来意想 不到的错误,导致无法编译通过 • 3、dbus库可依赖expat或libxml,默认是 expat,建议用expat • 4、glib库版本过高,可能会用到zlib库 • 5、bluez-4.x以上版本,编译时需要用到 linux内核中的/include/linux/sockios.h
• 1、编译安装expat-2.0.1.tar.gz • tar -zxvf expat-2.0.1.tar.gz • ./configure -prefix=/home/hdl/autobuild/hdl/Bluetooth/li b --host=arm-linux --target=arm-linux CC=arm-linux-gcc • make • make install
所用的库及下载网站
• • • • • • • • expat-2.0.1.tar.gz /expat dbus-1.0.3.tar.gz /releases/dbus/ glib-2.22.0.tar.bz2 ftp:///pub/glib bluez-4.48.tar.gz /pub/linux/bluetooth/
蓝牙模块解决方案
• 大致需要完成如下: • 1、linux内核的配置,完成蓝牙设备驱动的配 置 • 2、编译bluez协议栈 • 3、编写用户进程通信程序
蓝牙设备间配对原理
• 两个蓝牙设备A和B,A先发送要求配对的 请求给B,B由用户设置好配对的密码即 PIN code,然后回一个消息给A,说你想配 对可以呀,知道我的密码吗?然后A就发送 PIN code过去,B看和自己的密码相符合, 就发送一个replyOK的消息给A,这样两者 就建立起来了信任关系
Bluez的编译过程与方法
2011-05-19 制作人:胡道磊
蓝牙模块解决方案
• linux下针对蓝牙设备的操作分两部分,分 别是驱动程序的部分和用户程序的部分, 而用户程序部分又可分为守护进程部分和 用户编程部分。 • 蓝牙设备基于通用蓝牙芯片,驱动程序在 内核里已经集成,即大多数蓝牙设备的驱 动程序会在内核源代码中找到,因此,不 需要针对蓝牙设备编写具体的驱动程序。
Bluez介绍
• Linux OS开放的bluetooth 协议栈主要包括IBM公司的 BlueDrekar, Nokia公司的Affix, Axis公司的OpenBT和官方 的协议栈BlueZ. Bluetooth协议栈BlueZ分为两部分:内核代码和用户态程 序及工具集。 其中内核代码由BlueZ核心协议和驱动程序组成; Bluetooth协议实现在内核源代码 /net/bluetooth中。包括 hci,l2cap,hid,rfcomm,sco,SDP,BNEP等协议的实现。驱 动程序放在 /driver/bluetooth中,包含Linux kernel对各种接 口的Bluetooth device的驱动。例如:USB接口,串口等。 用户态程序及工具集包括应用程序接口和BlueZ工具集。 BlueZ提供函数库以及应用程序接口,便于程序员开发 bluetooth应用程序。BlueZ utils是主要工具集,实现对 bluetooth设备的初始化和控制。
库之间的依赖关系
• • • • • dbus依赖 expat bluez依赖 glib、dbus 说明: 1、如果glib库的版本比较高,可能还需要zlib 2、这里bluez-4.48,相当于以前低版本的 bluez-lib、bluez-utils • 3、dbus依赖expat或者libxml,这里用expat
编译方案选择与说明
• • • • • • 二、 bluez-lib+bluez-utils+libxml方案 bluez-lib-3.36.tar.gz libxml2-2.7.4.tar.gz dbus-1.0.2.tar.gz glib-2.16.5.tar.bz2 bluez-utils-3.36.tar.gz
编译过程与方法
• • • • • • • • 3、编译安装glib-2.22.0.tar.gz tar –zxvf glib-2.22.0.tar.gz echo ac_cv_type_long_long=yes>arm-linux.cache echo glib_cv_stack_grows=no>>arm-linux.cache echo glib_cv_uscore=no>>arm-linux.cache echo c_cv_func_posix_getpwuid_r=yes>>arm-linux.cache echo ac_cv_func_posix_getgrgid_r=yes>>arm-linux.cache ./configure --prefix=/home/hdl/autobuild/hdl/Bluetooth/lib --host=armlinux --target=arm-linux CC="arm-linux-gcc I/home/hdl/autobuild/hdl/Bluetooth/lib/include L/home/hdl/autobuild/hdl/Bluetooth/lib/lib" --cache-file=armlinux.cache • make • make install
编译过程与方法
• 4、编译安装bluez-4.48.tar.gz • export PKG_CONFIG_LIBDIR=/home/hdl/autobuild/hdl/Bluetoot h/lib/lib/pkgconfig • tar –zxvf bluez-4.48.tar.gz • ./configure --prefix=/home/hdl/autobuild/hdl/Bluetooth/lib --host=arm-linux --target=arm-linux CC=arm-linux-gcc CC="arm-linux-gcc I/home/hdl/autobuild/hdl/Bluetooth/lib/include I/home/hdl/autobuild/hdl/test/kernel/linux-2.6.28/include L/home/hdl/autobuild/hdl/Bluetooth/lib/lib" --disable-audio --enable-test • make • make install
Bluez介绍
• bluez新的版本不像旧的那样有什么bluezutil、bluez-lib什么的,就一个bluez4.48。
编译方案选择与说明
• • • • • • 一、 bluez-lib+bluez-utils+expat方案 bluez-lib-3.36.tar.gz expat-2.0.1.tar.gz dbus-1.2.16.tar.gz glib-2.22.4.tar.bz2 bluez-utils-3.36.tar.gz
编译过程与方法
• 2、编译安装dbus-1.0.3.tar.gz • tar –zxvf dbus-1.0.3.tar.gz • echo ac_cv_have_abstract_sockets=yes>armlinux.cache • ./configure --prefix=/home/hdl/autobuild/hdl/Bluetooth/lib --host=arm-linux --target=arm-linux CC="arm-linux-gcc I/home/hdl/autobuild/hdl/Bluetooth/lib/include L/home/hdl/autobuild/hdl/Bluetooth/lib/lib" --cachefile=arm-linux.cache --with-x=no --with-xml=expat • make • make install
Hale Waihona Puke 编译过程遇到问题及解决办法
• 编译bluez-4.48 • 提示找不到Dbus库,说明指明pkgconfig • export PKG_CONFIG_LIBDIR=/home/hdl/autobui ld/hdl/Bluetooth/lib/lib/pkgconfig
编译过程遇到问题及解决办法
• • • • • • • • • 编译bluez-4.48 CCLD test_textfile Making all in plugins CC echo.lo cc1: error: unrecognized option `-fvisibility=hidden' make[2]: *** [echo.lo] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2 [hdl@vsserver1 bluez-4.48]$
相关文档
最新文档