此文章由机器翻译。

.NET Micro Framework

使用具有 Azure Blob 存储的 Gadgeteer 创建 IoT 设备

Benjamin Perkins

下载代码示例

在未来的五年中,互联网连接的设备的数量将人类总人口的三倍以上。这些设备不会局限于智能手机和平板电脑,我们使用现在,但是将包含嵌入到家电、 电梯、 汽车、 商业环境、 臂带、 衣服和更多的额外设备。这些设备将捕获信息关于能源消耗、 速度、 温度、 各种气体、 血压、 心率、 程序或硬件异常,和你可以想象的任何东西的存在。

这些设备所捕获的数据需要存储在一个高度可扩展、 高度可靠、 高度可用的环境中。可用我的意思是一旦数据存储,它赖以存在的平台应该提供服务、 功能和处理能力进行分析,从学习和行动上所收集的数据。在这篇文章,我要向您展示如何使用: — — 快速的硬件开发平台基于 Microsoft.NET 微框架 — — 以建造的装置,用于捕获数据 ; 微软 Azure 存储来存储数据 ; 和 Azure 平台进行分析和使用数据。按照下面的流程,你就开始你的旅程的物联网 (物联网) 一代。

我将讨论那些三个组件、:、 Azure Blob 存储一些数据采集和分析组件的详细的 Azure 平台。此外,我将提供详尽的代码级别说明如何使用: 将图像插入到 Azure Blob 存储容器。

: 提供的 GHI 电子有限责任公司 (bit.ly/11ko85B),包括套件、 模块和主板 (如 FEZ 猛禽,FEZ 水螅和用于此项目的蜘蛛 FEZ) 用于创建许多不同类型的设备。这些设备可以用于捕获数据的众多品种。例如,他们可能会用于气体传感模块检测气体空气、 运动检测器或用于测量相对温度和湿度的模块中。FEZ 蜘蛛兼容模块需要完成这篇文章中讨论的项目如下:相机、 一个以太网插孔和一个电源模块。第一节,看看你如何配置模块和开发准备捕获的图像插入到 Azure Blob 存储容器所需的代码。

图 1 显示的项目配置。除了相机、 以太网插孔和电源,也是在设备 ; 上显示的 IP 地址以及日期和时间的字符显示 LED 光源,视觉的通知 ; 和一个按钮触发捕获图片和过程,将其上载。

FEZ 蜘蛛配置为拍一张照片和 Azure Blob 容器中存储
图 1 FEZ 蜘蛛配置为拍一张照片和 Azure Blob 容器中存储

在安装.NET 微架构后, GHI 二进制文件 (包 2014 R5) 和.NET: 到你的开发机器上的 SDK 开始通过在 Visual Studio 2012 (Visual Studio 2013 也支持,虽然不是很广泛测试) 中创建一个新项目,然后选择: 模板。一旦你给了该项目的名称,该向导将引导您完成选择主板与微架构版本。然后,使用工具箱添加模块,以建立您的设备,类似于所示图 1

当模块所有物理上连接到主板上的插槽时,开始要实现项目目标所需的代码更改 — — 连接到网络和拍一张照片。使用网络连接的模块是 ethernetJ11D,支持常见的 RJ-45 网络适配器。下面是一些代码,从而使 ethernetJ11D 模块执行连接并获得分配的 IP 地址:

ethernetJ11D.NetworkInterface.Open();
ethernetJ11D.NetworkSettings.EnableDhcp();
ethernetJ11D.NetworkSettings.EnableDynamicDns();
ethernetJ11D.UseDHCP();

当然,这并不是唯一的途径来实现连接 ; 然而,它是什么效果最好,在这方面最简单。

一旦连接,您可能想要执行简单的 System.Net.Http­WebRequest 请求,类似于所示图 2,以确保按预期方式工作与互联网的连接。

图 2 测试您的互联网连接

void makeGenericHTTPRequest()
{
  try
  {
    string url = "https://www.contoso.com/";
    using (var req = System.Net.HttpWebRequest.Create(url))
    {
      using (var res = req.GetResponse())
      {
        Debug.Print("HTTP Response length: " 
          + res.ContentLength.ToString());  }
    }   
  }
  catch (Exception ex)
  {
    Debug.Print(ex.Message);
  }
}

请注意,HTTPS 协议不会在这里工作,而无需一些配置。如果您收到异常 (如"类型 'System.NotSupportedException' 发生在 Microsoft.SPOT.Net.Security.dll 的第一次机会异常",必须更新设备上的 SSL 种子。您可以使用.NET 微架构部署工具 (MFDeploy.exe),位于 C:\Program 文件 (86) \Microsoft.NET Micro Framework\v4.3\Tools 目录中。与设备连接到开发计算机,导航到目标 |管理设备键并单击更新 SSL 的种子,如中所示图 3。当这样做了时,HTTPS 应按预期方式工作。

.NET 微架构部署工具 MFDeploy
图 3.NET 微架构部署工具 MFDeploy

一旦你已经连接到网络和因特网配置并且正常工作,它是重要的是在设备上设置的日期和时间。正如讨论以后的日期和时间是的动议付诸表决 Blob REST API 所需的部件 (bit.ly/1BTiIu9),您会使用 Azure Blob 容器中插入图像。若要设置的日期和时间,请使用 TimeServiceSettings 类,它是的 Microsoft.SPOT.Time 命名空间的一部分,如下所示:

TimeServiceSettings time = new TimeServiceSettings()
{
  ForceSyncAtWakeUp = true
};
IPAddress[] address = Dns.GetHostEntry("time.windows.com").AddressList;
time.PrimaryServer = address[0].GetAddressBytes();
TimeService.Settings = time;
TimeService.SetTimeZoneOffset(0);
TimeService.Start();

一旦运行了 TimeService,您可以检索使用标准的 DateTime.UtcNow 或 DateTime.Now 属性的当前时间戳。

捕获映像使用 GHI FEZ 蜘蛛兼容的照相机需要一行代码:

camera.TakePicture()

记得我添加按钮模块到该设备。它是从该按钮按下事件调用 TakePicture 方法时。当该图片是采取,相机。PictureCaptured 事件触发,并反过来调用方法 camera_PictureCaptured (照相机的发件人,gt。图片 e)。我使用标准的 C# 代码将事件处理程序和方法将压制和捕获的事件链接到其相应的方法:

button.ButtonPressed += button_ButtonPressed;
camera.PictureCaptured += camera_PictureCaptured;

Camera_PictureCaptured 方法接收 gt。图片作为一个参数。正在转换为 byte [] 数组,使用 e.PictureData 属性后, 的图像数据传递到 Azure Blob 容器中插入的自定义方法。读这篇文章,这一进程可能看起来很复杂,但它是真的非常简单,如中所示图 4。此外,您可以下载代码示例,伴随着这篇文章,看看整件事。

图片捕获流程
图 4: 图片捕获流程

图 5 显示用于使用 AzureBlob 类,在哪里创建授权标头的下一节中讨论的代码 (bit.ly/1z0gThK) 和调用图像插入到 Azure Blob 容器的 REST API。

图 5 将图像插入到 Azure Blob 存储

void insertImageintoAzureBlob(GT.Picture picture)
{
  AzureBlob storage = new AzureBlob()
  {
    Account = "ACCOUNT-NAME",
    BlobEndPoint = "https://ACCOUNT-NAME.blob.core.windows.net/",
    Key = "CONTAINER PRIVATE KEY"
  };
  if (ethernetJ11D.IsNetworkUp)
  {
    storage.PutBlob("CONTAINER-NAME", picture.PictureData);
  }
  else
  {
    characterDisplay.Print("NO NETWORK CONNECTION");
  }
}

从设备的角度来看,这是它。该设备是现在组装和连接到互联网,和逻辑来捕获映像并将它用正确的格式发送到放 Blob REST API 是最完美的。接下来,我创建的 Azure Blob 存储帐户和容器和配置需插入图像的代码。

蔚蓝的 Blob 存储

Azure 的 Blob 存储是一个有用的服务,提供图像、 文档、 视频等等从任何地方使用 HTTP 或 HTTPS 访问。例如,如果您有一个名为 home.bmp 的图像,一个公共的 Azure 存储帐户命名为 contosox 和一个名为 blob,从浏览器访问的.bmp 文件的容器就像 http://contosox.blob.core.windows.net/blob/home.bmp 进入浏览器或从 HTML 或源代码引用 URL 一样简单。

插入、 清单、 下载和删除从 Azure Blob 容器标准的.NET 应用程序中的 blob 完成使用 Azure.NET 存储客户端库通过 Microsoft.Windows­Azure.Storage 大会。此程序集,不幸的是,不是可用或兼容.NET 微架构,或者: 设备上。这不是问题,不过,由于 Azure Blob 存储服务提供可公开访问其他 Api 支持相同的插入,列表、 下载和删除功能 (见 bit.ly/1xPN55v 的详细信息)。因此,消费这些从物联网设备的功能是作为一个标准的 REST API 调用一样简单。

吧如何创建 Azure Blob 存储帐户和容器 ; 如何创建使用.NET 微框架 4.3 ; 其余部分 API 授权标头 和怎么去上一节中捕捉到的图片上传到 Azure Blob 容器。

创建从 Azure 管理控制台中的 Azure 存储帐户,然后单击 + Add 按钮以添加容器。在此示例中,存储帐户名称是 contosox 和容器是 blob,如中所示图 6

创建用于存储从物联网设备的拍摄 Azure 存储容器
图 6 创建用于存储从物联网设备的拍摄 Azure 存储容器

中的示例图 7 是所需消耗放 Blob REST API 的数目。将图像的名称追加到 URL 所示图 6 和 System.Net.HttpWebRequest 类的 GetRequestStream 方法调用返回一个 System.IO.Stream 对象。并成功地使用 System.IO.Stream 类的 Write 方法将图像保存到 Azure Blob 容器。请注意使用 Write 方法的 blobContent 参数是 byte [] 内容载于 gt。Picture.PictureData 属性。

图 7 消费付诸表决的 Blob REST API

Uri uri = new Uri("ACCOUNT-URL\CONTAINER\" + "IMAGE-NAME");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
try
{
  using (Stream requestStream = request.GetRequestStream())
  {
    requestStream.Write(blobContent, 0, blobLength);
  }
}
catch (WebException ex)
{
  Debug.Print(ex.Message);
}

不太复杂 ; 它非常类似于一个 REST API 调用从一个标准的 ASP.NET 或 Microsoft.NET 框架的应用程序。差异 — — 和复杂性 — — 来自授权标头,则在此处定义的创建:

Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"

当创建了 Azure Blob 容器时,它是公开的也就是说任何人都可以从中读取通过前面提到的 URL。然而,添加或删除一个 Blob 需要授权标头,要请求中。在页眉中的 SharedKey 值通知服务器共享的访问键存在,并且应该用于请求的身份验证。SharedKey 是关联到 Azure 存储帐户,在此示例 contosox,并获得通过点击管理给定的存储帐户的访问键。访问主键文本框中,在说明中包含的值图 8,是用于访问该容器的 SharedKey。

获得 SharedKey 必要的 Azure 存储身份验证
图 8 获得 SharedKey 必要的 Azure 存储身份验证

此外,授权标头的签名部分必须基于哈希的消息身份验证代码 (HMAC) 使用数量的请求属性,使用 System.Se 计算构造­curity.Cryptography.HashAlgorithm.ComputeHash 方法和编码的 System.Convert.ToBase64String 方法。

我会打破那一点点,入手构建授权标头所需的组件。这些包括属性,如内容类型内容长度 x-ms-版本,共享访问键和许多其他标头值,在详细介绍了 bit.ly/1BTiIu9。更重要的属性之一是 x-ms-日期,这是您必须设置的日期和时间在设备的初始化过程中的原因。X-ms-日期必须是 UTC 时间戳。在设备上的时间戳必须少于 15 分钟的差速器相比,托管存储服务的服务器上的时间戳。存储服务可确保请求不超过 15 分钟 ; 如果时间框架有一个更大的差别,该服务返回 403 (禁止)。其他属性不会改变和可以硬编码或检索从某些其他来源 — — 一个配置文件,例如。

一旦授权标头的格式正确,这需要大约 35 行代码,它需要进行哈希处理和编码要求。使用.NET 框架的完整版本,所需的代码类似于这样:

using (HashAlgorithm hashSHA256 = 
  new HashAlgorithm(HashAlgorithmType.SHA256))
{
  Byte[] dataToHmac = 
    System.Text.Encoding.UTF8.GetBytes(canonicalizedstring);
  signature = 
    Convert.ToBase64String(hashSHA256.ComputeHash(dataToHmac));
}

哈希授权标头所需的 System.Security.Cryptography.HashAlgorithm.ComputeHash 方法存在的微.net 版本 4.3 (bit.ly/1wIl77O) 和哈希签名是有效的选项。然而,我选择开发 WebAPI 接受作为参数的构造的标头,对其进行编码,散列值并将它返回到与放 Blob REST API 调用一起使用:。我选择了这种方法,主要是因为我想要测试: 从调用的 WebAPI,发现这是一个逻辑的地方去做。下面的代码演示如何 WebAPI 被称为从: 设备:

string queryString = "constructedHeader=" + constructedHeader;
Uri uri = new Uri("https://*??.azurewebsites.net/api/HMACSHA256?" + queryString);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
reader.Close();
response.Close();

来自 WebAPI,作为你的响应可能已经知道,是一个 JSON 对象,responseFromServer 字符串的内容。还有在开源 MicroJSON 图书馆 microjson.codeplex.com,这对于分析结果的 WebAPI 和得到的哈希和编码的授权标头值非常有用:

var jdom = (JObject)JsonHelpers.Parse(responseFromServer);
var hashedvalue = jdom["HashedValue"];
StringBuilder authorizationHeader = new StringBuilder("{0} {1}:{2}")
  .Replace("{0}", SharedKeyAuthorizationScheme)
  .Replace("{1}", "contosox")
  .Replace("{2}", hashedValue);

此外,使用字符串。IndexOf 方法与该字符串的组合。子字符串的方法可以达到同样的效果。

该字符串。格式方法当前不支持在.NET 微架构 ; 因此,用 StringBuilder.Replace 来构造 authorizationHeader。如前所述,授权标头包含 SharedKeyAuthorizationScheme,这是组合的 SharedKey 或 SharedKeyLite ; Azure 博客存储名称,contosox ; 和编码和散列签名。当授权标头的格式设置正确时,将它添加到放 Blob REST API 请求对象并执行它。一旦通过身份验证的图像,它被添加到 Blob 容器:

request.Headers.Add("Authorization", authorizationHeader);

在此示例中,触发图像插入 Azure Blob 容器的事件,是按下一个按钮。我选择了这种方法只是为了创建此概念验证项目。真实世界中的实现可能会改用议案、 气体、 大气压力、 温度或湿度传感器。真的,任何一个模块存在的违反了给定的阈值时触发事件可以用来拍摄照片,然后将其上载到 Azure。在许多情况下,物联网设备的要求,等等将不包括图像,只有存储捕获的数据,例如温度、 速度、 气体水平、 时间。这类数据可以存储在数据库中通过一个简单的 WebAPI 调用,一个与我讨论以前,但无需授权标头,因为没有 Blob 或图像相似。

现在,捕获数据并将其存储在 Azure 平台上,问题是要用它来做什么以及如何分析和从中吸取教训。下一节中,我将提供一些思路和结论性的想法,继续的审查、 发展和未来的讨论。我的意图在这里一定没有显示的端到端的物联网解决方案,所有的细节,但愿意提供精神食粮,推动这些概念。

Microsoft Azure

大多数 IT 专业人员有一个好主意,"大数据"一词意味着什么。然而,如何使用,收获它是可能不清楚。当我刚开始学习大数据时,最初的障碍,我发现我可以使用用于处理工具 (如 HDInsight、 功率双、 活动中心、 机器学习或流分析的数据源。尽管如此,开始使用这些服务,学习的特性和功能,但没有的数据上运行我的算法大源,我很快失去了兴趣。我终于明白什么是物联网 — — 这些互联网连接的设备 — — 可用于收集数据和建立与这些 Azure 服务一起使用的信息一大来源。

很明显每个这些服务旨在随着物联网在心目中,考虑事件集线器和流分析实时决策和 HDInsight 和机器学习分析大量的数据,寻找长期趋势。例如,事件集线器,专门用来摄取数以百万计的每秒设备触发事件,为大型物联网解决方案提供了必要的规模。对于公司和企业已经实施物联网解决方案,或在开始创建自己的物联网战略,事件集线器将一个伟大的开始,来管理长期增长和规模。此外,流分析与事件集线器集成在一起,可以提供到事件集线器设备所提交的数据的实时分析。流分析可以被发送到事件的集线器与历史数据对数据进行比较,并主动发送警报,如果目前的模式不匹配的历史。想象一下,这个可能性。

组织和即使有较大的数据池的人 — — 不一定由物联网设备收集 — — 可以使用该数据的分析的 HDInsight 或机器学习服务。HDInsight 是一个 Hadoop 的解决方案,可以扩展到兆兆字节甚至 petabytes 的数据需求,和 Azure 平台提供了几乎无限量的存储和计算资源。使用 HDInsight 来查找隐藏的商机一起或单独从机器学习以挖掘数据以帮助预测未来的趋势和行为。这些服务向您介绍新的物联网时代通过创新的方式,开辟了巨大的可能性,所有的一切都可以在通过功率双方便用户的方式提出了一种公开以前看不见的信息。

总结

这篇文章的目的是去解释如何配置使用: 物联网设备,将其连接到互联网上, 传图片到 Azure Blob 容器中的云。将数据从一个设备插入到任何互联网访问的数据源需要只是简单的 Web­API 调用和实际设备硬件的配置非常简单,拖动并将模块从一个工具箱菜单放到设计模板。在此示例中的唯一的真正的复杂性成立放 Blob 其余 API 授权标头,它必须在特定的格式进行编码和散列使用 System.Security.Cryptography.HashAlgorithm.ComputeHash 方法通过 WebAPI 或使用.NET 微框架类。

我也总结了一些 Azure 平台服务,并建立其存储和分析的数据捕获从物联网设备的扩展能力。一旦您的设备开始捕获足够数量的数据,你就可以使用 Azure 平台服务,如事件集线器和流分析进行实时分析和 HDInsight 和机器学习进行长期调查。发现的秘密隐藏在大量的生成、 存储、 处理和呈现信息然后可以用于业务决策、 预测和帮助您企业的战略取得成功。这样吧 !


Benjamin Perkins 是微软和 IIS、 NHibernate 和微软 Azure 三本书的作者的高级技术支持升级工程师。他目前正在写 C# 并行的 C# 6.0 版本出版的书。您可以通过 colin.miller@microsoft.com 与他联系。

衷心感谢以下 Microsoft 技术专家对本文的审阅:马丁 Grasruck 和科林 · 米勒