23. 板载蓝牙

Bluez是一个linux蓝牙协议栈,简单说就是linux上所有蓝牙相关的底层功能都是由它提供的, 没有他蓝牙就无法工作,Bluez主要提供蓝牙基础设施、和最基本的蓝牙管理工具。

23.1. 加载设备树插件

  • 确认开发板是从eMMC或者nandflash启动,不能在从SD卡启动时用wifi。

  • 修改两个跳线帽①与②为下图中连接方式,确保wifi模块连接在该sdio接口上。

  • 确认下板载的模块型号。

wifi接线

23.1.1. 板载的模块是AP6236的设备树插件操作如下

使用nano编辑器修改/boot/uEnv.txt文件, 打开imx-fire-uart2.dtbo与imx-fire-btwifi.dtbo设备树插件:

1
2
3
4
5
 sudo nano /boot/uEnv.txt

 # 下面语句去掉'#' 号,是开启设备树插件,加上'#' 号是关闭
 dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-uart2.dtbo
 dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-btwifi.dtbo

23.1.2. 板载的模块是AP6212的设备树插件操作如下

使用nano编辑器修改/boot/uEnv.txt文件, 添加imx-fire-bluetooth.dtbo、打开imx-fire-74hc595.dtbo设备树插件,关闭串口2的设备树插件:

1
2
3
4
5
6
7
 sudo nano /boot/uEnv.txt

 # 下面语句去掉'#' 号,就是开启设备树插件,加上'#' 号是关闭
 dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-74hc595.dtbo
 dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-bluetooth.dtbo
 #dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-uart2.dtbo
 #dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-485r1.dtbo

操作完成后,重启开发板。

23.2. 安装相关的依赖包

为了确保我们安装的软件包的版本是最新版本,让我们使用apt命令更新本地apt包索引:

1
2
3
4
5
 #更新本地apt索引包
 sudo apt update

 #安装相关依赖包
 sudo apt install  wget bluez util-linux

23.3. 烧录蓝牙固件

使用wget获取brcm_patchram_plus,并添加可执行权限。

1
2
3
4
5
 #获取brcm_patchram_plus
 wget -O brcm_patchram_plus https://cloud.embedfire.com/software/packages/brcm_patchram_plus

 #赋予可执行权限
 chmod +x brcm_patchram_plus

拉高蓝牙复位引脚

1
2
 sudo echo 507 > /sys/class/gpio/export
 sudo echo 1 > /sys/class/gpio/gpio507/value

执行烧录命令:

如果是 AP6236 就执行下面的操作:

1
 sudo ./brcm_patchram_plus -d --enable_hci --no2bytes --tosleep 200000 --use_baudrate_for_download --baudrate 115200 --bd_addr "11:22:33:44:55:66" --patchram /lib/firmware/bcm/AP6236/BT/BCM4343B0.hcd /dev/ttymxc1 &

如果是 AP6212 需要确认模块具体型号

ap6212有三种型号,分别是:

  • AP6212@A0(BCM43438A0),是最早版本,其中第二排数字为8位。

  • AP6212@A1(BCM43438A1),是新版,其中第二排数字为9位。且最后1位为1。

  • AP6212@B0(BCM43438B0),是最新版,其中第二排数字为9位,且最后一位为2。

如下图,旧版->新版->最新版,从左到右:

ap6212型号

如果是AP6212@A0执行以下操作:

1
2
wget -O bcm43438a0.hcd https://cloud.embedfire.com/software/packages/bcm43438a0.hcd
sudo ./brcm_patchram_plus -d --enable_hci --no2bytes --tosleep 200000 --use_baudrate_for_download --baudrate 115200 --bd_addr "11:22:33:44:55:66" --patchram bcm43438a0.hcd /dev/ttymxc1 &

如果是AP6212@A1执行以下操作:

1
2
wget -O bcm43438a1.hcd https://cloud.embedfire.com/software/packages/bcm43438a1.hcd
sudo ./brcm_patchram_plus -d --enable_hci --no2bytes --tosleep 200000 --use_baudrate_for_download --baudrate 115200 --bd_addr "11:22:33:44:55:66" --patchram bcm43438a1.hcd /dev/ttymxc1 &

如果是AP6212@B0执行以下操作:

1
2
wget -O BCM4343B0.hcd https://cloud.embedfire.com/software/packages/BCM4343B0.hcd
sudo ./brcm_patchram_plus -d --enable_hci --no2bytes --tosleep 200000 --use_baudrate_for_download --baudrate 115200 --bd_addr "11:22:33:44:55:66" --patchram BCM4343B0.hcd /dev/ttymxc1 &

注意:配置成功时,可以看到终端会打印

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
.......

received 7
04 0e 04 01 18 fc 00
Done setting baudrate
writing
01 01 fc 06 66 55 44 33 22 11
received 7
04 0e 04 01 01 fc 00
Done setting line discpline

若固件烧录到一半时停止或一直重复输出01 03 0c 00,可尝试拉低再拉高蓝牙复位引脚

1
2
sudo echo 0 > /sys/class/gpio/gpio507/value
sudo echo 1 > /sys/class/gpio/gpio507/value

若仍无法继续烧录则可执行以下命令再重新执行烧录命令,或者将②号跳帽移除,重启,然后再拉高蓝牙复位引脚,重新执行烧录命令

1
kill $!

若出现以下超时情况,可以将②号跳帽移除,重启,然后再拉高蓝牙复位引脚,重新执行烧录命令

1
2
3
Bluetooth:hci0: command 0x1003 tx timeout
Bluetooth:hci0: command 0x1001 tx timeout
Bluetooth:hci0: command 0x1009 tx timeout

23.4. 查看蓝牙信息

此时已经出现蓝牙设备的信息了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#执行命令
hciconfig -a

#打印信息如下
 hci0:   Type: Primary  Bus: UART
         BD Address: 11:22:33:44:55:66  ACL MTU: 1021:7  SCO MTU: 64:1
         UP RUNNING PSCAN
         RX bytes:842 acl:0 sco:0 events:57 errors:0
         TX bytes:3018 acl:0 sco:0 commands:57 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: 'npi'
         Class: 0x480000
         Service Classes: Capturing, Telephony
         Device Class: Miscellaneous,
         HCI Version: 4.2 (0x8)  Revision: 0x4d
         LMP Version: 4.2 (0x8)  Subversion: 0x410c
         Manufacturer: Broadcom Corporation (15)

23.5. 启动蓝牙

1
sudo hciconfig hci0 up

23.6. 修改配置文件

修改配置文件/etc/systemd/system/dbus-org.bluez.service,

1
 sudo nano /etc/systemd/system/dbus-org.bluez.service

修改内容如下,

1
2
 ExecStart=/usr/lib/bluetooth/bluetoothd -C
 ExecStartPost=/usr/bin/sdptool add SP

保存退出。

23.7. 重启蓝牙服务

1
2
3
4
5
6
 #执行命令
 sudo systemctl daemon-reload
 sudo /etc/init.d/bluetooth restart

 #打印信息
 [ ok ] Restarting bluetooth (via systemctl): bluetooth.service.

23.8. 配置蓝牙可以被发现

1
 sudo hciconfig hci0 piscan

23.9. 连接蓝牙设备

1
 sudo rfcomm watch hci0 &

在前面使用hciconfig -a命令可以看到蓝牙的名字叫npi,我们打开手机上的蓝牙软件, 比如我使用的就是——蓝牙调试宝,在安卓手机的应用商店应该有的, 苹果手机的话,暂不支持!

然后打开软件,可以搜索到蓝牙设备,然后进行连接,连接成功,终端会打印提示信息:

1
2
 Connection from B8:98:F7:1A:32:58 to /dev/rfcomm0
 Press CTRL-C for hangup

而此时/dev目录下也有一个rfcomm0设备,可以通过下面命令查看:

1
2
3
4
5
#执行命令
ls /dev/rfcomm0

#打印消息
/dev/rfcomm0

然后我们可以通过下面命令发送一些数据到手机的蓝牙调试工具上:

1
 echo "6666666" > /dev/rfcomm0

可以看到手机的蓝牙调试工具上已经收到了相关的数据,

当然手机也可以发送数据到开发板上,比如我们发送一些ASCII码字符串到开发板上, 然后在终端通过cat命令去读取这些数据,可以看到通信是正常的:

1
2
3
4
5
6
7
 #执行命令
 cat /dev/rfcomm0

 #打印信息
 12666666
 6666666
 66669764949
bluetooth001.png

bluetooth001.png

导入我们也能发送一些文件,比如一个txt文件:

在开发板上运行以下命令接收文件:

1
 cat /dev/rfcomm0 > test.txt

在蓝牙调试宝软件的右上角选择传送文件即可发送文件,为了演示方便, 我们直接发送文本文件(这个文本文件是笔者将蓝牙调试宝的调试日志信息保存生成的文件, 大家可以传送其他文本文件),这样子可以通过cat命令直接读取这些内容并且保存到开发板上:

bluetooth002.png

bluetooth002.png

当发送完成后,此时当前目录下已经存在一个test.txt文件了,我们可以打开文件的内容,发现

查看收到文件的内容,就是我们刚刚的调试信息:

1
2
3
4
5
6
7
8
#执行命令
cat test.txt

#查看消息
666
66669764949666
66669764949
12:03:23.241> 7A 66 85 DE 7A B3 D7 E8 23 BC EC 6F 11 66 BC 7F 31 89 F5 14 86 8F F9 4A 28 70 40 AD 46 9F E0 45 1F 42 8D 1E 49 8C AA EF 83 49 25 81 95 1A 3D 8B 1C F5 0E 86 1A BD D5 D3 17 66 DF C0 A4 D5 D2 17 C5 D5 21 EE 5F C7 3B 81 01 5A D0 8A 75 FA 90 C0 6E 90 E7 16 22 A5 97 99 5F E0 1D 2C A7 2E 0A C5 0D 88 77 30 6A 14 38 A4 7E 07 5B 02 2C FD CE 3B 58 4B 5D 04 56 BF 83 2D 85 D7 AB F5 0E 86 9B 17 E5 DF 79 07 63 EA 6A 6A 77 30 6A ED 3B 58 48 5B FC 9D 77 30 CF 27 FE FF C0 98 C0 46 9D BE DC C1 72 02 CB 49 8C E0 22 C4 3C C7 3B 18 95 EF 60 5C 1F 6A 06 B0 00 2E 09 73 BC 83 B5 0A 3D E6 70 07 5B BD 42 8F 02 47 05 17 E6 7C 07 EB 15 7A 26 AF FC 32 B3 9D 77 30 AE 0F 59 E0 C0 1D 0C A9 2B BD 0B 06 68 FD E7 0E 56 DF 05 5B FE 32 F3 87 7F B3 77 87 46 00 02 51 0C 05 3B A2 4C DA 86 6F 91 CC E5 72 66 45 6A 78 13 B5 BD 80 7D 63 C5 03 E3 81 F1 C0 78 60 3C 30 1E D8 1F 0F EC 3E F5 C0 26 54 09 0F 8C 07 C6 03 E3 81 F1 C0 78 60 3C B0 59 2B 60 D7 C3 03 E3 81 F1 C0 78 60 3C 30 1E 58 C8 03 2B 06 8C 07 C6 03 E3 81 F1 C0 78 60 3C B0 BC 07 56 08 18 0F 8C 07 C6 03 E3 81 F1 C0 78 60 79 0F AC 14 30 1E 18 0F 8C 07 C6 03 E3 81 F1 C0 02 1E 58 3F 60 3C 30 1E 18 0F 8C 07 C6 03 E3 81 45 3D B0 42 C0 F2 1E 18 0F 8C 07 C6 03 E3 81 F1 C0 78 60 85 80 05 3D 30 1E 18 0F 8C 07 C6 03 E3 81 F1 C0 3A 01 DB E7 81 F1 C0 78 60 3C 30 1E 18 0F 8C 07 56 08 D8 A2 07 C6 03 7B D9 3B 07 27 57 9A 2E 8C FF 15 5F F9 7B 6D 5C DB B6 6D DB 36 D7 B6 6D F3 DA 56 EE 5E DB B6 ED 3D E7 ED 4D 4F 55 A7 7B B2 99 CC 66 66 16 95 AE 7A EA 9C 51 7A D3 A9 DA 27 A7 7B 32 BF B8 C9 08 9B 83 10 4E 6E 40 B8 7B 0E 61 6D 4B 63 78 60 01 BD 10 76 44 30 85 F4 AF 9E 3C B0 15 E4 BD 26 8D 47 28 C9 41 D8 15 EE E4 81 95 29 B4 03 C2 C1 18 49 B1 74 5B 0D 0F CC AB 16 BB FE 10 51 F6 64 27 0F CC 16 0F CC 83 8C 7D E1 34 84 6B 3B 11 82 6A 19 CB 03 F3 20 EF 2D A5 07 82 FB FF 6A 24 0F 4C 37 03 AB 34 1E 98 5B 77 84 D4 C5 B6 79 60 6B 3B 22 78 F6 94 D4 03 C1 A3 07 17 69 DE DD 1C 99 BA F3 F2 2A 53 0F 22 8B 6D 8F 6E DA F3 C0 8E 16 A0 65 03 53 BE 31 3C B0 8C F9 7C BF 79 2B AA 1F 0F CC BD 09 C2 C7 37 EC 3D 00 20 C4 0C 75 F2 C0 D2 C7 A3 65 23 DB EA 78 60 C1 2D F9 EB 4B 52 CB E3 81 39 79 60 5B 96 21 7C 7A CB C6 EA 64 86 B1 3C B0 02 FA 59 C3 C7 D7 08 E7 0B 10 E2 DA D4 2C 1E 18 6F 60 D5 9C 07 E6 DD 0F E1 CD 33 FA 81 6D 0A 2B BF 12 BB 73 0E F5 68 F0 F9 83 F6 3C 30 BF 5E 7C 1F A5 DF 10 5C 5A E9 CF 03 93 1B 58 F5 E4 81 95 64 F3 EF E3 D9 2D 84 E5 BF 6A CB 03 0B 68 87 70 20 9E 28 CE 3E 1D 14 73 3E D2 3C D6 22 D2 9C 44 65 85 76 50 9E 3E 4C 9F 20 1A 98 3A 1E 58 70 2B D1 C0 1C E3 81 85 B4 44 38 14 ED 98 0E B3 48 73 3E 5A 57 94 85 A4 ED C8 D6 DA F2 C0 92 7B F3 63 05 A5 A4 8F E6 C6 F1 C0 AE EF E6 FB DF BC 00 A1 68 32 D1 24 5E C5 7C 94 E7 B6 34 91 C5 F4 9E 15 E2 81 39 79 60 8B 1A 4B E6 C5 1A 1C CA 43 98 5B 4B FC 0D 98 9E 06 66 9B 07 B6 B4 3E 82 4B 3B 26 D7 B2 D8 96 8F AE 6D A5 DC 42 B7 4F F3 FD EC 8C 26 FB CB BE 49 B5 95 22 91 B4 CD 72 4B B5 46 70 69 A1 8E 07 96 B1 40 B9 02 5B 59 C7 6C 74 90 49 C4 A2 94 0B CA B2 DC 9E 47 45 F6 D1 28 6C 7B B7 D3 8E 07 E6 D6 90 7D 03 96 1A 14 AE D0 96 07 96 30 12 AB 4A 83 B4 09 CA 3C 30 79 05 A6 8E 07 26 AF C0 1C E3 81 25 0F