当前位置: 首页>編程日記>正文

树莓派的蓝牙通讯(bluez、gattlib)

树莓派的蓝牙通讯(bluez、gattlib)

目录

  • 一.准备工作
  • 二.利用蓝牙工具进行调试
  • 三.编译使用gattlib

一.准备工作

我使用的蓝牙模块是大夏龙雀的DX-BT16,支持BLE4.2协议。树莓派的型号为4b,操作系统为64位的ubuntu-18.04。

提前说明一下,因为我没有安装桌面,所以很多工具都需要自己手动安装。

首先先创建一个root用户,方便以后的系列操作。下面的所有命令都是在root权限下进行的。

sudo passwd
su

bluez是linux官方的蓝牙协议栈,我们首先安装bluez。

apt install bluez

树莓派上使用的蓝牙是通过UART和CPU通讯的,所以我们要用hciattach建立串口和蓝牙协议层之间的HCI传输接口。

hciattach /dev/ttyAMA0 bcm43xx 921600

如果不建立传输接口就直接使用蓝牙工具,系统就会找不到蓝牙。
在这里插入图片描述
在使用hciattach初始化蓝牙时,可能我们会接收到以下报错:
在这里插入图片描述

我在网上找了一个解决方法,输入以下命令再进行初始化便可以消除报错,不过不管消不消除这个报错,都不影响蓝牙的正常使用。(至少我的使用是这样的)

mkdir -p /etc/firmware
ln -s /lib/firmware/BCM43430A1.hcd /etc/firmware/BCM43430A1.hcd
systemctl reboot

使用hciattach初始化之后,我们键入hciconfig -a就可以看到我们蓝牙设备了(hci0)。
在这里插入图片描述

二.利用蓝牙工具进行调试

接下来就可以使用bluez自带的蓝牙工具进行蓝牙调试了。首先我们使用bluetoothctl连接蓝牙并获取地址。

bluetoothctl
power on
scan on
devices
connect <dev>
disconnect <dev>
exit

在这里插入图片描述

如果使用传统蓝牙,可能还需要进行配对、输入默认密码等操作。
接下来我们使用gatttool的交互模式向蓝牙发送数据,这里需要用到bluetoothctl获取的蓝牙地址。

gatttool -b <dev> -I
connect

我们需要用primary命令获取句柄,然后再通过句柄发送数据。

primary
char-write-cmd <handle> <value>

在这里插入图片描述

三.编译使用gattlib

用蓝牙工具调试完毕之后,我们可以自己编写代码来进行蓝牙通讯,我的水平不足以直接在协议栈的层面操作,github用户Lab A Part已经将bluez封装成一个个函数了,我是直接调用他编写好的函数进行操作的,github仓库地址如下:https://github.com/labapart/gattlib

首先我们需要在树莓派上重新编译他的代码,这样我们就可以使用他提供的一系列examples。

cd /home/ubuntu
mkdir ble && cd ble
wget https://github.com/labapart/gattlib/archive/master.zip
apt install unzip
unzip master.zip
cd gattlib-master
mkdir build && cd build

安装编译相关的工具和依赖。

apt install cmake build-essential scons
apt install pkg-config
apt install libbluetooth-dev libreadline-dev
apt install glib-2.0 libglib2.0-dev
apt install doxygen
cmake ..

在这里插入图片描述

make

在这里插入图片描述
下面是编译生成的一系列文件,我们现在就可以使用gattlib提供的例程了,个人认为examples中的ble_scan函数比bluez提供的蓝牙工具更加方便。
在这里插入图片描述

cd examples
./ble_scan/ble_scan
./read_write/read_write <...>

最后的最后,我们要调用gattlib里的函数编写自己的代码。下面的test.c是我自己写的代码。注意,要根据自己设备的架构选择合适的下载地址,我下载的是arm64的库。

cd /home/ubuntu/ble
wget https://github.com/labapart/gattlib/releases/download/dev/gattlib_0.2-dev_arm64.zip
unzip gattlib_0.2-dev_arm64.zip
wget https://github.com/labapart/gattlib/releases/download/dev/gattlib_0.2-dev_arm64.deb
dpkg -i gattlib_0.2-dev_arm64.deb
apt install libpython3.7
gcc test.c -o test gattlib_0.2-dev_arm64/lib/libgattlib.so

调试蓝牙的过程中遇到的一些坑:

  • 蓝牙无法连接时可以尝试重启蓝牙模块。
  • gattlib中的write函数会向蓝牙模块连续发送8个十六进制数据,单片机会进入8次串口中断,且write函数发送数据是先发送低位,再发送高位。
  • 使用gattlib中的函数时也需要先使用hciattach初始化蓝牙并赋予root权限。

参考资料:
https://forums.opensuse.org/showthread.php/523803-Bluetooth-device-not-working-(Raspberry-Pi-3-Leap-42-2)


https://www.fengoutiyan.com/post/14140.html

相关文章:

  • 树莓派连接蓝牙耳机
  • 树莓派 蓝牙
  • 树莓派4b连接蓝牙失败
  • 树莓派蓝牙连接
  • 手机连接树莓派
  • 树莓派联网
  • 树莓派连接蓝牙失败
  • 树莓派4b 蓝牙
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機