目录

  • 一.准备工作
  • 二.利用蓝牙工具进行调试
  • 三.编译使用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)

树莓派的蓝牙通讯(bluez、gattlib)相关推荐

  1. 树莓派蓝牙ble gattlib c语言,树莓派的蓝牙通讯(bluez、gattlib)

    目录 一.准备工作 二.利用蓝牙工具进行调试 三.编译使用gattlib 一.准备工作 我使用的蓝牙模块是大夏龙雀的DX-BT16,支持BLE4.2协议.树莓派的型号为4b,操作系统为64位的ubun ...

  2. 树莓派3B+与Arduino Mega 2560蓝牙通讯

    树莓派3B+与Arduino Mega 2560蓝牙通讯 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 树莓派3B+与Arduino Mega 2560蓝牙通讯 前言 一 ...

  3. 树莓派python蓝牙_用树莓派玩转蓝牙

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 蓝牙是一个使用广泛的无线通信协议,这两年又随着物联网概念进一步推广.我将介绍蓝牙协议,特别是低功耗蓝牙,并 ...

  4. 树莓派python蓝牙_树莓派的蓝牙操作

    树莓派端的蓝牙操作 首先利用ssh登录树莓派(假设用户名为pi) ssh pi@xxx.xxx.xxx.xxx 更新软件源.软件包等相关操作: sudo apt-get update sudo apt ...

  5. ARM平台上蓝牙协议栈Bluez的移植使用和配置

    版权所有,转载请注明出处http://blog.csdn.net/gatieme/article/details/48751743 参考 http://blog.csdn.net/lizzywu/ar ...

  6. 树莓派连接蓝牙音响并播放音频

    树莓派连接蓝牙音响并播放音频 前提准备 方式一:通过桌面图形界面连接(播放有坑) 方式二:通过命令窗连接(有坑) 前提准备 默认已经完成树莓派系统的烧录及更新 打开命令窗执行以下指令安装蓝牙相关包 s ...

  7. 树莓派3B+蓝牙使用

    树莓派3B+蓝牙   树莓派3B+自带蓝牙,使用的是硬件串口.查看蓝牙状态: systemctl status bluetooth # 查看蓝牙状态   当看到active说明蓝牙已经开启了,如果没有 ...

  8. android 蓝牙通讯编程 备忘

    1.启动App后: 判断->蓝牙是否打开(所有功能必须在打牙打开的情况下才能用) 已打开: 启动代码中的蓝牙通讯Service 未打开: 发布 打开蓝牙意图(系统),根据Activity返回进场 ...

  9. microbit编程_使用图形化编程实现主控板与手机蓝牙通讯(2019.3.25)

    本文转自:DFRobot创客社区 原文链接: [Mind+]使用图形化编程实现主控板与手机蓝牙通讯-Mind+论坛-DF创客社区​mc.dfrobot.com.cn 本帖最后由 Forgotten 于 ...

  10. flutter怎么添加ios网络权限_使用Flutter控制蓝牙通讯

    背景知识视频教程 Dart和Flutter:完整的开发人员指南 - 国外课栈​viadean.com Flutter使用Firestore构建复杂的Android和ios应用 - 国外课栈​viade ...

最新文章

  1. C#经典再现——《C#本质论》
  2. 在你休息时,你的大脑运动皮层中重放习得的神经放电序列
  3. 自定义ORM系列(三)工具雏形及基本用法
  4. PyQt5 技术篇-设置QTableWidget表格组件默认值实例演示,如何获取QTableWidget表格组件里的值,获取表格的行数和列数
  5. viewpager+fragment学习笔记
  6. java static调用吗_Java中的static的使用
  7. mysql数据备份(windows,linux)
  8. oracle数据库自动备份脚本
  9. Unity3D实践4:带有出入特效的提示框
  10. unittest 测试
  11. Cookie和Session有什么区别?
  12. [wechart] 微信小程序使用粘性定位position: sticky的注意事项(避坑)
  13. 6个月内进轨,目标火星!马斯克刚刚发布最强“理想飞船”,称已达人类物理极限
  14. 数控技术 - 直线插补 - 数字积分法(DDA)
  15. openstack镜像格式转换
  16. LED 发光二极管工作电流分析
  17. Android10修改电池图标,导航栏、信号及电池图标修改方法(新增视频教程)
  18. Linux下c语言模拟贝壳物联设备在线
  19. linux 显示bin 文件格式,bin文件扩展名,bin文件怎么打开?
  20. PID控制算法基础知识

热门文章

  1. 原生js实现多语言切换
  2. 【复习笔记】画法几何与土木水利工程制图知识点总结
  3. 卡片游戏 基础c语言试题
  4. python 经纬度画北京地图_python 画经纬度的函数drawparallel
  5. 关于android硬件加速器的问题
  6. IP城域网域内组播功能测试
  7. 计算机的字体设为中文繁体,中文转换繁体
  8. AutoCAD2000软件学习心得
  9. 浅谈JAVA工作流的优雅实现方式
  10. html上传文件出现fakepath,IE8上传文件时获取文件本地路径问题(C:\fakepath\……)的解决...