使用ubuntu 16.04 64位
参考文章:https://blog.csdn.net/hzzhengyx/article/details/78598767
我的记录:
1)编译zlib:
版本:zlib-1.2.8.tar.xz
解压: tar -Jxvf zlib-1.2.8.tar.xz -C .
./configure --prefix=/home/book/Documents/bluez-location
修改Makefile:
CC=arm-hisiv300-linux-gcc
LDSHARED=arm-hisiv300-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=arm-hisiv300-linux-gcc -E
AR=arm-hisiv300-linux-ar
RANLIB=arm-hisiv300-linux-ranlib
make
make install
2)编译libffi
版本:libffi-3.0.13.tar.gz
解压:tar -xzvf libffi-3.0.13.tar.gz -C .
./configure --host=arm-hisiv300-linux --prefix=/home/book/Documents/bluez-location
make
make install
3)编译glib
版本:glib-2.40.0.tar.xz
解压:tar -Jxvf glib-2.40.0.tar.xz -C ../hisi_dependency_package
依赖 gettext:
sudo apt-get install gettext
依赖 glib-genmarshal:
sudo apt-get install libglib2.0-dev
需要交叉编译 gettext
版本:gettext-0.18.3.1.tar.gz
解压 tar -xzvf gettext-0.18.3.1.tar.gz -C ../hisi_dependency_package
./configure --host=arm-hisiv300-linux --prefix=/home/book/Documents/bluez-location/gettext-location 再加一层目录,一会儿好摘出来gettext的lib和include。
make
make install
gettext_lib对应的lib,include拷贝到/opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnueabi 下的lib,include里
回到glib的编译:
./configure --host=arm-hisiv300-linux --prefix=/home/book/Documents/bluez-location \
PKG_CONFIG_PATH=/home/book/Documents/bluez-location/lib/pkgconfig \
glib_cv_stack_grows=no glib_cv_uscore=yes ac_cv_func_posix_getpwuid_r=yes ac_cv_func_posix_getgrgid_r=yes
make
make install
4)编译 expat
版本:expat-2.1.0.tar.gz
解压:tar -xzvf expat-2.1.0.tar.gz -C ../hisi_dependency_package
./configure --host=arm-hisiv300-linux --prefix=/home/book/Documents/bluez-location
make
make install
5)编译d-bus
版本:dbus-1.10.8.tar.gz
解压:tar -xzvf dbus-1.10.8.tar.gz -C ../hisi_dependency_package
export CFLAGS=-I/home/book/Documents/bluez-location/include
export LDFLAGS='-L/home/book/Documents/bluez-location/lib -L/opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnueabi/lib/ -lintl'
./configure --host=arm-hisiv300-linux \
--with-system-socket=/var/run/system_bus_socket --with-system-pid-file=/var/run/dbus.pid \
--enable-abstract-sockets --prefix=/home/book/Documents/bluez-location
注意两个配置选项:
--with-system-socket 指明的d-bus的系统socket 文件的路径,我们配置为/var/run/system_bus_socket。
当d-bus启动后,就会在/var/run/ 目录下生成一个system_bus_socket文件, 因此/var/run/目录必须存在。
--with-system-pid-file同上。
make
make install
出错:
/home/book/Documents/bluez-location/lib/libglib-2.0.so: undefined reference to `libintl_dngettext'
/home/book/Documents/bluez-location/lib/libglib-2.0.so: undefined reference to `libintl_textdomain'
/home/book/Documents/bluez-location/lib/libglib-2.0.so: undefined reference to `libintl_dcgettext'
/home/book/Documents/bluez-location/lib/libgio-2.0.so: undefined reference to `libintl_bind_textdomain_codeset'
/home/book/Documents/bluez-location/lib/libglib-2.0.so: undefined reference to `libintl_bindtextdomain'
/home/book/Documents/bluez-location/lib/libglib-2.0.so: undefined reference to `libintl_dgettext'
/home/book/Documents/bluez-location/lib/libgio-2.0.so: undefined reference to `libintl_gettext'
/home/book/Documents/bluez-location/lib/libgio-2.0.so: undefined reference to `libintl_ngettext'
export LDFLAGS=-L/home/book/Documents/bluez-location/lib
改为
export LDFLAGS='-L/home/book/Documents/bluez-location/lib
-L/opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnueabi/lib/
-lintl'
因为在我的工具链路径里面,确实是有libintl的!
ls /opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnueabi/lib/*intl*
/opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnueabi/lib/libintl.a
/opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnueabi/lib/libintl.la
/opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnueabi/lib/libintl.so
/opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnueabi/lib/libintl.so.8
/opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnueabi/lib/libintl.so.8.1.2
/**/
6)编译ncurses
版本:ncurses-5.9.tar.gz
解压:tar -xzvf ncurses-5.9.tar.gz -C ../hisi_dependency_package
./configure --host=arm-hisiv300-linux --with-shared --prefix=/home/book/Documents/bluez-location CXX="arm-hisiv300-linux-g++"
make
make install
7) 编译 readline
版本:readline-6.3.tar.gz
解压:tar -xzvf readline-6.3.tar.gz -C ../hisi_dependency_package
./configure --host=arm-hisiv300-linux --prefix=/home/book/Documents/bluez-location bash_cv_wcwidth_broken=yes
make
make install
make install时第一次出错:
mv /home/book/Documents/bluez-location/lib/libreadline.a /home/book/Documents/bluez-location/lib/libreadline.old
mv: cannot stat '/home/book/Documents/bluez-location/lib/libreadline.a': No such file or directory
Makefile:238: recipe for target 'install-static' failed
make: [install-static] Error 1 (ignored)
/usr/bin/install -c -m 644 libreadline.a /home/book/Documents/bluez-location/lib/libreadline.a
test -n "arm-hisiv300-linux-ranlib" && arm-hisiv300-linux-ranlib /home/book/Documents/bluez-location/lib/libreadline.a
mv /home/book/Documents/bluez-location/lib/libhistory.a /home/book/Documents/bluez-location/lib/libhistory.old
mv: cannot stat '/home/book/Documents/bluez-location/lib/libhistory.a': No such file or directory
但是第二次make install就没事了,额。。。
8)编译 blueZ
版本:bluez-5.29
./configure --host=arm-hisiv300-linux --prefix=/home/book/Documents/bluez-location --localstatedir=/var/run \
PKG_CONFIG_PATH=/home/book/Documents/bluez-location/lib/pkgconfig \
--disable-systemd --disable-udev --disable-cups --disable-obex --enable-library
修改Makefile:在Makefile中 -lreadline的后面加上 -lncurses(共6处,我全加了)
make
make install
然后,加载固件,再然后:
2. 启动d-bus
1)当所有的编译完成后,配置文件的位置:
system.conf位于prefix/share/dbus-1/system.conf
bluetooth.conf位于prefix/etc/dbus-1/system.d/bluetooth.conf
注意,prefix是编译的时候配置的安装路径
2)修改配置文件
对于system.conf:
修改点1:
<user>messagebus</user> 修改为 <user>root</user>
修改点2:
<includedir>/home/zhengyx/work/extend/BlueZ/realTek_8723BS/BlueZ_build/hisi_lib_install/etc/dbus-1/system.d</includedir>
修改为 <includedir>/etc/bluetooth</includedir>
<includedir>这个选项指明"bluetooth.conf"!!!的路径
对于bluetooth.conf:
修改点1:
删除
<policy group="lp">
<allow send_destination="org.bluez"/>
</policy>
修改的地方,用"shenen"做了标记
3)执行dubs
dbus-daemon --config-file=/etc/bluetooth/system.conf
3.. 启动blueZ
bluetoothd -d -n
关于加载AP6212固件:
整体思想就是通过串口,使用HCI命令,把固件传给AP6212就可以了。
不同的目标ARM板需要自行讲引脚功能配置为UART工作模式。
我这边主要就是把两个流控引脚全部拉低了(因为硬件设计板子画错了)也是受晕哥帖子的启发。
CTS/RTS全部拉低后,再使用github上的一个代码,就可以加载固件到AP6212里面了。
github地址:
https://github.com/rafaello7/nanopi-bluetooth
回来把这个代码交叉编译成一个目标ARM板的程序,再随便在GitHub上找个固件,名字叫bcm43438a1.hcd(一开始以为是bcm43438a0.hcd)
目标ARM板上单后,执行:
./ap6212hciattach /dev/ttyAMA1 1000000
即可加载固件成功。
输出的日志:
bcm43xx_init
reset retry
Set Controller UART speed to 1000000 bit/s
Flash firmware /lib/firmware/brcm/bcm43438a1.hcd
Set BDADDR UART: any
Incorrect bdaddr
Set Controller UART speed to 1000000 bit/s
Device setup complete
执行
hciconfig hci0 up 打开蓝牙
hcitool scan 即可进行扫描
hcitool和hciconfig这些工具都是我移植的BlueZ
======================上边是成功的部分,下边是还没成功的部分==========================
我现在面临的问题:
移植的蓝牙工具bluetoothd 运行之后卡死。。。
移植的蓝牙工具bluetoothctl运行之后命令行被冻结。。。
之后,使用移植的各种工具一通乱怼,如:
绑定 rfcomm bind /dev/rfcomm0 50:9E:A7:5A:1E:9D 12
链接
hcitool cc 50:9E:A7:5A:1E:9D
hcitool auth 50:9E:A7:5A:1E:9D(返回not connect。。。尴尬)
后来,想用BlueZ提供的API进行编程,
这里推荐一个BlueZ的API的帖子:实战bluetooth编程:http://blog.sina.com.cn/s/articlelist_1613727600_2_1.html
和一个老外写的文档,很好。书名叫:Bluetooth for programmers 后简称BTBook.pdf 地址:http://people.csail.mit.edu/rudolph/Teaching/Articles/BTBook.pdf
但是,仍然,找到的API代码只能带我走到扫描这一步。
我的疑问:
1. 我这里不太理解,BTbook里面解释的rfcomm的两段代码,一个是server一个是client。
我这边AP6212所在的ARM开发板运行一个client代码,然后需要一台其他设备运行server代码吗?
2. 我看其他帖子说如果想要配对、连接、传数据,需要一个agent,但我不知道blueZ的agent在哪里弄。
救命啊!!!
。
最近编辑记录 WM_CH (2018-09-27 09:34:18)
离线
离线
感谢分享!
晕哥帮我解答一下吧:)
离线
bluez 使用非常繁琐, 连 android 都放弃治疗了,改用 bluedroid.
建议使用 btstack, 不过这个协议栈商业使用需要付费,如果只是国内买卖你懂的。
btstack 更容易使用,而且在应用层驱动,非常方便。
blueZ真的没救吗,搞了好久blueZ的。。。
真的只能转投btstack了吗,晕哥
离线
我只是玩过 blueZ 而已, 没有出过产品,反正就是各种难用,以后公司的产品我也打算用 btstack。
电脑ubuntu上的蓝牙(也是blueZ)用到想死.
好吧
离线
离线
已经出了几款产品,bluez用在cortex a5上,蓝牙SOC是wg7813(bluetooth和wifi的复合模块,芯片是TI的wl18xx)
总体是参考这个wiki来的
http://wiki.beyondlogic.org/index.php?title=Cross_Compiling_BlueZ_Bluetooth_tools_for_ARM
离线
这个楼主解决了吗?我也遇到了这个问题,能说下怎么解决的嘛?
离线
楼主的问题最后解决了吗?
离线
正基的模块,为什么不用BSA 协议栈。BSA协议栈简单
离线
bluez交叉编译比较复杂,但是胜在代码开源
离线