内容


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

使用 IBM Bluemix 上的 Geospatial Analytics 和 Node.js 部署并扩展一个 Connected Vehicle 入门工具包

Comments

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

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

本教程指导您在 Bluemix 上配置和部署 Connected Vehicle 入门工具包,并使用 Geospatial Analytics 服务和 Node-RED 构建分析功能。

Connected Vehicle 应用程序使用 IoT Foundation 在模拟的车辆与 Map 和 Tester 应用程序之间执行近乎实时的消息传递。

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

运行应用程序获取代码

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 应用程序发布通知。

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

Connected Vehicle 入门工具包的概略图
Connected Vehicle 入门工具包的概略图

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

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

第 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),然后单击 ContinueDevice Registration 页面的屏幕截图
    Device Registration 页面的屏幕截图
  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 应用程序。您将看到这些模拟的车辆在地图上移动。单击一个车辆可查看遥测数据: 运行 Map 应用程序时的屏幕截图
    运行 Map 应用程序时的屏幕截图
  11. 每个车辆模拟器可模拟多辆车。数量由一个 Bluemix 环境变量控制:VEHICLE_COUNT。键入 cf set-env <app-name> VEHICLE_COUNT 5,将车辆总数增加到 15。

第 4 步. 创建和配置 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 Foundation 发布一条 MQTT 消息。Map 应用程序使用该消息并在地图上的车辆上显示一个覆盖图:

包含覆盖图的地图屏幕截图
包含覆盖图的地图屏幕截图

要删除地理围栏,可选择该区域并单击 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)。要删除属性,可使用空字符串值更新该属性;车辆不会再将该属性包含在其遥测消息中。 配置 setProperty 命令的 UI 屏幕截图
      配置 setProperty 命令的 UI 屏幕截图
  3. 配置 addOverlay 命令:在 Tester 应用程序中,使用上部的表单在车辆上方显示一条消息: 配置 addOverlay 命令的 UI 屏幕截图
    配置 addOverlay 命令的 UI 屏幕截图

第 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 载荷: 配置 Node-RED 节点时的屏幕截图
    配置 Node-RED 节点时的屏幕截图
  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。现在应该在调试窗格中看到一辆车的数据: 调试窗格中一辆车的数据的屏幕截图
    调试窗格中一辆车的数据的屏幕截图

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

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

  1. 转到您的 Node-RED 流并将两个 inject 输入节点拖到 Node-RED 画布上。编辑每个节点并配置一个字符串载荷:locked 是一个,unlocked 是另一个。此载荷是在 setProperty 命令中发送的值: 配置字符串载荷时的屏幕截图
    配置字符串载荷时的屏幕截图
  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
    为节点配置虚拟值时的屏幕截图
    为节点配置虚拟值时的屏幕截图
  4. 部署应用程序(单击页面右上角的 Deploy),看到 Map 应用程序时单击 inject 节点上的按钮。您可看到车辆 ABC-2 的 lockState 属性更新了,而且地图上出现了一条 “unlocked” 消息: 地图上显示的 unlocked 消息屏幕截图
    地图上显示的 unlocked 消息屏幕截图

第 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
    ibmiot 节点配置 UI 屏幕截图
    ibmiot 节点配置 UI 屏幕截图
  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 就会发布一条推文:

Node-RED 发布推文的屏幕截图
Node-RED 发布推文的屏幕截图

结束语

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


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=移动开发, Cloud computing
ArticleID=1010045
ArticleTitle=使用 Geospatial Analytics 构建互联车辆 IoT 应用程序
publish-date=07062015