Edison 蓝牙模块 学习笔记
本笔记基于
Intel Edison Bluetooth Guide
官方手册完成,如有错误敬请指出。由于个人能力有限,到最后几节内容一直拖着没有翻译,以后会补上,自己也是边学习边翻译的,还请见谅。
- Edison 蓝牙模块 学习笔记
- 基本介绍
- Linux集成蓝牙
- 1 The bluetoothd daemon
- 2 Configuration
- 3 Application interface
- 基本蓝牙操作
- 1 Enable and disable Bluetooth on Intel Edison
- 2 Bluetooth status control via connman
- 3 The bluetoothctl utility
- 4 Device identification DI profile
- 搜索与连接设备
- 修改蓝牙MAC地址
- 蓝牙配置文件
- 1 Bluetooth Low Energy BLE profile
- 11 Verifying BLE plugin compilation
- 12 preparing to test Bluetooth profiles
- 2 scan and connect
- 21 bluetoothctl
- 22 hcitool
- 23 btmgmt
- 24 Python test scripts
- 25 AGTTtool
- 3 Advanced audio distribution profile A2DP
- 4 Device identification DI profile
- 41 Reading and Changing the local device identification
- 42 Retrieving the peer devices DI information
- 5 Human interface device HID profile
- 6 Personal area networking PAN profile
- 61 PAN test between Linux host PC and Intel Edison device
- 62 PAN test between two Intel Edison devices 未完成
- 7 Serial port profile SPP
- 71 SPP verification using DBUS APIs
- 72 SPP verification using the RFCOMM tool 未完成
- 8 HID over GATT profile HOGP
- 9 Heart rate profile HRP
- 10 Proximity profile PXP
- 101 PXP service
- 102 PXP test
- 103 Proximity monitor
- 104 Proximity reporter
- 11 Time profile TIP
- 12 File transfer protocol FTP profile
- 121 FTP server
- 122 FTP client
- 1 Bluetooth Low Energy BLE profile
- Appendix A SPP-loopbackpy
1. 基本介绍
Edison中包含一个蓝牙模块,蓝牙芯片是BCM43340
(注:这个芯片是WIFI蓝牙一体芯片),与主芯片通过UART和一部分IO连接,UART使用的是/dev/MFD0
,额外的GPIO口包括如启动蓝牙,复位蓝牙,主设备唤醒,从设备唤醒,低功耗模式等。
选用的是BlueZ,一个开源的Linux蓝牙软件协议栈。这个包提供了一些DBUS API
接口,可以用于开发,但是并没有公开内部工作机理,Edison上对Yocto进行了一些更改来适应BlueZ 5.24版本。。
BlueZ, an open source project, is the official Linux Bluetooth protocol stack.
2. Linux集成蓝牙
首先聊了他们是如何把BlueZ添加到Edison中的。BlueZ提供了一些接口(API),如 rfkill
(用于开启或关闭蓝牙)、hcitools
(用于配置蓝牙)。通常来说,当一个蓝牙模块连接到USB并rfkill启用Bluetooth时,hciattach
会自动启动并接管蓝牙,同时其他命令也会自动开始运行。但是Edison的蓝牙是连接到UART的,所以即使rfkill启用了Bluetooth,hciattch
不能自动加载。于是想了个办法,新写了一个Bluetooth_rfkill_event
程序,这个程序在系统启动时加载运行,用来监听Bluetooth接口的rfkill事件,可以工作来代替hciattch
。故而,当我们在使用Edison上的蓝牙时,必须让Bluetooth_rfkill_event
在操作系统后台运行。
准确的说,rfkill并不属于BlueZ的一部分,rfkill是linux内核中的一个子系统,它是加到内核中的,可以用来查询、激活或取消激活计算机系统中的无线电传输,蓝牙作为一种无线电通信方式,自然也可以被rfkill控制。原文是这样说的:
Bluetooth controlers are handled in Linux via interfaces accessible by the rfkill and hci utilities (rfkill, hcidump, hciconfig, hcitools, etc.). These utilities, which are provided in the BlueZ package, include the following: rfkill, hcitools
BlueZ中包含hcitools和bluetoothd等系统程序,可以与外部的rfkill通信,bluetoothd程序的外部用户应用接口有:BlueZ python scripts, bluetoothctl, connman
2.1 The bluetoothd daemon
关于bluetoothd
。它是一个在系统启动时就运行加载的daemon,他会初始化相关的plugins, 并在内核中监听硬件事件,当一个HCI设备发出MGMT_EV_INDEX_ADDED
响应时,这个daemon会开始初始化蓝牙的相关程序和控制。
Plugin
是一系列可以表征特性(features)或规范(profile),BlueZ本身包含了一系列的规范,这些规范会在系统启动时一并启动。
另外,BlueZ
也支持加载和初始化用户定义的plugins,从而来开发第三方的程序,路径是/usr/lib/bluetooth/plugins
,基本上,当bluetoothd daemon
初始化后,某个plugin可以实现一部分功能。
这些设置存储在/var/lib/bluetooth
路径下。这部分的说明在BlueZ协议栈<buez_package>/doc/settings-storage
文件路径下。
2.2 Configuration
默认的bluetoothd daemon
将会加载和初始化所有的plugins
,但是我们可以通过手动命令行选项开启或关闭plugin,命令选项指令为-plugin
和-noplugin
,(当然,我还不清楚怎么使用)。当关闭某个plugin时,对应的profile将不会工作,有关于这个service的注册和广播也就不会工作,可以通过修改BlueZ
的systemd来做这个工作,路径是/etc/systemd/system/bluetooth.target.wants/bluetooth.service
,可以在ExecStart
中增加命令行参数。
BlueZ
可以修改一些特殊的profile特性,如input.conf
network.conf
proximity.conf
以及更加常规的main.conf
,可以完成一些修改蓝牙名字、可发现性、匹配时间等设置参数,这些文件的路径在/etc/bluetooth/
,如果修改了这些参数,需要重启bluetooth
,重启命令:
root@edison:~# systemctl stop bluetooth
root@edison:~# systemctl start bluetooth
2.3 Application interface
应用层接口,可以使用BlueZ
协议栈提供的DBUS API
接口来使用蓝牙服务,在BlueZ的协议栈说明文档中描述了这些接口,路径<bluez_package>/doc
。包括adapter
agent
device
profile
等配置接口。
3. 基本蓝牙操作
当开始蓝牙操作时,我们必须保证Bluetooth_rfkill_event
服务在edison后台运行,当我们使用rfkill
命令来开启或关闭蓝牙时,该服务会监听发生的rfkill
事件,当触发到开启蓝牙时,该服务会开始下载一个新的固件包、配置BCM43340芯片以及注册HCI设备(hci0)。
下载固件包和注册HCI设备的是该服务下的brcm_patchram_plus
,它将操作hciattach
等来配置蓝牙选项。
3.1 Enable and disable Bluetooth* on Intel Edison
开启或关闭蓝牙的命令是:
root@edison:~# rfkill unblock bluetooth
root@edison:~# rfkill block bluetooth
当蓝牙使能时,可以通过rfkill
列出可以使用的接口,命令是:
root@edison:~# rfkill block bluetooth
root@edison:~# rfkill list
以及
root@edison:~# rfkill unblock bluetooth
root@edison:~# rfkill list
bcm43xx Bluetooth: bluetooth
是被增加到蓝牙控制器的电源驱动中的,通过rfkill block
和rfkill unblock
可以直接驱动芯片的开启与关闭;
rfkill unblock bluetooth
可以同时起到systemctl start connman
和connmanctl enable bluetooth
的作用。
hci0: bluetooth
是当串口设备与BlueZ协议栈建立连接后添加的,如果内核已经配置了相关驱动,则它将始终存在。
3.2 Bluetooth* status control via connman
Connman
是一个连接管理工具,属于一个Bluetooth plugin。它可以管理网络连接,可以获取已连接或已匹配设备的信息。connman
不会自动启动,需要手动启动。
root@edison:~# systemctl start connman
root@edison:~# connmanctl enable bluetooth
关于蓝牙启动这块,我实际尝试了一下,因为rfkill block/unblock bluetooth
可以取代掉systemctl start connman
和connmanctl enable bluetooth
的功能,所以我尝试rfkill block/unblock
和systemctl stop/start bluetooth
。结论:systemctl stop/start bluetooth
是系统级的蓝牙控制,当在这里关闭蓝牙时,无法对蓝牙进行任何操作,包括bluetoothctl
等程序,这时打开该程序显示的[bluetooth]
是灰色的;rfkill block/unblock bluetooth
是管理蓝牙控制的,如果阻塞后,无法控制蓝牙进行指定的任务,bluetoothctl可以正常进入,[bluetooth]
显示是正常的蓝色,但是无法进行设备搜索等功能,提示
No default controller available
3.3 The bluetoothctl utility
bluetoothd
daemon 通过 DBUS接口来工作,输入:
root@edison:~# bluetoothctl
可以进入蓝牙的基本配置中。通过键入help
可以查看所有可以用的命令。
3.4 Device identification (DI) profile
该profile用于提供有关于蓝牙设备的额外信息,可以通过在bluetoothctl
程序下输入:
[bluetooth]# show
来显示相关的信息。主要信息有供应商编号源(VendorID)、供应商编号(VendorID)、设备编号(DeviceID)、版本号(Version)等。可以通过在edison的/etc/bluetooth/main.comf
文件中取消注释并修改信息。
4. 搜索与连接设备
讲解了如何通过传统蓝牙配置edison蓝牙的搜索和匹配过程。
root@edison:~# systemctl start bluetooth
root@edison:~# rfkill unblock bluetooth
root@edison:~# bluetoothctl
[bluetooth]# agent KeyboardDisplay
[bluetooth]# default-agent
[bluetooth]# scan on
[bluetooth]# pair 40:2C:F4:DB:EF:AA
[bluetooth]# connect 40:2C:F4:DB:EF:AA
[bluetooth]# info 40:2C:F4:DB:EF:AA
[bluetooth]# discoverable on
[bluetooth]# exit
5. 修改蓝牙MAC地址
MAC地址存放在/factory/bluetooth_address
,修改后需要重新启动。
root@edison:~# mount -v | grep factory
root@edison:~# mount -o remount, rw /dev/mmcblk0p5 /factory
root@edison:~# vi /factory/bluetooth_address
root@edison:~# reboot
6. 蓝牙配置文件
蓝牙配置文件定义了可能的应用和特殊常见的蓝牙行为,从而可以允许设备通过蓝牙互相通信,每个蓝牙配置文件都包含这样的信息:
- 有关于其他配置文件的依赖;
- 用户接口格式建议;
- 特殊的蓝牙协议栈接口;
Edison支持所有的BlueZ配置文件。
6.1 Bluetooth* Low Energy (BLE) profile
BLE是什么我就不说了,BlueZ协议栈包含着GATT配置文件在Edison上均支持,并通过C API接口与内部连接,但是也许还需要我们写自己的配置文件,因为大多数GATT配置文件,如心率计、体温计、报警等功能,均是全功能集成的BlueZ例子,但是DBUS接口API已经过时了。Edison上的BlueZ是按照默认的全功能例子编译的,这些配置文件默认是存在的。
有关协议栈的层次也不说了。
6.1.1 Verifying BLE plugin compilation
BlueZ软件为了允许BLE配置文件,在Edison上是按测试模式编译的,可以重新按BLE plugins编译,下列操作使能所有logs。
1. 首先关闭bluetoothd:[email protected]:~# systemctl stop bluetooth
;
2. 修改蓝牙系统服务文件,路径在/etc/systemd/system/bluetooth.target.wants/bluetooth.service
,增加-d
参数:ExecStart=/usr/lib/bluez5/bluetooth/bluetoothd -d
;
3. 重启bluetoothd:[email protected]:~# systemctl start bluetooth
;
4. 加载蓝牙logs:journalctl --unit=bluetooth
,可以查看所有在Edison上支持的蓝牙plugings,以及bluetoothd是否开启。
注释一下:我的Edison和这个略有不同,我是在/lib/systemd/system/bluetooth.service
找到的bluetooth.service文件的。
测试蓝牙配置文件可以通过BlueZ测试脚本,也可以通过常规的Python脚本,后者需要进行一些额外的配置,需要把以下内容写入DBUS policy file,路径为/etc/dbus-1/system.d/bluetooth.conf
:
<allow send_interface=“org.bluez.ThermometerWatcher1”/>
<allow send_interface=“org.bluez.AlertAgent1”/>
<allow send_interface=“org.bluez.HeartRateWatcher1”/>
<allow send_interface=“org.bluez.CyclingSpeedWatcher1”/>
6.1.2 preparing to test Bluetooth* profiles
文档中说做profile test之前,应该先运行两个命令:
root@edison:~# rfkill unblock bluetooth
root@edison:~# hciconfig hci0
通过这两句命令可以确保蓝牙被打开而且HCI接口正在工作。HCI接口就是控制器(Edison核心)和蓝牙模块的接口,通过UART通信。
可以通过如下指令查看链接管理器支持的状态:
root@edison:~# hciconfig hci0 lestates
这句指令不能用于测试profile,但可以检查蓝牙控制器支持的状态,包括:可连接、未广播、可搜索广播、激活搜索等。从显示的内容来看,仅支持蓝牙4.0。
蓝牙4.0是蓝牙3.0+HS规范的补充,专门面向对成本和功耗都有较高要求的无线方案。它支持梁总部署方式:双模式和单模式。双模式中,低功耗蓝牙功能集成在现有的蓝牙控制器中,在现有的经典蓝牙技术芯片上增加低功耗功能,整体架构基本不变。单模式只能与蓝牙4.0设备相互连接而无法向下兼容,双模式可以向下兼容,与3.0、2.1/2.0设备通信。
单模式面向高度集中、紧凑的设备,使用一个轻量级连接层提供超低功耗的待机模式操作、简单设备恢复和可靠的点对多点数据传输、具有高级节能和安全加密连接。
6.2 scan and connect
edison作为主机搜索和连接其他设备,使用命令行或脚本来使用bluetoothd daemon。命令行模式包括bluetoothctl
和一系列的扩展工具,像hcitool
和btmgmt
,推荐使用bluetoothctl
,因为它不需要通过hcidump
来检测通信踪迹从而检测到从设备地址是静态的还是动态的。
6.2.1 bluetoothctl
root@edison:~# bluetoothctl
root@edison:~# scan on
//会开始搜索设备,直到搜索到想匹配的设备时
root@edison:~# scan off
root@edison:~# connect 00:22:D0:3B:2F:2A
注:搜索可以发现所有的传统蓝牙和低功耗蓝牙设备,没有区分。BlueZ daemon 也会隐藏搜索设备类型,所以不需要在乎这个或者不要用这个工具。
6.2.2 hcitool
这个命令行工具主要用于将蓝牙指令包(raw packets
这个不知道怎么翻译)从用户空间发向蓝牙控制器,从而来初始化LE设备。这个实验,需要用两个终端,我当时就呆了,一个串口只能被一个PUTTY占用,不过后来解决了。其中一个用于执行命令,另一个通过hcidump
来显示log信息。
在命令终端中:
root@edison:~# hcitool lescan
这句指令搜索附近的LE设备,如果搜索到会显示MAC地址和设备名称。
可以通过按Ctrl+C
来终止搜索,不要用Ctrl+Z
,一旦搜索到设备就可以终止搜索,如果命令执行失败,则运行:
root@edison:~# hciconfig hci0 down
root@edison:~# hciconfig hci0 up
来重新启动hciconfig
。
在监控终端中:
root@edison:~# hcidump -X
这个监控窗口会不断自动刷新,并接收控制器与BlueZ栈之间的交换数据。
当设备被发现后,在命令终端中:
root@edison:~# hcitool lecc 00:22:D0:3B:2F:2A
这句指令会初始化设备并将一个连接handler返回显示出来。通过监控终端中可以发现被连接设备的MAC地址类型(动态的或静态的),如果需要连接动态地址的设备,需要在hcitool lecc
中增加--random
参数。
监控窗口中只能监控链路层的连接过程,而不能不过GATT程序的交换数据,即读写数据。
This is just a connection at the link layer; no GATT procedures are exchanged to browse peer device services and eventually read/write or register to indications/notifications for exposed characteristics.
6.2.3 btmgmt
这个指令存在于BlueZ协议包里,需要手动下载。
Use the btmgmt code in the BlueZ 5.24 package downloaded by the Yocto recipe. You can also find the btmgmt source from the BlueZ git repository at http://git.kernel.org/cgit/bluetooth/bluez.git/tree/tools
可以发现设备并配对设备,使用方法:
root@edison:~# ./btmgmt find -l
root@edison:~# ./btmgmt find -b
root@edison:~# ./btmgmt find
寻找设备,-l
参数说明只寻找le设备,-b
参数说明只寻找传统蓝牙设备,不加参数将寻找所有蓝牙设备。
root@edison:~# ./btmgmt pair -t 1 00:22:D0:3B:2F:2A
这个指令配对一个设备,通过SMP配对,-t
参数说明连接的类型,后边接1为le设备,地址公开,接0为传统设备,2为le设备,地址随机。可以通过监控窗口查看。
6.2.4 Python test scripts
还可以通过Python脚本调试蓝牙,和bluetoothctl的效果一样,需要下载这部分的程序代码。使用test-discovery
程序可以发现设备,使用simple-agent
程序可以配对设备。
Python脚本可以让用户自定义用户软件,提高了灵活性。
6.2.5 AGTTtool
当我们通过hcitool
工具连接了一个蓝牙时,可以通过gatttool
工具测试BlueZ协议栈的GATT客户端(不是服务器),这个工具也是包含在BlueZ协议栈中,并不在Edison镜像中,下载地址:http://git.kernel.org/cgit/bluetooth/bluez.git/tree/attrib
通过命令:
root@edison:~# ./gatttool -I -b 20:CD:39:A5:3B:62
启动gatttool程序。
可以通过:
root@edison:~# ./gatttool -help
来获取帮助。
6.3 Advanced audio distribution profile (A2DP)
Edison平台支持A2DP profile,这个配置文件可以规定音频流如何通过蓝牙从一个设备向另一个设备传输。A2DP服务是单方向的音频流传输,存在传输源和传输目的设备(原文中是sink
),最多2通道的立体声,而Edison可以两者中的任何一者。将Edison作为传输源的操作:
root@edison:~# bluetoothctl
[bluetooth]# scan on
[bluetooth]# trust 00:18:6B:4E:A4:B8
[bluetooth]# pair 00:18:6B:4E:A4:B8
[bluetooth]# connect 00:18:6B:4E:A4:B8
[bluetooth]# scan off
在Edison上修改一个文件,定义A2DP设备为一个sink设备,同时定义设备名和MAC地址。
查看默认的未定义设备ID:
root@edison: /usr/lib/bluez/test# pactl list sinks
修改设备:
root@edison: /usr/lib/bluez/test# pactl set-default-sink bluez_sink.00_18_6b_4e_a4_b8
然后,通过SCP将音频文件复制到Edison,用mplayer播放,就可以在一个蓝牙音频播放设备上播放了。
6.4 Device identification (DI) profile
这个配置文件用于查询蓝牙的相关信息,包括:
- VendorID source: VendorID的制定者,0x0001
为bluetooth SIG组织,0x0002
为USB Group。
- VendorID (16位)
- DeviceID (16位)
- Version (16位)
6.4.1 Reading and Changing the local device identification
通过bluetoothctl 程序中的show命令可以查看这些信息:
[bluetooth]# show
通过修改`/etc/bluetooth/main.conf文件,可以修改部分参数,必须重启蓝牙服务和bluetoothctl程序。
6.4.2 Retrieving the peer device’s DI information
可以通过两种方式来查询匹配设备的DI信息:
- sdptool: 存在于Edison和Ubuntu电脑上的工具,支持bluez4.x和5.x。通过与匹配设备建立SDP服务来查询;
- bluetoothctl: 存在于Edison中,支持bluez5.x。通过查询匹配设备发来的EIR包来查询。
[email protected]: ~# sdptool browse --tree --uuid 0x1200 98:0d:2e:c8:bd:2c
[bluetooth]# info 98:0D:2E:C8:BD:2C
6.5 Human interface device (HID) profile
通过HID配置文件,可以连接到任意的人机接口设备,如蓝牙鼠标、蓝牙键盘等。在Edison上不需要注册任何服务。
root@edison:~# rfkill unblock bluetooth
root@edison:~# bluetoothctl
[bluetooth]# agent DisplayYesNo
[bluetooth]# default-agent
[bluetooth]# scan on
[bluetooth]# pair [MAC地址]
[bluetooth]# scan off
[bluetooth]# connect [MAC地址]
[bluetooth]# info [MAC地址]
[bluetooth]# quit
通过more指令可以查看是否连接成功,因为当连接后,一个/dev/input/eventX
文件将会被建立,X为任意数字,通过more指令可以检查这个文件,从而确定设备被正确连接。
打开是乱码,可以通过evtest
解码,下载http://cgit.freedesktop.org/~whot/evtest
。
6.6 Personal area networking (PAN) profile
个人局域网(简称个域网,英文名PAN),可以用来定义两个或多个蓝牙设备组成网络,并通过一个网络连接点连接到其他网络。个域网配置文件定义了怎样来使用蓝牙网络封装协议(BNEP——Bluetooth Network Encapsulation Protocol)来给蓝牙设备提供网络兼容性。个域网配置文件角色包括:
- NAP: Network access point,网络节点
- GN: Group ad-hoc network,群无线自组织网络
- PANU: Personal area network user,个域网用户
NAP和GN提供了不同的网络需求服务。NAP提供了每个蓝牙设备的连接服务,而GN允许两个或多个设备组成自组织网络。
Edison中对PAN中的NAP和GN有一些修改,需要下载测试脚本来调试PAN服务,这个测试脚本是BlueZ的一部分,并不包括在Edison镜像中,可以通过http://git.kernel.org/cgit/bluetooth/bluez.git/tree/test
的test文件夹内找到。
- 通过
-s
参数选择不同的角色。(没看懂。。。) - 压缩并且复制BlueZ测试包,通过SCP传输到Edison。
- 解压并且复制BlueZ测试包到Edison。 (什么鬼?,下边附原文,自己理解)
- 使能蓝牙。
- Select the role with the -s option.
- Compress and copy the BlueZ test package into the Intel Edison board via scp.
- Unzip and copy BlueZ test package into the Intel Edison board.
- Enable Bluetooth as described in chapter 4 Scanning and Connecting Device.
完成这些步骤,就可以通过一个Linux主机和一个Edison设备之间建立PAN网络,或者在两个Edison设备之间建立PAN网络。
6.6.1 PAN test between Linux host PC and Intel Edison device
- 在Edison设备上打开
connman
并允许蓝牙。 - 在Linux主机上查看PC Bluetooth地址。
- 匹配设备。
- 在Edison上创建一个桥接并配置地址。
root@edison:~# brctl addbr br0
root@edison:~# ip addr add 192.168.10.1 dev br0
root@edison:~# ip link set br0 up
root@edison:~# ifconfig
显示的结果是:UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
,然后可以通过ifconfig
命令检查桥接状态。
5. 在Edison上加载PAN测试脚本,将会注册一个NAP服务。
root@edison:~/test-bluez# ./test-pan -s nap br0
root@edison:~/test-bluez# ./test-nap br0
在第一步中建立的bnep0
接口将会添加到br0
桥接中。
备注:这个脚本中只允许几分钟的网络连接状态,如果需要长时间连接,则需要修改脚本内容。
6. Linux主机作为一个PANU设备,需要在Linux主机上安装BlueZ包,通过pand
:
备注:在BlueZ4中,pand服务接口是允许的,但在BlueZ5中则不允许。
user@peter:~/$ sudo apt-get install bluez-compat
通过pand命令来绑定:
user@peter:~/$ sudo pand -n --connect 00:11:22:33:55:77 --service NAP
7.在Edison上通过ifconfig -a
查看网络状态。
8.在Linux主机上通过ifconfig -a
查看网络状态。
此时如果一切顺利,bnep接口将会增加到桥接中。
有时bnep不会显示,需要执行:
sudo ip link set bnep0 up
9.用一个IP地址来配置接口,并ping:
user@peter:~/$ sudo ip link set bnep0 up
user@peter:~/$ sudo ip addr add 192.168.10.10 dev bnep0
user@peter:~/$ sudo ip route add 192.168.10.0/24 via 192.168.10.10
root@edison:~# ip addr add 192.168.10.2 dev bnep0
root@edison:~# ip route add 192.168.10.0/24 via 192.168.10.1
10.最后就可以互相ping通了。
我没有尝试这个实验,仅仅是看了看。
6.6.2 PAN test between two Intel Edison devices (未完成)
暂不看,因为没有两个Edison。
6.7 Serial port profile (SPP)
SPP(Serial port profile 串口协议)是基于ETSI 07.10 和 RFCOMM 协议,定义了两个蓝牙设备之间如何通过创建一个虚拟/仿真串口连接来进行通信。
- SDP(Bluetooth Service Discovery Protocol 蓝牙服务发现协议),允许蓝牙设备之间搜索服务。
- 设备通过RFCOMM协议接收到一个传入的连接,在SPP协议中在SDP发现一个记录表明,RFCOMM通道处于接听状态。(@[email protected])
- 设备初始化一个连接时,首先在设备数据库中搜索SPP记录,然后才可能初始化一个连接到对应匹配设备的RFCOMM服务通道。(@[email protected])
- SDP is the Bluetooth Service Discovery Protocol, which allows devices to provide browsing services to each other.
- Devices accepting an incoming connection over RFCOMM expose a record in SDP for SPP indicating that the RFCOMM channel is listening.
- Devices iniltiating a connection will first search for SPP records on the peer device database and in turn may initiate a connection to the RFCOMM server channel on a peer device.
我们可以通过创建一个在两个设备之间通过蓝牙传输的虚拟串口来测试这个功能。使用SPP从一个蓝牙设备到另一个蓝牙设备之间发送信息。我们可以修改:
- 通过DBUS APIs验证SPP。推荐。
- 通过RFCOMM工具来验证SPP。
之所以推荐DBUS APIs来验证SPP,是因为它可以将文件描述符(file descriptor)提供给用户来用于连接,可以直接使用发送和接收数据。RFCOMM工具在fd可行时是不允许的。RFCOMM用于设置开始、维持以及检查在Linux内核蓝牙子系统中的RFCOMM配置。(一个模拟串口设备文件被创建并通过SPP被打开来读写数据,并不需要使用DBUS接口打开一个文件设备,因为在用户空间下,fd连接在DBUS接口下已经建立)。(@[email protected])
an emulated TTY device file is created and it has to be opened to read/write data over SPP, whereas when using DBUS interfaces opening of the device file is not needed as fd connection is already available with DBUS interfaces in userspace.
测试脚本中有连接方法,可以修改这个配置脚本:
root@edison:~# vi /etc/dbus-1/system.d/bluetooth.conf
如果这个文件中没有一行:
<allow send_interface="org.bluez.Profile1"/>
就在文件中添加这一行,保存文件。
6.7.1 SPP verification using DBUS APIs
很容易可以通过使用test-profile python脚本来在RFCOMM socket文件的应用层上实现验证,test-profile python脚本在BlueZ协议栈的文件夹内:http://git.kernel.org/cgit/bluetooth/bluez.git/tree/test
。英特尔修改了最初的源文件,提供了一个循环接收数据的脚本,并且重命名文件为SPP-loopback.py
。这个文件在附录中,也可以在:http://downloadmiror.intel.com/24909/eng/SPP-loopback.py下载。
将这个脚本下载到Edison中,比较与test-profile.py
脚本的区别。在运行SPP-loopback.py
脚本前,先通过bluetoothctl -> show
命令检查是否存在。
运行SPP-loopback.py脚本:
root@edison:~# chmod +x SPP-loopback.py
root@edison:~# ./SPP-loopback.py &
注意,通过SCP传送到Edison上的文件默认都是没有文件执行权限的,所以要手动添加执行权限。&
符号是说让程序运行到后台,释放当前命令行。
然后搜索匹配设备,并保证自身可被发现:
[bluetooth]# scan on
[bluetooth]# discoverable on
搜索到设备后,与该设备配对,并信任该设备:
[bluetooth]# pair 00:11:22:33:55:77
[bluetooth]# trust 00:11:22:33:55:77
Edison上设置完毕。
在安卓手机上下载一个软件:Bluetooth spp pro
,确保手机上打开蓝牙,通过该软件搜索蓝牙设备,找到Edison设备,并建立连接。在Edison终端上可以发现已经打印出了建立连接的文字,然后通过手机字符流的方式给Edison蓝牙发送文本,可以在Edison上接收到。成功实现通过DBUS APIs来测试SPP 验证。
当时参考了一篇文章:http://kurtqiao.github.io/iot/2015/06/29/Intel-Edison-Board-Bluetooth-control-GPIO.html
6.7.2 SPP verification using the RFCOMM tool (未完成)
Edison必须要监听前来的连接信号。可以通过RFCOMM工具来设置、保持或者是检查处于Linux内核中的蓝牙子系统的RFCOMM配置信息。
当成功连接了一个Edison设备与一个Linux设备或是一个安卓设备时,我们也应该去匹配其他的蓝牙设备。
6.7.2.1 Edison配置
1.对RFCOMM通道增加SDP接口
root@edison:/usr/lib/bluez/test# ./test-profile -u 1101 -n edisonSpp -s -P 3 -C 22 serial22
2.打开RFCOMM来监听发送连接请求的匹配设备
root@edison:~# rfcomm listen 0 22
0是指/dev/rfcommX
设备将会被创建,22是指RFCOMM通道。
Android设备连接到了RFCOMM通道1,所以这里选择了22通道,为了不造成冲突。
3.使用bluetoothctl的scan on命令,来发现一个设备
4.配对该被发现的设备
6.7.2.2 Android 设备
在Android设备上下载一个APP:Bluetooth SPP Pro
或者BlueTerm/BlueTerm+
,然后匹配Edison设备。
1.在Edison设备上启用RFCOMM,监听匹配设备上的请求信息
2.通过手机上的APP连接Edison的蓝牙设备,在Edison上:
root@edison:~# rfcomm listen 0 1
3.手机上发送测试文本到Edison
4.Edison上查看手机发来的测试文本
root@edison:~# cat /dev/rfcomm0
Linux电脑设备
这部分内容原文中乱糟糟的,好多话都重复着说
1.使用RFCOMM工具连接Edison设备与Linux PC
在Linux PC上:
user@peter:~$ sudo rfcomm connect 0 00:11:22:33:55:77 22
在Edison设备上:
root@edison:~# rfcomm listen 0 22
2.连接建立以后,在两个设备上都会出现/dev/rfcommX
设备,X为普通数字。如果看到”NewConnection”描述出现时(说明当时运行有test-profile脚本),说明当前脚本不是RFCOMM工具的文件,这时,需要停止test-profile脚本然后重新做第1步。
3.在Linux电脑上,验证/dev/rfcommX
: —-(Linux收,方法1)
user@peter:~$ sudo cat /dev/rfcommX
里边的内容,或者加载Minicom,然后进入cat /dev/rfcommX验证。—-(Linux收,方法2)
user@peter:~$ sudo minicom -D /dev/rfcomm0
在Edison上,验证/dev/rfcommX
: —-(Edison收)
root@edison:~# cat /dev/rfcomm0
添加内容: —-(Edison发)
root@edison:~# echo ‘<text>‘ > /dev/rfcommX
4.在linux电脑上进入minicom程序,检查窗口,发新消息。—-(Linux收发)
5.在Edison上,通过cat检查/dev/rfcommX
内容。—-(Edison收)
6.在Edison上,通过echo命令发送消息。—-(Edison发)
7.在Linux电脑上,使用cat命令查看信息。 —-(linux收)
6.8 HID over GATT profile (HOGP)
从这节开始,和原文相差了一个序号单位,原文的这一节是6.9,如果问我为什么少了一节,能先找到原文中6.8节的请联系我。