OrangePI蓝牙:搜索设备
上一篇文章讲述了我在OrangePi中开启蓝牙的过程,这一章来讲述我如何对蓝牙进行编程操作。
开发板中使用bluez
安装bluez 我的OrangePi的板子上是bluez5.43版本,为了开发bluez需要安装一些必要的头文件.
安装后,我们就可以在通过添加一些头文件去调用bluez的api做一些事情了.sudo apt-get install libbluetooth-dev
ls /usr/include/bluetooth/
bluetooth.h bnep.h cmtp.h hci.h hci_lib.h hidp.h l2cap.h rfcomm.h sco.h sdp.h sdp_lib.h配置编译 首先我使用外国老哥曾经写的文档中的代码做测试[1](这个文档非常nice),这个一个扫描周围蓝牙设备的小程序.
int main(int argc, char **argv)
{
inquiry_info *ii = NULL;
int max_rsp, num_rsp;
int dev_id, sock, len, flags;
int i;
char addr[19] = { 0 };
char name[248] = { 0 };
dev_id = hci_get_route(NULL);
sock = hci_open_dev( dev_id );
if (dev_id < 0 || sock < 0) {
perror("opening socket");
exit(1);
}
len = 8;
max_rsp = 255;
flags = IREQ_CACHE_FLUSH;
ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));
num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
if( num_rsp < 0 ) perror("hci_inquiry");
for (i = 0; i < num_rsp; i++) {
ba2str(&(ii+i)->bdaddr, addr);
memset(name, 0, sizeof(name));
if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name),
name, 0) < 0)
strcpy(name, "[unknown]");
printf("%s %s\n", addr, name);
}
free( ii );
close( sock );
return 0;
}使用:
## 交叉编译bluezroot@H5:~# vi test.c
root@H5:~# gcc -o simplescan test.c -lbluetooth
root@H5:~# ./simplescan
CC:29:F5:79:14:21 iPhone下载bluez
首先去官方网址下载bluez,这里我还是选择使用5.43版本.
解压配置 这里参考网络文章[2]. 将bluez5.43解压出来.并新建一个文件夹blue,用于存放安装的文件.
这里如果配置检查出现错误那么参考这个文章[3]. 这里有一个比较恶心的错误:mkdir blue
cd bluez-5.43
CC=/home/zqh/GccOrangPi/bin/aarch64-linux-gnu-gcc #指定交叉编译器
./configure --host=aarch64-linux-gnu --prefix=/home/zqh/Program/orangepi/blue --disable-obex --enable-library我安装了readline-dev还是会出现这个错误,这里就需要把这个头文件复制到交叉编译器的头文件目录下.configure: error: readline header files are required
sudo cp -r /usr/include/readline /home/zqh/GccOrangPi/aarch64-linux-gnu/libc/usr/include
编译安装 配置完成后开始编译以及安装
之后就可以把blue目录下的文件移植到开发板上. 将/bin下所有文件,放到开发板/usr/bin include所有文件,放到开发板/usr/include lib所有文件,放到开发板/usr/lib sbin所有文件,放到开发板/usr/sbin 当然bluez安装还是会把许多的文件安装在默认目录,比如/etc下,我先尝试看看会不会影响开发. ## 偷懒方法 其实orangepi可以自己apt-get到libbluetooth-dev,那么我们可以直接将板子上的动态链接库拉过来使用即可~(注意编译动态链接库的编译器版本不同可能会出现错误,那么还是要全部手动编译一波,再安装进去) 不过要是大家有什么更简单的方法,可以方便的交叉编译,可以告诉我~make
sudo make install
cd /home/zqh/Program/orangepi/blue
使用bluez
配置路径
我这里使用的是cmake配置工程:
# 设置工程名称
project (TEST)
# 设置可执行文件名称
set(MY_TARGET t1)
# 需要链接的动态链接库
set(EXTRA_LIBS libpthread.so libbluetooth.so)
# CMAKE最小版本
cmake_minimum_required (VERSION 2.6)
# 设置目标平台系统
set(CMAKE_SYSTEM_NAME Linux)
# 设置交叉编译库路径
set(CMAKE_FIND_ROOT_PATH /home/zqh/GccOrangPi/)
# set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)#只在交叉编译库路径中寻找
# set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# 设置交叉编译器
set(CMAKE_C_COMPILER /home/zqh/GccOrangPi/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /home/zqh/GccOrangPi/bin/aarch64-linux-gnu-g++)
set(CMAKE_C_EXTENSIONS "-lbluetooth -pipe -g -Wall -W -fPIE")
set(CMAKE_CXX_EXTENSIONS "-lbluetooth -pipe -g -Wall -W -fPIE")
#设置执行文件输出目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#设置库输出路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
message("++++++++++++++Start Build+++++++++++++++++")
# 添加头文件目录
include_directories(${PROJECT_SOURCE_DIR}/usr/inc)
include_directories("/home/zqh/Program/orangepi/blue/include")
# 添加源文件目录
aux_source_directory(${PROJECT_SOURCE_DIR}/usr/src USRSRC)
# 添加子目录 子目录里面放一些别的编译好的模块
#ADD_SUBDIRECTORY(src)
# 链接库搜索路径
link_directories("/home/zqh/GccOrangPi/" "/home/zqh/Program/orangepi/blue/lib")
# 添加动态库
link_libraries(${EXTRA_LIBS})
# 添加可执行文件(可执行文件名 [配置] 源文件)
add_executable(${MY_TARGET} ${USRSRC})
# 执行文件链接属性
TARGET_LINK_LIBRARIES(${MY_TARGET} ${EXTRA_LIBS})编译运行 这里使用之前的代码.很简单:
然后发送可执行文件到开发板上,运行:cd build
cmake ..
makeroot@H5:~# ./t1
CC:29:F5:79:14:21 iPhone
参考资料
[1].http://people.csail.mit.edu/albert/bluez-intro/c404.html [2].http://www.forwhat.cn/post-436.html [3].https://blog.csdn.net/twy76/article/details/23851587