最近为了搞这个蓝牙的事情,忙碌了好几天,我就是想结合 bluez 的代码随便玩一下蓝牙设备,而且能够参考源码写点测试程序来操作这个蓝牙设备。这里只是说明 Linux 下的准备工作而非嵌入式的arm。
1,系统支持
我用的是真机安装的 Debian11系统,Ubuntu 没用过,不知道是否支持。我之前的系统是Centos 7的,但我买了蓝牙适配器后,在那上面无法使用,转而安装了debian系统。系统如果能完全正常安装的话,比较安装了 GNOME 桌面系统,它的“设置” 里面就有 “蓝牙” 这一项。如果桌面系统里没有蓝牙界面可以操作,也可以用 sudo apt -y install bluetooth 进行安装,这样安装后会有很多蓝牙的命令行工具可以使用。例如我的系统里已经安装了 bluetooth,使用 hciconfig 可以查看当前蓝牙设备的信息:
能正常输出蓝牙设备的信息,那接下来你就可以自己写测试代码了。
2,蓝牙适配器
我是在某宝上搜索的,直接跟卖家确认支持哪些系统。我买的那家适配器说是支持的debian,但不支持centos,所以我才重新安装debian的。
3,bluez 源码
这个之前的文章有介绍过,可以参考一下。蓝牙开发要看你想基于哪种方式来开发了,有基于 hci接口的,有基于 dbus 的,只要能用就行。
4,测试例子
下面这个例子调用了 hci 的接口:hci_get_route() 获取蓝牙设备的设备号, hci_devinfo() 根据设备号获取对应的设备信息。lib/hci_lib.h 头文件里提供了很这样的接口,而接口的实现就在libbluez库里。所以需要链接库-lBluez(根据第3步源码编译出来的库),-lglib-2.0 -lgthread-2.0 这两个库也是源码编译出来的。
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include "lib/bluetooth.h"
#include "lib/hci.h"
#include "lib/hci_lib.h"
static void print_dev_hdr(struct hci_dev_info *di);
int main(int argc, char *argv[])
{
int devId = hci_get_route(NULL);
if(devId < 0)
{
printf("get bluetooth device id fail\n");
return -1;
}
printf("get bluetooth device id = %d\n", devId);
struct hci_dev_info devInfo;
if(hci_devinfo(devId, &devInfo) == 0)
{
printf("get device info success\n");
print_dev_hdr(&devInfo);
}
return 0;
}
static void print_dev_hdr(struct hci_dev_info *di)
{
static int hdr = -1;
char addr[18];
if (hdr == di->dev_id)
return;
hdr = di->dev_id;
ba2str(&di->bdaddr, addr);
printf("%s:\tType: %s Bus: %s\n", di->name,
hci_typetostr((di->type & 0x30) >> 4),
hci_bustostr(di->type & 0x0f));
printf("\tBD Address: %s ACL MTU: %d:%d SCO MTU: %d:%d\n",
addr, di->acl_mtu, di->acl_pkts,
di->sco_mtu, di->sco_pkts);
}
可以看到用这个例子输出的,和系统工具输出的蓝牙 mac 地址是一样的,说明例子正常使用了,接下来可以根据自己需要随意写代码了。