使用 AWS 云平台构建物联网应用
摘要:本文介绍了如何使用亚马逊的AWS IoT来开发物联网应用。
当我们没有足够的能力或者时间去开发一些物联网云平台的时候,使用一些现有的成熟的云平台是一个很好的选择。通常来说,这些平台可以为我们带来更快的开发速度和更简单的解决方案,并且可以让我们集中于实现上的业务逻辑。我们只需连接上我们的设备、上传我们的数据,就可以在地球的另一端观察这些数据的变化。
在这些物联网平台中,做得比较不错的有:
- IBM的Bluemix Internet of Things
- Microsoft的Azure IoT Suite
- Amazon的AWS IoT
由于亚马逊的云服务比较领先,所以这里我们以亚马逊的AWS IoT作为示例。
AWS IoT 是亚马逊推出的一款托管的云平台,它可以使互联设备轻松安全地与云应用程序及其他设备交互。它可以支持数十亿台设备和数万亿条消息,并且我们可以对这些消息进行处理,同时将其安全可靠地路由至 AWS 终端节点和其他设备。我们还可以结合AWS的其他服务,如AWS Lambda、Amazon Kinesis、Amazon S3、Amazon Machine Learning 和 Amazon DynamoDB,来构建 IoT 应用程序,以方便我们收集、处理和分析互联设备生成的数据。
亚马逊的物联网解决方案和我们之前写的服务端代码一样,如图1所示。我们将在服务端接收设备传过来的数据并存储到服务器上,然后,通过手机等就可以直接访问这个API,并可以对设备进行控制—这里采用的是MQTT协议。
图1 AWS IoT
现在让我们登录AWS后台,可以看到如图2所示的内容。在本书写作的时候,AWS IoT处于测试版。但是相信在读者看到这本书的时候,已经可以使用了。
图2 AWS IoT控制台
现在,让我们创建一个Thing。这个步骤很简单,如图3所示,我们只需填写Name就可以创建。在AWS IoT中,Thing代表了设备的一个影子,即Device Shadow。而Rule则可以对数据进行过滤——我们可以创建一些规则,如当温度大于某个值时我们才将其发布到AWS IoT上。
图3 AWS IoT 创建Thing
这时,我们创建了一个名为Led的设备,如图4所示。上面会显示这个设备的REST API地址,及其MQTT Topic——我们只需订阅这个主题就可以使用这个设备了。然后单击下面的“Connect a device”按钮就会进入如图5所示的**配置页,确认并下载相应的文件就可以使用了。
图4 创建了一个名为Led的设备
图5 **配置页
现在,我们可以编写代码来测试我们的设备是否能正常使用了。这里我们需要使用到AWS IoT的SDK,这个SDK实际上只是对mqtt进行一些封装,安装这个SDK的过程很简单:
npm install aws-iot-device-sdk
我们需要配置相应的keyPath、certPath和caPath。这里的caPath需要到网上下载(网址:https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign- Class%203- Public-Primary-Certification-Authority-G5.pem,这个网址包含在代码里)。需要注意的是,这里的clientId实际上也是我们要控制的Thing的名字:
var awsIot = require('aws-iot-device-sdk');
var thingName = 'Led';
var thingShadows = awsIot.thingShadow({
keyPath: 'certs/fa635d3140-private.pem.key',
certPath: 'certs/fa635d3140-certificate.pem.crt',
caPath: 'certs/root-CA.crt',
clientId: thingName,
region: 'us-west-2'
});
thingShadows.on('connect', function () {
console.log("Connected...");
thingShadows.register(thingName);
setTimeout(function () {
console.log("Updating Led Status...");
var led = thingShadows.update(thingName, {
"state": {
"reported": {
"led": true
}
}
});
console.log("Update:" + led);
}, 2500);
thingShadows.on('status',
function (thingName, stat, clientToken, stateObject) {
console.log('received ' + stat + ' on ' + thingName + ': ' +
JSON.stringify(stateObject));
});
});
接着运行这个脚本会接收到下面的结果,同时我们可以观察到网页上的Shadow值也发生了相应的变化。
Connected...
Updating Led Status...
Update:Led-0
received accepted on Led: {"state":{"reported":{"led":true}},"metadata": {"reported":{"led":{"timestamp":1449151056}}},"timestamp":1449151056}
下面的Python代码讲述了更多的细节——使用SSL/TLS来连接MQTT服务器:
mqttc.tls_set("./certs/root-CA.crt",
certfile="./certs/fa635d3140-certificate.pem.crt",
keyfile="./certs/fa635d3140-private.pem.key",
tls_version=ssl.PROTOCOL_TLSv1_2,
ciphers=None)
mqttc.connect("a1dul237m8y7r3.iot.us-west-2.amazonaws.com", port=8883) # AWS IoT service hostname and portno
现在接上传感器,我们就可以上传数据了。
相关阅读
本文经授权节选自图书《自己动手设计物联网》第六章,作者黄峰达。
本书内容包括设计一个基于文本文件的物联网系统、实现以互联网为基础的物联网系统,即以HTTP协议与Web编程为基础的物联网系统、最后打造一个能结合多个物联网协议的物联网系统。读者将学会如何打造物联网的相关应用——手机App、温度趋势、网页端控制等,以及如何打造智能、安全的物联网系统的相关内容。
下一篇: WinFrom程序-配置文件的使用
推荐阅读