《题外话》:刚开始第一次接触bluez,完全没用过,也没搞过,开局一脸懵逼。刚好项目需要用到,只能硬着头皮上,淦淦淦,干他丫的,先上来一顿百度。。。本人耗时两个星期搞完bluez的通信,实现蓝牙广播自定义服务,并和小程序通信,进行wifi配网和传输数据。好了,开始发车,坐好了,车速有点快,但是不是开去幼儿园的车,淡定。。。
1.硬件电路
说明:这里说一下硬件方面的问题,本人使用了wifi和蓝牙一体模块,而且通信方式都是使用SDIO通信,其实换其他芯片也一样的,无非就是sdio或者uart通信。问题不大,不影响你的发挥。
2.软件准备
2.1.源码配置
1)首先我们要有buildroot,我这里用了buildroot-2021.05.3,请对应自己的buildroot进行修改。
2)配置一下配置文件:defconfig xxx_xxx_spinor (这玩意就是你的配置文件)
defconfig xxx_defconfig (不同的芯片可能这里操作不太一样,也可能是make xxx_defconfig)
3)打开menuconfig配置文件。配置一下工具链和选择bluez相关的内容。
3.1)工具链配置请参考:链接: link https://blog.csdn.net/qq_39721016/article/details/123876398?spm=1001.2014.3001.5501
3.2)配置bluez
Target packages —>
Networking applications —>
4)内核配置
开启蓝牙相关配置,主要为hci_uart驱动和其他的配置
2.2 编译源码
make
1)编译好buildroot之后,我们会在 outpur/build/ 看到bluez5_utils-5.58这个文件夹,里面有我们需要用到的一些工具,比如:bluetoothd 、bluetoothctl、btmon等工具,后续调试bluez需要用到这些工具。
2)调试工具说明
bluetoothd bluetoothd进程,用于和蓝牙通信
bluetoothctl bluetoothctl相当于wpa_cli,通过命令的方式进行蓝牙的操作
btmon 该工具用于监控蓝牙数据
3.调试过程
3.1.加载驱动
1)首先需要加载wifi驱动,并起waln0
//------------------ssv6158模块-----------------
insmod ssv6x5x.ko
//以下可不启动
ifconfig wlan0 up
wpa_supplicant -B -i wlan0 -c /mnt/system/ssv6158/wpa_supplicant.conf
udhcpc -i wlan0
//----------------------------------------------
//-----------------rtl8723ds模块----------------
insmod 8723ds.ko
//以下可不启动
ifconfig wlan0 up
wpa_supplicant -B -i wlan0 -c /mnt/system/ssv6158/wpa_supplicant.conf
udhcpc -i wlan0
//----------------------------------------------
3.2.加载hci_uart驱动
1)这里分为两种情况,编译到内核的驱动方式和编译成模块的方式
2)这里只说编译成模块的方式
//------------------ssv6158模块-----------------
//启动dbus相关服务
/etc/init.d/dbus start (如果以启动可忽略)
insmod hci_uart.ko (加载hci_uart驱动)
//注意,这里有些芯片需要控制蓝牙的使能管脚,记得使能。
./rtk_hciattach -n -s 115200 ttyS3 rtk_h5 & (运行hciattch)
./bluetoothd -C & (运行bluetoothd进程,以后台方式运行)
./bluetoothctl (运行bluetoothctl控制端)
power on (开启电源)
discoverable on (打开蓝牙可发现)
menu adv (进入adv菜单)
name bluez_123 (修改蓝牙名字)
back (退出)
menu gatt (进入gatt菜单)
register-service 0x00EE (注册服务)
register-characteristic 0xEE01 read,write (读、写事件)
register-characteristic 0xEE02 notify (通知事件)
register-application
back
advertise on (开启广播)
//然后手机端使用nrf connect工具或者其他蓝牙助手所搜即可
//----------------------------------------------
//-----------------rtl8723ds模块----------------
/etc/init.d/dbus start (如果以启动可忽略)
//上面说的有些芯片需要控制蓝牙的使能管脚,当前的模块就需要使能,如下
echo 380 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio380/direction
echo 1 > /sys/class/gpio/gpio380/value (具体的使能方式请参考不同soc的控制方式即可)
insmod hci_uart.ko (加载hci_uart驱动)
./rtk_hciattach -n -s 115200 ttyS3 rtk_h5 & (运行hciattch)
./bluetoothd -C & (运行bluetoothd进程,以后台方式运行)
./bluetoothctl (运行bluetoothctl控制端)
power on (开启电源)
discoverable on (打开蓝牙可发现)
menu adv (进入adv菜单)
name bluez_123 (修改蓝牙名字)
back (退出)
menu gatt (进入gatt菜单)
register-service 0x00EE (注册服务)
register-characteristic 0xEE01 read,write (读、写事件)
register-characteristic 0xEE02 notify (通知事件)
register-application
back
advertise on (开启广播)
//然后手机端使用nrf connect工具或者其他蓝牙助手所搜即可
//----------------------------------------------
以上是调试bluez流程的大致操作。
4.请等待
后续会添加dbus通信相关的内容,整个通信流程,power on 、discover on、advertise on,这部分为移植源码,直接代码操作蓝牙,不使用bluetoothct命令行的方式控制蓝牙,因为项目中开发不方便。