ãããããç¹å®ã®æ®µéã®ãã¹ãŠã®éçºè ã¯ãèªåã®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ã€ã®ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªããããŸãã
- DeviceHive.Client-ã倧ã.NET 4.5以éçšã WebSocket4Netã䜿çšããŸãã
- DeviceHive.Client.Portable-Windows 8.1ããã³Windows Phone 8.1çšã ãã€ãã£ãWebSocketã䜿çšããŸãã
- DeviceHive.Client.Universal-Win10 IoT Coreãå«ãWindows 10ã®ãã¹ãŠã®ãšãã£ã·ã§ã³çšã ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããã®ã¯åœŒå¥³ã§ãã
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çµã¿èŸŒã¿ãããžã§ã¯ãã«åãçµãã§ããŸãã