Windows 10 IoT をアプリでデバイスシャットダウンする方法

今回は、Windows 10 IoT でアプリからデバイスをシャットダウン(再起動)する方法。

他のマイコンボードだと、いきなり給電を止めても問題ありません。
microSD に書き込み中に電源を落としたりすると、カードの中身を破損する可能性はあると思うので絶対安全とは言えませんが、それほど神経質になることもないと思います。

それに対して、Windows 10 IoT はやむを得ない場合を除いて、ちゃんとシャットダウンしてあげるべきです。Windows です。“OS”です。
それなのにディスプレイもマウス・キーボードも接続していないということもあるでしょう。

そこでアプリでデバイスをシャットダウンしたくなります。タクトスイッチを押すとか、IoT Hub からメッセージを送るとかのタイミングでシャットダウンプロセスを起動することが考えられます。


Windows 10 IoT を楽しんでいる人ならば馴染みのある画面。

2017-01-26 23-08-27

ご承知のように、Windows 10 IoT はデフォルトシェルを持っていません。見慣れた画面も “IoT Core Default App” なるごく普通の UWP アプリケーション。
ソースコード が公開されているので、シャットダウンの方法もすぐにわかるでしょう

実際に、ソースコードを展開して、”Shutdown” を検索すればすぐに見つかります。
MainPage.xaml.csShutdownManager クラスの BeginShutdown  を呼び出しています。なるほど。

真似をしてこんなコードを書いてみました。起動して10秒後に自動的にシャットダウンしてしまうという、無意味この上ないアプリケーション(笑)。

using System;
using System.Threading.Tasks;
using Windows.System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace ShutdownDemo01
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void MainPage_OnLoaded(object sender, RoutedEventArgs e)
        {
            Task.Delay(TimeSpan.FromSeconds(10)).Wait();

            new System.Threading.Tasks.Task(() =>
            {
                ShutdownManager.BeginShutdown(ShutdownKind.Shutdown, TimeSpan.FromSeconds(0));
            }).Start();
        }
    }
}

 

実行してみるとこんなことになりました・・・。

2017-01-25 23-59-44

・・・“UnauthorizatedAccessException”。
さすが UWP アプリケーション、デバイスの機能を利用するには機能の指定が必要なようです。

残念ながら、ソリューションエクスプローラーの Package.appxmanifest をダブルクリックして開いても該当しそうな機能がリストに見つかりません。

2017-01-26 23-29-34

仕方ないのでここで改めて、先ほどダウンロードした IoT Core Default App のソースコードを参考にしてみます。

Package.appxmanifest を右クリックして、コードの表示を選択します。

2017-01-26 0-00-58

変更箇所は2か所。

Package 要素に属性を一つ追加。もう一つは一番下の Capabilities に要素を一つ追加。こうなります。

<?xml version="1.0" encoding="utf-8"?>

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"
  IgnorableNamespaces="uap mp iot">

  <Identity
    Name="c626b4f7-7b52-4c90-90cb-9606fdce05c8"
    Publisher="CN=taka"
    Version="1.0.0.0" />

  <mp:PhoneIdentity PhoneProductId="c626b4f7-7b52-4c90-90cb-9606fdce05c8" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>

  <Properties>
    <DisplayName>ShutdownDemo01</DisplayName>
    <PublisherDisplayName>taka</PublisherDisplayName>
    <Logo>Assets\StoreLogo.png</Logo>
  </Properties>

  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
  </Dependencies>

  <Resources>
    <Resource Language="x-generate"/>
  </Resources>

  <Applications>
    <Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="ShutdownDemo01.App">
      <uap:VisualElements
        DisplayName="ShutdownDemo01"
        Square150x150Logo="Assets\Square150x150Logo.png"
        Square44x44Logo="Assets\Square44x44Logo.png"
        Description="ShutdownDemo01"
        BackgroundColor="transparent">
        <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"/>
        <uap:SplashScreen Image="Assets\SplashScreen.png" />
      </uap:VisualElements>
    </Application>
  </Applications>

  <Capabilities>
    <Capability Name="internetClient" />
    <iot:Capability Name="systemManagement" />
  </Capabilities>
</Package>

 

以上で、無事にアプリからシャットダウンできるようになりました。めでたしめでたし。

広告
カテゴリー: Windows 10 IoT タグ: パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中