首页 > 其他分享 >物联网 - 使用Azure IoT Suite来促进物联网开发

物联网 - 使用Azure IoT Suite来促进物联网开发

时间:2022-12-16 17:01:25浏览次数:61  
标签:remotecamera 解决方案 IoT 联网 命令 Azure 远程 设备


Internet of Things - Use Azure IoT Suite to Boost IoT Development

By ​​Dawid Borycki​​​ | June 2017 | ​​Get the Code​


物联网-物联网套件使用Azure助推物联网发展

由​​大卫borycki​​​2017年6月| |​​获取代码​


图1)。此外,用户不仅可以看到与远程设备获取信息,而且远程控制装置。你可以找到完整的源代码,支持这次的讨论​​msdn.com/magazine/0617magcode​​。


 

图1预配置Azure物联网套件解决门户和远程通用Windows平台的应用程序,获取和处理视频流

遥控装置

程序与Windows 10的物联网核心Raspberry Pi的基础已经在该杂志的讨论(Frank LaVigne​​msdn.com/magazine/mt694090​​​)和Bruno Sonnino(​​msdn.com/magazine/mt808503​​)。拉维妮,尼诺显示了如何设置开发环境和物联网板,如何在浏览器中使用设备门户配置物联网单位,如何控制与Windows 10物联网核心的GPIO端口。此外,拉维妮在他的文章中,物联网可以用来计划和控制远程摄像机提到。在这里,我发展了这一思想,并明确说明如何把Raspberry Pi为这样的设备。

为此,我创建remotecamera通用的Windows平台(UWP)应用程序使用空白应用程序(Windows通用)Visual C #项目模板,然后设定目标和最低API版本Windows 10周年纪念版(10;建14393)。我使用这个API的版本使结合的方法,这让我直接线方法的视图模型的可视化控件的事件了:



<按钮 X:名字=“buttonpreviewstart“       内容=“开始预览“       点击=“{ x:绑定remotecameraviewmodel previewstart }。“ />


接下来,我宣布界面如<strong>图1</strong>。有两个标签:摄像头捕捉和云。第一个包含用于启动和停止相机预览控件,显示视频流和呈现图像的亮度(一个标签和一个进度条)。第二标签包含两个按钮,你可以用它来连接设备到云与物联网门户登记装置。云标签也有一个复选框,可以使流遥测数据。

多数与UI相关的逻辑是在remotecameraviewmodel类实现(看到的remotecamera项目程序的子文件夹)。这节课,除了实施几个属性绑定到UI,处理视频图像采集、图像处理和云相互作用。这些子功能将在单独的类中实现:摄像机俘获,图像处理和cloudhelper,分别。我将讨论摄像机俘获和图像处理芯片不久,而cloudhelper及相关辅助类将进行的预配置Azure的物联网解决方案上下文之后。

摄像头捕捉

摄像头捕捉(见助手文件夹下的CameraCapture.cs)是建立在顶部的两个要素:windows.media.capture.mediacapture类和windows.ui.xaml.controls.captureelement。前者用于获取视频,后者显示所采集的视频流。我获得了视频摄像头的,所以我要在package.appxmanifest申报相应设备的能力。

初始化mediacapture类,调用initializeasync方法。最后,你可以通过这种方法的mediacaptureinitializationsettings类的一个实例,它可以让你指定捕获选项。你可以在视频或音频流和捕获硬件选择。在这里,我只从默认的摄像头获取的视频(见<strong>图2)</strong>。


图2摄像头捕捉初始化



公共mediacapture {得到;私人 配置;} =新mediacapture();公共 布尔IsInitialized {得到;私人 配置;} =假;公共 异步IsInitialized)
{
VaR设置=新 {
等待

};抓住;
}
}


其次,使用的captureelement类实例的源属性,我丝这个对象与mediacapture控件来显示视频流。我也getvideoproperties调用helper方法,读取和存储视频帧的大小。我用这个信息后处理得到的预览框。最后,真正的开始和停止视频采集,我祈求的mediacapture类startpreviewasync和stoppreviewasync。在摄像机俘获我用这些方法与额外的逻辑,验证初始化和预览状态:



公共 异步(IsInitialized)
{
如果(!mediacapture。startpreviewasync();
ispreviewactive真正的<trans data-src="" ;"="" style="box-sizing: border-box;">;
}
}


当你运行应用,你可以按下启动预览按钮,它配置的摄像头采集的,你就会看到相机图像一会儿。请注意,remotecamera应用程序是通用的,所以它可以在不给你任何变化发展的PC,智能手机,平板电脑或Raspberry Pi。如果你测试你的Windows 10 PC的remotecamera应用程序,您需要确保应用程序可以使用你的相机。你配置此设置的设置程序(隐私/相机)。测试应用程序与Raspberry Pi我用一个低预算的微软生活凸轮HD-3000型。这是一个USB摄像头,所以它的自动检测到Windows 10物联网核心我连接到四个Raspberry Pi的USB端口后。你会发现一个完全兼容Windows 10物联网核心在相机列表​​bit.ly/2p1zhgd​​。一旦你连接你的网络摄像头的Rasbperry Pi,它会出现的装置入口设备选项卡下。


图像处理器

的图像处理类计算当前帧的背景亮度。执行后台操作,我创建了一个线程与基于任务的异步模式,如<strong>图3</strong>。


图3计算背景亮度



公共 事件imageprocessoreventargs processingdone EventHandler < >;私人 无效cancellationtokensource() 
加工任务;新任务(异步" style="box-sizing: border-box;">()= >
{
虽然(!(活跃)
{
VaR亮度=等待ImageProcessorEventArgs(亮度));
任务。Delay(延迟)。wait();
}
}
},processingcancellationtokensource令牌)。


在while循环中,我确定了图像的亮度,然后把价值的processingdone事件监听器。这一事件是美联储的imageprocessoreventargs类的一个实例,它只有一个公共财产,亮度。处理运行直到任务取消信号接收。关键的是图像处理getbrightness方法,示于<strong>图4</strong>。


图4 getbrightness方法



私人 异步任务组字节 GetBrightness()" style="box-sizing: border-box;">> getbrightness() 
{
VaR亮度=新 字节(摄像机俘获。ispreviewactive)
{
//获取当前预览位图 VaRpreviewbitmap =等待
亮度;


我访问使用的摄像机俘获类实例getpreviewbitmap预览框。在内部,getpreviewbitmap使用的mediacapture类getpreviewframeasync。有getpreviewframeasync两版本。第一,一个无参数的方法,返回一个类的实例的视频帧。在这种情况下,你可以通过阅读direct3dsurface财产获得实际的像素数据。第二版接受视频­框架类和复制像素数据的实例对其softwarebitmap财产。在这里,我用的是第二选项(见getpreviewbitmap方法的摄像机俘获类)然后获取像素数据通过copytobuffer方法的softwarebitmap类实例显示在<strong>图5</strong>。


图5访问像素数据



私人 字节=摄像机俘获。BitmapPixelFormat)
{
softwarebitmap。转换(softwarebitmap,摄像机俘获。BitmapPixelFormat);
}/ /锁定潜在的位图缓冲 VaRbitmapbuffer = softwarebitmap。lockbuffer(bitmapbufferaccessmode。读);
/ /使用位图的高度来确定飞机的描述 / /和步幅(缓冲区的实际宽度) VaRplanedescription = bitmapbuffer。getplanedescription(0);
VaRpixelbuffer =新 字节 softwarebitmap。CopyToBuffer(pixelbuffer。asbuffer());
退货[ ] pixelbuffer)
{
/ /环指数增加四起 /有四个频道(蓝色,绿色,红色和α)。 / / Alpha是亮度计算忽略了 const int一步= 4;
双平均= 0;
为(无符号整型<trans data-src="" i="0;" <="" pixelbuffer.length;="" +="step)"" style="box-sizing: border-box;">我= 0;i < pixelbuffer。长度;我+ =步)
{
平均+ = getgrayscalevalue(pixelbuffer,I);
}
平均/ =(pixelbuffer.length /步)退货startIndex)
{
VaR灰度值=(pixelbuffer [字符]
+ pixelbuffer [指数+ 1 ]
+ pixelbuffer [指数+ 2 ])/ 3;
退货
{
亮度)如果 {
等待" style="box-sizing: border-box;">调度。RunAsync(CoreDispatcherPriority.Normal()= >
{
displaybrightness(亮度);
});
}


配置远程监控解决方案

提供一个解决方案,你可以使用一个专门的门户网站在​​azureiotsuite.com​​。登录后,选择你的Azure订阅,您将被重定向到一个页面,点击“创建新的解决方案“矩形。这将打开一个网站,你可以选择一个预配置的解决方案:两预测维修或远程监控(见图8)。在选择另一种形式出现的解决方案,它可以让你在Azure资源设置方案名称和区域。在这里,我的解集的名字和地区,RemoteCameraMonitoring和美国西部,分别。


 

图8物联网解决方案套件配置Azure(顶部)和远程监控的解决方案配置(下)

当你提供的远程监控解决方案,蔚蓝的物联网套件门户创建几个Azure资源:物联网的枢纽,流分析工作,存储和应用程序服务。物联网中心提供设备之间的双向通信和远程云。数据流由远程设备由流分析工作转化,通常过滤掉不必要的数据。过滤后的数据存储或直接用于进一步的分析。最后,应用程序服务是用于主机的门户网站。

解决方案配置也可以从命令行完成。这样做,你可以复制或下载的解决方案源代码​​bit.ly/2osi4rw​​​,然后按照指令​​bit.ly/2p7mppc​​​。你还可以选择部署方案在局部,如图所示​​bit.ly/2neepni​​。在这种情况下,没有蓝色的APP服务创建因为门户运行在本地机器上的解决方案。这种方法可以用于调试或当你想修改一个预配置的解决方案的开发是非常有用的。

一旦配置完成后,您可以启动的解决方案,以及门户网站将出现在默认浏览器(参照<strong>图1)</strong>。这个网站有几个标签。在本文­CLE的目的,我会限制我的关注只是其中的两个:仪表和设备。仪表盘显示的地图与远程设备和遥测数据流。设备选项卡列出远程设备,包括身份、能力和描述。默认情况下,有几个模拟设备。让我解释一下如何登记新的,非仿真硬件。

注册设备

登记你使用解门装置,当你按下添加设备链接位于左下角。然后你可以模拟或自定义设备之间的选择。选择第二个选项并按“添加新按钮。现在你可以定义设备ID。我将此值设置为remotecamera。然后,添加一个自定义设备的形式显示装置的凭据,(见<strong>图9)</strong>,我会用我以后的连接物联网设备的物联网中心。


 

图9设备登记汇总

设备元数据和云通信

该装置将会出现在设备列表中,然后你可以发送装置或设备信息元数据。设备信息包括一个JSON对象,描述了远程设备。这个对象告诉云终端设备的功能,包括硬件描述和远程命令您的设备接受列表。这些命令可以由最终用户设备通过物联网解决方案的门户派。在remotecamera APP,设备信息被表示为deviceinfo类(在azurehelpers子文件夹):



公共 类
;}公共 字符串版{得到;配置
;}公共deviceproperties deviceproperties {得到;配置
;} }


对deviceinfo第一个属性指定设备是否进行定义的deviceinfo对象的版本。以后你会知道,第三属性,对象类型,设置为一个字符串常量, deviceinfo。这个字符串是由云应用,具体由碧流分析工作,过滤从遥测数据设备信息。接下来,deviceproperties(见azurehelpers子文件夹)持有的属性集合(如序列号、内存、网络、内存),描述你的装置。最后的命令属性是一个远程命令你的设备识别。你通过指定其名称和参数列表定义每一个命令,这是指挥commandparameter类为代表,分别为(见azurehelpers命令。CS)。

建立你的物联网设备和你使用的microsoft.azure.devices.client NuGet包物联网中心之间的通信。这个包提供了deviceclient类,您可以用它来发送和接收消息和从云。你可以创建一个实例的deviceclient使用创建或createfromconnectionstring静态方法。在这里,我使用第一个选项(在azurehelpers文件夹cloudhelper.cs):



公共 异步IsInitialized)
{
deviceclient = deviceclient。创造(
配置。主机配置。authenticationkey());等待;
beginremotecommandhandling();
}


你可以看到,这deviceclient。创建方法要求您提供的主机名的物联网中心和设备证书(标识符和关键字)。你获得这些值从解门在设备配置(参照<strong>图9)</strong>。在remotecamera APP,我店的主机名,设备ID,在配置静态类的关键:



公共 静止的 类;
公共 静止的 字符串DeviceID {得到;} =“remotecamera”;
公共 静止的DeviceAuthenticationWithRegistrySymmetricKey(DeviceID,DeviceKey);
}


此外,配置类实现一个静态方法认证密钥,将设备认证的deviceauthenticationwithregistrysymmetrickey类的一个实例。我用这个简化的deviceclient类实例的创建。

一旦连接,所有你需要做的是把deviceinfo,如<strong>图10</strong>。


图10发送设备信息



公共 异步deviceinfo() 
{
issimulateddevice =假,
版“1”deviceproperties(配置。DeviceID),
/ /指令集 命令=新SendMessage(deviceinfo);


的remotecamera应用程序发送的设备信息,它描述了真实的硬件,所以issimulateddevice属性设置为false。正如我所提到的,ObjectType将DeviceInfo。此外,我的版本属性1。对于deviceproperties我使用任意值,这主要是由静态字符串(看到的deviceproperties班setdefaultvalues法)。我还定义了一个远程命令,更新相机预览,使预览摄像头远程控制。这个命令有一个布尔参数,ispreviewactive,说明相机预览应该启动或停止(见下azurehelpers文件夹的commandhelper.cs文件)。

实际数据发送给我实施SendMessage方法云:



私人 异步deviceclient。sendeventasync(serializedmessage);


基本上,你需要将你的C #对象以JSON格式的对象包含的字节数组(参见azurehelpers子文件夹的messagehelper静态类):



公共 静止的Message Serialize(目标
);VaRJSONData= jsonconvert。SerializeObject(obj);
退货 新任务connect()
{
等待;


第二按钮的单击事件处理程序是有线的cloudhelper类实例的senddeviceinfo方法。前面讨论的方法。

一旦你连接到云,你也可以开始发送遥测数据,就像你什么时候发送设备信息。就是说,你可以用SendMessage方法,你通过遥测对象。在这里,这个对象,­的遥测数据类的一个实例,都是单属性,亮度。下面显示了一个完整的发送遥测数据到云的例子,cloudhelper班内sendbrightness方法实现:



公共 异步 无效sendbrightness(字节(IsInitialized)
{
/ /建立遥测数据 VaR遥测数据=新SendMessage(遥测数据);
}


sendbrightness调用权取得的亮度后,通过图像处理计算。这是在processingdone事件处理程序执行:



私人 无效imageprocessor_processingdone(目标 displaybrightness(e.brightness);
/ /发送遥测 如果beginremotecommandhandling()
{
运行(任务。异步" style="box-sizing: border-box;">()= >
{
虽然(真正的deviceclient receiveasync();
。如果(消息!=无效的handleincomingmessage(消息);
}
}
});


这个方法负责创建一个任务,不断从云终端接收到的消息。接收远程消息,你调用的deviceclient班receiveasync方法。receiveasync返回消息类的一个实例,你用它来获得原始字节数组包含JSON格式数据的远程命令。你再反序列化该数组的remotecommand对象(在azurehelpers文件夹看到RemoteCommand.cs),这是在messagehelper类实现(的azurehelpers子文件夹):



公共 静止的
);VaRJSONData=编码。UTF8。GetString(消息。getbytes());
退货<trans data-src="" jsonconvert.deserializeobject(" style="box-sizing: border-box;">JsonConvert。deserializeobject < remotecommand >(
JSONData);


RemoteCommand有几个属性,但通常只使用两种:名称和参数,其中包含的命令名和命令参数。在remotecamera应用程序,我使用这些值来确定是否收到了预期的命令(参见<strong>图11</strong>)。如果是这样的话,我养的updatecamerapreviewcommandreceived事件传递的信息的听众,然后我告诉云,命令被接受使用的deviceclient班completeasync方法。如果命令不认可,我拒绝使用rejectasync方法。


图11远程消息反序列化和解析



私人 异步 { 
/ /反序列化消息到远程命令 VaRremotecommand = messagehelper。反序列化(消息);
/ /分析命令deviceclient。completeasync(消息);
}
抓住deviceclient。RejectAsync(消息);
}
私人 无效。比较(remotecommand。名字,
commandhelper。camerapreviewcommandname)= = 0)
{
/ /引发事件,当有效的命令被接收 updatecamerapreviewcommandreceived(这UpdateCameraPreviewCommandEventArgs(
remotecommand。参数。ispreviewactive));}


在主页的updatecamerapreviewcommandreceived事件类处理。根据不同的参数值,我得到的遥控指挥,我要么停止或启动本地相机预览。这个操作再次派遣到UI线程,如<strong>图12</strong>。


图12更新相机预览



私人 异步 无效发件人,updatecamerapreviewcommandeventargs E)
{
如果(e.ispreviewactive)
{
等待 {
等待 {
等待" style="box-sizing: border-box;">调度。RunAsync(CoreDispatcherPriority.Normal()= >
{
cloudhelper_updatecamerapreviewcommandreceived(发送者,E);
});
}


从云发送命令

最后,我表明,液门可以用来远程控制你的物联网设备。为此,可以使用“设备”选项卡,你需要找到并点击你的设备(参见<strong>图13</strong>)。


 

图13物联网门户“设备”选项卡显示remotecamera细节

这个激活装置中的细节,当你点击命令链接。你会看到另一种形式,你可以选择和发送远程命令。这种形式的特定布局取决于你选择的命令。在这里,我只有一个单参数的命令,所以只有一个复选框。如果清除此复选框,并发送命令,remotecamera程序将停止预览。你把所有的命令,与自己的地位,出现在历史命令,如<strong>图14</strong>。


 

图14窗体发送遥控命令的物联网设备

结束了

我展示了如何设置远程监控的物联网解决方案配置Azure套件。该解决方案收集和显示信息的图像连接到远程设备的摄像头获得的,也可以让你远程控制的物联网设备。配套源代码可以运行在任何有限的设备,所以其实你不需要将它部署到Raspberry Pi。这篇文章中,随着远程监控解决方案及其源代码在线文档,可以帮助你跳实际远程监控全面启动物联网发展。正如你看到的,与Windows 10物联网的核心,你可以远远超出简单的LED闪烁。



标签:remotecamera,解决方案,IoT,联网,命令,Azure,远程,设备
From: https://blog.51cto.com/u_15772980/5947949

相关文章