65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2015年6月11日

CPOL

20分钟阅读

viewsIcon

12976

本文档旨在向您展示如何编写代码并连接硬件,以在 Intel Edison 和配备蓝牙 4.0 的 Android 设备之间建立 BLE 通信,使用免费的软件工具和低成本的现成硬件。

获取新的 Intel® IoT 开发套件,这是一个完整的硬件和软件解决方案,允许开发人员使用 Intel® Galileo 和 Intel® Edison 开发板创建令人兴奋的新解决方案。访问 Intel® IoT 开发者专区

引言

低功耗蓝牙 (BLE) 通信在商业产品和业余应用中都呈爆炸式增长,这主要归因于其低成本和低功耗要求。这使其成为您希望从 Android* 手机或平板电脑与 Intel® Edison 或 Intel® Galileo 项目进行通信时的绝佳选择。

本文档旨在向您展示如何编写代码并连接硬件,以在 Intel Edison 和配备蓝牙 4.0 的 Android 设备之间建立 BLE 通信,使用免费的软件工具和低成本的现成硬件。

什么是 BLE?

低功耗蓝牙、Bluetooth LE 或简称 BLE(也称为 Bluetooth Smart)是一种由蓝牙特殊兴趣小组设计和推广的无线个人局域网技术。它针对医疗保健、健身、安全、自动化和家庭娱乐行业的应用。

低功耗蓝牙最初由诺基亚于 2006 年以 Wibree 的名称推出。它于 2010 年随蓝牙 4.0 版本添加到蓝牙标准中。

BLE 允许设备比标准蓝牙连接使用更少的电量,同时仍提供常规蓝牙的大部分连接功能,并且范围大约只有一半(约 15 米 / 50 英尺)。使用低功耗蓝牙的电池供电设备可以运行多年而无需充电或更换电池。像 Estimote 这样的信标设备已经声称电池寿命可达三年 (www.estimote.com)。

硬件

我们将重点关注 Intel Edison,但本文大部分内容也适用于 Intel Galileo。对于我们的物联网项目,我们将使用的物理传感器和控制器来自 Seeed Studio 的 Grove 系统。具体来说,我们将使用

  • 带 Arduino 扩展板的 Intel Galileo
  • Seeed Grove – 适用于 Galileo GEN 2 的 Starter Kit Plus Intel® IoT 版
  • Seeed Grove BLE
  • 运行 Android 4.3 或更高版本的 Android 设备(我使用的是联想 TAB S8-50)
  • 运行 Windows* 7 或 8 的 PC 用于开发(我使用的是戴尔 XPS12)

关于硬件的一些说明

  1. Grove 入门套件 标明是为 Intel Galileo 设计的,但它与 Edison 配合良好。您也可以单独购买 Grove 组件,但套件可能更经济。
  2. 我在开发过程中使用了我的联想 Android 平板电脑,但任何运行至少 Android 4.3 并支持蓝牙 4.0 的 Android 设备都应该可以工作。
  3. 我使用我的戴尔 XPS12 编写 Intel Edison 和 Android 项目的代码(以及本文)。开发也可以在 Mac* 或 Linux* 系统上进行。

软件

我使用了几种免费的软件工具。要完成此示例,您需要根据需要下载并安装它们

以上所有软件都适用于 Windows、Mac 和 Linux,但我将专门介绍在 Windows 上的安装。

近距离观察硬件

Intel® Edison

Intel® Edison 是拟议的低成本通用计算平台系列中的第一个。它旨在实现物联网项目的快速简便原型制作,同时为商业化提供产品就绪的途径。

Intel® Edison 使用 22 纳米 Intel® SoC,其中包括一个运行在 500MHz 的双核 Intel® Atom™ CPU。它支持 40 个 GPIO,包括 1GB LPDDR3 RAM、4 GB EMMC 存储以及双频 Wi-Fi* 和蓝牙,所有这些都集成在一个微小的外形尺寸中。

在底层,Edison 运行一个完整的 Linux 内核,为了从 Edison 获得最佳性能,您需要编写硬件级别的 Linux 代码。

但是 Edison Linux 也包含一个作为 Linux 程序的 Arduino 实现。简而言之,这意味着您可以编写熟悉的 Arduino 草图并在 Edison 板上运行它们。而这正是我们将要做的。

在此处了解有关 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 显示了 Edison 安装到 Arduino 扩展板上。

图 1. Intel® Edison 安装到 Arduino 扩展板上

Grove Starter Kit Plus

该套件的全称是“Grove Starter Kit Plus - Intel® IoT Edition for Intel® Galileo Gen 2 Developer Kit”,最初是为 Intel Galileo 第二代开发板设计的。幸运的是,它通过 Arduino 扩展板与 Intel Edison 完全兼容。

该套件(如图 2 所示)旨在简化传感器、执行器和扩展板的使用和原型制作。它包含一个带标准化四 (4) 引脚连接器的 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

图 2. Grove Starter Kit Plus - Intel® IoT Edition for Intel® Galileo Gen 2 开发套件

Grove BLE V1

我们将使用 Grove 低功耗蓝牙 v1 模块,该模块未包含在入门套件中,但与 Grove 扩展板和连接电缆引脚兼容。它也是一个相对低成本的 BLE 附加组件,在撰写本文时是我找到的最便宜的选择。

Grove BLE v1 基于行业标准的德州仪器 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 Edison。

图 3. Grove BLE V1 模块

在 Android 设备上调试

Android 4.3(API 级别 18)中添加了 BLE 支持。您需要运行 4.3 或更高版本的设备才能通过 BLE 进行通信。

在此处了解有关 Android BLE 的更多信息:https://developer.android.com.cn/guide/topics/connectivity/bluetooth-le.html

如果您是 Android 开发新手,在使用手机或平板电脑运行和调试软件之前,需要启用开发人员选项。打开设置应用,滚动到底部,选择“关于设备”,然后点击构建号七 (7) 次以解锁开发人员选项。

开发人员选项现在显示在设置下;请务必勾选“USB 调试”。

在此处了解有关 Android 开发人员选项的更多信息:https://developer.android.com.cn/tools/device.html

安装软件并准备好编码!

适用于 Intel® Galileo 的 Arduino IDE

您需要下载专门准备的 Arduino IDE 版本,以便将 Sketches 部署到 Intel Edison 或 Galileo。在撰写本文时,当前版本是 1.5.3,可在此处获取

https://software.intel.com/en-us/articles/install-arduino-ide-on-intel-iot-platforms

Intel® Edison 驱动程序

您还需要从上面的链接下载并安装 Intel Edison 驱动程序。它应该是页面上“驱动程序软件”下列出的最后一个链接。在撰写本文时,它是 1.0.0 版本。

如果您需要进一步的说明,这里有一个出色的入门指南

software.intel.com/iot/getting-started

Android Studio

Android Studio 是一个新的基于 IntelliJ IDEA* (https://www.jetbrains.com/idea/) 的 Java* IDE,用于 Android 开发。它目前处于 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 中,点击 Configure -> Project Defaults -> Project Structure 并设置路径。

图 4. 在 Android* Studio 中设置 SDK 路径

测试 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 设备上运行它。

  1. 将您的 Android 设备连接到 PC
  2. 打开 Android Studio
  3. 选择“New Project...”
  4. 选择名称和位置,然后点击“Next”3 次(API 15/空白活动)
  5. 点击完成并等待项目创建(这可能需要 20 秒以上)
  6. 点击工具栏上的绿色播放图标
  7. 选择您的设备并按下“OK”

如果一切正常,您应该会在 Android 屏幕上看到“Hello world!”(图 5)。

图 5. Android* Studio Hello World 应用

BLE 如何工作?

BLE 通过在需要时提供短时数据爆发,然后断电来工作。这部分解释了低功耗蓝牙如何使用如此少的能量。与常规蓝牙的传统配对方法不同,BLE 设备仅在需要发送或接收信息时才建立连接。

BLE 的通信结构非常严谨。设备公开服务来发送和接收数据,这些服务具有称为特征(Characteristics)的属性,用于定义可以共享的数据。为了获取更详细的信息,特征可以具有描述符(Descriptors),以帮助定义数据。例如,您可能有一个标记为“心率监测器”的服务,其中包含“心率测量”等特征。

大多数低功耗蓝牙 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 演示
  • 部署并运行空的 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。

图 6. 创建新的 Android 应用程序

接下来,通过打开 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,以便我们可以在代码中引用它。

图 7. 为 TextView 设置资源 ID

MainActivity

对于此项目,其余代码都放在 MainActivity 中。如果您逐行添加代码,请注意 Android Studio 会自动检测缺少的导入并提示您添加它们。

示例代码执行以下操作

  1. 检查 Android 设备是否支持 BLE
  2. 搜索附近的 BLE 设备
  3. 识别并连接到 Grove BLE 模块
  4. 在可用服务中搜索已知的通信服务
  5. 在通信服务上找到传输特性
  6. 通过向特性写入值来发送消息

我不会在这里涵盖每一行代码,但我们会查看核心概念。

类级别变量和静态值

在连接 BLE 模块、搜索服务和发送消息时,我们将存储许多值。我们还将为 Grove BLE v1 (TI CC2540) 添加一些已知的静态值。如果您使用不同的模块,您可能需要更改这些值。具体来说,我建议定义传输和接收特性,例如

CHARACTERISTIC_TX = "0000ffe1-0000-1000-8000-00805f9b34fb"
CHARACTERISTIC_RX = "0000ffe1-0000-1000-8000-00805f9b34fb"

状态帮助方法

为了简单起见,我们在之前标记的 TextView 上显示进度。代码中包含一个名为 statusUpdate 的简单帮助方法,我们用它将状态消息写入屏幕和控制台。它还会返回到 UI 线程,因此我们可以安全地从任何线程调用它。

连接到 BLE 设备

要获取对蓝牙管理器的引用,我们首先检查设备上是否支持 BLE,调用 getSystemService 以获取对蓝牙管理器 (BluetoothManager) 的引用,然后调用 getAdapter() 方法以获取对 BluetoothAdapter 对象的引用。或者,您可以直接从 Bluetooth Manager 类使用静态帮助方法 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 对象,并且我们重写 onConnectionStateChangedonServicesDiscovered

请注意在 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 Breakout Board 和 BLE 模块设置 Intel® Edison

首先组装基本硬件。如果您还没有,请将 Intel Edison 安装到 Arduino 扩展板上。

接下来,将 Grove 扩展板底部的引脚与 Arduino 扩展板对齐,然后安装 Grove 扩展板。然后将 Grove BLE v1 连接到串行 UART 端口。

图 8. Intel® Edison 连接了 Grove 扩展板和 BLE 模块

我们的第一个草图

我们将在 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 连接。

图 9. BLEConnect 在 Android* 手机上运行

图 10. Arduino IDE 串行监视器接收 BLEConnect 消息

展望未来

创建一个更复杂的项目意味着在 Android 代码和草图中都加入一些架构。我建议将大部分 Android BLE 代码移到一个服务中,以将其从 UI 中抽象出来,并使其更容易在多个活动和多个项目中重复使用。在创建更高级的草图时,您需要开始使用 Arduino 时间库,它使您能够模拟运行多个循环,同时仍能接收数据 (http://playground.arduino.cc/Code/Time)。我将把这些示例添加到 GitHub 存储库 (https://github.com/adrianstevens/Edison_to_Android_BLE) 中,我将在未来的文章中讨论这些概念。

关于作者

Adrian Stevens 拥有超过 14 年的移动应用程序开发经验;专注于 C# 和 C++ 跨平台开发。Adrian 的专业领域包括用户界面架构、音频/信号处理、传感器和数学。Adrian 居住在加拿大温哥华,对技术充满热情,并具有创业精神。他共同运营着一个关于 C# 跨平台开发的 Meetup 小组。

Adrian 于 2001 年开始为 Palm Pilot 和 Pocket PC 等平台开发移动应用程序。他成功创立并领导了一家精品移动开发工作室。Adrian 目前是一名移动和跨平台应用程序讲师,教授架构和开发策略。

目录

Intel® 物联网开发者中心

立即开始创新!Intel® 物联网开发者计划提供知识、工具、套件以及专家社区,助您快速轻松地将您的创新想法转化为物联网解决方案。

使用适用于 Intel® Edison 和 Intel® Galileo 平台的 Intel® IoT 开发套件,梦想成真,构建一切。这些套件用途广泛、性能优化,是完全集成的端到端物联网解决方案,支持各种编程环境、工具、安全、云连接和硬件。

如需更多资源并了解新的 Intel® 物联网开发者套件 v1.0 如何帮助您简化物联网项目

© . All rights reserved.