二、编写程序调用 IoT 服务
现在,服务创建与配置已经完成,接下来开始编写应用程序进行服务的调用。
通过使用 Eclipse Paho Java客户端:https://eclipse.org/paho/ 在 Java 中构建一个简单的应用程序端程序。
第一步,创建一个物联设备端程序,来模拟物联设备向 IoT 服务发送消息、订阅消息之类的。程序功能需要完成以下功能:先连接到 IoT 服务,再将事件消息发布到 IoT 服务上,然后从 IoT 服务上面订阅消息等功能。
1、模拟物联设备端程序
连接到 IoT 服务
IBM IoT 服务(MQTT 代理)的访问点是 <orgid>.messaging.internetofthings.ibmcloud.com,其中 <orgid> 是在配置 IoT 服务时自动创建的,比如我申请的是sbgz8b,于是完整的服务点名称就是
sbgz8b.messaging.internetofthings.ibmcloud.com
在进行设备的服务调用连接时可使用 TCP 或 TLS(传输层安全)连接。
以设备客户端的身份连接到 IoT 服务之前,必须设置 MQTT 连接选项。
client-id 属性的格式应为 d:<orgid>:<type-id>:<device-id>
<orgid> 与上面相同为sbgz8b,
<type-id> 和 <divice-id> 是之前注册设备时输入的,比如Arduino与Arduino01
authmethod 属性应设置为 use-token-auth。
authtoken 属性应设置为之前所复制的设备信息中的 auth-token 字段内容。
发布事件
应该使用这种形式发布各种事件主题:iot-2/evt/<event-id>/fmt/<format>
设置 <event-id> 可将不同的事件类型分类;可选择自己的值。
<format> 设置为 json。消息应编码成 JSON 格式,它必须包含单个名为 “d” 的顶级属性,如下JSON的消息内容所示:
{
"d": {
"id": "ArduinoMsg000001",
"status": "started",
" temperature ": 20,
"time": "2016-01-01 09:01:23"
}
}
订阅消息
订阅消息的主题应为以下格式:iot-2/cmd/<cmd-type>/fmt/<format-id>
设置 <cmd-type> 可将不同的消息类型分类;可选择自己的值。
可使用加号(“+”)作为通配符来设置 <cmd-type>,这样它可订阅各种消息类型。
<format-id> 设置为 json。
这样,当收到一个消息事件后,应用程序里开始执行对应的业务内容即可。
以上是设备端的模拟程序,接下来编写Java应用程序直接调用 IoT 服务的程序。
2、Java应用程序
连接到 IoT 服务
同样先进行连接,需要注意的是IoT 服务的访问点,格式如下:
client-id 属性的格式应该是 a:<orgid>:<app-id>
<orgid>与设备端相同,为sbgz8b,
<app-id> 是为应用程序设置的惟一 id;也可选择自己的 id。
authmethod 和 authtoken 属性应设置为之前所复制的应用程序信息中的相关字段(Key 和 Auth Token)内容。
订阅事件
应用程序端可订阅两种类型的事件:一种是来自设备端的状态消息,另一种是系统生成的连接监视器消息。订阅设备端事件的主题应为以下格式:
iot-2/type/<type-id>/id/<device-id>/evt/<event-id>/fmt/<format-id>
它应与设备端的事件格式保持一致。可使用加号(“+”)作为通配符,它将与主题树中的一个级别准确匹配。
订阅系统生成的事件的主题应为以下格式:iot-2/type/<type-id>/id/<device-id>/mon。也可使用加号(“+”)作为通配符。通过订阅系统事件,每次设备与 IoT 服务连接或断开连接时,都可收到消息。
这样,当收到一个消息事件后,应用程序里开始执行对应的业务内容即可。
发布消息
发布消息的主题应为以下格式:iot-2/cmd/<cmd-type>/fmt/<format-id>。它应与设备端上的消息格式保持一致。当然,该消息也被编码为 JSON 格式。
接下来,开始运行应用程序
运行设备端模拟程序进行发送消息,运行应用程序端程序进行消息的接收与处理。
运行一段时间后,检查正在运行的应用程序所发送到 IoT 服务上面的一些情况:
可按照下面的步骤查看 IoT 服务控制台上的使用情况以及设备接入等情况。导航到 IoT 服务控制台,在“设备”选项卡上,观察相关设备的情况。
也可以在“使用情况”一栏里,可以查看设备和应用程序对IoT服务的使用度量值。如下图所示:
通过以上的程序进行试运行之后,大家可以发现,直接使用 IBM Bluemix IoT 服务,并通过 MQTT 协议编写Java应用程序,与 MQTT 客户端的Java编程是一致的。但是需要注意的是,在调用 IBM Bluemix IoT 服务时,必须遵循它的格式要求,比如 MQTT 连接选项、发布和订阅主题的格式要求。
详情可参见 设备的 MQTT 连接 : https://docs.internetofthings.ibmcloud.com/zh_CN/messaging/devices.html
应用程序的 MQTT 连接 : https://docs.internetofthings.ibmcloud.com/zh_CN/messaging/applications.html
除了基于现有的 MQTT 客户端库进行应用开发之外,IBM也提供了大量其它各种不同平台语言进行开发,这样使得调用 IBM Bluemix IoT 服务来构建自己所熟悉的解决方案就会更加得心应手。从Github上面可以看到已经有了大量针对不同平台语言的开源库 : https://github.com/mqtt/mqtt.github.io/wiki/libraries ,比如我常玩的Java、Arduino类库,也有了针对Xcode 7 + Swift 2的MQTT客户端了,还有C、C++、Delphi、Erlang、Go、JavaScript、Node.js、Lua、.Net、Objective-C、Perl、PHP、Python、Ruby 、Tcl等等比较常见的基本上都有了相关的类库,为不同需要的开发者提供了最基础的开发客户端了,而无需再去重新发明轮子了。
通过标准的物联网MQTT协议,IBM Bluemix IoT 服务可以支持各种物联网 (IoT) 设备和数据的应用程序,比如 Arduino Uno、Raspberry Pi 等。请参阅注册设备一节查看详细信息 https://www.ng.bluemix.net/docs/#services/IoT/index.html
3、编写Ardunio设备程序
Arduino(http://www.arduino.cc/)是 2005 年推出的一个单主板微控制器(由它的创建者根据意大利北部城镇 Ivrea 的一个酒吧命名)。Arduino 使用一种基于 Java 语言的语言(叫做 Processing)而编写。Arduino 社区非常庞大,网络上拥有数百个使用该主板从各种传感器获取度量结果并控制各种传动装置的例子。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。然后,Arduino电路板就会根据程序执行对应的功能操作,控制各种传感器的实际工作!
接下来,通过Arduino类库为Ardunio编写测试程序:
经过代码的正确编译后,然后开始上传,来执行测试:
如果您的设备位于已有的设备列表当中,则可以直接通过借鉴它们的示例代码,然后进行更深入的业务需求进行定制开发了。如果手中的设备未在列表中,那就根据设备所支持的平台语言,查找对应的 MQTT 客户端类库,来构建自己的程序即可;比如:C、C++或Swift。
为了使应用程序端编程工作更容易,IBM Bluemix IoT 服务支持基于浏览器的流编辑器 Node-RED,而不是在本地进行编写程序代码了。无论是自行构建还是通过 Node-RED 编写程序,IBM Bluemix IoT 服务背后的 MQTT 流都具有相同的工作方式。
——本文转载自 IBM 云计算华南团队 (微信号:IBMCloud_SC)