想在 IBM Bluemix™ 上构建一个物联网 (IoT) 应用程序?这个工作并没有想象得那么困难。大多数 IoT 应用程序都由 3 部分组成:一个连网的 事物 ,一个查看和管理这个事物的应用程序,以及检测这个事物触发了哪些事件的分析。Bluemix 上的 物联网 服务(IoT Foundation)使您可以轻松地将事物连接到应用程序和分析服务。为了演示这有多么容易,我构建了一个 IoT Connected Vehicle 入门工具包。Connected Vehicle 工具包包含 3 部分:
与作者 Bryan Boyd 一同参加 IBM InterConnect 2015 ,获取 IoT Foundation 和 Bluemix 的引导式实际体验。
本教程指导您在 Bluemix 上配置和部署 Connected Vehicle 入门工具包,并使用 Geospatial Analytics 服务和 Node-RED 构建分析功能。
观看: 观看 IBM Bluemix 实战演示
阅读: 使用 Internet of Things 入门应用程序创建应用程序
阅读: Geospatial Analytics 入门
阅读: 使用 Geospatial Analytics 服务监视移动设备
阅读: 命令行接口
“ Connected Vehicle 应用程序使用 IoT Foundation 在模拟的车辆与 Map 和 Tester 应用程序之间执行近乎实时的消息传递。 ”
运行应用程序
获取代码
您将配置和部署的 Connected Vehicle 应用程序有 3 个部分:
这 3 个组成部分使用 IBM Internet of Things Foundation (IoT Foundation) 与 MQTT 协议进行实时的发布/订阅消息传递。模拟的车辆会频繁地发布遥测数据(每秒两条消息)并从 Tester 应用程序订阅一个命令主题,用于接受命令(比如 “将速度设为 60 码”)。Map 应用程序订阅车辆遥测主题,从而实时显示位置和状态。Tester 应用程序使您能够向车辆发布控制命令并向 Map 应用程序发布通知。
这个概略图显示了该应用程序各组成部分之间的关系:
点击查看大图
关闭 [x]
Connected Vehicle 应用程序使用 IoT Foundation 在模拟的车辆与 Map 和 Tester 应用程序之间执行近乎实时的消息传递。为了加快此通信过程,首先您必须注册设备并为应用程序生成一个 API 密钥。
借助车辆模拟器,您可利用单个 Node.js 运行时实例建模多个车辆。IoT Foundation 将每个车辆模拟器视为一个设备。最终将运行 3 个车辆模拟器,所以第 1 步是手动注册这些模拟器来获得访问凭据:
vehicle
。输入在此组织中惟一的、任意长度的设备 ID(比如 ABC),然后单击 Continue : 点击查看大图
关闭 [x]
org=o4ze1w type=vehicle id=ABC auth-method=token auth-token=5QK1rWHG9JhDw-rs+S
IoT 入门工具包的源代码存储在 DevOps Services 上的 bryancboyd | iot-vehicle-geospatial-starter-kit 项目中。您可用多种方式获取自己的代码副本,包括:
如果您更熟悉某种方法,可使用该方法获取自己的代码副本。如果不熟悉,请按照这些说明创建代码的 ZIP 文件并将文件下载到 PC 中:
bryancboyd-trafficsim
)并在 hosst 和 name 字段中输入该名称。将实例数量设为 3
,保存此文件。 iot_deviceType
,输入 vehicle
。 iot_deviceOrg
,输入 6 字符的组织 ID(比如 O4ze1w
)。 iot_deviceSet
,输入您已注册的 3 个设备的 ID 和令牌。 iot_apiKey
,输入您创建的 API 密钥。 iot_apiToken
,输入 API 密钥令牌。 notifyTopic
和 inputTopic
的默认值;这些是 Geospatial Analytics 服务使用的配置参数。 cf login
。按照提示输入 API 端点的 https://api.ng.bluemix.net
,以及您的 Bluemix IBM ID 电子邮件地址和密码作为登录凭据。如果有多个 Bluemix 组织和空间,还需要选择它们。 cf push
将应用程序部署到 Bluemix。 点击查看大图
关闭 [x]
VEHICLE_COUNT
。键入 cf set-env <app-name> VEHICLE_COUNT 5
,将车辆总数增加到 15。 有关 Geospatial Analytics 服务的介绍,请参阅 “ 使用 Geospatial Analytics 服务监视移动设备。 ”
使用 Bluemix Geospatial Analytics 服务,您可跟踪每辆车何时进入和离开既定的 地理围栏区域 。Map 应用程序可与该服务交互,使您能够用图形方式动态创建和删除地理围栏:
点击查看大图
关闭 [x]
Geospatial Analytics 服务将此地理围栏添加到所观察的区域列表中,只要有车辆进入或离开该区域,就通过 IoT Foundation 发布一条 MQTT 消息。Map 应用程序使用该消息并在地图上的车辆上显示一个覆盖图:
点击查看大图
关闭 [x]
要删除地理围栏,可选择该区域并单击 Delete 。
Tester 应用程序向模拟的车辆和 Map 应用程序发送命令。车辆模拟器订阅 setProperty
类型的命令,并动态地更改它自己的属性、速度和状态。Map 应用程序订阅 addOverlay
类型的命令,并动态地在车辆上方显示一个弹出式文本窗口。
setProperty
命令,可选择一辆车并在 Tester 应用程序底部输入 ID。输入属性 speed
和值 100
,单击 Update Property 。您将看到 MQTT 主题和 Tester 应用程序中包含该命令的载荷,并且所选车辆的速度变为 100 mph。 setProperty
API 在车辆上动态地添加/更改/删除自定义属性。要添加属性,可发布一个尚不存在的属性(比如 DriverWindow = UP
)。要删除属性,可使用空字符串值更新该属性;车辆不会再将该属性包含在其遥测消息中。 点击查看大图
关闭 [x]
addOverlay
命令:在 Tester 应用程序中,使用上部的表单在车辆上方显示一条消息: 点击查看大图
关闭 [x]
您可使用 Bluemix 中的 Node-RED 样板应用程序,利用基本分析功能来扩展入门工具包。Node-RED 是一个将 IoT 用例中的各种事件连接在一起的可视工具。借助 Node-RED,您可设计将各种输入(比如 MQTT、TCP 和 HTTP)链接到输出(比如 MQTT、HTTP、Twitter、MongoDB 和 Cloudant)的逻辑流,以快速添加轻量型分析功能:
bryancboyd-nodered
),单击 CREATE 。 vehicle
。 telemetry
。 json
。 telemetry
。 点击查看大图
关闭 [x]
VEHICLE_COUNT
环境变量被设为大于 1
的值,则会在单个数组中包含 VEHICLE_COUNT
辆车的遥测数据。要修改逻辑流,从而筛选出一辆车(比如 ABC-2),可在逻辑流的中间添加一个 function 节点,双击并填入以下代码: var data = msg.payload; for (var i in data) { if (data[i].id == "ABC-2") { msg.payload = data[i]; return msg; } }
点击查看大图
关闭 [x]
接下来,使用 Node-RED 构建一个简单的远程控件来锁定/解锁一辆车。您将使用两个 inject 节点:一个解锁车辆,另一个锁定车辆。对于每个操作,您将为具有值 locked
或 unlocked
的 lockState
属性发布一个 setProperty
命令,然后发布一个 addOverlay
命令,在 Map 应用程序上显示一个通知:
locked
是一个, unlocked
是另一个。此载荷是在 setProperty
命令中发送的值: 点击查看大图
关闭 [x]
var commandValue = msg.payload; var setPropertyMsg = { deviceId: "ABC", deviceType: "vehicle", eventOrCommandType: "setProperty", format: "json", payload: JSON.stringify({ "id": "ABC-2", "property": "lockState", "value": commandValue }) } var addOverlayMsg = { deviceId: "tester", deviceType: "api", eventOrCommandType: "addOverlay", format: "json", payload: JSON.stringify({ "id": "ABC-2", "text": commandValue, "duration": 5000 }) } return [ [setPropertyMsg, addOverlayMsg] ];
override
来标记这些字段。双击 ibmiot 节点并执行如下配置: override
。 override
。 override
。 json
。 override
。 commands
。 lockState
属性更新了,而且地图上出现了一条 “unlocked” 消息: 点击查看大图
关闭 [x]
借助 Bluemix Geospatial Analytics 服务,您可在 Map 应用程序上创建地理围栏多边形,并在车辆进入或离开一个区域时收到 IoT Foundation 事件。Map 应用程序已订阅此事件主题,并将消息显示为车辆上方的一条覆盖通知。这个地理空间事件主题可由多个应用程序订阅,而且它可以是更复杂场景中的一个组成部分 — 比如,限制年轻司机的一个边界框,在子女驶离一个 “批准的” 区域时通知父母。或者检测车辆何时进入住房周围的一个地理围栏,并通知您的住房自动化系统准备迎接您回家。
您可使用 Node-RED 将地理围栏警报链接到其他应用程序和 API。在这个逻辑流中,您将在收到一个特定车辆的地理围栏通知消息时发布一条推文:
api
。 geospatial
。 geoAlert
。 json
。 commands
。 msg.payload = { time: msg.payload.time, id: msg.payload.deviceInfo.id, lon: msg.payload.deviceInfo.location.longitude, lat: msg.payload.deviceInfo.location.latitude, eventType: msg.payload.eventType region: msg.payload.regionId } if (msg.payload.id == "ABC-3") { return msg; }
msg.payload
的内容。登录您的 Twitter 帐户并修改功能节点,为 Twitter 创建一条消息: msg.payload = { time: msg.payload.time, id: msg.payload.deviceInfo.id, lon: msg.payload.deviceInfo.location.longitude, lat: msg.payload.deviceInfo.location.latitude, eventType: msg.payload.eventType, region: msg.payload.regionId } if (msg.payload.id == "ABC-3") { var verb = "exited"; if (msg.payload.eventType == "Entry") { verb = "entered"; } msg.payload = "Vehicle " + msg.payload.id + " has " + verb + " region " + msg.payload.region + "!"; return msg; }
现在,只要您的车辆穿过地理围栏,Node-RED 就会发布一条推文:
点击查看大图
关闭 [x]
使用 Bluemix 中的 Internet of Things 和 Geospatial Analytics 服务构建 IoT 既简单有容易。您亲自尝试一下吧:使用其他 Bluemix 服务、移动应用程序,甚至是物理传感器来扩展 Connected Vehicle 入门工具包。