一、简介
通过“BT[1]-Introduction to Bluetooth Low Energy”知道,两个BLE设备通信需要完成两件事:
- 广播:设备发送广播信息表明自己的存在,让周围的设备可以Discover自己
- 连接:Peripheral和Central设备建立peer-to-peer连接,之后通过GATT通信
心率计是官方定义的一个Service,详参:Heart Rate Profile & Heart Rate Service。
这里不涉及广播和连接的原理讲解,通过Linux系统下BlueZ提供的工具实现一个心率计,进而体验下BLE。
二、RK3308蓝牙使用
系统概况
# uname -a Linux rockchip 4.4.143 #9 SMP PREEMPT Wed Feb 13 18:38:41 CST 2019 armv7l GNU/Linux 蓝牙芯片:AP6212 |
1、查看电源是否开启
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # cd /sys/class/rfkill # ls rfkill0 rfkill1 rfkill2 # rfkill <--- 查看蓝牙对应的目录 ID TYPE DEVICE SOFT HARD 0 bluetooth bt_default blocked unblocked 1 wlan phy0 unblocked unblocked 2 wlan brcmfmac-wifi unblocked unblocked # cd rfkill0/ # cat state <--- 查看电源状态 0 <--- power down # echo 1 > ./state <--- power up [ 423.917629] [BT_RFKILL]: rfkill_rk_set_power: set bt wake_host pin output high! [ 423.980538] [BT_RFKILL]: rfkill_rk_set_power: set bt wake_host pin input! [ 423.980608] [BT_RFKILL]: ENABLE UART_RTS [ 424.081438] [BT_RFKILL]: DISABLE UART_RTS [ 424.081539] [BT_RFKILL]: bt turn on power |
2、查看蓝牙是否启动
1 2 3 4 5 6 7 8 9 10 11 12 13 | # hciconfig -a <--- 蓝牙设备未启动 # brcm_patchram_plus1 --bd_addr_rand --enable_hci --no2bytes --use_baudrate_for_download --tosleep 200000 --baudrate 1500000 --patchram /system/etc/firmware/bcm43438a1.hcd /dev/ttyS4 & <--- 启动蓝牙设备 # hciconfig -a hci0: Type: Primary Bus: UART BD Address: 90:1B:07:8D:34:B0 ACL MTU: 1021:8 SCO MTU: 64:1 DOWN <--- 蓝牙Down状态 RX bytes:612 acl:0 sco:0 events:30 errors:0 TX bytes:398 acl:0 sco:0 commands:30 errors:0 Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH SNIFF Link mode: SLAVE ACCEPT |
3、激活蓝牙
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # hciconfig hci0 up # hciconfig dev hci0: Type: Primary Bus: UART BD Address: 90:1B:07:8D:34:B0 ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING RX bytes:1224 acl:0 sco:0 events:60 errors:0 TX bytes:796 acl:0 sco:0 commands:60 errors:0 # hciconfig -a <--- 查看详细信息 hci0: Type: Primary Bus: UART BD Address: 90:1B:07:8D:34:B0 ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING RX bytes:1224 acl:0 sco:0 events:60 errors:0 TX bytes:796 acl:0 sco:0 commands:60 errors:0 Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH SNIFF Link mode: SLAVE ACCEPT Name: 'BCM43438A1 26MHz AP6212A1_CL1 BT4.0 OTP-BD-0058' Class: 0x000000 Service Classes: Unspecified Device Class: Miscellaneous, HCI Version: 4.0 (0x6) Revision: 0xf9 LMP Version: 4.0 (0x6) Subversion: 0x2209 Manufacturer: Broadcom Corporation (15) |
4、扫描看下
1 2 3 4 5 6 7 8 9 10 | # hcitool scan Scanning ... 00:1A:7D:DA:71:13 CHENTONG1070 70:BB:E9:C7:1B:1C 小米手机 94:87:E0:B4:09:82 小米手机8 50:3C:EA:AF:D7:00 OPPO R11s 20:47:DA:BE:3B:B3 小米手机6 28:B2:BD:CA:69:BB GUOZF668 20:18:06:25:62:79 HC-05 34:D7:12:91:DC:C0 坚果 Pro 2 特别版 |
三、准备
RK3308+BLE:作为蓝牙的Peripheral端。RK3308系统有hciconfig、hcitool 、btgatt_server、brcm_patchram_plus1命令。
手机+BLE Scanner:作为蓝牙的Central端。BLE Scanner APP(iPhone)界面如下:
四、Peripheral设备发送广播
1、启动蓝牙
1 2 3 4 | echo 1 > / sys / class / rfkill / rfkill0 / state brcm_patchram_plus1 - - enable_hci - - no2bytes - - use_baudrate_for_download - - tosleep 200000 - - baudrate 1500000 - - patchram / system / etc / firmware / bcm43438a1.hcd / dev / ttyS4 & hciconfig hci0 up hciconfig hci0 piscan |
2、检测启动是否成功
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # hciconfig -a hci0: Type : Primary Bus: UART BD Address: 8C :F7: 10 : 4A : 71 :B5 ACL MTU: 1021 : 8 SCO MTU: 64 : 1 UP RUNNING PSCAN ISCAN RX bytes: 9721 acl: 6 sco: 0 events: 328 errors: 0 TX bytes: 747 acl: 2 sco: 0 commands: 53 errors: 0 Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87 Packet type : DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH SNIFF Link mode: SLAVE ACCEPT Name: 'BCM43438A1 26MHz AP6212A1_CL1 BT4.0 OTP-BD-0058' Class: 0x000000 Service Classes: Unspecified Device Class: Miscellaneous, HCI Version: 4.0 ( 0x6 ) Revision: 0xf9 LMP Version: 4.0 ( 0x6 ) Subversion: 0x2209 Manufacturer: Broadcom Corporation ( 15 ) |
3、开启BLE的广播功能
1 2 3 4 5 | # hcitool -i hci0 cmd 0x08 0x000a 01 < HCI Command: ogf 0x08 , ocf 0x000a , plen 1 01 > HCI Event: 0x0e plen 4 01 0A 20 00 |
4、发送广播数据
1 2 3 4 5 6 | # hcitool -i hci0 cmd 0x08 0x0008 16 02 01 06 03 02 80 ff 0e 09 62 6c 65 5f 6e 61 6d 65 5f 5a 30 30 31 < HCI Command: ogf 0x08 , ocf 0x0008 , plen 23 16 02 01 06 03 02 80 FF 0E 09 62 6C 65 5F 6E 61 6D 65 5F 5A 30 30 31 > HCI Event: 0x0e plen 4 01 08 20 00 |
至此,通过BLE Scanner可以看到设备,在APP的“ADBERTIMENT DATA”区域可以看到广播数据,比如Device Local Name:ble_name_Z001。
五、GATT
1、运行btgatt_server服务:
1 | btgatt_server - i hci0 - t public - r - v |
注:btgatt-server编译自“bluez-5.50/tools/btgatt-server.c”
2、点击APP的【connect】,连接设备。在【Service】可以看到心率计的服务。点进去可以看到红心处更新。
附录
1.BlueZ:http://www.bluez.org
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!