转载

在 IBM IoT Foundation 中构建可扩展应用程序

软件要求

  • IBM Bluemix 帐户
  • Oracle JDK 7 或更高版本

回页首

简介

共享订阅允许用户构建可扩展的应用程序,它将通过对应用程序连接到 IoT Foundation 的方式作出一些更改,在多个应用程序实例之间实现设备事件的负载平衡。如下图所示,通过使用共享订阅支持,可以在应用程序 1 和应用程序 2 之间共享设备事件。

在 IBM IoT Foundation 中构建可扩展应用程序

如果某个后端企业应用程序实例无法适应发布到特定主题空间的消息的数量,则可能需要使用共享订阅功能。例如,如果许多设备都在发布事件,而这些事件由单个应用程序处理,则可能需要使用共享订阅。IoTF 服务扩展了 MQTT 3.1.1 规范,为共享订阅提供了支持,而且仅限于非持久订阅。当非持久性应用程序从 IoT Foundation 断开连接时,IoT Foundation 不再保留这些消息。

请参阅文档的 可扩展应用程序 部分,了解有关共享订阅支持的更多信息。

本文通过运行一个示例应用程序演示了共享订阅支持——本文将帮助您在有共享订阅支持和没有共享订阅支持的情况下构建可扩展应用程序。本文是为 Windows 平台编写的,但也可以应用于其他平台上。

回页首

示例代码

本文中使用了两个示例来演示共享订阅支持:

  • 设备示例发布了一个事件,每秒都向 IBM IoT Foundation 发布事件
  • 应用程序示例 订阅了给定 IoT Foundation 组织中的所有设备事件,并实时输出这些事件

两个示例都是用 Java Client Library for IBM IoT Foundation 编写的,简化了与 IBM IoT Foundation 的交互。

IBM IoT Foundation 的 Java Client Library 根据用户为属性 “ Enable-Shared-Subscription” 设置的值来启用共享订阅支持。当 “ Enable-Shared-Subscription ”属性被设置为 “true” 时,会在共享订阅模式下连接应用程序,否则会在独立模式(默认行为)下建立连接。为了启用共享订阅支持或可扩展的应用程序支持,该库在内部以 “ A:org_id:app_id ”的形式采用客户端 id 并连接到 IoT Foundation,其中

  • A 表示应用程序是一个可扩展应用程序
  • org_id 是唯一组织 ID,在您注册使用服务时分配。它将是一个 6 字符的字母数字字符串。
  • app_id 是此客户端的用户定义的唯一字符串标示符。

另外,不需要共享订阅支持的应用程序将会使用“ a:org_id:app_id” 形式的客户端 id 连接到 IoT Foundation。(请注意第一个字符的差别。)

在连接到 IoT Foundation 时,没有使用 客户端库 的应用程序必须使用 “A:org_id:app_id” 形式的客户端 id 来启用共享订阅支持。此外,应用程序的多个实例必须使用相同的客户端 id 建立连接,以便分担负载。

回页首

示例

示例应用程序可以:

  • 实时处理设备事件,以检测异常
  • 实时处理事件,以显示给定时间的数据点的最大值、最小值、标准偏差和平均测量值(传感器读数)
  • 实时在 Cloudant NoSQL DB 或其他任何存储中记录事件 ——稍后,可能使用此数据进行历史数据分析

在这些示例中,当越来越多的设备开始发布事件时,某个应用程序实例可能无法处理负载。在这种情况下,共享订阅允许应用程序用户构建和运行多个应用程序实例,这样就可以在这些应用程序之间平均分担负载。

用户可以使用 Apache Spark 和 Spark 的更精确的流功能( Spark 流库 )来实时处理事件。对于共享订阅(可以使用相同的客户端 id 创建多个接收器 (DStreams) 来分担传入的负载), Apache Spark 流应用程序是最好的用例 。在负载增加时,应用程序开发人员只需担心是否设置了适当数量的接收器和执行器。(我们很快会在其他文章中演示此功能)。

回页首

在 IBM IoT Foundation 中注册您的设备

为了演示共享订阅,我们需要设置 IoT Foundation Organization 并在其中注册设备。本节将演示如何完成相同的设置。

创建 IoT Foundation Organization

  1. 打开您喜欢的浏览器并转到Bluemix。如果您已是一名 Bluemix 用户,请像平常一样登录。如果您对 Bluemix 不熟悉,那么可以通过注册获得一个免费 30 天的试用版。
  2. 在 Bluemix 应用程序中,单击“ CATALOG ”选项卡。
  3. 选择“ Internet of Things Foundation ” 服务。(备注:如果无法找到该服务,可以使用搜索框。)
  4. 为您的服务键入一个名称并单击 Create 按钮。
  5. 在“ Connect your devices ”部分,单击“ Launch dashboard ”。这会将您带到 IBM IoT Foundation 组织空间。该 IoTF 组织是一个用来连接和管理连接到 IoT Foundation 的设备的一个空间,这样您的应用程序就可以访问它的实时数据和历史数据。

注册您的设备

  1. 单击“ Devices ”选项卡。
  2. 在屏幕的底部,单击“ Add Device ”按钮。
  3. 单击“ Create Device Type ” 并指定一个名称,例如,“ iotsample-raspberry ″。单击屏幕右下角的 “ Next ”。
  4. 单击下一组屏幕上的“ Next ”,直到看见屏幕右下角的 “ Create ”选项。
  5. 单击 Create
  6. 选择您刚刚创建的“iotsample-devicetype″ 设备类型并单击 Next
  7. 输入一个唯一设备 id,它会将您的设备与您可以连接到 IoTF 的其他所有设备区分开来(您可以使用“1”或更复杂的 id 作为设备 id,比如设备的 MAC 地址)。
  8. 单击下一组屏幕上的“ Next ”,直到看见屏幕右下角的 “ Add ”选项。
  9. 单击 “Add” 添加您的设备,这会向您提供 设备凭证

    。记下这些细节,因为稍后我们需要使用它们与 IoT Foundation 进行交互。

    组织 ID

    设备类型

    设备 ID

    身份验证方法

    身份验证令牌

  10. 您现在应该可以在 Device 选项卡中看见已注册的设备。

回页首

发布设备事件

为了演示共享订阅,我们需要将事件从设备发布到 IBM IoT Foundation 的已注册组织。本节将向您展示如何发布设备事件。

1. 从 GitHub 下载最新的 iotf java 客户端库:

https://github.com/ibm-messaging/iot-java/releases/download/0.0.4/com.ibm.iotf-0.0.4.zip

2. 解压归档文件 com.ibm.iotf-0.0.4.zip

3. 通过输入前面步骤中记下的以下设备注册细节来修改 device.prop 文件:

Organization-ID = <Your Organization ID> Device-Type = <Your Device Type> Device-ID = <Your Device ID> Authentication-Method = token Authentication-Token = <Your Device Token>

4. 打开一个命令提示符并导航到解压归档文件 com.ibm.iotf-0.0.4.zip 的目录。

5. 通过指定以下命令运行设备事件发布示例:

java -cp com.ibm.iotf.client-0.0.4.jar;com.ibm.iotf.samples-0.0.4.jar; lib/* com.ibm.iotf.sample.client.device.DeviceEventPublishWithCounter

(示例代码呈现在 此处 )

6. 该代码使得设备每隔 1 秒发送一次事件——每个事件都包含计数器、名称、该过程的 cpu 使用和内存使用,如下所示:

在 IBM IoT Foundation 中构建可扩展应用程序

7. 您会观察到,每当有新的事件发布,数据点“event-count“就会增加。

让我们在下面小节中通过应用程序使用和处理这些事件——使用和不使用共享订阅特性的情况。

回页首

在不使用共享订阅的情况下使用事件

通过许多应用程序在不使用共享订阅的情况下使用和处理设备事件

如下图所示,在不使用共享订阅支持的情况下连接到 IBM IoT Foundation 时,不会在应用程序之间共享设备事件。

在 IBM IoT Foundation 中构建可扩展应用程序

要将应用程序连接到 IBM IoT Foundation,必须生成 API 密钥和令牌。这可以通过执行以下步骤完成:

1. 从浏览器启动 IBM IoT Foundation 仪表板

2. 单击 ACCESS 选项卡

3. 单击 API Keys 选项卡

4. 单击“Generate API Key” 按钮,如下所示

在 IBM IoT Foundation 中构建可扩展应用程序

5. 记下“ API Key ”和“ Authentication Token ”。我们需要使用这些信息连接到 IoT Foundation 来订阅设备事件。

启动应用程序

1. 打开命令提示符并导航到解压归档文件 com.ibm.iotf-0.0.4.zip 的目录。

2. 通过输入您的组织 ID、应用程序的 API 密钥和身份验证令牌来修改 application.prop 文件,如下所示:

id = <Unique application id> Organization-ID = <Your Organization ID> API-Key = <Your Organization's API Key> Authentication-Token = <Your Organization's Token>

(使用前面记下的 API 密钥和令牌替换此处的 API 密钥和令牌)

3. 通过指定以下命令运行应用程序示例:

java -cp com.ibm.iotf.client-0.0.4.jar;com.ibm.iotf.samples-0.0.4.jar; lib/* com.ibm.iotf.sample.client.application.SharedSubscriptionSample

4. 您会观察到,应用程序使用 a:org_id:app_id 形式的客户端 id(如下面的突出部分所示)连接到 IBM IoT Foundation。该客户端 id 以小写的 ‘ a ‘ 开头,这告诉 IoT Foundation 该应用程序是一个单独的应用程序,没有共享设备事件订阅。

在 IBM IoT Foundation 中构建可扩展应用程序

5. 另外还请注意,应用程序会在设备发布事件时接收设备事件。例如,每隔 1 秒按照设备发布事件的相同顺序接收设备事件。(参见上图中的突出显示部分。)

6. 在运行应用程序的第一个实例的同时,会打开另一个命令提示符并导航到解压归档文件 com.ibm.iotf-0.0.4.zip 的目录。

7. 使用不同的应用程序 id 修改 application.prop 文件:

id = <Must be different from the first one> Organization-ID = <Your Organization ID> API-Key = <Your Organization's API Key> Authentication-Token = <Your Organization's Token>

(注意:如果您尝试连接具有相同应用程序 id 的另一个应用程序,现有的应用程序会断开与 IoT Foundation 的连接。每个应用程序都必须通过提供唯一 id 来区分自身。)

8. 通过指定相同的命令运行应用程序示例的另一个实例:

java -cp com.ibm.iotf.client-0.0.4.jar;com.ibm.iotf.samples-0.0.4.jar; lib/* com.ibm.iotf.sample.client.application.SharedSubscriptionSample

9. 您会观察到,每个应用程序每隔 1 秒都会接收相同的一组事件。如下面突出显示部分所示,两个应用程序都接收了具有相同 “event-count” 值(509、510,等等)的事件。 也就是说,没有在这两个应用程序之间分担负载。

在 IBM IoT Foundation 中构建可扩展应用程序

用户可能需要使用共享订阅来分担负载,这将在下一节中演示。

回页首

在使用共享订阅的情况下使用设备事件

通过许多应用程序在使用共享订阅的情况下使用和处理设备事件

如下图所示,如果在使用共享订阅支持的情况下将应用程序连接到 IBM IoT Foundation,设备事件将会在这些应用程序之间共享。

在 IBM IoT Foundation 中构建可扩展应用程序

1. 打开命令提示符并导航到解压归档文件 com.ibm.iotf-0.0.4.zip 的目录。

2. 通过输入您的组织 ID、应用程序的 API 密钥和身份验证令牌来修改 application.prop 文件,如下所示:

id = <Unique application id> Organization-ID = <Your Organization ID> API-Key = <Your Organization's API Key> Authentication-Token = <Your Organization's Token> Enable-Shared-Subscription = true

(Enable-Shared-Subscription 必须设置为 true,以便在共享订阅模式下运行应用程序)

3. 通过指定以下命令运行共享订阅示例:

java -cp com.ibm.iotf.client-0.0.4.jar;com.ibm.iotf.samples-0.0.4.jar; lib/* com.ibm.iotf.sample.client.application.SharedSubscriptionSample

(备注:该示例订阅了在给定组织中注册的所有设备事件,因此,如果您有多个已注册的设备,并且正在发送事件,那么观察到的结果可能会有所不同。)

4. 您会观察到,应用程序使用 A:org_id:app_id 形式的客户端 id(如下面突出显示的部分所示)连接到 IBM IoT Foundation。客户端 id 以大写字母 'A' 开头,这告诉 IoT Foundation 该应用程序是在共享订阅模式下建立连接的,并与使用客户端 id 连接到 IBM IoT Foundation 的其他应用程序一起分担负载。

在 IBM IoT Foundation 中构建可扩展应用程序

5. 另请注意,应用程序会在设备发布事件时接收设备事件。也就是说,每隔 1 秒按照设备发布事件的顺序接收它们(参见上图中的突出显示部分)。由于目前只有一个应用程序实例在运行,所以它会接收由设备发布的所有事件。

6. 在应用程序的第一个实例运行的同时,会打开另一个命令提示符并导航到解压归档文件 com.ibm.iotf-0.0.4.zip 的目录。

7. 通过指定相同命令运行共享订阅示例的另一个实例:

java -cp com.ibm.iotf.client-0.0.4.jar;com.ibm.iotf.samples-0.0.4.jar; lib/* com.ibm.iotf.sample.client.application.SharedSubscriptionSample

(确保 application.prop 文件未被修改。为了实现负载平衡,必须使用相同应用程序 id 连接到 IoT Foundation)

8. 您会观察到,这两个应用程序共享了它们之间发布的所有事件,也就是说,目前在应用程序实例 1 和 2 之间 分担了负载 。如下面突出显示的部分所示,应用程序实例 1 接收 “event-count” 值为 2119 和 2121 的事件,而实例 2 接收 “event-count” 值为 2118 和 2120 的事件。

在 IBM IoT Foundation 中构建可扩展应用程序

9. 停止一个应用程序实例,您会观察到,正在运行的实例使用了设备发布的所有事件,因为现在只有一个应用程序实例。类似地,如果您运行 3 个应用程序实例,则会在所有 3 个应用程序之间分担负载。

回页首

准备好走得更远了吗?

探索 IoT Foundation Event Recorder 文章 ,该文章展示了在将事件记录到 Cloudant NoSQL DB 中时,用户可以如何充分利用共享订阅特性。

原文  http://www.ibm.com/developerworks/cn/iot/iot-shared-subscription-in-ibm-iot-foundation/index.html?ca=drs-
正文到此结束
Loading...