Blog:
Microsoft Azure IoT Hub应用 – 第一部分:向云端发送数据

2016年6月7日星期二
Colibri

Colibri

简介

物联网(Internet of Things)概念的本质其实就是关于发送数据到网络,所以称为云服务。随着时代发展和技术进步,人们可以使用尺寸更小功耗更低的电子设备并很容易的连接到云端,不过有一个问题却始终困扰着电子工程师们:如何使用这些获取的数据?而这正是物联网的主题。

Microsoft 主页 面有一些实际的应用例子来展示IoT的应用:一个电梯公司通过物联网来改善并提供预先维护;一个工业自动化公司通过物联网深入了解油气产业供应链,同时提供预先维护;还有一个公司通过IoT预测驾驶人员行为然后优化汽车利用。在读完这个系列文章后,我们期待读者可以拥有足够的知识和工具去部署应用来深度检视同时优化整个系统 – 不仅仅是积攒了一堆数据,而是从中获取了有用的结果!

Azure 是Microsoft提供的云服务平台,提供了多种应用如数据库,虚拟机,应用服务,机器学习,数据流分析,媒体和CDN服务,大数据解决方案,以及包括IoT Hub的其他众多应用。就其提供的大量应用本身已经是使用Azure服务的很好理由,但Microsoft更进一步通过和Amazon Web Services的对比来进一步证明其方案是更好的 – 和前面相反,这是一个通过用户和时间来确认的强有力宣言。另外,高安全性,易于整合以及容易上手也是选择Azure服务的另一个理由。

本系列文章通过开发一个IoT应用,从读取现场传感器数据,展示数据到获取商业智能(BI)。所使用的用来连接传感器以及上传数据到云端的平台:Azure IoT Certified Partner。Toradex 的Toradex Colibri VF61 计算机模块 + Iris Carrier Board。应用程序获取传感器数据然后上传到来自Microsoft Azure云解决方案的一个叫做Azure IoT Hub 的IoT服务,然后就可以被各种所需要的Microsoft Azure服务来处理。这部分内容将在本系列文章的第二部分着重讲解,在此我们主要关注在如何配置Azure IoT Hub以及上传数据到它上面。

我们选用的IoT环境为模型车监控。为了演示方便,将Toradex平台和传感器置于遥控模型汽车内,如下图1所示;而图2则给出的目标应用的框图。


Remote Controlled Car
图1:遥控汽车

Block diagram of the application
图2:应用框图

我们所选用的应用编程语言为Javascript 配合Node.js: 一个服务器端(本文中即Toradex嵌入式系统)基于Chrome V8 引擎编译的Javascript解释器。这个选择是考虑到Azure Iot Hub SDKs 可以提供的开发库。但是需要注意的是现在IoT Hub SDKs正处于频繁更新中,每一次更新都会有些改变(至少Node相关),所以在使用前需要考虑清楚。本文所使用的Azure IoT Node包版本为1.0.1。

整个环境的搭建,从开发嵌入式系统应用,到配置Azure来获取数据我们分为3个主要步骤,下面会分别介绍:

配置Azure环境

首先需要创建一个新的Azure账户:从Azure 网站可以申请30试用的免费账户。然后就可以使用账户里一定数目的信用额度来免费部署应用使用Azure 服务;同样,IoT Hub也有一个用于开发的包含有限资源的免费版本,且不受试用期限制。关于价格和IoT Hub的详细信息,请见这里

设置好Azure账户后,需要创建IoT Hub。用新创建的Azure账户登陆 Azure portal,选择 +New > Internet of Things > Azure IoT Hub。新的IoT Hub配置界面如下图3所示,“Pricing and scale tier”选项需要选择“Free”;然后在“Resource Group”选项创建一个新的资源组,另外“Location”选项需要和后面部署的服务保持一致;“Name”可以自由设定,而“IoT Hub Units”和”Device-to-cloud“选项在免费版本中则无法修改。点击“Create”后,服务就被部署了,这个过程可能需要几十秒时间。

Creating an IoT Hub from the Azure Portal
图3:从Azure Portal创建IoT Hub

上面操作完成后,可以看到IoT Hub已经出现在控制台,也就是Azure Portal 主页。点击后,如下图4所示页面会打开:里面包含“Essentials” 是如IoT Hub地区等基本信息;“Usage”是提供给系统管理员注册设备数目以及从设备发送信息数量的反馈信息;“Monitoring”是显示收到信息数量。

IoT Hub main panel
图4:IoT Hub 主面板

仍然在IoT Hub主面板上,为了让其他应用也可以访问服务,”Settings“选项卡里面的“Shared access policies“选项需要被选中。在新打开的” Shared access policies“选项卡中,点击“iothubowner”规则选项,这个包含了本IoT Hub所有可能的权限。如下图5所示,“iothubowner”选项卡会打开,然后复制”Connection string – primary key”对应的内容留作后用:这个是下一步用于管理和监控这个IoT Hub服务的钥匙。

Getting the iothubowner connection string
图5:获取iothubowner connection string
添加设备并发送信息到IoT Hub

现在云端设置已经完成,我们需要在开发主机上面安装iothub-exporer工具来添加设备到IoT Hub,另外如果开发主机是Windows的话,也可以选择Device Explorer工具。鉴于本文所使用的开发主机系统为Ubuntu 14.04,我们采用iothub-explorer。需要注意所需Node版本为0.12.x或以上(根据说明如需全部功能工作需要4.x或以上版本),但目前apt-get工具只能安装0.10.x版本。为了解决这个问题,需要先后安装Node Version Manager (NVM)和Node 版本0.12.9. 然后在终端中使用NPM(Node Package Manager)来安装iothub-explorer。

leonardo@leonardo:~$ npm install iothub-explorer@latest

然后可以运行iothub-explorer help参数来查看使用方法

leonardo@leonardo:~$ iothub-explorer help


根据上面命令的打印结果,iothub-explorer 包含有create和monitor事件参数。首先,我们配合上面图5中获取的connection string使用iothub-explorer工具来创建一个设备“tdx_iot_car”。注意“--connection-string”参数用来显示设备connection string (和图5中获取的IoT Hub connection string不同),这个也需要保存下来用来连接这个新创建的设备到IoT Hub,是的可以使用Colibri VF61应用来发消息到Hub。

leonardo@leonardo:~$ iothub-explorer "HostName=toradex.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=putyoursharedaccesskeyfromtheconnectionstringhere" create tdx_iot_car --connection-string
 
Created device tdx_iot_car
 
- 
  deviceId:                   tdx_iot_car
  generationId:               635931262207620183
  etag:                       MA==
  connectionState:            Disconnected
  status:                     enabled
  statusReason:               null
  connectionStateUpdatedTime: 0001-01-01T00:00:00
  statusUpdatedTime:          0001-01-01T00:00:00
  lastActivityTime:           0001-01-01T00:00:00
  cloudToDeviceMessageCount:  0
  authentication: 
    SymmetricKey: 
      primaryKey:   somesharedaccesskeyreturned
      secondaryKey: somesecondaryaccesskeyreturned
- 
  connectionString: HostName=toradex.azure-devices.net;DeviceId=tdx_iot_car;SharedAccessKey=somesharedaccesskeyreturned
Toradex嵌入式系统应用开发

现在来设置Colibri VF61 计算机模块 + Iris Carrier Board。本文中使用Toradex发布的预编译Linux image (Colibri_VF_LinuxConsoleImageV2.5),如何刷写image到模块请参考这里。然后请参考下面步骤安装Node.js, NPM 包和git – 安装过程需要一些时间,尤其是curl步骤。

root@colibri-vf:~# opkg update
root@colibri-vf:~# opkg install nodejs
root@colibri-vf:~# opkg install tar
root@colibri-vf:~# curl -L https://www.npmjs.com/install.sh | sh
root@colibri-vf:~# opkg install git

本文所展示的例程(send_data.js)相关packages installer和node文件存放于这里,可以通过下面命令将其clone到目标板上面并安装node packages

root@colibri-vf:~# git clone https://github.com/leograba/azure-iot-car.git
root@colibri-vf:~# cd azure-iot-car
root@colibri-vf:~# npm install

现在我们可以在目标板上面运行例程向IoT Hub发送数据,但有几点需要解释下:例程使用HTTP协议通讯,但AMQP和MQTT协议也是支持的;变量“connecionString”数值必须和上面用iothub-explorer工具创建新设备时候所保存下来string一致:

var connectionString = "HostName=toradex.azure-devices.net;DeviceId=tdx_iot_car;SharedAccessKey=somesharedaccesskeyreturned"

Setinterval()循环函数随机产生数值发送到IoT Hub, 用来模拟传感器数据,如温度,声纳传感器距离数据,加速度和陀螺仪传感器,一些gps坐标数据和来自目标板的时间日期等。如何从真实传感器获取数据将在这个系列文章的下一篇进行说明。JSON Stringify() 函数用来产生一个JSON编码数据串,然后封装于Message object用于发送。下面是一个JSON格式数据串示例:

{"ObjectName":"toradex2", 
"ObjectType":"SensorTagEvent", 
"temp":24.889683, 
"acceleration: 
{"accel_x":10.018892,"accel_y":0.039468,"accel_z":-0.081328}, 
"gyroscope": 
{"gyro_x":-0.0532362,"gyro_y":-0.01597086,"gyro_z":0}, 
"distance":0.17017, 
"boardTime":1458064972706}

正常情况下,在程序运行时候sendEvent()函数里面的callback函数不应打印任何串口输出。下面是在Colibri VF61上面运行程序并正常工作时候的串口打印输出:

root@colibri-vf:~/azure-iot-car# node send_data.js 
sending message to the IoT Hub
sending message to the IoT Hub
sending message to the IoT Hub
sending message to the IoT Hub
sending message to the IoT Hub
sending message to the IoT Hub
sending message to the IoT Hub
sending message to the IoT Hub

为了确保数据被收到,在Azure Portal面板会显示每天的消息计数,同时监控图表上面会有尖峰显示,如下图6所示。需要注意这些信息大概需要几十秒才会在portal上面显示出来。

Checking in the Azure Portal that data is being received
图 6: 在Azure Portal中确认数据被收到

另外,也可以使用iothub-explorer工具通过“monitor-event”参数配合device id来查看发送到IoT Hub的数据流,不过需要Colibri VF61程序要同步运行,而通过Azure Portal查看则不需要。下面图7展示了iothub-exploer收取目标板发送数据情况,上面是具体监测数据命令:

leonardo@leonardo:~$ iothub-explorer "your_iothub_connection_string" monitor-events yourdevice


Receiving data from the board into the iothub-explorer
图7:用iothub-explorer收取目标板发送数据

Microsoft Azure网站上面提供了很多文档用于帮助用户开发更复杂和稳固的应用。参考这些文档可以从中获取更多有用信息,如创建一个设备,或者从Hub获取设备发送的数据是可以通过编程来完成的。另外,在接下来的文章中我们将侧重连接真实传感器到Colibri VF61 + Iris载板,并传输真实传感器数据到IoT Hub, 这个也可以用作其他Azure 服务来给设备部署应用提供深度检视或变量操控。

I我们希望通过本文可以让用户了解并最终使用Toradex 嵌入式系统方案配合Auzre IoT Hub服务,然后从中获益。同时,我们也想在这里感谢来自巴西的Grupo Viceri团队在Azure and Business Intelligence上面的丰富经验最终促成了这个IoT Car 项目。

参考

本文最初使用葡萄牙语发表于 Embarcados.com,详见 这里

作者: Leonardo Graboski Veiga, Toradex Brasil

评论

Please login to leave a comment!
Have a Question?