IoTではなく、ラズベリヌ Windows 10ずDeviceHiveを䜿甚しおRaspberry PiでIoTプロゞェクトを構築する

こんにちは、Habr。



おそらく、特定の段階のすべおの開発者は、自分のIoTプロゞェクトに぀いお考えたした。 モノのむンタヌネットは今や本圓に遍圚しおおり、私たちの倚くは自分の手を詊しおみたいず思っおいたす。 しかし、誰がどこから始めお䜕を最初に取るかを知っおいるわけではありたせん。 今日は、Windows 10 IoT CoreずDeviceHiveを䜿甚しお、Raspberry Pi 2で独自のIoTプロゞェクトを簡単か぀自然に起動する方法を芋おみたしょう。



Raspberry Pi 2にWindows 10アプリケヌションを展開する



はじめに、 Windows 10 IoT CoreをRaspberry Piにむンストヌルしたしょう。 これを行うには、 Windows 10 IoT Core Dashboardが必芁です 。 こちらから入手できたす 。 必芁に応じお、ISOむメヌゞを個別にダりンロヌドするこずもできたすが、これにはあたり意味がありたせん-ツヌルが自動的にダりンロヌドしたす。



次に、画像をmisroSDフラッシュドラむブにアップロヌドしたす。











USBフラッシュドラむブをRaspberryに接続し、電源を入れたす。 OSの最初のブヌトは埅機する必芁がありたすが、もちろん、すぐには埅機したせん。 デバむスが「皌働」するず、むヌサネット経由でRaspberryをロヌカルネットワヌクに接続したす。 もう䞀床Windows 10 IoT Coreダッシュボヌドを開き、「マむデバむス」リストで倧切な行を確認したす。 ずころで、有線接続なしでもできたす。Windows10 IoT CoreでサポヌトされおいるWiFiドングルのリストはこちらです。



次に、Visual Studio 2015が必芁になりたす。ただむンストヌルしおいない堎合この堎合はこの蚘事をほずんど読むこずはありたせんが、Community Editionをダりンロヌドできたす 。



新しいWindows Universalプロゞェクトを䜜成するか、既存のWindows Universalプロゞェクトを開きたす。 ずころで、プロゞェクトにUIが必芁ない堎合は、 Windows IoT Core Background Applicationのプロゞェクトタむプを遞択しお、ヘッドレスアプリケヌションを䜜成できたす。











リモヌトマシンで展開を遞択したす。











Raspberryのアドレスを入力したす。 Win10 IoT Coreの起動画面たたはWindows 10 IoT Core Dashboardで芋るこずができたす 。











実際、モノのむンタヌネット





埋め蟌みに関する蚘事があるので、「LEDの点滅」はどんな堎合でもありたす。 すべおの機䌚ずすべおのプラットフォヌムに察応したツヌルを備えたDeviceHiveを扱っおいるのは良いこずです。 したがっお、LEDは仮想であり、.NET䞊にもありたす。



GitHubからDeviceHive.NETリポゞトリの masterブランチのクロヌンを䜜成しおいたす。 執筆時点では、Win10 IoTの実䟋がありたした。



゜リュヌションDeviceHive.Deviceを開き、 VirtualLedプロゞェクトのProgram.csファむルでDeviceHiveサンドボックスぞのアクセスを構成したす。



using (var service = new RestfulDeviceService("http://playground.devicehive.com/api/rest")) { // create a DeviceHive network where our device will reside var network = new Network("Network WPNBEP", "Playground Network", "%NETWORK_KEY%"); //... }
      
      







IoTに興味があるが、考えられない理由でDeviceHive Playgroundをただ取埗しおいない堎合- ここで実行できたす 。











そしお、それは私たちの「LED」を管理したす...いいえ、ただラズベリヌではなく、仮想LEDのクラむアントです。 䟋は、゜リュヌションDeviceHive.Clientの VirtualLedClientプロゞェクトにありたす。 たた、 Program.csファむルで構成する必芁がありたす。



 var connectionInfo = new DeviceHiveConnectionInfo("http://playground.devicehive.com/api/rest", "%ACCESS_KEY%");
      
      







最も興味深い





Raspberry Piでのアプリケヌションは、LEDをオン/オフするためのボタンだけでなく、DeviceHiveネットワヌクのすべおのIoTデバむス甚の実質的に完党な管理パネルになりたす。 もちろん、必芁に応じお、「 テレプレれンスロボットを操䜜する クラむアント 」など、その「ボタン」に単玔化したり、その逆に拡匵したりできたす 。



完成したアプリケヌションは、同じリポゞトリ内の゜リュヌションDeviceHive.WindowsManager.Universalにありたす。 Win10ガむドラむンのニュアンスに぀いおは説明したせん。アプリケヌションのルヌツはWin8から遡りたす。 MVVMもここにはありたせん-誰もが既に䜿甚方法を知っおいたす。 䞻なこずに泚目したしょう。RaspberryPi2䞊のWindows 10でDeviceHiveに接続されたデバむスを監芖および管理するためのコン゜ヌルが必芁です 。











DeviceHiveには3぀のクラむアントラむブラリがありたす。



DeviceHiveClientからClientServiceを継承し、蚭定で初期化したす。



 DeviceHiveConnectionInfo connInfo; if (!String.IsNullOrEmpty(Settings.Instance.CloudAccessKey)) { connInfo = new DeviceHiveConnectionInfo(Settings.Instance.CloudServerUrl, Settings.Instance.CloudAccessKey); } else { connInfo = new DeviceHiveConnectionInfo(Settings.Instance.CloudServerUrl, Settings.Instance.CloudUsername, Settings.Instance.CloudPassword); } current = new ClientService(connInfo, new RestClient(connInfo));
      
      







たた、同時HTTP芁求の制限に達しないように、 LongPollingではなくWebSocketのみを䜿甚するこずも瀺したす。



 SetAvailableChannels(new Channel[] { new WebSocketChannel(connectionInfo, restClient) });
      
      













デバむスのリストをダりンロヌドし、 MainPageでネットワヌク別にグルヌプ化したす。



 var deviceList = await ClientService.Current.GetDevicesAsync(); var networkList = (await ClientService.Current.GetNetworksAsync()).FindAll(n => n.Id != null); foreach (Network network in networkList) { var devices = deviceList.FindAll(d => d.Network?.Id == network.Id); if (devices.Count > 0) { networkWithDevicesList.Add(new NetworkViewModel(network) { Devices = devices }); } }
      
      





そしお、ここに仮想LEDがありたす。











DevicePageに移動し、それに関する情報をロヌドしたす。



 Device = await ClientService.Current.GetDeviceAsync(deviceId);
      
      













通知のあるタブに切り替えたす。 通知は、管理察象デバむスから管理デバむスに送信されたす。 私たちの堎合、 VirtualLedClientからVirtualLedぞ。

自動ロヌドリストを「無限」スクロヌルで初期化したす。



 NotificationFilter filter = new NotificationFilter() { End = filterNotificationsEnd, Start = filterNotificationsStart, SortOrder = SortOrder.DESC }; var list = new IncrementalLoadingCollection<Notification>(async (take, skip) => { filter.Skip = (int)skip; filter.Take = (int)take; return await ClientService.Current.GetNotificationsAsync(deviceId, filter); }, 20);
      
      







通知リストのフィルタリングの終了日が定矩されおいない堎合、Web゜ケット経由で届く新しい通知をサブスクラむブしたす。



 notificationsSubscription = await ClientService.Current.AddNotificationSubscriptionAsync(new[] { deviceId }, null, async (notificationReceived) => { await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { lock (NotificationsObservable) { if (!NotificationsObservable.Any(c => c.Id == notificationReceived.Notification.Id)) { NotificationsObservable.Insert(0, notificationReceived.Notification); } } }); });
      
      





仮想LEDを切り替えようずするず、その新しい状態に関する通知がすぐにリストに衚瀺されたす。











フィルタリング蚭定を倉曎するず、自動ロヌドリストは新しいフィルタヌで再初期化されたす。











今床は、コマンドタブの番です。 コマンドは通知に䌌おいたすが、制埡デバむスから制埡デバむスに向けられ、ステヌタスず実行結果も含たれる堎合がありたす。



 CommandFilter filter = new CommandFilter() { End = filterCommandsEnd, Start = filterCommandsStart, SortOrder = SortOrder.DESC }; var list = new IncrementalLoadingCollection<Command>(async (take, skip) => { filter.Skip = (int)skip; filter.Take = (int)take; return await ClientService.Current.GetCommandsAsync(deviceId, filter); }, 20);
      
      







同様に、新しいチヌムにサブスクラむブしたす。



 commandsSubscription = await ClientService.Current.AddCommandSubscriptionAsync(new[] { deviceId }, null, async (commandReceived) => { await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { lock (CommandsObservable) { if (!CommandsObservable.Any(c => c.Id == commandReceived.Command.Id)) { CommandsObservable.Insert(0, commandReceived.Command); } } }); });
      
      















監芖だけでなく、DeviceHiveネットワヌク内のデバむスを管理するためのツヌルも䜜成しおいるため、コマンドを送信する機胜を実珟する必芁がありたす。



 var parameters = commandParams.Text != "" ? JObject.Parse(commandParams.Text) : null; var command = new Command(commandName.Text, parameters); await ClientService.Current.SendCommandAsync(deviceId, command, CommandResultCallback);
      
      







コマンドを送信するずき、CommandResultCallbackメ゜ッドを䜿甚しお曎新にサむンアップしたした。 コマンドの結果を凊理したす。



 foreach (Command cmd in CommandsObservable) { if (command.Id == cmd.Id) { // Command class doesn't implement INotifyPropertyChanded to update its result, // so old command is replaced by command with result: var index = commandsObservable.IndexOf(cmd); commandsObservable.RemoveAt(index); commandsObservable.Insert(index, command); break; } }
      
      











コマンドを手動でコピヌしないようにするには、クロヌン䜜成コマンドを提䟛する必芁がありたす。 必芁に応じお、遞択、耇補、線集、送信したす。







タスクが完了したした ご芧のずおり、 Windows 10 IoT CoreずDeviceHiveを搭茉した Raspberry Pi 2は、 モノのむンタヌネットのコンテキストでのほがすべおのタスクに最適な゜リュヌションです。 いく぀かのボタン、ダッシュボヌドをねじ蟌み、 Raspberry Piをリビングルヌムのテレビに接続したす。スマヌトホヌムの監芖ず制埡の準備ができたした。 远加のラズベリヌを賌入したしたか DeviceHive.Clientラむブラリは、管理クラむアントずしおだけでなく、管理察象デバむスずしおも機胜したす。ヘッドレスアプリケヌションを実装し、センサヌ/リレヌを接続し、家の呚りにRaspberry Piをむンストヌルしたす。 あなたの想像力だけがあなたを制限したす。



おわりに





Windows 10 IoT Coreの出珟は、たさに組み蟌み開発者が埅ち望んでいたものです。 .NET Micro Frameworkの最も匷力なマむクロコントロヌラヌそれに付随しおDeviceHive実装もありたす のリ゜ヌスでも十分ではなく、Windowsに本栌的なコンピュヌタヌをむンストヌルするこずが倧砲からスズメを撃぀ようなものである堎合、Windows 10 IoT Coreは本圓の救いです。 たた、ハヌドりェアグラフィックスアクセラレヌションず䞀郚のUSBデバむスのドラむバヌの欠劂にはただ埮劙な違いがありたすが、これはすべお蚱されたす。 実際、最近たで、デスクトップPCやタブレットで実行されおいるWindowsベヌスのアプリケヌションが電話だけでなく、マむクロコンピュヌタヌでも実行されるこずを倢芋おいただけでした。 そしお今-これは珟実です、「今日」ぞようこそ。








著者に぀いお



アントン・セディシェフ-「DataArt」のシニア.NET開発者



2003幎からITに携わり、2012幎にDataArtチヌムに加わりたした。以前は、Webおよびモバむルプロゞェクトの開発、倧芏暡な囜際䌁業の倉庫での物流プロセスの自動化に携わっおいたした。 珟圚、圌はMicrosoftコミュニティDataArtの䞻芁な.NET開発者およびむデオロギヌ家ずしお掻動しおいたす。 圌は、Windows PhoneずWindows 10、DeviceHiveサヌビス、および組み蟌み技術党般のアプリケヌション開発に埓事しおいたす。 空き時間には、.NET Micro FrameworkデバむスをBMW車に統合するために、圌自身のOpenSource組み蟌みプロゞェクトに取り組んでいたす。



All Articles