转载

使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

想在 IBM Bluemix™ 上构建一个物联网 (IoT) 应用程序?这个工作并没有想象得那么困难。大多数 IoT 应用程序都由 3 部分组成:一个连网的 事物 ,一个查看和管理这个事物的应用程序,以及检测这个事物触发了哪些事件的分析。Bluemix 上的 物联网 服务(IoT Foundation)使您可以轻松地将事物连接到应用程序和分析服务。为了演示这有多么容易,我构建了一个 IoT Connected Vehicle 入门工具包。Connected Vehicle 工具包包含 3 部分:

  • 一个车辆模拟器(一个 Node.js 应用程序)
  • 查看和管理地图上各种车辆的 HTML5 应用程序
  • Bluemix 上的 Geospatial Analytics 服务和用于分析的 Node-RED

与作者 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 应用程序之间执行近乎实时的消息传递。

构建您的应用程序所需的准备工作

  • 一个 Bluemix 帐户和一个 DevOps Services 帐户,二者都链接到您的 IBM ID
  • Cloud Foundry 命令行接口
  • 基本了解 JavaScript

运行应用程序

获取代码

Connected Vehicle 入门工具包概述

您将配置和部署的 Connected Vehicle 应用程序有 3 个部分:

  • Node.js 车辆模拟器
  • HTML5 Map 应用程序
  • HTML5 Tester 应用程序

这 3 个组成部分使用 IBM Internet of Things Foundation (IoT Foundation) 与 MQTT 协议进行实时的发布/订阅消息传递。模拟的车辆会频繁地发布遥测数据(每秒两条消息)并从 Tester 应用程序订阅一个命令主题,用于接受命令(比如 “将速度设为 60 码”)。Map 应用程序订阅车辆遥测主题,从而实时显示位置和状态。Tester 应用程序使您能够向车辆发布控制命令并向 Map 应用程序发布通知。

这个概略图显示了该应用程序各组成部分之间的关系:

使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

第 1 步. 在 Bluemix 上创建 Internet of Things 服务实例

  1. 登录 Bluemix。在仪表板中,单击 ADD A SERVICE 。从服务目录中选择 Internet of Things 。选择已选定的 Free 计划并单击 CREATE 创建该服务。
  2. 在仪表板中选择新创建的服务,然后单击页面右上角的 LAUNCH 按钮。
  3. 现在处于 IoT Foundation 仪表板中,可在这里注册设备,生成应用程序的 API 密钥,查看使用情况,并邀请其他人加入组织: 使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

    点击查看大图

    关闭 [x]

    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

第 2 步. 配置 IoT Foundation 组织

Connected Vehicle 应用程序使用 IoT Foundation 在模拟的车辆与 Map 和 Tester 应用程序之间执行近乎实时的消息传递。为了加快此通信过程,首先您必须注册设备并为应用程序生成一个 API 密钥。

借助车辆模拟器,您可利用单个 Node.js 运行时实例建模多个车辆。IoT Foundation 将每个车辆模拟器视为一个设备。最终将运行 3 个车辆模拟器,所以第 1 步是手动注册这些模拟器来获得访问凭据:

  1. 在组织仪表板的 Devices 页面中单击 Add Device 。在 Device Type 列表中,单击 Create a device type... 并在 Device Type 字段下面的字段中输入 vehicle 。输入在此组织中惟一的、任意长度的设备 ID(比如 ABC),然后单击 Continue使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

    点击查看大图

    关闭 [x]

    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

  2. 下一页显示了设备的凭据。请记下它们!比如:
    org=o4ze1w type=vehicle id=ABC auth-method=token auth-token=5QK1rWHG9JhDw-rs+S
  3. 再创建两个设备(比如 DEF 和 GHI),记下凭据。您将使用此信息配置入门工具包。
  4. 在组织仪表板中单击 API Keys 选项卡并选择 New API Key 。复制密钥和令牌。Map 和 Tester 应用程序将使用这些凭据连接到 IoT Foundation

第 3 步. 下载、配置和部署入门工具包

IoT 入门工具包的源代码存储在 DevOps Services 上的 bryancboyd | iot-vehicle-geospatial-starter-kit 项目中。您可用多种方式获取自己的代码副本,包括:

  • 使用项目页面上的 FORK PROJECT 选项创建自己的项目。
  • 克隆 git 存储库。

如果您更熟悉某种方法,可使用该方法获取自己的代码副本。如果不熟悉,请按照这些说明创建代码的 ZIP 文件并将文件下载到 PC 中:

  1. 向上滚动并单击本教程的 获取代码 按钮。
  2. 在 bryancboyd | iot-connected-vehicle-starter-kit 项目中,单击 EDIT CODE
  3. 突出显示源代码树的根,并单击菜单中的 File > Export > Zip :将下载的文件保存在本地。
  4. 解压该 ZIP 文件。
  5. 在您的本地项目中,打开 manifest.yml 文件。挑选一个全局惟一的应用程序名称(比如 bryancboyd-trafficsim )并在 hosstname 字段中输入该名称。将实例数量设为 3 ,保存此文件。
  6. 打开 config/settings.js。此文件存储所有设备和 API 密钥配置数据。
    • 对于 iot_deviceType ,输入 vehicle
    • 对于 iot_deviceOrg ,输入 6 字符的组织 ID(比如 O4ze1w )。
    • 对于 iot_deviceSet ,输入您已注册的 3 个设备的 ID 和令牌。
    • 对于 iot_apiKey ,输入您创建的 API 密钥。
    • 对于 iot_apiToken ,输入 API 密钥令牌。
    • 保留 notifyTopicinputTopic 的默认值;这些是 Geospatial Analytics 服务使用的配置参数。
  7. 保存更改。
  8. 从您已解压的应用程序的根目录,键入 cf login 。按照提示输入 API 端点的 https://api.ng.bluemix.net ,以及您的 Bluemix IBM ID 电子邮件地址和密码作为登录凭据。如果有多个 Bluemix 组织和空间,还需要选择它们。
  9. 键入 cf push 将应用程序部署到 Bluemix。
  10. 部署应用程序后,运行 http:// app-name .mybluemix.net 上的 Map 应用程序。您将看到这些模拟的车辆在地图上移动。单击一个车辆可查看遥测数据: 使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

    点击查看大图

    关闭 [x]

    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

  11. 每个车辆模拟器可模拟多辆车。数量由一个 Bluemix 环境变量控制: VEHICLE_COUNT 。键入 cf set-env <app-name> VEHICLE_COUNT 5 ,将车辆总数增加到 15。

第 4 步. 创建和配置 Geospatial Analytics

有关 Geospatial Analytics 服务的介绍,请参阅 “ 使用 Geospatial Analytics 服务监视移动设备。 ”

使用 Bluemix Geospatial Analytics 服务,您可跟踪每辆车何时进入和离开既定的 地理围栏区域 。Map 应用程序可与该服务交互,使您能够用图形方式动态创建和删除地理围栏:

  1. 在新应用程序的 Bluemix 仪表板中,单击 ADD A SERVICE 。从服务目录中选择 Geospatial Analytics 。选择已选定的 Free 计划,单击 CREATE 将该服务绑定到您的应用程序。
  2. starter-kit 应用程序包含多个 API,支持使用已配置的 IoT Foundation 组织和消息凭据来启动和停止 Geospatial Analytics。要启动该服务,可浏览到 http:// app-name .mybluemix.net/GeospatialService_start 并等待页面显示成功(这可能需要 30-45 秒)。
  3. 打开 Map 应用程序并创建一些地理围栏。单击工具栏上的 Alert 按钮(感叹号图标),启动地理围栏创建过程,并拖动手柄和边缘来放置地理围栏。要创建地理围栏,单击中央的黑色圆圈来打开上下文菜单,然后单击 Create使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

    点击查看大图

    关闭 [x]

    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

Geospatial Analytics 服务将此地理围栏添加到所观察的区域列表中,只要有车辆进入或离开该区域,就通过 IoT Foundation 发布一条 MQTT 消息。Map 应用程序使用该消息并在地图上的车辆上显示一个覆盖图:

使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

点击查看大图

关闭 [x]

使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

要删除地理围栏,可选择该区域并单击 Delete

第 5 步. 使用 Tester 应用程序

Tester 应用程序向模拟的车辆和 Map 应用程序发送命令。车辆模拟器订阅 setProperty 类型的命令,并动态地更改它自己的属性、速度和状态。Map 应用程序订阅 addOverlay 类型的命令,并动态地在车辆上方显示一个弹出式文本窗口。

  1. 依次打开 Map 应用程序和 Tester 应用程序 (http:// app-name .mybluemix.net/tester),将其并排放置,以便可以同时看到两个页面。
  2. 要配置 setProperty 命令,可选择一辆车并在 Tester 应用程序底部输入 ID。输入属性 speed 和值 100 ,单击 Update Property 。您将看到 MQTT 主题和 Tester 应用程序中包含该命令的载荷,并且所选车辆的速度变为 100 mph。
    • 备注: 车辆模拟了一组 静态属性 (位置、速度、状态和类型)和 自定义属性 。您可使用 setProperty API 在车辆上动态地添加/更改/删除自定义属性。要添加属性,可发布一个尚不存在的属性(比如 DriverWindow = UP )。要删除属性,可使用空字符串值更新该属性;车辆不会再将该属性包含在其遥测消息中。 使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

      点击查看大图

      关闭 [x]

      使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

  3. 配置 addOverlay 命令:在 Tester 应用程序中,使用上部的表单在车辆上方显示一条消息: 使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

    点击查看大图

    关闭 [x]

    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

第 6 步. 创建一个 Node-RED 分析应用程序

您可使用 Bluemix 中的 Node-RED 样板应用程序,利用基本分析功能来扩展入门工具包。Node-RED 是一个将 IoT 用例中的各种事件连接在一起的可视工具。借助 Node-RED,您可设计将各种输入(比如 MQTT、TCP 和 HTTP)链接到输出(比如 MQTT、HTTP、Twitter、MongoDB 和 Cloudant)的逻辑流,以快速添加轻量型分析功能:

  1. 将 Node-RED 样板应用程序部署在 Bluemix 中:在 Bluemix 仪表板中,单击 ADD APPLICATION 并选择 Internet of Things Foundation 样板应用程序。提供一个惟一的名称和主机名(比如 bryancboyd-nodered ),单击 CREATE
  2. 应用程序运行时,单击 BIND A SERVICE 并选择您在第 1 步中创建的 Internet of Things 服务。
  3. 应用程序启动后,打开 Node-RED 画布,地址为:http:// node-red-app .mybluemix.net/red/。
  4. IoT 样板 Node-RED 应用程序使用默认的逻辑流来启动。选择画布上的节点并删除它们。
  5. 构建一个流来监视所有车辆的遥测数据:将一个 ibmiot 输入节点从左侧面板拖到画布上。将一个 debug 节点拖到 ibmiot 节点的右侧,并将两个节点连接起来。双击 ibmiot 节点并执行如下配置:
    • 对于 Authentication ,选择 Bluemix Service
    • 对于 Input Type ,选择 Device Event
    • 对于 Device Type ,输入 vehicle
    • 对于 Device Id ,选中 All 复选框。
    • 对于 Event ,输入 telemetry
    • 对于 Format ,输入 json
    • 对于 Name ,输入 telemetry
  6. 单击 Deploy (页面右上角)并选择 debug 窗格。如果配置成功,而且 starter kit 应用程序目前正在运行,就会在调试窗格中看到互联车辆的 MQTT 载荷: 使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

    点击查看大图

    关闭 [x]

    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

  7. 如果您的 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;   } }
  8. 将逻辑流连接起来并单击 Deploy 。现在应该在调试窗格中看到一辆车的数据: 使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

    点击查看大图

    关闭 [x]

    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

第 7 步. 在 Node-RED 中创建一个虚拟遥控钥匙

接下来,使用 Node-RED 构建一个简单的远程控件来锁定/解锁一辆车。您将使用两个 inject 节点:一个解锁车辆,另一个锁定车辆。对于每个操作,您将为具有值 lockedunlockedlockState 属性发布一个 setProperty 命令,然后发布一个 addOverlay 命令,在 Map 应用程序上显示一个通知:

  1. 转到您的 Node-RED 流并将两个 inject 输入节点拖到 Node-RED 画布上。编辑每个节点并配置一个字符串载荷: locked 是一个, unlocked 是另一个。此载荷是在 setProperty 命令中发送的值: 使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

    点击查看大图

    关闭 [x]

    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

  2. 向逻辑流中添加一个功能节点,并将两个 inject 节点连接到它。此功能将构建两个命令并将其发布到 IoT Foundation:一个用于设置车辆状态,另一个用于在 Map 应用程序上显示一条覆盖消息。使用以下代码:
    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] ]; 
  3. 向逻辑流中添加一个 ibmiot 输出节点,放在功能节点后。功能节点将改写 ibmiot 节点上的许多配置值;我们将使用 “虚拟” 值 override 来标记这些字段。双击 ibmiot 节点并执行如下配置:
    • 对于 Authentication ,选择 Bluemix Service
    • 对于 Input Type ,选择 Device Command
    • 对于 Device Type ,输入 override
    • 对于 Device Id ,输入 override
    • 对于 Command Type ,输入 override
    • 对于 Format ,输入 json
    • 对于 Data ,输入 override
    • 对于 Name ,输入 commands
    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序
  4. 部署应用程序(单击页面右上角的 Deploy ),看到 Map 应用程序时单击 inject 节点上的按钮。您可看到车辆 ABC-2 的 lockState 属性更新了,而且地图上出现了一条 “unlocked” 消息: 使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

    点击查看大图

    关闭 [x]

    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

第 8 步. 使用 Node-RED 发布地理空间事件

借助 Bluemix Geospatial Analytics 服务,您可在 Map 应用程序上创建地理围栏多边形,并在车辆进入或离开一个区域时收到 IoT Foundation 事件。Map 应用程序已订阅此事件主题,并将消息显示为车辆上方的一条覆盖通知。这个地理空间事件主题可由多个应用程序订阅,而且它可以是更复杂场景中的一个组成部分 — 比如,限制年轻司机的一个边界框,在子女驶离一个 “批准的” 区域时通知父母。或者检测车辆何时进入住房周围的一个地理围栏,并通知您的住房自动化系统准备迎接您回家。

您可使用 Node-RED 将地理围栏警报链接到其他应用程序和 API。在这个逻辑流中,您将在收到一个特定车辆的地理围栏通知消息时发布一条推文:

  1. 将一个 ibmiot 输入节点放在画布上。双击 ibmiot 节点并执行如下配置:
    • 对于 Authentication ,选择 Bluemix Service
    • 对于 Input Type ,选择 Device Command
    • 对于 Device Type ,输入 api
    • 对于 Device Id ,输入 geospatial
    • 对于 Command Type ,输入 geoAlert
    • 对于 Format ,输入 json
    • 对于 Name ,输入 commands
    使用 Geospatial Analytics 构建互联车辆 IoT 应用程序
  2. 在 ibmiot 输入节点后添加一个功能节点。此功能将过滤从地理空间服务返回的数据,并且仅在警报涉及的车辆与指定的 ID 匹配时才继续执行操作流。使用以下代码(如果愿意,将 ID 替换为您环境中的一辆车)将该功能连接到一个调试节点并进行部署:
    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; }
  3. 接下来,将一个 twitter 输出节点拖到画布上,将该功能的输出连接到此节点的输入。您可使用 twitter 节点,利用 OAuth 配置一个现有的 Twitter 帐户,然后发布 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;   } 
  4. 部署应用程序。

现在,只要您的车辆穿过地理围栏,Node-RED 就会发布一条推文:

使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

点击查看大图

关闭 [x]

使用 Geospatial Analytics 构建互联车辆 IoT 应用程序

结束语

使用 Bluemix 中的 Internet of Things 和 Geospatial Analytics 服务构建 IoT 既简单有容易。您亲自尝试一下吧:使用其他 Bluemix 服务、移动应用程序,甚至是物理传感器来扩展 Connected Vehicle 入门工具包。

正文到此结束
Loading...