通过蓝牙低功耗(BLE)从Android连接到Intel® Edison





0/5 (0投票)
本文档旨在展示如何编写代码和连接硬件,以在 Intel Edison 和配备蓝牙 4.0 的 Android 设备之间建立 BLE 通信,使用免费的软件工具和低成本的现成硬件。
访问新的 Intel® IoT Developer Kit,这是一个完整的硬件和软件解决方案,允许开发人员使用 Intel® Galileo 和 Intel® Edison 板开发激动人心的新解决方案。请访问 Intel® 物联网开发者中心。
目录
引言
蓝牙* LE (BLE) 通信在商业产品和爱好应用中的使用正在爆炸式增长,这主要归因于其低成本和低功耗要求。当您想从 Android* 手机或平板电脑与 Intel® Edison 或 Intel® Galileo 项目进行通信时,这是一个绝佳的选择。
本文档旨在展示如何编写代码和连接硬件,以在 Intel Edison 和配备蓝牙 4.0 的 Android 设备之间建立 BLE 通信,使用免费的软件工具和低成本的现成硬件。
什么是 BLE?
蓝牙低功耗(Bluetooth Low Energy、Bluetooth LE 或简称 BLE,也称为 Bluetooth Smart)是由蓝牙技术联盟(Bluetooth Special Interest Group)设计和推广的一种无线个人区域网络技术。它面向医疗保健、健身、安全、自动化和家庭娱乐等行业。
BLE 最初由诺基亚(Nokia)于 2006 年以“Wibree”的名称推出。它于 2010 年作为蓝牙 4.0 版本的一部分被添加到蓝牙标准中。
BLE 允许设备比标准蓝牙连接使用更少的电量,同时仍提供常规蓝牙的大部分连接性,并且范围约为一半(约 15 米/50 英尺)。使用蓝牙 LE 的电池供电设备可以运行数年而无需充电或更换电池。Estimote 等公司的信标设备已声称电池寿命为三年(www.estimote.com)。
硬件
我们将重点关注 Intel Edison,但大部分内容也适用于 Intel Galileo。对于我们的物联网项目,我们将使用的物理传感器和控制器来自 Shenzhen(思创)的 Grove 系统。具体来说,我们将使用:
- 带有 Arduino 扩展板的 Intel Galileo
- 用于 Galileo GEN 2 的 Seeed Grove – 入门套件增强版 Intel® 物联网版
- Seeed Grove BLE
- 运行 Android 4.3 或更高版本的 Android 设备(我使用的是联想 TAB S8-50)
- 运行 Windows* 7 或 8 进行开发的 PC(我使用的是 Dell XPS12)
关于硬件的一些说明
- Grove 入门套件标有专为 Intel Galileo 设计,但它与 Edison 配合良好。您也可以单独购买 Grove 组件,但套件可能更经济。
- 我在开发过程中使用了我的联想 Android 平板电脑,但任何运行至少 Android 4.3 并支持蓝牙 4.0 的 Android 设备都应该可以使用。
- 我使用我的 Dell XPS12 为 Intel Edison 和 Android 项目(以及本文)编写代码。开发也可以在 Mac* 或 Linux* 系统上进行。
软件
我使用了一些免费的软件工具。要完成本示例,您需要根据需要下载并安装它们。
- 适用于 Intel® Galileo 的 Arduino IDE: https://communities.intel.com/docs/DOC-22226
- Android Studio: https://developer.android.com.cn/sdk/installing/studio.html
- Android SDK: https://developer.android.com.cn/sdk/index.html?hl=i
以上所有软件均适用于 Windows、Mac 和 Linux,但我将专门介绍 Windows 上的安装。
仔细查看硬件
Intel® Edison
Intel® Edison 是首款推出的低成本、通用计算平台系列。它旨在实现物联网项目的快速便捷原型开发,同时为商业化提供产品就绪的路径。
Intel® Edison 使用 22nm Intel® SoC,包含一个双核 Intel® Atom™ CPU,运行频率为 500MHz。它支持 40 个 GPIO,并包含 1GB LPDDR3 RAM、4 GB EMMC 存储,以及双频 Wi-Fi* 和蓝牙,外形小巧。
在底层,Edison 运行一个完整的 Linux 内核,要充分发挥 Edison 的性能,您需要编写硬件级别的 Linux 代码。
但 Edison Linux 还包含一个作为 Linux 程序的 Arduino 实现。简而言之,这意味着您可以编写熟悉的 Arduino 草图并在 Galileo 上运行它们。这正是我们将要做的。
在此处了解更多关于 Intel Edison 的信息: http://www.intel.com/content/www/us/en/do-it-yourself/edison.html
Arduino 扩展板
Intel Galileo 的 Arduino 扩展板有两个目的。首先,它提供了一个更大的原型开发平台,方便访问 IO 引脚。其次,它提供了一个与 Arduino 兼容的硬件平台,这意味着我们可以将标准的 Arduino 扩展板与 Intel Edison(就像 Intel Galileo 一样)一起使用。图 1 显示了安装在 Arduino 扩展板上的 Edison。
Grove Starter Kit Plus
该套件的全称为“Grove Starter Kit Plus - Intel® IoT Edition for Intel® Galileo Gen 2 Developer Kit”,最初是为 Intel Galileo 第二代主板设计的。幸运的是,它通过 Arduino 扩展板与 Intel Edison 完全兼容。
该套件(如图 2 所示)旨在简化传感器、执行器和扩展板的安装和原型开发。它包含一个与 Arduino 兼容的扩展板,带有标准化的四针连接器。这些连接器连接到 IO 端口,通过随附的电缆连接到套件中的传感器和控制器。这意味着您可以构建项目,而无需处理小导线和上拉/下拉电阻,也无需担心极性。
在此处了解更多或购买套件: http://www.seeedstudio.com/depot/Grove-starter-kit-plus-Intel-IoT-Edition-for-Intel-Galileo-Gen-2-p-1978.html
Grove 套件的创建者 Seeed Studios 在线提供了许多有用的资源。
特别是,我建议在此处克隆或下载 Sketchbook Starter 存储库: http://Github.com/Seeed-Studio/Sketchbook_Starter_Kit_V2.0
并在此处收藏 Grove Wiki 页面: http://www.seeedstudio.com/wiki/index.php?title=Main_Page#Grove
Grove BLE V1
我们将使用 Grove 蓝牙低功耗 v1 模块,该模块不包含在入门套件中,但与 Grove 扩展板和连接线兼容。它也是一个相对低成本的 BLE 附加模块,在撰写本文时是我找到的最便宜的选择。
Grove BLE v1 基于行业标准 Texas Instruments CC2540。许多其他设备都使用此芯片。如果您有其他 TI CC2540 BLE 模块,例如 RedBear BLE Mini,您应该能够轻松地调整示例代码。
在此处了解 Grove BLE v1: http://www.seeedstudio.com/wiki/index.php?title=Grove_BLE_v1&uselang=en
请注意,Intel® Edison 包含一个支持 Wi-Fi 和蓝牙 4.0/BLE 的板载无线模块;然而,Grove BLE 模块将极大地简化硬件和软件设置。使用 Grove BLE(图 3)也意味着这些项目可以轻松地适配到 Intel Galileo。
在 Android 设备上调试
BLE 支持已添加到 Android 4.3(API 级别 18)版本中。您需要运行 4.3 或更高版本的设备才能通过 BLE 进行通信。
在此处了解更多关于 Android BLE 的信息: https://developer.android.com.cn/guide/topics/connectivity/bluetooth-le.html
如果您是 Android 开发新手,在使用设备运行和调试软件之前,需要先启用手机或平板电脑上的开发者选项。打开设置应用,滚动到最底部,选择“关于设备”,然后连续点击“版本号”七次以解锁开发者选项。
现在,“开发者选项”将显示在设置下方;请务必勾选“USB 调试”。
在此处了解更多关于 Android 开发者选项的信息: https://developer.android.com.cn/tools/device.html
安装软件并准备编码!
适用于 Intel® Galileo 的 Arduino IDE
您需要下载专门准备的 Arduino IDE 版本才能将草图部署到 Intel Edison 或 Galileo。在撰写本文时,当前版本为 1.5.3,可在以下网址获取:
https://communities.intel.com/docs/DOC-22226
Intel® Edison 驱动程序
您还需要从上面的链接下载并安装 Intel Edison 驱动程序。它应该是页面上“驱动程序软件”下的最后一个链接。在撰写本文时,版本为 1.0.0。
如果您需要进一步的说明,有一个出色的入门指南。
https://communities.intel.com/docs/DOC-23147
Android Studio
Android Studio 是一个基于 IntelliJ IDEA* (https://www.jetbrains.com/idea/) 的新的 Android 开发 Java* IDE。它目前处于 Beta 阶段,但稳定且功能相当齐全。如果您习惯使用 Eclipse* 进行 Java Android 开发或 IntellliJ IDEA,您应该能够轻松地按照任一工具的演练进行操作。
Android Studio 通过包含 Android SDK 来简化安装过程。只需下载,解压 zip 文件内容,然后在 bin 文件夹中运行 studio.exe。
在此处了解更多关于 Android Studio 的信息: https://developer.android.com.cn/sdk/installing/studio.html
Android SDK
您可能需要下载额外的 SDK 包。要做到这一点,请在 Android Studio 的工具栏上点击“SDK Manager”。配置 Android SDK 超出了我们的范围,但您可以在此处获取更多信息:
https://developer.android.com.cn/sdk/installing/adding-packages.html
如果您之前安装过 Android SDK,您可以配置 Android Studio 并指向正确的路径,如图 4 所示。
在 Android Studio 中,点击配置 -> 项目默认设置 -> 项目结构并设置路径。
测试 Intel® Edison
在开始下面的演练之前,请确保您能够运行 Blink 示例草图。它包含在 Arduino IDE 下载包的examples -> 01.Basics -> Blink 文件夹中。
有关更多信息,请参阅 Edison 入门指南。
https://communities.intel.com/community/makers/edison/getting-started
Android Hello World
安装 Android Studio 后,请确保您能够创建一个新项目并在您的 Android 设备上运行它。
- 将您的 Android 设备连接到您的 PC。
- 打开 Android Studio
- 选择“新建项目…”
- 选择名称和位置,然后单击“下一步”3 次(API 15/空白活动)。
- 单击“完成”并等待项目创建(这可能需要 20 秒以上)。
- 按工具栏上的绿色播放图标。
- 选择您的设备并按“确定”。
如果一切顺利,您应该会在 Android 屏幕上看到“Hello world!”(图 5)。
BLE 是如何工作的?
BLE 的工作原理是通过在需要时发送短数据突发,然后关闭电源。这在一定程度上解释了蓝牙 LE 为什么能消耗如此少的能量。与常规蓝牙的传统配对方法不同,BLE 设备仅在需要发送或接收信息时才进行连接。
BLE 在通信方面具有高度的结构化。设备公开服务来发送和接收数据,这些服务具有称为“特性”的元素,它们定义了可以共享的数据。为了获得更详细的信息,特性可以具有描述符,这些描述符有助于定义数据。例如,您可以有一个标记为“心率监测器”的服务,其中包含“心率测量”等特性。
大多数蓝牙 LE API 都允许搜索本地设备并发现这些设备上的服务、特性和描述符。
BLE 关键术语和概念
以下是您在开始 BLE 项目之前应理解的关键 BLE 术语和概念的简要摘要:
通用属性配置文件 (GATT)
GATT 配置文件是用于通过蓝牙低功耗链路发送和接收短数据片段(称为“属性”)的通用规范。所有当前的 LE 应用配置文件都基于 GATT。蓝牙技术联盟 (SIG) (https://www.bluetooth.org) 已预定义了许多 BLE 设备配置文件。这些配置文件描述了设备如何使用的规范。
属性协议 (ATT)
属性协议 (ATT) 是 GATT 的基础。ATT 是一种为 BLE 设备专门设计的优化协议。ATT 通信发送的数据字节最少。每个属性都有一个通用唯一标识符 (UUID),这是一个标准化的 128 位字符串 ID,用于唯一标识信息。ATT 传输的属性格式化为特性和服务(下文定义)。
特性
一个特性包含一个单独的值和 0 个或多个描述符(下文)来描述该特性的值。
描述符
描述符是定义的属性,用于描述特性的值。这些可能是人类可读的描述、指定单位或测量,或者定义可接受的值范围。
Service
服务是特性的集合。您可以在此处找到现有基于 GATT 的配置文件的列表: https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
将数据从 Android 发送到 Intel® Edison
必备组件
本文档的其余部分假定您已设置好开发系统并配置好 Intel Edison 和 Android 开发环境。请确保已完成以下步骤,并在需要时回顾前面的内容。
- 安装 Intel Arduino IDE
- 安装 Intel Edison 驱动程序
- 安装 Android Studio
- 安装 Android SDK
- 在 Intel Edison 上部署和运行 Blink 演示
- 在 Intel Edison 上部署和运行空的 Hello world Android 项目
Android 中的 BLE
您可以在此处从 GitHub 下载已完成的项目:
https://github.com/adrianstevens/Edison_to_Android_BLE/tree/master/Android/BLEConnect
但我建议创建您自己的项目,并通过参考上面的链接逐行引入代码。
创建新项目
打开 Android Studio(或您选择的 IDE),创建一个新的空白 Android 应用程序,并将其命名为 BLEConnect。确保将最低 SDK 设置为至少 API 18。否则,您将无法使用 BLE API。
接下来,通过打开 AndroidManifest.xml 并将以下内容添加到 <application>
标签上方,来添加所需的权限:
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
设置用户界面
为保持简单,我们将仅使用默认布局,但我们需要为 TextView 设置一个 ID。打开 layout -> activity_main.xml,选择 TextView,并将 ID 设置为 mainText
,以便我们可以在代码中引用它。
MainActivity
对于此项目,其余代码放在 MainActivity 中。如果您逐行添加代码,请注意 Android Studio 会自动检测缺失的导入并提示您添加它们。
示例代码执行以下操作:
- 检查 Android 设备上的 BLE 支持。
- 搜索附近的 BLE 设备。
- 识别并连接到 Grove BLE 模块。
- 搜索可用服务以找到已知的通信服务。
- 在通信服务中找到传输特性。
- 通过写入特性值来发送消息。
我将不在这里介绍每一行代码,但我们会关注核心概念。
类级别变量和静态值
我们将存储连接到 BLE 模块、搜索服务以及发送消息过程中的一些值。我们还将为 Grove BLE v1 (TI CC2540) 添加一些已知的静态值。如果您使用的是不同的模块,可能需要更改这些值。特别是,我建议定义传输和接收特性,例如:
CHARACTERISTIC_TX = "0000ffe1-0000-1000-8000-00805f9b34fb" CHARACTERISTIC_RX = "0000ffe1-0000-1000-8000-00805f9b34fb"
状态辅助方法
为了简单起见,我们在前面标记的 TextView 上显示进度。代码包含一个简单的辅助方法,名为 statusUpdate
,我们用它将状态消息写入屏幕和控制台。它还会回传到 UI 线程,因此我们可以安全地从任何线程调用它。
连接到 BLE 设备
要获取对蓝牙管理器 (Bluetooth Manager) 的引用,我们首先检查我们的设备是否支持 BLE,然后调用 getSystemService
来获取对蓝牙管理器的引用 (BluetoothManager
),然后调用 getAdapter()
方法来获取对 BluetoothAdapter
对象的引用。或者,您也可以直接从 BluetoothManager 类使用静态辅助方法 getDefaultAdapter
。
搜索附近的 BLE 设备
要搜索设备,我们使用计时器来搜索设定的时间段。我们调用蓝牙管理器对象的 startLeScan
并传入一个回调对象,以便在找到设备时收到通知。
API 会持续扫描设备,因此我们可能会为每个设备在 LeScanCallback
中收到多个通知,所以我们会在保存设备条目之前检查其唯一性。我们还会检查设备名称是否是我们需要的模块,并保存一个引用。对于此示例,我们实际上不需要将设备保存到列表中。
@Override public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) { … }
查找通信服务
大多数 BLE 设备都公开一个或多个服务用于通信/交互。我们 Grove BLE 中的 TI CC2540 芯片有一个关键服务,其 ID 为“0000ffe0-0000-1000-8000-00805f9b34fb”。接下来,我们将查找并保存该服务的引用。
首先,我们需要连接到设备。为了在连接或发现服务时收到通知,我们需要一个 BluetoothGattCallback
对象,我们重写 onConnectionStateChanged
和 onServicesDiscovered
。
请注意,在 onConnectionStateChanged
方法中,当我们收到连接通知时,我们会调用 mBluetoothGatt.discoverServices()
来搜索服务。一旦我们找到想要的服务,就可以发送消息了。
@Override public void onConnectionStateChange (BluetoothGatt gatt, int status, int newState) { … } @Override public void onServicesDiscovered (BluetoothGatt gatt, int status) { … }
可以重写许多其他方法。请在此处参阅文档:
https://developer.android.com.cn/reference/android/bluetooth/BluetoothGattCallback.html
发送消息
在示例代码中有一个 sendMessage
方法。我们通过其 UDID 识别所需的特性,然后调用该特性的 setValue
。最后,我们在 BluetoothGatt
引用上调用 writeCharacteristic
,将特性作为值传递以发送数据。
setValue
有多个重载,实际上有一个更简单的重载可以发送字符串,但由于大多数 BLE 通信都将命令作为字节发送,因此这是一个更有用的示例。
现在是时候设置 Intel Edison 了。
使用 Grove 扩展板和 BLE 模块设置 Intel® Edison
首先组装基本硬件。如果您还没有这样做,请将 Intel Edison 安装到 Arduino 扩展板上。
接下来,将 Grove 扩展板安装上去,将扩展板底部的引脚对准 Arduino 扩展板。然后将 Grove BLE v1 连接到串行 UART 端口。
我们的第一个草图
我们将进行一些简单的串行通信,在我们的 Android 设备和 Intel Edison 之间。但我们也想看到发送和接收的内容,所以我们将使用 Arduino IDE 内置的串行监视器。
您可以在此处查看草图的完整版本:
https://github.com/adrianstevens/Edison_to_Android_BLE/tree/master/Sketches/SimpleSerial
打开 Intel Arduino IDE 并创建一个新草图。让我们将其保存并命名为“SimpleSerial”。与其他一些 Arduino 兼容板不同,Intel Edison 有两个串行端口可供我们使用。这非常有用,因为它允许我们从 PC 与 Edison 通信,同时 Edison 通过 Grove BLE 发送和接收数据。主要的串行 UART 通过连接到 PC 的 microUSB 访问,我们使用连接到 BLE 模块的 Grove 扩展板上的 UART 连接器。
我们的草图在部署到 Intel Edison 后会自动运行。它首先运行 setup()
函数,然后连续无限次调用 loop()
函数。这使我们能够读取串行连接的输入并对其做出响应。
初始化串行连接
Grove BLE 的默认通信速度为 9600 波特,所以我们从这个速度开始。我们需要将两个串行端口配置为使用此速度。我们还需要向 Grove BLE 发送一些 AT 命令来重置它并将其置于全新状态。您可以在草图的 setup()
函数中看到所有这些。
请注意,我们首先配置“Serial”,这是 microUSB 端口 UART,然后是“Serial1”,这是连接到 Grove BLE 的 UART。
循环
在此草图中,我们所做的只是从一个串行端口读取数据并将其发送到另一个串行端口。为此,我们将调用串行端口的 read()
函数,它会返回单个字符,然后调用另一个串行端口的 print()
。
Edison 的循环速度足够快,我们能够轻松跟上 9600 波特的速度。
部署草图
现在点击 Arduino IDE 上的验证按钮(复选标记)并修复任何拼写错误。一旦验证通过,请确保您的 Intel Edison 已连接到 PC 并上传草图(右箭头)。传输完成后,草图开始循环,我们就可以从 Android 应用进行连接了。现在在 Arduino IDE 上打开串行监视器(右上角的放大镜),以便我们可以发送和接收数据。
一旦草图在 Intel Edison 上运行,就运行 Android BLEConnect 应用。您应该会在串行监视器中看到消息“Hello Grove BLE”。
如果不起作用,最有可能的原因是 Android 应用有问题。检查状态显示,它应该会告诉您失败的位置。
GitHub 存储库中有一个草图,也可以在 Grove LCD 上显示消息。请确保您的 Grove 扩展板设置为 5V,并将 LCD 显示屏连接到任何 I2C 连接。
展望未来
创建一个更复杂的项目意味着需要在 Android 代码和草图中都加入一些架构。我建议将大部分 Android BLE 代码移到服务中,以将其与 UI 分离,并使其更易于在多个活动和多个项目中使用。创建更高级的草图时,您将需要开始使用 Arduino Time 库,该库可让您在接收数据的同时模拟运行多个循环(http://playground.arduino.cc/Code/Time)。我将向 GitHub 存储库(https://github.com/adrianstevens/Edison_to_Android_BLE)添加这些示例,并且将在未来的文章中讨论这些概念。