使用开源硬件快速开发 IoT 应用
投稿人:DigiKey 北美编辑
2016-09-15
物联网 (IoT) 的发展给设备硬件设计到云应用软件的各个领域带来了重大挑战。 与此同时,开源硬件和配套的云开发软件为快速开发高级 IoT 应用提供了极具吸引力的平台。 随着 BeagleBone Green Wireless 套件和相关的 Amazon 网络服务 (AWS) IoT 软件开发套件 (SDK) 的上市,开发人员可以充分利用 BeagleBone 生态系统,同时在领先的云服务环境中部署 IoT 应用。
要想抓住物联网带来的新兴机遇,开发人员必须精通从硬件设计到高级应用软件开发的复杂开发过程。 当前正值行业的竞争机制和协议优胜劣汰之际,Amazon 等行业领军企业已经迅速建立起开发和部署 IoT 应用的综合性平台。
然而,设计者面临的第一个挑战是找到多种硬件要求的平衡点,包括成功的 IoT 解决方案所要求的功耗、无线电性能和系统总体性能等。 除了这些基础硬件问题之外,由于设计者在学习新生的 IoT 云平台软件技术方面也面临学习周期过长的困难局面,因此公司的 IoT 项目陷入了更加举步维艰的境地。
对于着眼于部署 IoT 应用的公司来说,选择设备设计与选择云服务供应商同等重要。 不论基础数据的质量如何,糟糕的 IoT 设备设计都会影响驱动应用所需的 IoT 数据,而功能不全的云解决方案则会影响应用自身的稳健性和性能。 同样不容忽视的是,如果由于 IoT 设备或云服务实施的开发支持不得力,导致上市时间发生任何延迟,都有可能让本可大获成功的产品发布胎死腹中。 因此,将硬件与云软件支持相结合的开发平台日益成为 IoT 开发取得成功的重要因素。
IoT 平台
在可用的 IoT 开发套件中,BeagleBone Green Wireless (BBGW) 板为那些希望快速构建能够充分利用当前和新兴的 IoT 平台的设计者们提供了一种卓越的解决方案。 BBGW 板基于 Texas Instruments Sitara 处理器,为创造低功耗、高性能的 IoT 设备提供了综合性解决方案。 设计者可基于 BBGW 快速构建产品,使用可用的附加组件快速增强产品功能,甚至为此开源硬件板扩展自定义功能。
BBGW 板为 IoT 开发人员提供的优势不止于此。 Texas Instruments 和 Amazon 网络服务 (AWS) 已达成合作,共同开发集成式解决方案,简化与基于该板构建的 AWS IoT 系统的连接。 该解决方案推出后便备受瞩目,因为 IoT 应用开发人员都希望其产品能够与市场领先的云服务一同被推介。
虽然云服务供应商的选择往往取决于多种技术和业务因素,但 AWS 凭借在地域和服务覆盖广度上的双重优势,一跃成为众多着眼部署 IoT 应用的公司的首选方案。 事实上,AWS 的市场份额甚至超过了其他几家最接近的竞争对手的总和(图 1)。
图 1: Amazon 网络服务 (AWS) 继续保持云服务供应商的主导地位,其市场份额超过了其他几家最接近的竞争对手的总和。 (图片来源: Synergy Research Group)
开发平台
基于 BeagleBone Black 的开源硬件设计,BBGW 成为 BeagleBoard.org 社区开发的第一款包含无线连接且同时支持 Wi-Fi 和低功耗蓝牙 (BLE) 的电路板。 BBGW 通过 Texas Instruments 兼容单频 (2.45 GHz) Wi-Fi (IEEE 802.11b/g/n) 和蓝牙 4.1 且具备双天线支持的组合模块 WiLink 8 提供该连接。 该电路板结合了无线模块与 Texas Instruments AM3358 Sitara 处理器、512 MB DDR3 RAM、四个 USB 2.0 主机端口和两个 Grove 插座。
TI AM3358 专为高性能应用处理而设计,完美地组合了 1 GHz ARM Cortex-A8 处理器、3D 图形加速器、浮点加速器和一组多样化的片载外设。 此外,该器件的可编程实时单元子系统和工业通信子系统 (PRU-ICSS) 还集成了两个专门用于处理 I/O 事件的 PRU 32 位微控制器。 PRU-ICSS 旨在提高实施快速实时响应的灵活性,可满足 IoT 设备工作严苛的性能需求,包括支持专门的数据处理操作和自定义外设接口,以及分担器件的 Cortex-A8 主机内核的外设处理任务。
在系统层面,此款电路板的 Grove 插座提供了快速添加其他硬件的机制(图 2)。 开发人员可直接插入标准化的传感器模块,例如 Seeed Technology 的 101020192 大气压力传感器、105020012 陀螺仪或 101020212 温度和湿度传感器,而不是插入试验板传感器或构建自定义电路。 与 Grove 外设的交互非常简单,只需加载相关的支持库并在相关的 GPIO 引脚读取或写入 Grove 外设值即可(列表 1)。
图 2:BBGW 的 Grove 接口提供了简单易行的方法添加传感器和其他外设。 此图显示了如何轻松添加 Grove 兼容型按钮。 (图片来源: Seeed Technology)
/*
Get input form Grove-button and print its current state one time in a second
*/
// Load Grove module
var groveSensor = require('jsupm_grove');
// Create the button object using GPIO pin 60
var button = new groveSensor.GroveButton(60);
// Read the input and print, waiting one second between readings
function readButtonValue() {
console.log(button.name() + " value is " + button.value());
}
setInterval(readButtonValue, 1000);
列表 1: 将 Grove 外设插入 BeagleBone Green Wireless 之后,开发人员可使用相关的软件模块读取、写入或控制外设。 此示例读取 Grove 按钮的状态并直接在 JavaScript 控制台写入该值。 (代码来源: Seeed Technology)
云连接
综合 TI AM3358 的性能与开源硬件 BBGW 的可扩展性,可提供高效的 IoT 开发硬件平台。 TI 和 AWS 已就云服务开展合作,双方将通过 AWS IoT 设备软件开发套件 (SDK) 的自定义端口,在 BeagleBone Green 系列的服务器端 Javascript (node.js) 中提供预先集成的 AWS IoT 连接。
AWS IoT 设备 SDK 可通过多种开源库语言绑定进行访问,并支持开发人员轻松地将各种标准硬件设备与 AWS IoT 平台自身相连接。 AWS IoT 将 AWS 用于松散连接应用的基于消息的方法扩展到了 IoT,提供包含基于云的应用和服务的松散连接硬件设备机制(图 3)。
图 3: AWS IoT 平台在基于消息的 AWS 架构之上构建,提供用于维护每个物理设备的虚拟“影子”的专用服务。 这样,即使在实际设备离线时,该平台仍能提供设备数据。 (图片来源: Amazon 网络服务)
在 AWS IoT 中,消息代理、规则引擎、设备网关和安全/识别等服务提供的是整个 AWS 云服务架构的通用服务的 IoT 专用版本。 但在 IoT 中,AWS IoT 消息代理可支持 MQTT 通讯。 MQTT 为设备、应用和服务提供基于标准 (ISO/IEC PRF 20922) 的轻型化机制,以便与其他设备、应用或云服务交换数据。 此“发布/订阅”模式可作为云端 IoT 外设和应用中松散耦合设备的基本机制。 在 AWS 模式中,设备会订阅“主题”(消息队列服务),并以 JSON 格式将数据发布到主题。
创建连接非常简单: TI/AWS SDK 提供打包标准 mqtt.js node.js 包的设备类,以确保安全连接到 AWS IoT 平台。 除了公开底层 mqtt.js 接口之外,此设备类还提供了用于简化间歇性连接处理的功能。 这些功能包括渐进式退避重试、连接时自动重新订阅以及队列离线发布。 如以下列表 2 所示,在实例化“device”实例之后,设备可轻松订阅某个 AWS“主题”(topic_1),然后将数据 (test_data) 以 JSON 格式发布至另一个 AWS 主题 (topic_2)。 反过来,该设备可接收消息并运行其有效载荷(或者如列表所示,仅显示消息)。
var awsIot = require('aws-iot-device-sdk');
//
// Replace the values of '<YourUniqueClientIdentifier>' and '<YourAWSRegion>'
// with a unique client identifier and the AWS region you created your
// certificate in (e.g. 'us-east-1'). NOTE: client identifiers must be
// unique within your AWS account; if a client attempts to connect with a
// client identifier which is already in use, the existing connection will
// be terminated.
//
var device = awsIot.device({
keyPath: <YourPrivateKeyPath>,
certPath: <YourCertificatePath>,
caPath: <YourRootCACertificatePath>,
clientId: <YourUniqueClientIdentifier>,
region: <YourAWSRegion>
});
//
// Device is an instance returned by mqtt.Client(), see mqtt.js for full
// documentation.
//
device
.on('connect', function() {
console.log('connect');
device.subscribe('topic_1');
device.publish('topic_2', JSON.stringify({ test_data: 1}));
});
device
.on('message', function(topic, payload) {
console.log('message', topic, payload.toString());
});
列表 2: 在软件层面,将 IoT 设备连接到应用只需要订阅命名消息队列(即“主题”),并将设备数据以 JSON 格式发布至相应的目标主题(请参见突出显示的代码部分)。 (代码来源: Amazon 网络服务)
AWS IoT SDK 中许多服务的功能与 AWS 服务系列中的企业级服务非常相似。 但在 IoT 中,AWS IoT 提供了可“屏蔽”物理设备的专用服务。 这一屏蔽机制确保即使 IoT 设备自身被物理移除或在功能上已断开网络连接,AWS IoT 仍能发送这些设备所提供的最新数据。
在 AWS IoT 架构中,每个设备或“物件”都具备存储和检索状态信息的物件影子 (Thing Shadow)。 应用可请求获取物件的当前状态信息。 影子通过提供包含状态信息的 JSON 文件来响应请求。 反过来,应用可通过请求更改物件状态来控制物件。 影子接受更改状态请求,更新其状态信息,并发送消息表明状态信息已更新。 与此同时,实际物理“物件”收到消息,更改其状态,然后报告其新状态。 因此,IoT 设备会持续显示在线状态 — 即使对应的物理设备离线时也能读取或更新设备状态。
在 BBGW 的 node.js SDK 中,“thingShadow”类通过 AWS IoT API 实现了访问物件影子的额外功能;设备可利用“thingShadow”类来更新 AWS IoT 中的物件影子的状态,接收其状态更改通知,或者获取其当前状态。 远程设备可通过此方法在 AWS IoT 中更新其物件影子,例如,确保用户能够通过移动应用查看设备最新报告的状态。 用户也可在 AWS IoT 中更新设备的物件影子,而远程设备将会同步新状态。
如列表 3 中的代码片段所示,影子的实现和使用非常简单。 与“device”实例相似,在物件注册表 (Thing Registry) 中注册的“thingShadows”实例可接收更新并在显示屏上显示更改后的状态,或者供其他对象方法酌情使用。
var awsIot = require('aws-iot-device-sdk');
//
// Replace the values of '<YourUniqueClientIdentifier>' and '<YourAWSRegion>'
// with a unique client identifier and the AWS region you created your
// certificate in (e.g. 'us-east-1'). NOTE: client identifiers must be
// unique within your AWS account; if a client attempts to connect with a
// client identifier which is already in use, the existing connection will
// be terminated.
//
var thingShadows = awsIot.thingShadow({
keyPath: <YourPrivateKeyPath>,
certPath: <YourCertificatePath>,
caPath: <YourRootCACertificatePath>,
clientId: <YourUniqueClientIdentifier>,
region: <YourAWSRegion>
});
//
// Client token value returned from thingShadows.update() operation
//
var clientTokenUpdate;
//
// Simulated device values
//
var rval = 187;
var gval = 114;
var bval = 222;
thingShadows.on('connect', function() {
//
// After connecting to the AWS IoT platform, register interest in the
// Thing Shadow named 'RGBLedLamp'.
//
thingShadows.register( 'RGBLedLamp' );
//
.
.
.
//
// Thing shadow state
//
var rgbLedLampState = {"state":{"desired":{"red":rval,"green":gval,"blue":bval}}};
clientTokenUpdate = thingShadows.update('RGBLedLamp', rgbLedLampState );
.
.
.
列表 3: 创建物件的影子实例 (awsIot.thingShadow) 并注册该影子 (thingShadows.register) 之后,云应用可更新该影子 (thingShadows.update),对应的物理“物件”也会得到相应的更新。 反过来,云应用也可通过影子来更改物件状态。 (代码来源: Amazon 网络服务)
结论
从头开始实施 IoT 应用可能要求广泛深入地掌握功能特性,增加开发的复杂度,并影响紧张的交付排程。 另一方面,开源 BBGW 及其自定义的 AWS IoT SDK 端口则提供了快速开发高级 IoT 应用的有效平台。 通过结合使用 IoT 设备设计硬件和 AWS 云应用开发服务,开发人员能够快速实施复杂的 IoT 应用。 这些应用将能充分利用高级云服务最新提供的先进的 IoT 数据处理能力和分析功能。
免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。