Bluez中Bluetoothctl指令详解
写在前面
写这篇博客的初衷是使用ubantu上面的bluez测试硬件设备的BLE功能时遇到了不少坑,在这里记录下,也希望可以帮助其他小伙伴少踩坑。网上一搜,很多资源都是在讲gatttool。但是这个工具总是在连接之后十几秒的时间就提示:GLib-WARNING **: Invalid file descriptor
,进而断开BLE的连接,加上它已经是属于已弃用的Bluez工具(弃用工具看这里)。所以推荐使用Bluetoothctl工具。
准备硬件和软件
ubantu&bluez版本
- ubantu版本
Ubuntu 7.5.0-3ubuntu1~18.04)
- 终端输入
bluetoothctl
查看bluez版本
本文所有的指令都是基于该bluez的版本 - 终端输入
hciconfig -a
查看蓝牙版本
iPhone&LightBlue
在苹果APP Store中下载lightblue APP,按照以下步骤设置虚拟蓝牙设备,用来测试Bluetoothctl的指令。
- 打开苹果手机蓝牙;
- 打开LightBlue-》Virtual Devices,点击右上角的‘+’,选择一个‘Blank’的设备(我为了好辨认,把名blank改掉了);
- 添加1个service,service名字自定义为Lzchar,value为0x77, 选择支持read,write和notify,保存配置后,虚拟BLE设备设置完毕;
- 在LightBlue界面上勾选该虚拟设备,这时,其他设备就可以扫描到Alias为Lztest的BLE设备;
Bluetoothctl指令列表
在ubantu的终端输入sudo bluetoothctl
开启
help
查看支持的指令
Bluetoothctl常用指令详解
以下指令都需要先输入sudo bluetoothctl
进入工具操作页面。
scan
搜索蓝牙设备
输入scan on
开始搜索设备;
输入scan off
停止搜索;
connect
连接BLE设备
输入connect BLE MAC
连接指定BLE设备,连接成功会提示connect successfully
, 第一次连接成功后,会把该BLE设备支持的属性都显示出来;无法搜索到指定设备,会提示not available
;
disconnect
断开设备连接menu gatt
进入gatt子目录;注意
下,想要操作连接,断开等,需要先输入back
回到主目录才行。
如果需要查询BLE设备的服务,特性和描述符,就需要进入到menu gatt,进入之后,会显示出来支持的gatt操作;
list-attribution
显示设备支持的所有属性
在BlueLight中虽然只写了1个service,但是虚拟BLE设备lztest包含了iphone支持的全部的service,根据UUID找到前面设置的BLE虚拟设备的service,后面所有命令都是操作该service为;
select-attribution
选择某个属性。当需要对某个属性进行read,write或者开启notify时,就需要先进入到该属性,之后更改;attribute-info
查看当前属性的信息,进入到虚拟BLE设备中新增的属性,可以看到前面设置好的属性支持read,write和notify,notify默认是关闭状态
read
通过#2进入属性,之后输入read
即可,可以读到前面设置的0x77
描述符的值也是可以直接read
获取的,比如前面设置的lzchar
的属性值名字
write
通过#2进入属性,之后输入write data
,如果是一个字节,write 0xaa
,如果多个字节,write '0xaa 0xbb'
,写入没有报错的话,就说明成功,查看iPhone上虚拟BLE设备中该属性的值已经变成0xAABB
7.notify on
可以开启属性值的变动通知,还是选择进入该属性,输入notify on
即可开启。 还是以虚拟设备的属性为例,开启通知后,在iPhone上面修改属性值为0xaa 0xbb 0xcc
,这时可以在电脑界面上直接看到新的值的通知。有一点要注意
的是,想要查看到某个属性通知过来的消息,就必须提前选择该属性,否则是看不到的。不需要的时候输入notify off
即可
另外,上面有提到通知默认的是00002902
这个UUID,就是所谓的CCCD,在实际应用的时候,如果想要开启通知,也可以在某个特性下面找到这个UUID的描述符,把值改成0x0001即可。比如上面开启了notify,去查看下CCCD,该值是01 00
,小端模式,所以实际值是0x0001,关闭notify后,再去读取CCCD的值,就是00 00
了
Bluez其他工具
monitor
工具
cd Bluez/monitor/btmon
之后,打开btmon,就会一直处于监控BLE消息的状态,ubantu作为client和iPhone的所有交互数据都可以看到,需要调查一些问题时很有用,比如检查MTU大小,是否读写成功等
读写相关:
连接成功和失败也可以查看到原因,这里不截图示意了。另外连接成功,会有MTU的显示,如果出现丢包,截包等情况,可以查看MTU