转载

将您的设备作为网关连接到 Watson IoT Platform

简介

物联网 (IoT) 正通过开启未连网机器中隐藏的价值,彻底改变业务经营方式。连接性对情报的生成至关重要,但不是所有设备都会直接连接到互联网,因为它们可能使用不同种类的无线电技术来传输数据。实际上,网关充当着 IoT 设备与互联网之间的桥梁。例如,(处理、内存和通信成本方面的)简单设备通过 Zigbee 或另一种低功率无线电网络连接到网关,然后,网关会存储并解析信息,并将它们发送到云服务器进行处理和分析。

IBM Watson IoT Platform 和网关支持

IBM Watson Internet of Things Platform 是一个完全托管的、托管在云上的服务,它使得从物联网 (IoT) 设备获取价值变得非常简单。在与 IBM Bluemix 平台结合使用时,Watson IoT Platform 为应用程序提供了访问 IoT 设备和数据的简单但强大的能力。您可以快速创建分析应用程序、可视化仪表板和移动 IoT 应用程序。创建能够向您的后端企业应用程序提供洞察的 IoT 应用程序。

网关是 Watson IoT Platform 中的一种专门的设备,它们充当着其他设备接入 Watson IoT Platform 的接入点。与常规设备相比,网关设备拥有额外的权限,可以执行以下功能:

  • 向 Watson IoT Platform 注册新设备
  • 像直接连接的设备一样发送和接收自己的传感器数据
  • 代表连接到它的设备发送和接收数据
  • 运行设备管理代理,以便可以托管它,并管理连接到它的设备

请参阅 文档 ,获取 Watson IoT Platform 中有关网关支持的更多信息。

本文将演示哪些内容?

本文通过将 Arduino Uno 连接到 Raspberry Pi 来演示网关支持,其中 Raspberry Pi 充当着网关,并代表 Arduino Uno 向 IBM Watson IoT Platform 发布事件/接收命令。

没有硬件?

如果没有 Raspberry Pi 和 Arduino UNO,不要担心,您仍然可以按照本文中的说明,连接您的设备作为网关,用它作为其他设备与 Watson IoT Platform 的接入点。在这种情况下,您可以使用 Windows 或 Linux 服务器替代 Raspberry Pi 作为网关。此外,示例提供了一个模拟器来代替即将充当附加设备的 Arduino UNO。

如果没有相关硬件,请跳到“在 IBM Watson IoT Platform 中注册您的网关”小节,因为以下几节将解释 Raspberry Pi 与 Arduino UNO 之间的硬件连接和串行通信。

硬件配置

本文使用以下配置来演示网关支持:

  • 使用 Raspberry Pi 作为网关
  • 使用 Arduino Uno 作为设备
  • 使用 PIR 动作传感器 作为连接到 Arduino Uno 的传感器
  • 使用内部温度传感器作为连接到 Arduino Uno 的传感器
  • 使用 LED 作为连接到 Arduino Uno 的执行器

Arduino Uno 将不断从 PIR 传感器以及内部温度传感器读取信号,并将这些读数发送给 Raspberry Pi,在收到传感器读数时,Raspberry Pi 网关会通过 MQTT 将相同信息发布到 Watson IoT Platform。一个用 Java 编写的示例应用程序(在 Raspberry Pi 和 Arduino Uno 之外的地方运行)将通过订阅 IBM Watson IoT Platform 来处理这些传感器读数。当应用程序观察到一个移动检测时,它会通过 Watson IoT Platform 和 Raspberry Pi 网关向 Arduino 发回一条命令,让 LED 灯开始闪烁。下图演示了这个过程。

将您的设备作为网关连接到 Watson IoT Platform

此外,示例应用程序允许通过随时发送该命令,让 LED 灯闪烁指定的次数。例如,可以发送一条让 LED 灯闪烁 10 次的命令,无论 PIR 传感器是否检测到运动。

如果没有 PIR 传感器和 LED 灯,不要担心,您仍然可以按照本文的说明来了解网关 (Raspberry Pi) 如何将 Arduino Uno 的内部温度发送到 Watson IoT Platform,并代表 Arduino Uno 接收命令。当示例应用程序发送一条让 LED 灯闪烁的命令时,您仍然可以在邻近的引脚 13 上观察到灯的闪烁。

本文使用以下示例来演示网关支持:

  1. 设备示例 – 该示例是用 C 编写的,将在 Arduino Uno 上运行,向/从 Raspberry Pi 网关发送/接收数据。此外,它还可以控制传感器。
  2. 网关示例 – 该示例是用 Java 编写,将在 Raspberry Pi 上运行,它将 Raspberry Pi 和 Arduino Uno 连接到 IBM Watson IoT Platform。
  3. 应用程序示例 – 该示例是用 Java 编写,将在一个服务器环境(在本例中为 Windows 平台)上运行,它将处理 Arduino Uno 事件并通过 Watson IoT Platform 将 LED 闪烁命令发送回 Arduino Uno。

这些示例将在以下各节详细解释。

将 PIR 传感器和 LED 灯连接到 Arduino

将 PIR(运动)传感器和 LED 执行器连接到 Arduino UNO。

连接 PIR 传感器

PIR 传感器充当着数字输出,所以我们只需监听引脚是跳高了(检测到)还是跳低了(未检测到)。PIR 传感器有 3 个引脚,即 +、- 和输出。

使用跳线和电路试验板将引脚 + 连接到 5v,将引脚 – 接地,将输出连接到任何可用的数字引脚,如下图所示。在这个例子中,我们将输出连接到引脚 2。

连接 LED 灯

LED 执行器有 2 个引脚,即接地引脚和电源。将接地引脚接地,将电源连接到引脚 13,并在接地引脚与电源之间放置 330 欧姆电阻,如下图所示:

将您的设备作为网关连接到 Watson IoT Platform

在这一步中,我们已成功将 PIR(运动)传感器和 LED 执行器连接到 Arduino UNO。

对 Arduino Uno 进行编程

使用 Micro USB 数据线将 Arduino Uno 连接到计算机,上传 Sketch 来执行一个或多个操作。

为了对 Arduino Uno 进行编程,我们需要下载和设置 Arduino IDE 。按照 这篇教程 中的介绍在计算机上设置 Arduino 软件 (IDE)。

在本节中,我们将给出从/向单独附加到 Arduino Uno 的传感器读/写数据的 Sketch 代码,然后将所有代码上传到 Arduino Uno。

读取 PIR 传感器值的 Sketch 代码

void setup() {  Serial.begin(9600);  pinMode(2,INPUT); // PIR sensor reading }  void loop() {  char val[10];  int buttonState = digitalRead(2);  itoa(buttonState, val, 10);  Serial.println(val); }

如上所示,Sketch 在引脚 2 上读取从 PIR 传感器传入的信号,并将其写入串行端口,以便 Raspberry Pi 可以使用该信号。将此 Sketch 代码上传到 Arduino Uno,以便在 Arduino IDE 的串行监视器上查看 PIR 读数。尝试阻止 PIR 传感器,以便将读数从 0 更改为 1。

读取内部温度传感器的 Sketch 代码

Arduino 中使用的大部分 AVR 芯片都有一个内部温度传感器。该传感器有助于向没有 PIR 传感器的人演示网关支持。以下 Sketch 代码可用于读取温度传感器值:

void setup() {  Serial.begin(9600); }  void loop() {  char val[10];  dtostrf(getTemp(),1,2, val);  Serial.println(val); }   /* This function is reproduced as is from Arduino site =>             http://playground.arduino.cc/Main/InternalTemperatureSensor */ double getTemp(void) {  unsigned int wADC;  double t;  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));  ADCSRA |= _BV(ADEN); // enable the ADC  delay(20); // wait for voltages to become stable. ADCSRA |= _BV(ADSC); // Start the ADC  // Detect end-of-conversion  while (bit_is_set(ADCSRA,ADSC));  // Reading register "ADCW" takes care of how to read ADCL and ADCH. wADC = ADCW;  // The offset of 324.31 could be wrong.It is just an indication. t = (wADC - 324.31 ) / 1.22;  // The returned temperature is in degrees Celcius. return (t); }

再次上传此 Sketch 代码,以便在 Arduino IDE 的串行监视器上查看温度。

让 LED 灯闪烁的 Sketch 代码

如下所示,当 Sketch 从 Raspberry Pi 收到非零值时,它会通过在引脚 13 上写入信号来为 LED 灯供电。

void setup() {  Serial.begin(9600);  pinMode(13,OUTPUT); // LED actuator  }  void loop() {  if (Serial.available()) {  int value = Serial.parseInt();  blink(value);  } }  // code to blink the LED for n times void blink(int n){  for (int i = 0; i < n; i++) {  digitalWrite(13, HIGH);  delay(100);  digitalWrite(13, LOW);  delay(100);  } }

如这段 Sketch 代码所示,Arduino 从串行端口读取闪烁命令,并将引脚 13 从 HIGH 切换为 LOW,以便让 LED 灯闪烁指定的次数。

上传组合的 Sketch 代码

组合了所有 3 个操作的完整 Sketch 代码 可在此处获得 。使用 IDE 将此代码上传到 Arduino Uno 中,观察 Arduino Uno 如何使用 Raspberry Pi 网关所要求的以下格式来发送 PIR 和温度读数:

<事件名称> <逗号分隔的传感器读数>

例如 status temp:35.22,pir:0。

在这一步中,我们了解了如何通过 Sketch 代码读取 PIR 传感器,读取内部温度和让 LED 灯闪烁。然后将组合的 Sketch 代码上传到 Arduino Uno。

将 Arduino Uno 连接到 Raspberry Pi

使用 USB 数据线将 Arduino Uno 连接到 Raspberry Pi。

可通过许多方式连接 Raspberry Pi 和 Arduino,比如 使用 GPIO 和串行引脚 以及 使用 I2C 。但是通过 USB 数据线建立连接是让它们通信的最简单方法,因为这样做所需的硬件最少:您只需要 Arduino 附赠的一条 Micro USB 数据线。

将您的设备作为网关连接到 Watson IoT Platform

理想情况下,Arduino Uno 使用端口“/dev/ttyACM0″连接到 Raspberry Pi。但是该端口可能经常改变,要找到准确的端口,可在未插入 Arduino Uno 时在 Raspberry Pi 中运行以下命令:

ls /dev/tty*

现在插入您的 Arduio Uno 并再次运行该命令。如果出现了一个新名称,那么该名称就是您的端口的名称。如果该端口不同于 /dev/ttyACM0,请记下它,在运行网关示例时,我们需要传递此名称。

在这一步中,我们成功地使用 Micro USB 数据线将 Arduino 连接到 Raspberry Pi。

通过对 Raspberry Pi 进行编程来执行串行通信

对 Raspberry Pi 进行编程,以便使用 RXTX 库向/从 Arduino Uno 写入/读取数据。

在上一节中,我们了解了 Arduino 如何向或从串行端口写入和读取数据。在本节中,我们将了解如何使用 Java RXTX 库 来使用 Raspberry Pi 网关实现串行通信,从/向 Arduino Uno 读取/写入数据。要使用 RXTX 库,需要使用以下命令将这个库安装在 Raspberry Pi 上:

sudo apt-get install librxtx-java

可以看到,我们已经安装了下列文件:

  • /usr/lib/jni/librxtxSerial.so
  • /usr/share/java/RXTXcomm.jar

总体上讲, 示例 执行以下操作来使用 RXTX 库从/向 Arduino Uno 读取/写入数据。

初始化端口

CommPortIdentifier portId = null; Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); // Enumerate system ports and try connecting to Arduino over each while (portEnum.hasMoreElements()) {  CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();  if (currPortId.getName().equals(PORT_NAME)) {  portId = currPortId;  break;  } }

连接到串行端口

然后,示例连接到该端口,配置通信参数,比如比特率、超时等,如下所示:

// open serial port, and use class name for the appName. serialPort = (SerialPort) portId.open(this.getClass().getName(), 2000); // set port parameters serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,                     SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);  // open the streams input = new BufferedReader(new InputStreamReader(serialPort.getInputStream())); output = new BufferedWriter(new OutputStreamWriter(serialPort.getOutputStream()));

此外,打开输入和输出流来向/从 Arduino Uno 读取/写入数据。

从 Arduino Uno 中读取数据

然后,该示例添加了一个事件监听器来从 Arduino 接收事件,并告知库在有数据可用时执行回调:

// add event listeners serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true);  // A sample event listener, public synchronized void serialEvent(SerialPortEvent oEvent) {  String line = null;  if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {  try {  line = input.readLine();  System.out.println(line);  } catch (Exception e) {  System.err.println(e.toString());  }  }  // Ignore all the other eventTypes, but you should consider the other ones. }

如代码中所示,RXTX 库会在有数据可用时调用 serialEvent() 方法从串行端口读取数据。这里是 Raspberry Pi 从 Arduino 中获取传感器读数(PIR 运动传感器和内部温度)的地方。可以添加一个逻辑来处理该数据,将它转换为 IBM Watson IoT Platform 所要求的格式,然后将它发送给 Watson IoT Platform。示例代码拥有执行相同过程的逻辑。(这将在本文后面的章节中解释。)

将命令写入 Arduino Uno

为了将数据发送到 Arduino Uno(让 LED 灯闪烁),该示例使用了我们之前打开的输出流并写入数据,如下所示:

this.output.write("<number of times to blink LED>");

要记下的信息

在 Raspberry Pi 上,RXTX 库将它的锁放入了文件夹 /var/lock 中。如果该目录不存在,则无法进行通信,但您不会收到任何表明原因的明显错误。要在该目录不存在时创建它,可以打开终端应用程序,并以根用户或等效用户身份创建 lock 目录:

sudo mkdir /var/lock

在这一步中,我们了解了 Raspberry Pi 如何使用 RXTC 库向或从 Arduino Uno 读取/写入数据。

在 IBM Watson IoT Platform 中注册您的网关

为了演示网关支持,我们需要设置 Watson IoT Platform 组织并在其中注册网关。本节将介绍如何执行相关设置。

执行本文中介绍的步骤,在 IBM Watson Internet of Things Platform 中注册您的网关。

在这一步中,我们成功创建了 Watson IoT Platform 服务并在其中注册了网关。

通过对网关进行编程来连接到 Watson IoT Platform

对您的网关进行编程,以便连接到 Watson IoT Platform

在前面的章节中,我们了解了 Arduino 和 Raspberry Pi 如何使用串行端口通信。在本节中,我们将了解如何将网关连接到 IBM Watson IoT Platform 并进行交互。本文中使用的 网关示例 是用 Java Client Library for IBM Watson IoT Platform 编写的,这个库简化了与 IBM Watson IoT Platform 的交互。

总体上讲,这个 示例 将执行以下操作来与 Watson IoT Platform 交互。

创建 GatewayClient 实例

网关示例使用了来自 IoTF Java Client Library 的 com.ibm.iotf.client.gateway.GatewayClient 类,该类简化了网关与 IBM Watson IoT Platform 的交互。网关示例中的 createGatewayClient() 方法通过传递所需的属性来创建一个 GatewayClient 实例,如下所示:

Properties options = new Properties();  options.setProperty("org", "<Your Organization ID>"); options.setProperty("type", "<The Gateway Device Type>"); options.setProperty("id", "The Gateway Device ID"); options.setProperty("auth-method", "token"); options.setProperty("auth-token", "API token");  gwClient = new GatewayClient(options);

将此网关连接到 IBM Watson IoT Platform

下一步是调用 connect 函数来将网关连接到 Watson IoT Platform。

gwClient.connect();

成功连接到 Watson IoT Platform 后,网关可执行以下操作:

  • 自行发布事件和代表网关背后连接的设备发布事件
  • 自行订阅命令和代表网关背后连接的设备订阅命令

向 IBM Watson IoT Platform 注册 Arduino Uno

可通过不同方式将 Arduino Uno 设备(连接到 Raspberry Pi 网关)注册到 IBM Watson IoT Platform:

  • 自动注册:在网关发布任何针对 Arduino Uno 设备的事件/订阅任何命令时,自动将设备添加到 IBM Watson IoT Platform 中。
  • API:可以使用 Watson IoT Platform API 向 Watson IoT Platform 注册 Arduino Uno 设备。

本文使用了 IBM Watson IoT Platform API 来添加设备。

订阅针对 Arduino Uno 的应用程序命令

网关可以订阅定向到网关本身或通过该网关连接的任何设备的命令。在 GatewayClient 建立连接时,它会自动订阅针对该网关的所有命令。但是,要订阅针对通过网关连接的设备的命令,需要使用一个重载的 subscribeToDeviceCommands() 方法。

要接收和处理 Arduino Uno 命令,网关示例需要执行以下操作:

  • 添加一个命令回调方法
  • 订阅针对 Arduino Uno 的命令
GatewayCommandCallback callback = new GatewayCommandCallback(); gwClient.setCommandCallback(callback); gwClient.subscribeToDeviceCommands(DEVICE_TYPE, ARDUINO_DEVICE_ID);

在向 GatewayClient 添加命令回调后,processCommand() 方法会在从 Watson IoT Platform 收到任何针对 Arduino Uno 的命令时被调用。Gateway CommandCallback 定义一个 BlockingQueue 来存储和处理命令(在单独的线程中),以便顺利地处理 MQTT 发布消息,如下所示:

public class GatewayCommandCallback implements CommandCallback, Runnable {  // A queue to hold & process the commands  private BlockingQueue<Command> queue = new LinkedBlockingQueue<Command>();   public void processCommand(Command cmd) {  queue.put(cmd);  }   public void run() {  while(true) {  Command cmd = queue.take();  JsonObject payloadJson = JSON_PARSER.parse(cmd.getPayload()).getAsJsonObject();  payloadJson = payloadJson.get("d").getAsJsonObject();  int value = payloadJson.get(LED_DATAPOINT_NAME).getAsInt();  arduinoInterface.sendCommand(value);  }  } }

将 Arduino Uno 事件发布到 Watson IoT Platform

事件是设备和网关将数据发布到 Watson IoT Platform 的机制,示例使用了一个重载的 publishDeviceEvent() 方法将 PIR 和内部温度读数发布到 Watson IoT Platform。

if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {  line = input.readLine(); // sensor readings from Arduino Uno   String[] tokens = line.split(" ");   String eventName = tokens[0];  JsonElement event = new JsonParser().parse("{" + tokens[1] + "}");  boolean status = this.gwClient.publishDeviceEvent(this.deviceType, this.deviceId, eventName, event); }

如上所示,网关示例以 JSON 格式提供传感器读数,并将它们发送到 Watson IoT Platform。

将网关事件发布到 Watson IoT Platform

Raspberry Pi 网关不仅可以代表 Arduino 发布事件,而且还可以发布自己的事件。示例每秒发布一个闪烁事件,该事件包含这个示例网关进程的 CPU 和内存利用率信息。

JsonObject event = new JsonObject();  event.addProperty("name", SystemObject.getName());  try {  event.addProperty("cpu", obj.getProcessCpuLoad());  } catch (Exception e) {  e.printStackTrace();  }  event.addProperty("mem", obj.getMemoryUsed());  gwClient.publishGWEvent("blink", event, 2);

请参阅 编程指南的“网关”小节 ,进一步了解网关可以使用 Java Client Library 执行的一些操作的列表。

在这一步中,我们了解了如何将网关和它的设备连接到 Watson IoT Platform,如何发布事件和订阅命令。

启动网关示例

将您的网关连接到 Watson IoT Platform。

1. 使用 SSH 连接到您的网关。

2. 从 Github 下载针对 IBM Watson IoT Platform 的最新的 Java Client Library:

curl -LO https://github.com/ibm-messaging/iot-java/releases/download/0.0.11/com.ibm.iotf-0.0.11.zip

3. 使用 unzip 解压存档文件 com.ibm.iotf-0.0.11.zip,例如“unzip com.ibm.iotf-0.0.11.zip”。

4. 因为我们计划通过 IBM Watson IoT Platform API 注册附加设备(在本例中为 Arduino Uno 或模拟器),所以需要使用组织的 API 密钥和令牌。我们还可以执行以下步骤来达到相同的目的:

  • 从浏览器启动 IBM Watson IoT Platform 仪表板
  • 单击 ACCESS 选项卡
  • 单击 API Keys 选项卡
  • 单击“Generate API Key”按钮,如下所示:

    将您的设备作为网关连接到 Watson IoT Platform

  • 记下“API Key”和“Authentication Token”。我们需要使用这些信息在 Watson IoT Platform 中注册 Arduino Uno 设备,并将其附加到 Raspberry Pi 网关。

5. 修改 gateway.prop 文件,输入您在“在 IBM Watson IoT Platform 中注册您的网关”小节中记下的以下网关设备注册细节。另外输入您在上一步中记下的 API 密钥和令牌。

## Gateway Registration detail Organization-ID = <Your Organization ID> Gateway-Type = <Your Gateway Device Type> Gateway-ID = <Your Gateway Device ID> Authentication-Method = token Authentication-Token = <Your Gateway Token>  ## Mandatory - Organization API-Key and Token to create the device type API-Key = <Your Organization API-Key> API-Token = <Your Organization Token>  Port = <Specify the port in which Arduino Uno connects to                 Raspberry Pi.Required only if the port is not /dev/ttyACM0>

(备注:如果 Arduino Uno 未通过端口 /dev/ttyACM0 建立连接,则会指定端口。请参阅“将 Arduino Uno 连接到 Raspberry Pi”,查找 Arduino Uno 连接到 Raspberry Pi 所用的端口。但是,如果您在模拟器模式下运行,则不需要使用它。也就是说,您没有硬件。)

6. 通过指定以下命令来运行 网关示例 :(如果在 Windows 环境上运行,可能需要将冒号更改为分号。)

java -Djava.library.path=/usr/lib/jni -cp com.ibm.iotf.client-0.0.11.jar:             com.ibm.iotf.samples-0.0.11.jar:lib/*                     com.ibm.iotf.sample.client.gateway.SampleRasPiGateway

7. 您可以观察到,网关使用 g:orgId:typeId:deviceId 形式的客户端 ID 连接到 IBM Watson IoT Platform。第一个字符‘g’表示我们是一个网关。

8. 转到 Watson IoT Platform 仪表板(如果需要,请进行刷新),可以观察到 Arduino Uno 设备已自动使用 ID“Arduino01”注册。设备 ID“Arduino01”被硬编码到示例代码中,并通过 Watson IoT Platform API 进行添加。这是网关和 Watson IoT Platform 的真实功能,我们可以轻松地将设备装载在网关背后,无需在 Watson IoT Platform 中预先注册它。

将您的设备作为网关连接到 Watson IoT Platform

9. 单击 Gateway01 行查看网关自身发布的事件:

将您的设备作为网关连接到 Watson IoT Platform

10. 各个传感器值可通过将页面转到 Sensor Information 部分来查看,如下所示:

将您的设备作为网关连接到 Watson IoT Platform

11. 如上所示,网关以事件形式发送了网关进程的 CPU 和内存使用率。请注意,网关也可以发布它自己的事件。

12. 继续向下滚动,查看此网关的附加设备,在本例中我们必须将 Arduino01 视为附加设备:

将您的设备作为网关连接到 Watson IoT Platform

13. 单击 Arduino01 观察来自 Arduino Uno 设备的事件:

将您的设备作为网关连接到 Watson IoT Platform

14. 各个传感器值可通过将页面转到 Sensor Information 部分来查看,如下所示:

将您的设备作为网关连接到 Watson IoT Platform

15. 如上所示,网关代表附加设备 (Arduino Uno) 发送了 PRI 和内部温度值。现在,阻止 PIR 运动传感器,可以看到该值从 0 更改为 1。

在本节中,我们成功地将网关和 Arduino Uno 连接到 Watson IoT Platform,还观察了各种传感器读数。

编写应用程序

编写一个应用程序来解析传感器事件和发送闪烁命令

目前为止,我们了解了如何将传感器读数发送给 Watson IoT Platform,在这一步中,我们将了解如何编写一个应用程序来解析这些读数,并发回一条命令,让附加到 Arduino Uno 的 LED 灯闪烁。

总体上讲,这个 示例 将执行以下操作来与 Watson IoT Platform 进行交互。

将应用程序连接到 IBM IoT Foundation

应用程序示例 使用了来自 IoTF Java Client Library 的 com.ibm.iotf.client.app.ApplicationClient 类,该类简化了应用程序与 IBM Watson IoT Platform 的交互。 应用程序示例 中的 createApplicationClient() 方法创建一个 ApplicationClient 实例,并通过传递所需的属性将应用程序连接到 IBM Watson IoT Platform,如下所示:

Properties options = new Properties();  options.setProperty(“org”,“<Your organization ID>″); options.put("id", "<The unique ID of your application within your organization>");  options.setProperty(“auth-method”,“apikey”); options.put("API-Key", "<YOUR API KEY>");  options.put("Authentication-Token", "<YOUR TOKEN>");  myAppClient= new ApplicationClient(options);

将应用程序连接到 IBM Watson IoT Platform

下一步是调用 connect 函数将应用程序连接到 Watson IoT Platform。

myAppClient.connect();

成功连接到 Watson IoT Platform 后,应用程序可以执行以下操作,比如订阅设备事件,订阅设备状态,发布设备事件和命令。

订阅 Arduino Uno 事件

要接收和处理 Arduino Uno 事件,示例应用程序应执行以下操作:

  • 添加一个事件回调方法
  • 订阅 Arduino Uno 设备事件

在应用程序示例中 subscribeToEvents() 方法添加了一个事件回调处理函数,并订阅了来自 Arduino Uno 设备的事件,如下所示:

MyEventCallback r = new MyEventCallback(this);

myAppClient.setEventCallback(r);

myAppClient.subscribeToDeviceEvents(DEVICE_TYPE, ARDUINO_DEVICE_ID);

在从 Watson IoT Platform 收到针对 Arduino Uno 的任何事件时,ApplicationClient 会调用回调方法 processEvent()。Event Callback 类定义一个 BlockingQueue 来存储和处理事件(在单独的线程中),以便顺利地处理 MQTT 发布消息,如下所示:

MyEventCallback r = new MyEventCallback(this);  myAppClient.setEventCallback(r);  myAppClient.subscribeToDeviceEvents(DEVICE_TYPE, ARDUINO_DEVICE_ID);

在从 Watson IoT Platform 收到针对 Arduino Uno 的任何事件时,ApplicationClient 会调用回调方法 processEvent()。Event Callback 类定义一个 BlockingQueue 来存储和处理事件(在单独的线程中),以便顺利地处理 MQTT 发布消息,如下所示:

class MyEventCallback implements Runnable, EventCallback { private BlockingQueue<Event> queue = new LinkedBlockingQueue<Event>();  public void processEvent(Event event) {  queue.put(event); }  public void run() {  while(true) {  Event event = queue.take();  String payload = event.getPayload();  JsonObject payloadJson = JSON_PARSER.parse(payload).getAsJsonObject();  JsonObject content = payloadJson.get("d").getAsJsonObject();  int value = content.get(PIR_DATAPOINT_NAME).getAsInt();  if(value != 0)  app.sendBlinkCommand(value);  } } }

向 Arduino Uno 发送闪烁命令

示例应用程序在下列情况下将一个闪烁命令发送给 Arduino Uno:

  • 无论何时在 PIR 传感器读数中收到一个正值时(检测到运动时)
  • 无论何时用户想要使用它的时候
JsonObject cmd = new JsonObject(); cmd.addProperty(LED_DATAPOINT_NAME, value); myAppClient.publishCommand(DEVICE_TYPE, ARDUINO_DEVICE_ID, COMMAND_NAME, cmd, 2);

如上述代码所示,应用程序将闪烁命令发送给 Arduino Uno,在 Raspberry Pi 上运行的网关示例订阅了针对 Arduino Uno 设备的所有命令时,Raspberry Pi 网关也会收到该命令(已在“对网关编程以连接到 Watson IoT Platform”小节中进行了介绍)。

请参阅 编程指南的“应用程序”小节 ,进一步了解应用程序可以使用 Java Client Library 执行的一些操作的列表。

在这一步中,我们了解了如何创建一个示例 Java 应用程序来连接到 Watson IoT Platform,如何读取设备事件并将命令发送回设备。

启动应用程序示例

启动用 Java 编写的将发送 LED 灯闪烁命令的命令行应用程序示例。

为了将应用程序连接到 IBM Watson IoT Platform,必须生成 API 密钥和令牌。这可以通过在仪表板中执行以下步骤来实现:

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

2. 单击 ACCESS 选项卡

3. 单击 API Keys 选项卡

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

将您的设备作为网关连接到 Watson IoT Platform

5. 记下“API Key”和“Authentication Token”。我们需要使用这些信息将应用程序连接到 Watson IoT Platform。

启动应用程序示例

1. 将最新的 IoTF Java Client Library 下载到您希望运行该应用程序的 Windows 平台(或任何环境):

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

(整个库的源代码位于 Github 中的此处 )

2. 使用 unzip 解压存档文件 com.ibm.iotf-0.0.11.zip。

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

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

Organization-ID = <Your Organization ID> Authentication-Method = apikey API-Key = <Your Organization's API Key> Authentication-Token = <Your Organization's Token> Device-Type = iotsample-deviceType Device-ID = Arduino01

(备注:如果没有修改网关示例来使用不同的 ID 注册 Arduino Uno,Device-Type 应为 iotsample-deviceType,Device-ID 必须为 Arduino01。)

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

java -cp com.ibm.iotf.client-0.0.11.jar;com.ibm.iotf.samples-0.0.11.jar;           lib/* com.ibm.iotf.sample.client.gateway.SampleApplication

6. 可以观察到,应用程序将连接到 IBM Watson IoT Platform 并在控制台中打印以下消息“Enter any valid number anytime to turn the LED blink”。

7. 在控制台中输入一个数字(比如 10),可以观察到附加到 Arduino Uno 的 LED 灯闪烁了 10 次。即使没有附加 LED 灯,仍然可以在邻近的引脚 13 上观察到灯的闪烁。

8. 现在,阻止 PIR 运动传感器,可以观察到 LED 灯闪烁了一段时间。

在本节中,我们使用示例 Java 应用程序成功地将闪烁命令发送给了 Arduino Uno。

结束语

在本文中,我们使用 Java Client Library for IBM Watson IoT Platform 演示了网关支持。开发人员可以查看 Github 存储库 中提供的代码来了解幕后发生的事情。开发人员可以将本文视为 IBM Watson IoT Platform 中的任何网关开发的模板。

后续步骤

  1. 查阅网关设备管理秘诀,连接您的网关(作为托管网关),并使用 IBM Watson IoT Platform DM 协议管理一个或多个附加设备。
  2. 查阅 IBM Watson IoT Real-Time Insights 秘诀 ,在来自 IoT 设备的实时数据上执行分析并获得诊断洞察。尽管这篇文章是为分析车辆数据而编写的,但您可以使用它作为从任何 IoT 数据获取洞察的模板。
  3. 查阅Node-RED 秘诀,将您的网关和附加设备事件接收到 Node-RED 应用程序中。
原文  http://www.ibm.com/developerworks/cn/iot/iot-connect-raspberry-pi-as-gateway-to-watson-iot-platform/index.html?ca=drs-
正文到此结束
Loading...