Edison 蓝牙模块 学习笔记

Edison 蓝牙模块 学习笔记

固定链接:https://www.zybuluo.com/SiberiaBear/note/212527


本笔记基于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
    • 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 blockrfkill unblock可以直接驱动芯片的开启与关闭;

rfkill unblock bluetooth可以同时起到systemctl start connmanconnmanctl 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 connmanconnmanctl enable bluetooth的功能,所以我尝试rfkill block/unblocksystemctl stop/start bluetooth。结论:systemctl stop/start bluetooth是系统级的蓝牙控制,当在这里关闭蓝牙时,无法对蓝牙进行任何操作,包括bluetoothctl等程序,这时打开该程序显示的[bluetooth]是灰色的;rfkill block/unblock bluetooth是管理蓝牙控制的,如果阻塞后,无法控制蓝牙进行指定的任务,bluetoothctl可以正常进入,[bluetooth]显示是正常的蓝色,但是无法进行设备搜索等功能,提示

No default controller available

遇到一个问题

3.3 The bluetoothctl utility

bluetoothddaemon 通过 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和一系列的扩展工具,像hcitoolbtmgmt,推荐使用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

  1. 在Edison设备上打开connman并允许蓝牙。
  2. 在Linux主机上查看PC Bluetooth地址。
  3. 匹配设备。
  4. 在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节的请联系我。

6.9 Heart rate profile (HRP)

6.10 Proximity profile (PXP)

6.10.1 PXP service

6.10.2 PXP test

6.10.3 Proximity monitor

6.10.4 Proximity reporter

6.11 Time profile (TIP)

6.12 File transfer protocol (FTP) profile

6.12.1 FTP server

6.12.2 FTP client

Appendix A: SPP-loopback.py

时间: 2024-10-15 13:03:44

Edison 蓝牙模块 学习笔记的相关文章

Ti CC2540蓝牙模块学习笔记整理

接触CC2540几天,终于有了初步的理解,现将笔记整理如下,只是皮毛,如有错误,还请指正,还有好多没闹明白的地方,以后应该还会继续向里面更新~ 一.整体 1.TI的蓝牙平台支持2种协议栈/应用配置:单一设备配置.网络处理器配置 2.协议栈最顶层2个通用profile: GAP 通用访问配置文件层 Generic Access Profile GATT 通用属性配置文件层 Generic Attribute Profile 3. GAP:处理设备的接入方式及接入过程:①设备发现 ②链路建立 ③链路

Node.js笔记(0003)---Express框架Router模块学习笔记

这段时间一直有在看Express框架的API,最近刚看到Router,以下是我认为需要注意的地方: Router模块中有一个param方法,刚开始看得有点模糊,官网大概是这么描述的: Map logic to route parameters. 大概意思就是路由参数的映射逻辑 这个可能一时半会也不明白其作用,尤其是不知道get和param的执行顺序 再看看源码里面的介绍: Map the given param placeholder `name`(s) to the given callbac

Android Bluetooth模块学习笔记

一.蓝牙基础知识 1.蓝牙( Bluetooth )是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.蓝牙基于设备低成本的收发器芯片,传输距离近.低功耗. 2.微波频段:使用2.402GGHz到2.480GHz(包括防护频带)的ISM波段的UHF无线电波 3.蓝牙使用跳频技术,将传输的数据分割成数据包,通过79个指定的蓝牙频道分别传输数据包.每个频道的频宽为1MHz. 4.蓝牙是基于数据包.有着主从架构的协议.一个主设备至多可和同一微微网中的七个从设备通讯.所有设备

Python模块学习笔记— —random

Python中的random模块用于生成随机数. random.random 函数原型 random.random() 生成一个范围在[0,1)的随机浮点数. import random print random.random() random.uniform 函数原型 random.uniform(a,b) 生成一个指定范围内的随机浮点数,两个参数一个是上限,一个是下限.如果a > b,则生成的随机数范围在[b,a].否则, 范围在[a,b]. import random print rand

Python requests模块学习笔记

1.Requests模块说明 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. 在Python的世界里,事情不应该这么麻烦. Requests 使用的是 urllib3,因此继承了它的所有特性.Request

Python模块学习笔记— —time与datatime

Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.首先对time模块中最常用的几个函数作一个介绍,它提供的接口与C标准库time.h基本一致.然后再介绍一下datatime模块,相比于time模块,datetime模块的接口则更直观.更容易调用. time模块 time.time time.time()函数返回从1970年1月1日以来的秒数,这是一个浮点数. import time print time.time() time.sleep 可以通过调

Python模块学习笔记— —glob

glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用windows下的文件搜索差不多.查找文件只用到三个匹配符:"", "?", "[]".""匹配0个或多个字符:"?"匹配单个字符:"[]"匹配指定范围内的字符,如:[0-9]匹配数字. 方法 glob.glob() 返回所有匹配的文件路径列表.它只有一个参数pathname,定义了文件路径匹配规则,

ansible debug模块学习笔记

ansible playbook可以将多个命令组合来执行,但是很多时候我们需要接收服务器的反馈,所以debug模块就非常重要了. 调试模块,用于在调试中输出信息 常用参数: msg:调试输出的消息 var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出 verbosity:debug的级别(默认是0级,全部显示) 例程: - name: Print debug infomation eg1   hosts: test2   gather_facts: F   va

matplotlib模块学习笔记

Python有很多可视化工具,matplotlib是其中重要的一个. matplotlib API函数都位于matplotlib.pyplot模块中,其通常的引入约定是: import matplotlib.pyplot as plt matplotlib的图像都位于Figure对象中,创建新的Figure方法为: fig = plt.figure() 绘图不能直接在空Figure上,需要用add_subplot创建一个或多个subplot: ax1 = fig.add_subplot(2,2,