Quantcast
Channel: デバイスとITの架け橋
Viewing all 167 articles
Browse latest View live

Windows 8.1でLEGO MINDSTOMRS NXTを制御するサンプルコード

$
0
0

もうちょっと形を整えてから…と思ったのですが、時間がたってしまったので、暫定的な形になってしまいますが、LEGO MINDSTORMS NXTをWindowsストアアプリで制御するための、ライブラリ、アプリテンプレートをサンプルとして公開します。

ファイル一式は、

http://eg-sample-filedowload.azurewebsites.net/FileDownload/GetFile?id=NXTControl

からダウンロードしてください。基本、http://nxtnet.codeplex.comで公開されている.NET FRAMEWORK版のライブラリをWindows Runtimeに移植したものです。将来的には、ちゃんと、オープンソース的な体裁を整えてどこかできちんと公開しますので、暫定的に使ってください。

ダウンロードしたZIPファイルには、

  1. NxtWinRTSolution.zip
  2. LegoNXTSDK.zip
  3. LegoNXTSDK.vsix
  4. BrickControlApps.zip
  5. README.txt

の5個のファイルが格納されています。※README.txtは必ず読んでくださいね。

最初のNxtWinRTSolution.zipには、以下の3つのプロジェクトが格納されています。

  • NxtWinRT       NXT.NETのWinRT対応 - ライブラリ形式
  • NxtWRTC       NXT.NETのWinRT対応 - コンポーネント形式
  • StoreAppsWRTCTest  サンプルコード

NXTとBluetooth Serial通信の処理の具体的な中身が知りたい方は、こちらを参照してください。基本的な使い方は、StoreAppsWRTCTestのMainPage.xaml.cs を見てみてください。

次に、2番目のLegoNXTSDK.zipですが、この中には、3番目のLegoNXTSDK.vsixを作るためのプロジェクトです。LegoNXTSDK.vsixをダブルクリックして実行すると、NxtWinRTSolutionのNxtWRTCで作成された、コンポーネント形式のライブラリが、Visual Studioに組み込まれます。4番目のBrickControlApps.zipは、このLegoNXTSDK.vsixをVisual Studioに組み込んだ状態で、NXTと連携するストアアプリを開発するためのテンプレートです。ドキュメントフォルダーの下のVisual Studio 2013の、

Templates¥ProjectTemplates¥Visual C#

の下にそのままZIP形式でコピーして、Visual Studio 2013を起動してください。新規プロジェクト作成で、Visual C#カテゴリの下に、Lego NXT Appsというプロジェクトテンプレートが現れます。これを選択すれば、コンポーネント形式のNxtWRTC(LegoNXTSDK.vsix)を組み込んだ形のストアアプリが出来上がります。

作成したアプリが上手くビルドできない場合は、プロジェクトへの参照追加で、NxtWinRTSolutionのNxtWRTCプロジェクトを追加してください。それでビルドは通るはずです。

ちなみに、このライブラリを使ったストアアプリは既に、

http://apps.microsoft.com/windows/app/brick-drive/87a0f77d-bebf-4a39-b9e4-169111c9b72c

http://apps.microsoft.com/windows/app/brick-piano/6cd96ca7-cf25-4ad4-b363-b6d2584b01a7

の二つが公開されています。

※あくまでもサンプル公開ですので、自己責任でお使いください。

 


2014/7/9-11の気圧を測ってみた

$
0
0

あ~、de:codeのデモの解説もしなきゃなぁ…と思いながらはや一か月半。そんな中、50年に一度の強力な台風が来るというので、.NET Gadgeteer+センサーで大気圧、温度、湿度を測ってみた。

システム構成は、de:codeデモ展示していた、

で、.NET Gadgeteerで計測したデータをAzure Mobile Serviceのテーブルに蓄積し、蓄積されたデータをExcelのPower Queryで取り出し、Power Viewでグラフ化。

実際のグラフアニメーションは、以下の通り。

http://youtu.be/oGDCmjgvx5s

ちょっと解説を加えると、

縦軸は湿度、横軸が大気圧、円の大きさが温度というグラフです。時系列的にみると、台風が近づくと気圧がぐーっと下がり、台風が遠ざかると気圧が上がっていくという現象がばっちりとれたわけです。
使っているセンサーは本物なので期待はあったのですが、これだけはっきり記録できるとは、と感銘。

 

Internet of Things 関連情報

$
0
0

Azure上のIoT向けサービス、Intelligent Systems Service(ISS)のPreviewのパブリック公開が待ち遠しい今日この頃ですが、Internet of Thingsを実現するのにつかわれるサービスが幾つかPreview公開されているので、簡単に紹介しておきます。

Internet of Thingsを構成する要素をざっくりと書くと、

こんな感じです。先週はEvent HubとML(Machine Learning)のPreviewが公開されました。

Event Hub : https://azure.microsoft.com/en-us/services/event-hubs/

Machine Learning: http://azure.microsoft.com/en-us/trial/get-started-machine-learning/

どちらも、Internet of Things専用のサービスというわけではありませんが、膨大な数の組込み機器からばらばらと送られてくるセンサー計測値や機械の状態などをきちんとクラウドで受けるためのサービスとして、高速リアルタイム通信向けのサービスバス、Event Hubが用意されています。また、例えば、WWPCで紹介されtエレベーターや、ロンドン地下鉄のように、計測されたデータから今後の機械の状況を予測したりアラートを発したりするための自動学習サービスMLが、Internet of Thingsのシナリオで利用されます。

Event Hubによる機器との接続には、通常のHTTP REST形式だけでなく、現時点では、メッセージ指向のプロトコルAMQP(Advanced Message Queuing Protocol)もサポートしています。詳しくは、http://msdn.microsoft.com/en-us/library/dn789972.aspx  を見てください。図を見ると、かなりIoTが意識されてますね。

AMQPでEvent Hubと通信するサンプルが、Windows Embedded 8(デスクトップアプリ含む)、Windows Embedded Compact、.NET Micro Framework、Windows Runtime API向けに http://amqpnetlite.codeplex.com/ から提供されています。私のブログをよく見ている.NET Gadgeteer持っている方、試してみてください。

 Intelligent Systems ServiceのLimited Previewを使ってみたいと云う方は、http://www.InternetOfYourThings.comから申し込んでみてくださいね。

 

GadgeteerとAzureで作る簡易温度計 - Part 1

$
0
0

最近方々で見せている、GadgeteerとAzure、Store Apps、そしてExcel Power Query/Viewを組合せた温度計デモを紹介します。これ、GadgeteerとAzureの部分だけだと、20~30分で完成します。

システム構成は、

です。.NET Gadgeteerで測った温度、湿度をAzureのMobile Serviceのテーブルに格納しながら、Web Siteに転送して、SignalRに送る。Mobile ServiceのテーブルからExcel Power Queryでデータをダウンロードしてグラフ化する。というもの。

Gadgeteerは、以下の部品を使います。

リレーは、電気屋さんで買ってきた100V用のタップを写真の様にケーブル接続しておきます。※Relay X1 Moduleの裏側は、配線ピンむき出しなのでくれぐれも感電しないように注意しましょう。

開発の手順は以下の通りです。

  1. Azure Mobile Serviceを作成
  2. Gadgeteerのアプリ開発
  3. Excel Power Queryで可視化
  4. Excel Power Viewで分析
  5. Azure Web Siteを作成
  6. Azure Mobile Serviceを改造 - Web Siteへのデータ転送
  7. Store アプリ開発
  8. Azure Mobile Serviceを改造 - Push 通知の追加

では早速最初から解説していきます。

1. Azure Mobile Service を作成

http://manage.windowsazure.comで、Azureの管理ポータルを開きます。※まだAzureのサブスクリプション契約をしていない方は、http://azure.microsoft.comから契約しちゃってください。

左側のタブで”モバイルサービス”を選択し、左下の新規ボタンをクリックします。

モバイルサービスの名前を付けて、データベースの設定などを行って、作成完了です。クラウド側で準備ができると、モバイルサービスのリストに作成したサービスが表示されます。作成されたサービスをクリックします。

表示されたページで、上手の上から、クリックして選択していって、下の黒い帯で隠れている部分に表示されるC#のコードをテキストファイルにコピペしておきます。このコードに含まれる、URLと、キーは、後程、.NET Gadgeteerの開発で使います。

このステップはこれで完了です。

2. Gadgeteerアプリの開発

次は、Gadgeteerボードで、温度と湿度を測ってAzure Mobile Serviceにデータを定期的にアップロードしながら、30度を超えたらリレーをONにするアプリを開発します。

先ず、http://1drv.ms/1rG4JoF からNETMFCloud.zipと、Microsoft.Azure.Zumo.MicroFramework.zipの二つのZIPファイルをダウンロードして、どこか適当なところに解凍してください。
※これらのファイルはあくまでもサンプルです。自己責任で使ってくださいね。ちなみに、Microsoft.Azure.Zumo.NetMicroFrameworkは、Gitで公開されている、https://github.com/nickharris/Microsoft.Azure.Zumo.MicroFramework のコードを若干修正、機能追加したものです。

それから、予め、http://blogs.msdn.com/b/hirosho/archive/2014/06/04/getting_5f00_started_5f00_net_5f00_micro_5f00_framework_5f00_and_5f00_gadgeteer_5f00_again.aspx を参考にして、Gadgeteer開発環境を準備しておいてください。

さてと、Visual Studio 2012を起動して、メニューから、”ファイル”→”新規作成”→”プロジェクト”を選択します。Visual C#のGadgeteerカテゴリーで、”.NET Gadgeteer Application”を選択して、プロジェクトを作成します。表示されたダイアログ、

FEZ CerbuinoNetを選択して”Create”ボタンをクリックします。

 プロジェクトが作成され、Program.gadgeteerというファイルが開きます。ツールボックスから、”Relay X1”、”TemperatureHumidity"を、赤いCPUボードが表示されたエディタ領域にドラッグ&ドロップします。そして、エディタ上で右クリックして、”Connect All Module”を選択してください。

この図に従って、TemperatureHumidityセンサーと、リレーをボードにコネクタでつなぎます。

次に、ソリューションフォルダーで、作成したソリューションに、先ほどOneDriveからダウンロードした二つのプロジェクトを追加します。ソリューションエクスプローラで、ソリューションを右クリックし、”追加”→”既存プロジェクト”を選択し、Microsoft.Azure.Zumo.MicroFramework.csprojとNETMFCloud.csprojを選択すれば追加可能です。

更に、Gadgeteerプロジェクトの”参照設定”フォルダーを右クリックし、”参照の追加”で、この二つのプロジェクトを選択し、参照設定に追加してください。

次はコーディングです。Program.csファイルを開いてください。

先ずは、ファイルの先頭のusing宣言がされている最後に、

using Microsoft.WindowsAzure.MobileServices.Utility;

を加えます。

次に、Proguramクラスのメンバーとして、

        SensorMobileService mobileService;
        double lastTemp;
        double lastHumidity;

を追加します。2番目と3番目のdouble変数は、センサーで計測した値を一時的に保持しておくためのバッファーです。
次にProgramStarted()メソッドに、以下のコードを追加します。

            // ① ネットワーク初期化
            var ipAddress = NETMFCloud.NetworkUtility.Current.SetupNetwork();
            Debug.Print(ipAddress);

            // ② Mobile Serviceアクセスライブラリ初期化
            mobileService = new SensorMobileService("URL", "KEY");

            // ③ 温度湿度センサー初期化
            temperatureHumidity.MeasurementComplete += temperatureHumidity_MeasurementComplete;
            temperatureHumidity.StartContinuousMeasurements();

            // ④ タイマー初期化
            var timer = new GT.Timer(2000);
            timer.Tick += timer_Tick;
            timer.Start();

            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
            Debug.Print("Program Started");

赤字で書いた②のURLとKEYは、ステップ1で記録しておいたMobile ServiceのURL(httpsをhttpに書き換えること)とアクセスキーを記入してください。ボードで実行した時、①のipAddressが”0.0.0.0"だった場合は、ネットワークに上手く接続できていない証拠なのでイーサネットケーブルがボードに挿入されているか、イーサネットケーブルがインターネットにつながっているか確認してください。③のコードで、温度湿度センサーが値を計測するたびに、temperatureHumidity_MeasurementCompleteメソッドがコールされるようになります。更に④で、2秒単位でtimer_Tickメソッドがコールされるようになります。

初期化コードは以上です。

次に、温度湿度センサーのイベントハンドラですが、

        void temperatureHumidity_MeasurementComplete(TemperatureHumidity sender, double temperature, double relativeHumidity)
        {
            lock (this)
            {
                lastTemp = temperature;
                lastHumidity = relativeHumidity;
            }
            if (temperature > 30)
            {
                relay_X1.TurnOn();
            }
            else
            {
                relay_X1.TurnOff();
            }
        }

このようにコーディングしてください。計測した値は引数で渡されるので、lastTemp,lastHumidityに格納しておきます。代入ロジックをlock(this){...}で囲んでいるのは、このハンドラがコールされるスレッドと、タイマーハンドラ―のスレッドが別物だからです。温度が30度を超えた場合にリレーをONに、30度以下の場合は、リレーをオフにするコードは説明しなくても明快ですね。

次にタイマーハンドラ―です。

        void timer_Tick(GT.Timer timer)
        {
            lock (this)
            {
                var tempString = mobileService.RoundDecimalPoint(lastTemp, 5);
                mobileService.Upload("gadgeteer", "temperature", tempString);
                var humidityString = mobileService.RoundDecimalPoint(lastHumidity, 5);
                mobileService.Upload("gadgeteer", "humidity", humidityString);
            }
        }

RoundDecimalPointは、倍精度の数値を指定の桁数に丸めるユーティリティメソッドです。全体をlock(this){...}で囲んでいるのは、センサーのハンドラ―とこのスレッドが異なるので排他しているのと、アップロードに時間がかかった場合のこのメソッドへの再入を防いでいます。Uploadメソッドはリエントラントではないのでご注意ください。

Gadgeteerアプリの開発はこれでお終い。あとは、ハードウェアをUSBでPCにつないで、F5デバッグ実行するだけで、Mobile Serviceにデータを2秒単位でアップロードを始めます。この作業、慣れると、5分ぐらいで終了します。実際にデータがMobile Serviceのテーブルに格納されているかどうかは、Azureの管理ポータルのモバイルサービスのテーブルを実際に開いてみて確認してみてください。

ここまでの作業で、まぁ、20分ぐらい?

3. Excel Power Query/View で可視化

さて、ステップ2までだと、単に蓄積するだけですね。これ以降、色々と加えていきます。先ずは、皆さんが普段よく使っているExcelによる可視化をしてみます。先ず、ExcelにAzureのテーブルからデータをダウンロードするアドオン Excel PowerQueryを、

http://www.microsoft.com/ja-jp/download/details.aspx?id=39379

からダウンロードしてインストールしてください。

次に、後(Part 2以降)で色々試すためにPOWER VIEWを有効化しておきます。
Excelを起動してファイルを一つ作り、メニューのファイルタブをクリックして、左下の”オプション”を選択します。開いたダイアログで下図の様に、左のパンで”アドイン”を選択し、下の”管理”で”COMアドイン”を選択し、”設定”をクリックします。

”Microsoft Office Power Pivot for Excel 2013”と”Power View”にチェックを入れて”OK”をクリックします。

Excelのシートで、”POWER QUERY”タブを選択します。

リボンの”データベースから”をクリックし、”Windows Azure SQL データベースから”を選択します。表示されたダイアログの”サーバー”に、Azureの管理ポータルの”SQLデータベース”タブをクリックして、センサーデータを格納しているデータベースを選択し、”データベースに接続する”の欄に表示された、XXXX.database.windows.net をコピー&ペーストします。認証を経て、ナビゲータに表示された、テーブルの一覧(モバイルサービス名.テーブル名)からダウンロードしたいテーブルを選択します。これで、計測&蓄積されたデータがダウンロードできました。しかし、実はMeasuredValueは、汎用性を考えて文字列型になっているので、右端のMeasuredValueを右クリックして、”型の変更”を選択、”10進数”に変えます。リボンの左側の”適用して閉じる”をクリックします。これでAzure Mobile Serviceのテーブルデータがダウンロードされるので、後は、数値の部分をグラフ化などすれば、可視化が完了します。

これで、Part 1はお終い。続きはまた後ほど。

待ってるぜ、ちゃお(By 林風)

 


 

GadgeteerとAzureで作る簡易温度計 - Part 2

$
0
0

さて、続き。

Part 1は、http://blogs.msdn.com/b/hirosho/archive/2014/07/25/gadgeteer-azure-part-1.aspx こちら。

  1. Azure Mobile Serviceを作成
  2. Gadgeteerのアプリ開発
  3. Excel Power Queryで可視化
  4. Excel Power Viewで分析
  5. Azure Web Siteを作成
  6. Azure Mobile Serviceを改造 - Web Siteへのデータ転送
  7. Store アプリ開発
  8. Azure Mobile Serviceを改造 - Push 通知の追加

の4番目は別の投稿でじっくり説明するとして、5から始めます。

5. Azure Web Siteを作成

ここでは、AzureのWeb Siteを使って、Mobile Serviceにアップロードされたデータを転送するためのWeb APIと、それをSignalRで通知するためのHubを作成します。

Visual Studio 2013を起動し、メニューの”ファイル”→”新規作成”→”プロジェクト”を選択して、Visual C#のWebカテゴリーのASP.NET Webアプリケーションテンプレートを使って、プロジェクトを作成します。MVCを選択し、Web APIにチェックを入れて作成します。

そのまま、Azure Web Site上に作れてしまうので、指示に従ってWebサイトをAzure Web Site上に作ってしまいます。

SignalRのハブを作成します。SignalRは、インターネット上で、計測した温度をStoreアプリに通知するために利用します。
ソリューションエクスプローラーで、プロジェクトの”Models”フォルダーに”SensorReading.cs”という名前でクラスを追加します。これは、モバイルサービスからのデータ転送、SignalRによる同報通信の際にデータを格納する為のクラスです。以下のようにコーディングします。

    public class SensorReading
    {
        public string SensorId { get; set; }
        public string SensorType { get; set; }
        public string Timestamp { get; set; }
        public double MeasuredValue { get; set; }
    }

次にソリューションエクスプローラーで、プロジェクトに”Hubs”というフォルダーを追加します。(プロジェクトを右クリックし、”追加”→”新しいフォルダー”を選択”)そして、そのフォルダーに、”SignalRハブクラス”というアイテムテンプレートを使って、SensorValueHub.csという名前でクラスを作成(”Hubs”フォルダーを右クリックし”追加”→”新しい項目”を選択”)します。

以下のようにコードを編集します。

    public class SensorValueHub : Hub
    {
        public void Update(Models.SensorReading model)
        {
            Clients.Others.Update(model);
        }
    }

SignalRを初期化するコードを追加します。ソリューションエクスプローラーで、”Startup.cs”というファイルを開き、以下のようにコードを編集します。

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR();
        }
    }

次に、モバイルサービスからSignalRのハブに転送するためのWeb APIを追加します。

ソリューションエクスプローラーで、”Controllers”フォルダーを右クリックし、”追加”→”コントローラ”を選択し、表示されたダイアログで”WEB API 2 コントローラ - 空”を選択し、”PostSensorReadingController.cs”という名前のクラスを作成します。コードは以下の通りです。

    public class PostSensorReadingController : ApiController
    {
        public void Post(Models.SensorReading model)
        {
            var context = GlobalHost.ConnectionManager.GetHubContext<Hubs.SensorHub>();
            context.Clients.All.Update(model);
        }
    }

これで、AzureのWeb Site側のコードは作成完了です。プロジェクトを右クリックし、”発行”を選択して、Web Siteに配置してください。

6. Azure Mobile Serviceを改造 - Web Siteへのデータ転送

前のステップで作成したWeb APIに対して、モバイルサービスにデータが挿入された時にアクセスするようモバイルサービスを改造します。サーバーエクスプローラーで、Windows Azure→モバイルサービスまでを開き、ステップ1で作成したモバイルサービスを探します。そのモバイルサービスの下のSensorReadingテーブルを更に開きます。直下にinsert.jsというファイルがあるので、それをダブルクリックして開きます。

insert.jsのコードは以下のように書きましょう。

function insert(item, user, request) {
    var httpRequest = require('request');
    var date = new Date();

    var postData = {
        'SensorId': item.SensorId,
        'SensorType': item.SensorType,
        'MeasuredValue': item.MeasuredValue,
        'Timestamp': date.toISOString()
    };

    httpRequest.post({
        uri: 'http://your-website.azurewebsites.net/api/PostSensorReading',
        headers: { 'Content-Type': 'applicaiton/json' },
        body: JSON.stringify(postData)
    }, function (err, res, body) {
        if (err) {
            console.log("Post Failed");
        }
    });

    request.execute();

}

your-websiteの部分を、作成したWeb SiteのURLに合わせて変えてください
httpRequestのpostメソッドをコールすることにより、前のステップで作成したWeb APIにJSON形式でデータが送られます。Web Site側では、PostSensorReadingControllerのPostメソッドがコールされます。コードを書き終わったら保存するのを忘れずに。

 7. Storeアプリ開発

さて、.NET Gadgeteerでセンサー計測→モバイルサービスへのInsert→Web APIでJSON受信→SignalRハブで同報送信という流れで送信されたデータを受信して表示するStoreアプリを開発します。
Microsoft Azureの管理ポータルで、ステップ1で作ったモバイルサービスのページを開き、プラットフォームの選択で”Windows ストア”を選択、”新しいWINDOWS ストアアプリを作成する”をクリックします。

3の”ダウンロード”ボタンをクリックしてStoreアプリをダウンロードします。
Visual Studio 2013を起動し、XAML/C#でストアアプリプロジェクトを一つ作成します。プロジェクトテンプレートは空のアプリで良いです。

作成されたプロジェクトをソリューションエクスプローラーで右クリックし、NuGetパッケージの管理を選択します。右上の検索窓に”SignalR”と入力

Microsoft ASP.NET SignalR .NET Clientを選択して、”インストール”ボタンをクリックします。

次に、SensorReadingPage.xamlという名前で、基本ページを追加します。このページに、図の様にGridを一つ追加し、データのラベル用にTextBockを4つ、データの表示用にTextBlockを4つ追加します。

SensorReadingPage.xaml.csを開き、SensorReadingPageクラスに以下のコードを追加します。Azure Web サイトからSignalRによる通信を受信するためのロジックです。HubConnectionコンストラクターの引数のURLは、各自のWeb サイトのURLに変えてください。

        IHubProxy sensorReadingHub;
        private async Task MakeConnectionAsync()
        {
            Exception lastEx = null;
            try
            {
                var hubConnection = new HubConnection("http://your-website.azurewebsites.net");
                sensorReadingHub = hubConnection.CreateHubProxy("sensorreadinghub");
                await hubConnection.Start();
                var updateSubscribe = sensorReadingHub.Subscribe("Update");
                updateSubscribe.Received += updateSubscribe_Received;
            }
            catch (Exception ex)
            {
                lastEx = ex;
            }
            if (lastEx != null)
            {
                var dialog = new MessageDialog(lastEx.Message);
                await dialog.ShowAsync();
            }
        }

        // SignalRのメッセージを受信した際にコールされるメソッド
        async void updateSubscribe_Received(IList<Newtonsoft.Json.Linq.JToken> obj)
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                foreach (var packet in obj)
                {
                    var sensorType = packet.Value<string>("sensortype");
                    if (sensorType == "Temperature")
                    {
                        tbMesauredValue.Text = packet.Value<double>("measuredvalue").ToString();
                        tbSensorId.Text = packet.Value<string>("sensorid");
                        tbSensorType.Text = sensorType;
                        tbTimestamp.Text = packet.Value<string>("timestamp");
                    }
                }
            });
        }

 そして、navigationHelper_LoadStateメソッドを以下の様に書き換えます。

        private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
        {
            if (sensorHub == null)
            {
                await MakeConnectionAsync();
            }
        }

更に、App.xaml.csの85行目の”MainPage”というクラス名を以下のように書き換えます。

                rootFrame.Navigate(typeof(SensorReadingPage), e.Arguments);

これで、SensorReadingPageがアプリ起動時に表示されます。
今作成したストアアプリを起動して、Gadgeteerも起動すると、センサーが計測した温度が表示されます。

8. Azure Mobile Serviceを改造 - Push 通知の追加

最後は、GadgeteerがAzureモバイルサービスにデータをアップロードした時に、温度が30度以上ならPush通知を送信するように改造します。
Push通知を受信するためには、アプリケーションをストアに登録(あくまでも登録です。公開ではありません)する必要があります。プロジェクトを右クリックし、”ストア”→”アプリケーションをストアと関連付ける”を選択し、一連の操作でダッシュボード上のアプリと関連付けを済ませます。この作業には、Windowsストアへの開発者登録が必要です。まだ開発者登録していない方はこの際に、登録してしまいましょう。
次に、Push通知を受けるために、ソリューションエクスプローラーで、ストアアプリプロジェクトを右クリックし、”追加”→”プッシュ通知”を選択して、一連のダイアログに従いストアアプリプロジェクトにプッシュ通知機能を追加します。
この作業を実施すると、Storeアプリ側にはPush通知を受信するためのコードが自動的に埋め込まれ、クラウド側のモバイルサービスにもPush通知の送信に必要な機能が自動的に組み込まれます。

最後に、Azure モバイルサービスのテーブルのスクリプト、Insert.jsを以下のように書き換えます。

function insert(item, user, request) {
    var httpRequest = require('request');
    var date = new Date();
    var postItem = {
        'SensorId': item.SensorId,
        'SensorType': item.SensorType,
        'MeasuredValue': item.MeasuredValue,
        'Timestamp': timestampValue
    };
    httpRequest.post({
        uri: 'http://eg-sensor-management.azurewebsites.net/api/PostValue',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(postItem)
    }, function (err, res, body) {
        if (err) {
            console.log("Temp - Post Failed");
        }
        else {
            //          console.log("Temp - Post Succeeded");
        }
    });
    if (item.sensortype == "Temperature") {
        if (item.MeasuredValue > 30) {
            sendNotifications("Too Hot! - " + item.SensorId + ":" + item.MeasuredValue);
        }
    }
    request.execute();

    function sendNotifications(message) {
        var payload = '<?xml version="1.0" encoding="utf-8"?><toast><visual><binding template="ToastText01">' +
            '<text id="1">' + message + '</text></binding></visual></toast>';
        push.wns.send(null,
            payload,
            'wns/toast', {
                success: function (pushResponse) {
                    console.log("Sent push:", pushResponse);
                }
            });
    }
}

太字で示したコードが、追加するコードです。Push通知のチャネルを管理しているchannelテーブルから登録済みのチャネルを取り出し、送信しています。

はい、これでお終い。後は、GadgeteerをVisual Studioで起動して温度センサーを手とかで優しく温めて、30度以上にすると、Push通知が送信されます。

 

 

.NET Gadgeteer Tips

$
0
0

.NET Micro Frameowkrk や .NET Gadgeteer対応ボードを実際に使ったハンズオン、頻繁にやっていますが、実施の際、色々とひっかかる点があります。読者の中にも、.NET Gadgeteerボードを購入して、さぁやろう!!と思ったら、「あれ、動かないんですけど…」と止まっている人も何人かいるかと思います。そういう場合は、GHI Electronics社の、Forumに問い合わせたりするのが手っ取り早いのですが、英語は敷居が高いなぁ…と云う方も多いでしょう?

そんなわけで、GHI Electronics社製のFEZシリーズを使っているときに、よく見かける、引っ掛かりポイントと対処法をここにまとめておきます。

その1)ビルドの際、MMP : error MMP0000: 0x80131700 というエラーが発生。
.NET Micro Frameworkのツールが、.NET Framework v3.5ベースで作られていて、開発環境PCに.NET Framework v3.5のランタイムがインストールされていない場合に発生します。
http://netmf.codeplex.com/workitem/221 の、MetaDataProcessor.exe.config をダウンロードし、このファイル名で、以下のフォルダーに格納すれば解決します。

c:¥Program Files(x86)¥Microsoft .NET Micro Framework¥v4.2¥Tools

その2)ボードをUSBで接続した状態で、F5、もしくは、デバッグ開始した際、Iteration 0、・・・と表示され、”Device not found or cannot be opend"になる。
GadgeteerのSDKバージョンにもよるのですが、Visual Studioが正しくボードを認識していないケースがあります。ソリューションエクスプローラーで、プロジェクトを右クリックし、”プロパティ”を選択し、プロパティページで、”.NET Micro Framework”タブを選択します。

Transportを、一旦”USB”から”Emulator”に変更し、再度、”Emulator”から”USB”に変更します。念のため、Deviceもコンボボックスでボードを選択しなおします。これで大概、上手くいきます。
二枚同時にボードをつなぐとうまくいかないので、そんな時は、開発用PCをボード数だけ用意してください。

その3)仮想マシンで動作している開発環境でボードが認識されない
例えば、MAC OS上で、Windowsを仮想マシン上で動かし、Visual Studioで開発しているような場合です。仮想マシンの設定で、USBで接続されているボードを有効になるようUSBを設定してください。この環境でも、.NET Gadgeteerの開発は可能です。

その4)Visual StudioのインストールしたSDKが想定するボードのファームウェアと、ボードのファームウェアのバージョンが一致しない。
デバッグ実行した時に、アプリをボードに配置する際、ボードのファームウェアのバージョンが古い、という、メッセージが、表示されることがあります。新しいSDKをインストールした時などです。そんな時は、

  • Windows 8以降
    検索チャームで、”FEZConfig”と入力し、このアプリを起動
  • Windows 7以前
    スタートボタンから、FEZConfigを起動

して、ボードをUSBで接続します。

右上のDeviceのコンボボックスからUSBを選択し、接続されているボードを選択します。後は、左側の”Firmware Updater”ボタンをクリックすれば、ボードのファームウェアがアップデートされます。

その5) ツールボックスに、SEEED社製の周辺ボードが表示されない。
ずっと前から.NET Gadgeteerボードを購入していて、既にいろんな周辺ボードを購入しているマニアで、最新のSDKにアップデートしたらSEEED社製のボードがツールボックスから消えてしまった!!とお嘆きの方、最新のSDKをインストールした状態で、

https://www.ghielectronics.com/support/netmf/sdk/11/netmf-and-gadgeteer-package-2014-r1

から、SDKをダウンロードして、ZIPファイルを解凍し、Installation Filesフォルダーに格納されている、”Seeed NET Gadgeteer SDK v4.2.exe"を実行してください。ツールボックスに、無事昔からある周辺ボード類が追加されます。

ま、こんなところでしょうか。

 

 

 

FlashAir を.NET Gadgeteerで使ってみた

$
0
0

東芝が販売しているFlashAir(http://www.toshiba.co.jp/p-media/flashair/)、.NET Gadgeteerから見れば、SDカードメモリそのものなので、各種センサーの値をSDメモリーカードに書き込んでいけば、FlashAirにWiFiでつながっているPCやスマートフォン、タブレットから、書き込んだ内容が見れるわけですね。逆にPC、スマートフォン、タブレットからWiFiを通じて、FlashAir側に命令などを書き込んだファイルをアップロードしてあげれば、.NET Gadgeteer側にデータを与えることが出来るってこと。

で、とりあえず、加速度センサーで計測した値をFlashAirを通じてPCに送るプログラムを試してみました。

回路図は、以下の通り。

この通りにボードを結線してSDカードリーダーにFlashAirを装着すれば準備完了。

Program.csの、ProgramクラスのProgramStartedメソッドを、以下のようなコードにして、

        void ProgramStarted()
        {
            /*******************************************************************************************
            Modules added in the Program.gadgeteer designer view are used by typing
            their name followed by a period, e.g.  button.  or  camera.
           
            Many modules generate useful events. Type +=<tab><tab> to add a handler to an event, e.g.:
                button.ButtonPressed +=<tab><tab>
           
            If you want to do something periodically, use a GT.Timer and handle its Tick event, e.g.:
                GT.Timer timer = new GT.Timer(1000); // every second (1000ms)
                timer.Tick +=<tab><tab>
                timer.Start();
            *******************************************************************************************/

            sdCard.MountSDCard();

            Thread.Sleep(500);

            new Thread(WorkerThread).Start();

            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
            Debug.Print("Program Started");
        }

で、Programクラスに、以下の変数と、WorkerThreadメソッドを追加。

        string rdName;
        string dxFileName = @"\dataexchange.txt";
        
        public void WorkerThread()
        {
            rdName = sdCard.GetStorageDevice().RootDirectory;
            if (!System.IO.File.Exists(rdName + dxFileName))
            {
                fs = System.IO.File.Create(rdName + dxFileName);
            }
 
            GT.Timer timer = new GT.Timer(10000);
            timer.Tick += timer_Tick;
            timer.Start();
        }

WorkerThreadメソッドでは、SDカードのルートディレクトリ名を取得して、データ交換の為のファイルが無ければ生成、で、タイマーを起動、をやっている。

timer_Tickメソッドは、以下の通り。

        void timer_Tick(GT.Timer timer)
        {
            var accel = accelerometer.RequestMeasurement();

            using (fs = new FileStream(rdName + dxFileName, FileMode.Open, FileAccess.Write))
            {
                fs.Seek(0, SeekOrigin.End);
                var writer = new StreamWriter(fs);
                writer.WriteLine("Accelerometer:x=" + accel.X + ",y=" + accel.Y + ",z=" + accel.Z + " @" + DateTime.Now.ToString());
                writer.Flush();
            }

         }

 はい、これで出来上がり。コード見れば何となくわかりますね。一応解説しておくと、accelerometerが加速度センサーで、RequestMeasurementメソッドで現在値を取得、データ交換用ファイルを開いて、書き込み位置を最後に移動(Seekメソッド)、加速度センサーの値を現在時刻とともに格納。タイマーの時間間隔ごとにこれが繰り返されるわけ。

次は、逆方向(PCなどから.NET Gadgeteerに送る)のプログラムを試してみる。多分だが、以下のコードでファイルのアップロード時刻を監視していれば、PCなどからファイルが更新されたか判断できるはず。

            var fi = new FileInfo(rdName + dxFileName);
            var currentLastAccessTile = fi.LastAccessTime;
            if (currentLastAccessTile > lastFileAccessTime)
            {
                // file changed! this means that file has been updated by external device.
            }

あ、using宣言は適宜追加してくださいね。

PS
FlashAirのミドルウェアが何を使っているか知らないのですが、FlashAirそのものに、.NET Micro Frameworkが載っていて、開発用PCにSDカードを差し込んで、いろんなアプリをFlashAir上で動かせると素敵なんですけどね…

 

IoT Kit ハンズオントレーニング

$
0
0

皆様

現在、実際のセンサー付ハードウェア(.NET Micro Framework対応ボード)とクラウド(Microsoft Azure)を使って、IoT(Internet of Things)のスキルアップを目指す、トレーニングを準備中です。

詳細情報は、こちらから、どうぞ。

http://ms-iotkithol-jp.github.io

11月公開予定です。

学習ステップのイメージです


Visual Studio 2013 で .NET Micro Framework、Gadgeteer開発

$
0
0

.NET Micro Framework、Gadgeteerを試してみたい。でも、Visual Studio 2012か…と、諦めていた方。SDK群がアップデートされ、ようやくVisual Studio 2013でも開発環境が構築できるようになりました。

まだまだベータ版なので、実際にやる場合には最新情報が無いか、確認してからお試しを。※この記事は2014/10/17現在の状況を基に書いています。

以下の手順で環境構築を行ってください。

1. .NET Micro FrameworkのSDKをインストール

http://netmf.codeplex.com/ のページの右側の”download”ボタンをクリックして、".NET Micro Framework V4.3 SDK-R2-Beta”をダウンロードします。ZIPファイルを解凍して、

  1. MicroFrameworkSDK.msi を実行
  2. netmfvs2013.vsixを実行

の順でインストールします。勿論、先にVS2013のインストールは必要なのでお忘れなく。Express Editionの場合は、Desktop向けのバージョンを使ってください。Express EditionはWeb版やStore Apps版ありますが、同時に複数インストール可能です。

さて次に、

2. .NET Gadgeteer CoreのSDKをインストール

http://gadgeteer.codeplex.comのページの右側の”downloads"ボタンをクリックして、表示されたページの”.NET Gadgeteer Core 2.43.1000"をダウンロードします。ダウンロードしたGadgeteerCore.msiを実行して、インストールします。

次に、

3. 各社のGadgeteer SDKをインストール

私がよくデモで使っているGHI Electronics社製SDKの場合を紹介します。

 http://www.ghielectronics.com/support/netmf/sdk/23/netmf-and-gadgeteer-package-2014-r4からSDKをダウンロードします。ダウンロードした NETMF_and_Gadgeteer_Package_2014R4.exe を実行します。

表示された、ダイアログの下にある”Advanced”ボタンをクリックします。

表示されたチェックリスト(インストールされるSDKの選択)から、.NET Micro Framework SDK と .NET Gadgeteer Core のチェックを外します(ここが味噌)。OKをクリックしてインストール開始。

”OK"ボタンをクリックして、最初のダイアログに戻ってインストールを開始します。

インストールが終われば、Visual Studio 2013を起動して、新規プロジェクト作成すると、C#とVisual Basicのプロジェクトテンプレートに、Gadgeteerというカテゴリが追加されます。

注意:
最新のGHI ElectronicsのSDKには、前にあった大気圧センサーや温度湿度センサーなど前に使えたセンサーボード類が大多数入っていません。既に色々とボードを持っている人は気を付けてください。ないボードの追加方法は別のポストで紹介します。

で、すでにFEZ シリーズのボードを相当数持っている人は、GHI Electronicsが提供する、古いSDKをインストールすると、.NET Micro Frameworkのバージョンは4.2限定になってしまいますが、Visual Studio 2013でアプリ開発できるようになります。

動作確認が済んだバージョンは、https://www.ghielectronics.com/support/netmf/sdk/11/netmf-and-gadgeteer-package-2014-r1 です。ダウンロードしたZIPファイルを解凍して、Setup.exeを実行して、二番目のダイアログの

 

 ”Install .NET Gadgeteer Core”のチェックを外して、”Next”をクリックします。

 

 

IoT Kit ハンズオントレーニング用の開発環境セットアップ

$
0
0

11月は30日までです‼…という言い訳を地でいってしまいましたが、現在、Step3 蓄積編までをhttp://aka.ms/IoTKitHoLで公開しています。

ここでは、このトレーニングを行うのに必要な開発環境セットアップ方法を念のため説明しておきます。現状確実に利用可能、かつ、最新版でのセットアップ方法です。

先ず、Windows PC(7以上)が必要です。

Windows PCに以下のツール、SDKをインストールしてください。

  1. Visual Studio 2013 有償版、もしくは、Visual Studio Community 2013
    http://www.visualstudio.com/downloads/download-visual-studio-vs
  2. .NET Micro Framework SDK
    http://netmf.codeplex.comの"download"ボタンをクリックして、netmf-v4.3.2-SDK-R2-Beta.zipをダウンロード
    1. ZIPファイルを展開
    2. MicroFrameworkSDK.msiを実行
    3. netmfvs2013.vsix を実行
  3. http://gadgeteer.codeplex.com/ の"downloads"ボタンをクリック
    .NET Gadgeteer Core をクリックし、"GadeteerCore.msi"をダウンロードし実行
  4. https://www.ghielectronics.com/support/netmf/sdk/24/netmf-and-gadgeteer-package-2014-r5 の”NETMF_and_Gadgeteer_Package_2014_R5.exe"をダウンロードし、実行。
    ※GHI Electronics社へのユーザー登録必要

以上で、FEZ版IoT Kitハードウェアのソフトウェア開発環境のセットアップは完了です。

それから、トレーニングではMicrosoft Azureを実際に使うので、http://azure.microsoft.com/ja-jp/ から、サブスクリプション契約をしてください。まずは右上の”無料評価版”からお申し込みください。MSDN SubscriptionやBiz Sparkを契約されている方は、各管理サイトからMicrosoft Azureのサブスクリプションをアクティベートできるので、そちらをお使いください。

 一連の作業では、マイクロソフトアカウントが必要になるので、予め、http://www.microsoft.com/ja-jp/msaccount/signup/default.aspx を参考に、登録をお願いします。

 

 

Lチカ、リレチカ、カメパシャ、クラコネで、FEZ Spiderで画像キャプチャしてAzureのブロブに格納

$
0
0

今年のDevice 2 Cloud (D2C)コンテストの広島工業大学の学生さんの作品を見ていて、この作品の完成形が見たい…ということで、FEZ SpiderのCameraで撮った画像を、Web SiteのWeb APIで作ったHTTP RESTサービスに送って、Azure のBlob ストレージに格納するサンプルを紹介します。

で、その前に、FEZ Spider のDebug用 LEDでLチカするなら、

var timer = new GT.Timer(500);
bool ledOn = false;
timer.Tik += (t) => {
    ledOn = !ledOn;
    Mainboard.SetDebugLED(ledOn);
};
timer.Start();

ま、こんな感じ。リレーチカチカするなら、Relay X1あたりを使って、

relayX.TurnOn();
relayX.TurnOff();

 で、おしまい。

さて、本題。http://aka.ms/IoTKitHoL と合わせて読むと理解度アップです。

構成を絵で描くと、

こんな感じ。Multicolor LEDはおまけ。

先ず、FEZ Spiderで、カメラでパシャ(カメパシャ)をするコードだが、タイマーを起動して、定期的にカメラで写真を撮って、クラウドに送信することとする。Program.csを以下のようにコーディング。

        void ProgramStarted()
        {
            /*******************************************************************************************
            Modules added in the Program.gadgeteer designer view are used by typing
            their name followed by a period, e.g.  button.  or  camera.
           
            Many modules generate useful events. Type +=<tab><tab> to add a handler to an event, e.g.:
                button.ButtonPressed +=<tab><tab>
           
            If you want to do something periodically, use a GT.Timer and handle its Tick event, e.g.:
                GT.Timer timer = new GT.Timer(1000); // every second (1000ms)
                timer.Tick +=<tab><tab>
                timer.Start();
            *******************************************************************************************/
            // ネットワーク初期化
            if (!ethernetJ11D.NetworkInterface.Opened)
            {
                ethernetJ11D.NetworkInterface.Open();
            }
            var ipAddr = ethernetJ11D.NetworkInterface.IPAddress;
            while (ipAddr == "0.0.0.0")
            {
                if (ethernetJ11D.NetworkInterface.IsDhcpEnabled)
                {
                    ethernetJ11D.NetworkInterface.RenewDhcpLease();
                }
                else
                {
                    ethernetJ11D.NetworkInterface.EnableDhcp();
                }
                Thread.Sleep(500);
                ipAddr = ethernetJ11D.NetworkInterface.IPAddress;
            }
            Debug.Print("IPAddress=" + ipAddr);

            // 時間合わせ
            SyncTimeService();

            // カメラ設定
            camera.PictureCaptured += camera_PictureCaptured;

            // タイマー起動 60000msecつまり1分毎
            timer = new GT.Timer(60000);
            timer.Tick += timer_Tick;
            timer.Start();

            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
            Debug.Print("Program Started");
        }

        void camera_PictureCaptured(Camera sender, GT.Picture e)
        {
            timer.Stop();
            var now = DateTime.Now;
            string fileName = deviceId + now.Year + now.Month + now.Day + now.Hour + now.Minute + now.Second + now.Millisecond + ".bmp";
            using (var request = HttpWebRequest.Create(url + "?fileName=" + fileName) as HttpWebRequest)
            {
                using (var reqStream = request.GetRequestStream())
                {
                    request.Method = "POST";
                    request.ContentLength = e.PictureData.Length;
                    request.ContentType = "image/bitmap";
                    reqStream.Write(e.PictureData, 0, e.PictureData.Length);
                }
                using (var response = request.GetResponse() as HttpWebResponse)
                {
                    if (response.StatusCode != HttpStatusCode.Created)
                    {
                        Debug.Print("Web Response: " + response.StatusCode);
                    }
                }
            }
            timer.Start();
        }

        string url = "http://[IoTWeb].azurewebsites.net/api/Bitmap";
        string deviceId = "gadgeteer1";

        void timer_Tick(GT.Timer timer)
        {
            timer.Stop();
            if (camera.CameraReady)
            {
                camera.TakePicture();
            }
            timer.Start();
        }

        GT.Timer timer;

        public static byte[] TimeServerIPAddress = new byte[] { 133, 243, 238, 243 };

        private void SyncTimeService()
        {
            if (ethernetJ11D.IsNetworkConnected)
            {
                TimeService.SystemTimeChanged += TimeService_SystemTimeChanged;
                TimeServiceStatus status = TimeService.UpdateNow(TimeServerIPAddress, 10);
                TimeService.SetTimeZoneOffset(540); // time origin
            }
        }
        void TimeService_SystemTimeChanged(object sender, SystemTimeChangedEventArgs e)
        {
            Debug.Print("Time Synced");
        }

以上で、FEZ Spider側は完了。コード読めば、分るよね。プロジェクトの参照に、アセンブリを3個追加することを忘れずに。

  • Microsoft.SPOT.Time.dll
  • System.Http.dll
  • System.IO.dll

次はクラウド側。ここから先は、Azureのサブスクリプション契約が必要。申し込みは、http://azure.microsoft.com/ja-jp/ から。

まずは、画像を保存するストレージを作ろう。http://manage.windowsazure.com を開いて、左下の”+新規”をクリック。”データサービス”→”ストレージ”→”簡易作成”と選択し、

URLには、適当な名前を入力。仮に、”photostorage"としておこう。ストレージが出来上がったら、ポータルの左側のタブの”ストレージ”を選択、出来上がったストレージを選択して、下の黒帯の”アクセスキーの管理”をクリック。表示された、プライマリーアクセスキーを記録しておく。仮に、"storageaccesskey"としておくね。

では次に、Visual Studio で、ASP.NETアプリプロジェクトを作ります。

そして、次のダイアログで、Web APIを選択、

右下のMicrosoft Azureの”クラウド内のホスト”にチェックを入れて”OK”クリックし、Azure上にWebサイトをさくっと作ります。出来上がったプロジェクトのControllerフォルダーを右クリックして、”追加”→”コントローラ”を選択して、BitmapControllerという名前でコントローラを作ります。出来上がった、BitmapController.csファイルのBitmapControllerクラスの中に、以下のメソッドを追加する。

        public HttpResponseMessage Post([FromUri] string fileName)
        {
            var task = this.Request.Content.ReadAsStreamAsync();
            task.Wait();
            var reqStream = task.Result;

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("iotstorage");
            container.CreateIfNotExists();
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);
            blockBlob.UploadFromStream(reqStream);

            var response = new HttpResponseMessage();
            response.StatusCode = HttpStatusCode.Created;
            return response;
        }

このメソッドが、作成したWebサイトに、http://[IoTWeb].azurewebsites.net/api/Bitmap?fileName=gadgeteer1201412071000001.bmp といった形式でPOSTすると、このメソッドにルーティングされる、と、そんな仕組みにASP.NETアプリはなっている。あ、そうそう、”StorageConnectionString”の設定をしておかないと、このコードはちゃんと動かない。Web.config を開いて、

    <appSettings>
       
<addkey="StorageConnectionString"value="DefaultEndpointsProtocol=https;AccountName=account-name;AccountKey=account-key"/>
   
</appSettings>

と、<appSettings>...</appSettings>に上のボールドで示した一行を入れ、account-nameを、さっき作ったストレージアカウント名、ダイアログに表示されていたプライマリーアクセスキーでaccount-keyを置き換えて、おしまい。

後は、プロジェクトを右クリックして発行する。このサービス、PCのローカルのエミュレータでも実行はできるけど、外のデバイスからそのサービスにつなぐには、PCのセキュリティに色々と穴をあけないとつなげられないので、お勧めしない。色々手間かけてPCの脆弱度を高めるより、Azureを使った方が手っ取り早いし、結果的に安くつく。

あ、FEZ Spider側のプログラムのurlの[IoTWeb]を作成したウェブサイトに合わせて修正することを忘れずに。

ちゃんと格納されているかは、Visual Studioのサーバーエクスプローラで、AzureのStorageを覗いてみれば確認できる。

ブロブに画像を格納してしまえば、後は、IT側で何でもできる。Webサービス側で、ブロブから画像を取り出す方法は、格納する道具立てを使えばできる。インテリセンスを駆使して試してみてほしい。デバイスローカル(SDカードとか)に格納したい場合は、http://yseosoft.wordpress.com/2012/07/14/net-gadgeteer-%e3%83%87%e3%82%b8%e3%82%ab%e3%83%a1%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f-%e4%bd%8e%e6%a9%9f%e8%83%bd%e3%81%a0%e3%81%91%e3%81%a9%e4%b8%80%e5%bf%9c%e5%ae%8c%e6%88%90/ も参考になるはず。

たいしたコード量でもないので、是非、試してみてほしい。このシステム構成、写真をアップロードするデバイスが増えても対応できるので、いろいろトライしてみてね。

 D2Cにエントリーしたほかの学生さんたち、結構、スマホ連携的なシナリオもあったので、http://blogs.msdn.com/b/hirosho/archive/2014/07/25/gadgeteer-azure-part-1.aspx も参考になると思うので、是非。

IoT ( Internet of Things) Hands-on Kit トレーニング の学習方法

$
0
0

10月のIoT Japanで発表した、IoT Kit Hands-on Training セミナー、既に11月末からStep3までhttp://aka.ms/IoTKitHoLから公開してます。是非、皆さん、トライしてください。

…ポータルを眺めていて、う~ん、そっけない…と感じたのは私だけでなないと思います。特に姉妹ハンズオンのhttp://aka.ms/nkitと比べると、メインでやっている人間性が出てる…。

ということで、ここでポータルの構造と学習方法を説明しておきます。ポータルは、

はい。”さあ、始めよう”をクリックして、

といった流れで進めてください。学習に必要な機材や各種準備は、ポータルの

”事前準備”に書いてあるので、よく読んでください。2014年12月現在、まだ、GR PEACH版IoT Kitは販売されていませんが、FEZ版IoT Kitは販売中なので、そちらをご利用ください。IoTは基本複数のデバイスがつながるのが基本だし、学習コンテンツの中には、複数のデバイスをつなぐとより学習効果が出る内容もあるので、損はしないでしょう。

この「ハンズオンいいかも」と思った方、ポータルの、

”トレーニング概要”をクリックすると、このトレーニングの全体像が表示されるので、これを知合いに見せて紹介してくれるとありがたし。このハンズオントレーニングの集合教育版セミナーや各種イベントの告知をやっているので、それも参考にしてくださいね。

更に、「俺持ってんの、mbedだし」とか「ラズパイ命」とか、「LEGO MINDSTORMS EV3大好き」とか、「やっぱArduinoっしょ」とか、思っている方は、”さぁ、始めよう”の下の方に

”コントリビューター募集”

と書いてますよね。そういった皆さんは、.NET MFの部分をそれらのガジェットに置き換えたコンテンツ作成に協力してもらえると、非常に助かるので、挙手…いや、iotkithol-jp@microsoft.com にご連絡おねがいします。

では、では。

 

FEZの温度センサー処理のバージョンアップ対応等 - 2014/12/24日現在

$
0
0

今年後半にかけて、.NET Micro Framework、.NET Gadgeteer、FEZのSDKや製品ラインナップのUpdateが立て続けにあり、APIやセンサーが変わっているので、

http://blogs.msdn.com/b/hirosho/archive/2014/07/25/gadgeteer-azure-part-1.aspx

で説明している内容のStep2の最新環境での実装方法を解説しておきます。

先ず、開発環境のセットアップですが、

http://blogs.msdn.com/b/hirosho/archive/2014/12/03/iot-kit.aspx

で紹介しているセットアップがなされているものとして話を進めます。

プロジェクト作成の際に出てくるメインボード選択のダイアログでFEZ CerbiunoNetを選択する際には、右下のバージョン選択で4.3を選択するようにしてください。

既にディスコンになってしまった、温度湿度センサーを継続して使う場合、このセンサー用のAPIは更新されてしまったので、最新版のSDKを使う場合には、

温度センサー初期化のコード:

            tempHumidity.MeasurementComplete += tempHumidity_MeasurementComplete;
            tempHumidity.StartTakingMeasurements();

の変更が必要です。更に、MeasurementCompleteはシグネチャが変わっているので、このイベントハンドラのメソッドは、

        void tempHumidity_MeasurementComplete(TempHumidity sender, TempHumidity.MeasurementCompleteEventArgs e)
        {
            lock(this)
            {
                lastTemp = e.Temperature;
                lastHumidity = e.RelativeHumidity;
            }
            if (e.Temperature > 30)
            {
                relay_X1.TurnOn();
            }
            else
            {
                relay_X1.TurnOff();
            }
         }

と変更が必要です。

以前の.NET Micro Framework 4.2のプロジェクトをアップデートする場合は、上の修正をする前に、ソリューションエクスプローラでプロジェクトを右クリック→”プロパティ”を選択して、”アプリケーション”タブの”対象のフレームワーク”を”.NET Micro Framework 4.3”に変更します。

そして、プロジェクト直下の”参照”フォルダを展開して、”GHI.Premium.Net”という項目が残っていたら、選択して右クリックし”削除”で消してください。

Program.gadgeteerを開いたときにボードが黒くなっている場合は、エディタ上から一旦Temp&Humidモジュールを削除し、ツールボックスからドラッグ&ドロップしなおしてください。

それから、FEZ版IoT Kitを購入の方、もしくは、TempHumid SI70を使おうと思っている皆さん、このセンサーには、MeasurementCompleteの様なイベントが無く、同期的にしか計測データを取り出せないので、上の方法は使えません。Timerを使ってセンサー計測値をポーリングするロジックの追加が必要です。

やり方は、http://aka.ms/IoTKitHoL のStep2を参考にして実装してみてください。

では、では

Go Azure + おばかIoTシンポジウム

$
0
0

皆さん、明けましておめでとうございます。本年も昨年に引き続きIoTにフォーカスしていきますので、よろしくお願いいたします。

さて、来週の金曜日1月16日に開催されるGo Azure、皆さん申込みは済んでますか?

まだの方は、http://www.microsoft.com/ja-jp/server-cloud/azure/event/goazure2015/session.aspx からお申込くださいね。なんと、あの、Rubyのまつもとゆきひろさんも登壇されたりします。

本題です。http://r.jazug.jp/event/goazure/のSession2-5(17:50-)に、おばかIoTシンポジウムがあります!う~ん…「おばか」といえば、Windows 7のSensor & Location Platformやってた時の「おバカアプリ選手権」思い出すな…Neuro Skyの脳波センサーとか加速度センサー付グローブとかいろいろやったな、あの頃…

なんだか色々と面白げなIoTのデモもあるらしいので、皆さん是非ご参加ください。当日私もお手伝いの予定です。

IoTというと、FAとかアグリカルチャーとか医療機器とか、交通関係とか、ビル管理とかエンタープライズ系を思い浮かべる人が多いかもしれないですが、家電やウェアラブルとか身の回りにある個人持ちのデバイス達とクラウド連携といった身近なIoTも当然あるわけで、今後普通のスマートフォンやタブレット、PCに加えて、それ以外のMPU搭載の組込み機器もITシステムを構成する主役になっていくのは間違いない‼ってことで、ソフトウェア開発者なら、IT系、組込み系、全て今のトレンドに触れてみましょう。

では、16日会場でお待ちしております。1月26日の品川でのハンズオントレーニング(https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032609294&Culture=ja-JP&community=0)も募集中。http://aka.ms/IoTKitHoLもよろしくね。

 

 

.NET Micro Frameworkのカスタムエミュレータの作り方

$
0
0

ニッチなネタですみません。備忘録的に書いておきます。

組込み機器は千差万別。製品が違えば必ずどこかしらHWは違うもの。ついているセンサーやアクチュエーター、UI全部違います。C#で書いてPC上でエミュレートできるのも、.NET Micro Frameworkのメリットの一つ。で、カスタムなハードウェアを作って.NET Micro Frameworkを移植すると、カスタムなエミュレーターが必要になります。複雑なアルゴリズムやネットワーク通信系は、エミュレーター上で動作確認しておけば、実ハードウェアで動かない場合は、ハードウェアのせいか、実ハードウェアの動作に起因するタイミングのせいか、とにかくソフトとハードの問題の切り分けができるからね。

で、カスタムエミュレーターが欲しいケースは、

  • デフォルトのエミュレーターには装備されていないセンサーやアクチュエーターをエミュレートしたい
  • デフォルトのエミュレーターとは違うUI(表示やキーなど)を使いたい
  • デフォルトのエミュレーターのRuntimeライブラリを弄りたい

あたりです。エミュレーターは、Windows上に.NET Micro Frameworkを移植したものなんですね。だから、この作業は、各自のハードウェアに.NET Micro Frameworkを移植するのと基本同じ作業になります。ただ、Windows上で動くので、Visual Studioでビルドできてランタイムもデフォルトのエミュレーターとして公開されているモノをほぼそのまま使えるので、他の諸々のハードウェアに移植するよりは楽。

Runtimeをカスタマイズする、やり方は、http://netmf.codeplex.comの”Documentation”タブの”HowTo Manual to Build a Custom Version of the Runtime for a Device Emulator"に結構詳しく書いてあり、基本これに従ってやっていけばOK。ただ、ちょっと説明が足りなかったりするので、ここで補足しておきます。

あ、この作業やるには、Codeplexのサイトの”DOWNLOADS”タブをクリックして表示されたページの右上の.NETMF 4.3 RTM(QFE1)という項目をクリックして、表示された”PORTING KIT 4.3(QFE1)”をクリックしてZIPファイルをダウンロードし、中に入っているMSIファイルをたたいてポーティングキットのインストールが必要。Runtimeには2種類あって、C++で実装された部分(Porting KitをインストールしてできるディレクトリのSolutionsの下)と、C#で実装された部分(Framework/Tools/Emulatorの下)があり、それぞれ()でくくったところに書いてある場所にあり、それらを自分の好みに修正すればよろし。

Porting Kitをインストールすると√ディレクトリに、”MicroFramework_V4_3というディレクトリが出来ます。前者のC++で実装されている部分のビルドは、マニュアルに書かれてある通りにやって、msbuild.exeを実行する前に、コマンドプロンプトを一個開いて、このディレクトリに移動して、

C:¥MicroFrameworkPK_v4_3> setenv_vs.cmd

と入力し、環境設定用のバッチファイルを実行しておきます。これやらないと全然ビルドできないので、やるように。ハードウェアをエミュレートするドライバなど追加してC++の部分はマニュアルに書かれている通りにビルドすればOK。で、C#で実装されている部分は、このバッチを実行した状態で、”Framework/Tools/Emulator"に移動して、

C:¥MicroFrameworkPK_v4_3¥Framework¥Tools¥Emulator>build /t:Build /p:Flavor=Debug

でビルド開始。終わったらDebugの部分をReleaseに変えて再度実行すれば、デバッグ用、リリース用両方ができあがる。出来上がったDLLは、C:¥MicroFrameworkPK_v4_3¥BuildOutput¥public¥[Release|Debug]¥Server¥dll に、C++のが、Microsoft.SPOT.Emulator.Interface.dll、C#のが、Microsoft.SPOT.Emulator.dllという名前で出来上がっています。

これが出来たら、Visual StudioのC#のプロジェクトテンプレートの”MicroFramework”カテゴリにある、”Device Emulator”を使ってエミュレータ用のプロジェクトを作る。この作り方は、https://msdn.microsoft.com/en-us/library/hh399820.aspxに書いてある。基本これに従って作業を進める。

カスタムのRuntimeを作った場合は、プロジェクトの参照の”Microsoft.SPOT.Emulator.dll”と”Microsoft.SPOT.Emulator.Interface.dll”を作成したものと置き換えてね。

が、しかし、…なんとWinFormなんですね、今時。

やっぱりWPFでやりたいよね今時…ということで、

先ず、参照設定に、PresentationCore、PresentationFramework、System.Xaml、WindowsBase、WindowsFormsIntegrationというアセンブリを追加する。

そして、エミュレータープロジェクトに、”ユーザーコントロール(WPF)”項目を追加する。名前は…そうだな…”EmulatorPad”としておこうか。するとUI用のXAMLファイルが出来上がるので、ちゃららら~んと、データバインディングとか駆使してUIを作る。

デフォルトで出来上がっている”MainForm.cs”を開いて、MainForm_Load(object sender, EventArgs e)メソッドに、

            wpfPageHost = new System.Windows.Forms.Integration.ElementHost();
            wpfPageHost.Dock = DockStyle.Fill;
            var wpfPage = new EmulatorPad();

            wpfPageHost.Child = wpfPage;

            this.Controls.Add(wpfPageHost);

 って記述を加えると、追加したWPFのユーザーコントロールがめでたく表示される。

I2CやGPIOなどのハードウェアの追加方法は、MSDNのドキュメントに記載されているので、そちらを参考にしてやってほしい。弄るファイルは、Emulator.configや、Program.csファイルのSetupComponent()メソッドあたり。

…まぁね….NET Micro Frameworkのカスタムエミュレータ作らなきゃいけない人なんて、日本に数人しかいないはずなので、見る人少ないかもしれないけど、とりあえずアップしておく


Developers Summit 2015 初日のIoT Kitハンズオントレーニング内容

$
0
0

2015/2/19、目黒雅叙園で開催されたデブサミ2015初日、GR-SAKURA+センサーボード+Azureを使ったハンズオントレーニングを4回開催しました。参加された皆さん、お疲れ様でした。

ここでハンズオントレーニングで実施した内容を紹介しておきます。

使ったハードウェアは、.NET Micro Frameworkを移植したGR-SAKURAボードに温度センサーその他が装備されたドーターボード(以下センサーボードと呼びます)を挿したものを使いました。

右の写真の方に3つ並んでいるGadgeteerソケットの一番右のちょい下の青っぽい素子が、温度を測るサーミスターです。

このボードをイーサネットでつないで、AzureのMobile Serviceに計測した温度を送信して、各自のストレージに貯めつつ、SignalRで計測データを送信する一連の処理を作ってもらいました。私の方で用意したSignalRハブで受信してAzureのテーブルストレージに受講者から送られた熱い魂(温度です)をExcel Power Mapで表示し、受講者の皆さんの成果を全員で鑑賞しました。

※この構成は、100分という短い時間でIoTの超基本要素を一通り実践することを主眼にデザインしています。これがIoTの一般的なアーキテクチャであるという意味ではないのであしからず。

この実習内容は、http://aka.ms/IoTKitHoLから公開中のStep0-Step5の一連の自学自習コンテンツの中で取り扱っているテーマをピックアップして再構成したものです。

受講者の皆さんの熱い魂(指の温度です)は、私が用意したストレージに貯められて、Excel Power Mapを使って、

番号のついたセルに参加者が対応し、実習書に書かれているチャレンジを一通りやって、ボードから温度センサーの値が正しく送られて転送されると、テーブル番号に相当するセルに温度が送られた回数が棒グラフで表示されます。

 トレーニングの部屋のネットワーク環境の問題で中にはボードでつながらない人もいました(ごめんなさい)が、参加された方の多くの方の温もり(指の温度です)を、表示しました。

 当日の実習テキストには、私の方で用意したSignalRハブとExcelの作成方法は書いていないので、ここで紹介しておきます。

実習内容の図の「3.SignalR送信Webアプリ作成」で作ったWebアプリが送信した先は、以下のステップで作成しています。

1.Visual StudioでASP.NET Webアプリを作成

2.作成されたプロジェクトにHubsというホルダーを作成

3.Hubsフォルダーを右クリックして”SignalRハブクラス(V2)”を選択し、”SensorHub”という名前でクラス作成

出来上がったクラスに、

        public void Update(SensorReading data)
        {
            Clients.Others.NotifyTemperature(data);

            var storeCS = CloudConfigurationManager.GetSetting("StorageConnectionString");
            var storageAccount = CloudStorageAccount.Parse(storeCS);
            var tableClient = storageAccount.CreateCloudTableClient();
            var sensorReadingTable = tableClient.GetTableReference("SensorReading");
            sensorReadingTable.CreateIfNotExistsAsync().Wait();

            var sr = new SensorReadingTable(data.DeviceId, DateTime.Now);
            sr.Timestamp = data.Timestamp;
            sr.SensorType = "Temperature";
            sr.SensorValue = data.Temperature.ToString();
            sensorReadingTable.ExecuteAsync(TableOperation.Insert(sr)).Wait();
        }

        public class SensorReading
        {
            public string DeviceId { get; set; }
            public DateTime Timestamp { get; set; }
            public double Temperature { get; set; }
        }

というコードを実装します。ストレージに関する各種設定は、http://aka.ms/IoTKitHoLから公開している”Step 3 蓄積”を読んでください。

※SignalRのハブの中で直接ストレージに蓄積することは設計的に考えるとちょっと微妙ですが、簡単のためこんな実装にしています。

実習に参加した方は、自分用にこのASP.NETアプリを作成して、実習の時に作成したASP.NETのプロジェクトのPostSensorReadingController.csファイルのURLをそれに合わせて変えれば、自前の方にデータが転送されるようになります。

後は、http://aka.ms/IoTKitHoL の”Step 5 分析”で説明しているような方法で、ExcelのPower Mapを作成すれば見ること可能です。Power QueryでAzureのテーブルストレージからデータをダウンロードする設定は、”POWER QUERY”メニューの”AZUREからインポート”→”Microsoft Azureテーブルストレージから”を選択して、ストレージのアカウント、アクセスキーを入力すれば表示可能です。各テーブルのどこに表示するかは、予め計算した表を用意しています。詳細は別の機会で紹介しようと思っていますが、ハンズオントレーニング資料や、このブログを参照しながらチャレンジしてみてくださいね。

 

 

デスクトップアプリでWindows Runtime APIをコールする(センサーとか)

$
0
0

前から、デスクトップアプリからWindows Runtime API(の一部)を呼び出せるのは知っていたのですが、最近、本当にコールする必要が生じたので、やり方をここに書いておきます。

※この投稿はストアアプリより、デスクトップアプリの方が良いです…という話ではありません。使えるWinRT APIは一部だし、セキュリティ、パフォーマンスなどストアアプリで使った方がいいので、なるべくストアアプリを使うことをお勧めします。

Windows Runtime APIを使おうとするのは、Visual Studioで、”Windowsデスクトップ”→”WPFアプリケーション”プロジェクトテンプレートで作ったプロジェクトです。このプロジェクトは本来.NET FrameworkのAPIを使用します。

プロジェクトファイル(C#なら*.csproj)をテキストエディタ等で開きます。

<Project>...</Project>という記述がありますね。その中に<PropertyGroup>…</PropertyGroup>という定義がいっぱいあります。これらに並べて、

  <PropertyGroup>
    <TargetPlatformVersion>8.0</TargetPlatformVersion>
  </PropertyGroup>

を入れます。

プロジェクトをVSで再度開きます。

参照設定に、以下のパスに存在する、Windows.winmd というファイルを追加します。

C:\Program Files (x86)\Windows Kits\8.1\References\CommonConfiguration\Neutral

※32ビットOSの場合は、”Program Files\Windows Kits…

これで設定は終わり。

例えば、加速度センサーなら、

var accelerometer = Windows.Devices.Sensors.Accelerometer.GetDefault();

と、こんな風に取り出すことができます。但し、イベントを”+=”の様な普通の形式では使うことはできません。


 

GR SAKURAで.NET Micro Frameworkを使おう

$
0
0

先日行ったデブサミでのハンズオン、それから、最近各地方で開催しているIoT Kitハンズオンで使っているGR SAKURAを.NET Micro Frameworkデバイスとして使うためのセットアップ方法を解説します。
GR SAKURAを既に持っている方、是非、お試しください。

※本説明は、2015年3月31日現在の情報に基づいて記載しています。

GR SAKURAの.NET Micro Framework化は、TinyCLRという.NET Micro Frameworkの実行エンジンファームウェアをGR SAKURAに書き込むことで行います。

この作業を行うために、ルネサスさんから提供されているFDTというツールをまず、PCにインストールしてください。

 
こちらからツールが公開されているので、このページの記載をよく読んで、インストールしてくださいね。
それから、
 
の”DOWNLOAD”ページから最新のファームウェアが入ったZIPファイル(最新版はhttp://aka.ms/GRSakuraFW )をダウンロードします。ダウンロード後ZIPファイルのプロパティでブロックを外しておいてください。ZIPファイルを解凍すると、tinyclrmbl.mot という名前のファイルが入っています。これが.NET Micro Frameworkのファームウェアが格納されているファイルです。
では、セットアップを開始しましょう。
 
1. ボードをPCにつなぐ
図に示されているようにボードのスイッチをセットして、USBケーブルでPCに接続します。
2. FDTを起動
ルネサスさん提供のFDTを起動します。FDT.exeは、
64Bit OSの場合、
c:¥Program Files(x86)¥Renesas¥FDT4.09 ※最後の数字は違うかも
32Bit OSの場合
c:¥Program Files¥Renesas¥FDT4.09 ※最後の数字は違うかも
にあります。FDT.exeをダブルクリックして実行してください。
FDTが起動して、最初に表示されるダイアログはそのまま”OK”をクリックし、次に表示されるダイアログの”Workspace Name”もしくは、ワークスペース名は、適当な文字列(SAKURAとか)を入力してOKをクリックしてください。
 
3. ボードの接続設定
図に説明されている通りに操作を行ってください。
 
 
 
これでFDTアプリ上での、ボードの接続作業が完了しました。
 
4. ファームウェアの焼付け
メニューの”File”→”Open Data File”を選択し、CodeplexからダウンロードしたMOTファイルを選択します。
 
 次に、メニューから”Device”→”Download Active File"を選択します。これでボードへのファームウェアの転送が始まります。転送が完了すると、図の様に”Image written to device”と表示されます。
 
転送&書き込みが終わったら、ボードをDisconnectします。メニューの”Device”→”Disconnect”を選択します。表示されたダイアログは”OK”をクリックします。
ケーブルはつないだまま、ボードのスイッチをRUN側に切換えて、リセットボタンを押します。
 
これで、ボード側のセットアップは完了です。
次に、PC側のドライバーをインストールします。
 
ドライバーは、https://netmf4rx.codeplex.com/releases/view/612666から、USB Driver for Windows 7/8.1をクリックして”GRPEACH-NETMF-Driver.zipファイルをダウンロードしてください。
ダウンロードしたZIPファイルは、右クリック→プロパティ表示で、右下の”ブロック解除”をクリックしてブロックを解除することをお忘れなく。
ZIPファイルを展開し、INSTALL.BATファイルを実行します。
 
 
ドライバーのインストールが終了したら、PCにUSBケーブルでSAKURAを再度接続します。
デバイスマネージャーで、ユニバーサルシリアルバスデバイスの下にGR_SAKURAが表示されていればOK.。
 
この作業が終われば、PCにSAKURAを接続すると、いつも、.NET Micro Framework対応版SAKURAとしてPCにつながるようになります。
あとは、Visual Studioで、.NET Micro Frameworkのプロジェクトテンプレートを使ってアプリを開発できるようになります。
あ、Visual Studio使ったことない人、https://www.visualstudio.com/ からVisual Studio 2013 Community Editionという無償版が公開されているので、それを使ってください。既に有償版やVisual Studio Express fro Windows Desktopをインストール済みの人も開発可能です。
Visual Studioをインストールしたら、http://netmf.codeplex.com/ の右側の”DOWNLOAD”からダウンロードしたZIPファイルに入ったMSIとVSIXを実行してSDKをインストールすればセットアップはおしまい。
例えば、エルチカは、Visual C#のMicro FrameworkのConsole Applicationテンプレートを使ってプロジェクトを作成し、参照に、Microsoft.SPOT.Hardwareというアセンブリを追加して、

    public class Program
    {
        public static void Main()
        {
            Debug.Print(Resources.GetString(Resources.StringResources.String1));

            var program = new Program();
            program.LChika(500);
        }

        Program()
        {
            LED = new OutputPort(LEDpin, false);
        }

        public void LChika(int msec)
        {
            bool status = false;
            while (true)
            {
                status = !status;
                SetLED(status);
                Thread.Sleep(msec);
            }
        }
        public void SetLED(bool on)
        {
            LED.Write(on);
        }

        static Cpu.Pin LEDpin = (Cpu.Pin)80;                            // PA0 - GPIO 80: LED
        OutputPort LED;

    }

といったようなコードで実行できます。

また、HTTPでWebにアクセスしたい場合は、参照に、Microsoft.SPOT.Net、Sysmte.Http、System.IOの3つのアセンブリを追加し

string ipAddr = "";
foreach (var ni in Microsoft.SPOT.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
{
    if (ni.NetworkInterfaceType == Microsoft.SPOT.Net.NetworkInformation.NetworkInterfaceType.Ethernet)
    {
        if (!ni.IsDhcpEnabled)
        {
            ni.EnableDhcp();
        }
        Thread.Sleep(1000);
        ipAddr = ni.IPAddress;
        if (ipAddr != "" && ipAddr != "0.0.0.0")
        {
             if (!ni.IsDynamicDnsEnabled)
             {
                  ni.EnableDynamicDns();
             }
             break;
         }
     }
}
if (ipAddr != "0.0.0.0")
{
    using (var request = HttpWebRequest.Create("http://www.bing.com") as HttpWebRequest)
    {
        try
        {
            using (var response = request.GetResponse() as HttpWebResponse)
            {
                Debug.Print("Status - " + response.StatusCode);
                using (var stream = new StreamReader(response.GetResponseStream()))
                {
                    string content = stream.ReadToEnd();
                    Debug.Print(content);
                }
           }
        }
        catch (Exception ex)
        {
            Debug.Print(ex.Message);
        }
    }
 }

こんなパターンでWebサービスとの通信可能です。

ただ、残念なことにメモリが少ないため、SSLはサポートされていません。
なので、http://aka.ms/IoTKitHoLから公開しているStep1~5までのハンズオンは全て実施することできませんが、Event Hubへの接続をASP.NET Webアプリに変えたり工夫すれば、Step4、5は実施できるので挑戦してみてください。
 

IoT Kitハンズオンセミナーで実演している、センサーデータ収集とExcelによる表示の仕組みについて

$
0
0

2月のデベロッパーサミットのハンズオンで初披露し、3/15のIoTあるじゃん(https://www.facebook.com/groups/ioytjp/)コミュニティ設立イベントでのハンズオン、それと、最近地方で開催しているIoT Kitハンズオンセミナーで、もれなく使っている、参加者の皆さんが各自のGR SAKURA+センサーボードやGR PEACH+センサーボードでの実習で計測したデータを、集めて、ExcelのPower Mapでの表示に関する説明です。

この右側の赤の点線で囲んだ部分です。

この部分は大きく分けて二つのパーツから構成されています。一つ目は、受講者各自が作成したASP.NET WebアプリからSignalRで送信されたセンサーデータを受信しAzure StorageのTableに格納する部分、二つ目は、そのTableからExcel Power Queryでデータを取り出し、Excel PowerMapで表示する部分です。

1つ目は図の4番目のステップで、SignalRというプロトコルを使って、私が作って動かしているASP.NET Webアプリケーションにデータを送っています。作り方は、http://aka.ms/IoTKitHoLから公開中のハンズオントレーニングのStep 4 表示の、4.1節で解説している方法で作っています。手順書を見ながら以下の説明を読んでください。

SignalR?なんか難しそう…と思っている方、大丈夫です。簡単です。先ず、ハンズオントレーニングのStep1 接続の1.1節で説明された方法で、Azure上にWebアプリを作成します。出来上がったら、Step 4表示の4.1節で説明された方法で、SignalRのハブを”SensorHub”という名前で作成します。

で、ここでは、Azure Storageを使うので、NuGetパッケージで、Windows Azure Storeage SDKをインストールします。やり方は、ハンズオントレーニングのStep 3蓄積の1.2、1.3節に書いてあります。Azure上でのストレージアカウントの作成や、Web.configへのストレージへのConnectionString設定などは手順書を見て適宜やってください。

作成したSensorHubクラスに、以下の様なメソッドとクラスを追加します。

        public void Update(SensorReading data)
        {
            Clients.Others.NotifyTemperature(data);

            var storeCS = CloudConfigurationManager.GetSetting("StorageConnectionString");
            var storageAccount = CloudStorageAccount.Parse(storeCS);
            var tableClient = storageAccount.CreateCloudTableClient();
            var sensorReadingTable = tableClient.GetTableReference("SensorReading");
            sensorReadingTable.CreateIfNotExistsAsync().Wait();

            var query = new TableQuery<SensorReadingTable>().Where(
     TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, data.DeviceId));
            bool unstored = true;
            foreach (var stored in sensorReadingTable.ExecuteQuery(query))
            {
                // 登録されていたら新しい温度で更新
                stored.LastUpdatedTime = data.Timestamp;
                stored.SensorValue = data.Temperature.ToString();
                stored.SensorValueD = data.Temperature;
                stored.Count = stored.Count + 1;
                sensorReadingTable.ExecuteAsync(TableOperation.Replace(stored)).Wait();
                unstored = false;
            }

            if (unstored)
            {
                // 未登録なら、新しいレコードを追加
                var sr = new SensorReadingTable(data.DeviceId, DateTime.Now);
                sr.Timestamp = data.Timestamp;
                sr.SensorType = "Temperature";
                sr.SensorValue = data.Temperature.ToString();
                sr.SensorValueD = data.Temperature;
                sr.CreatedTime = data.Timestamp;
                sr.LastUpdatedTime = data.Timestamp;
                sr.Count = 1;
                sensorReadingTable.ExecuteAsync(TableOperation.Insert(sr)).Wait();
            }
        }

        public class SensorReading
        {
            public string DeviceId { get; set; }
            public DateTime Timestamp { get; set; }
            public double Temperature { get; set; }
        }

        public class SensorReadingTable : TableEntity
        {
            public SensorReadingTable(){

            }

            public SensorReadingTable(string deviceId, DateTime time)
            {
                PartitionKey = deviceId;
                RowKey = deviceId + time.Ticks.ToString();
            }
            public string SensorType { get; set; }
            public string SensorValue { get; set; }
            public double SensorValueD { get; set; }
            public DateTime CreatedTime { get; set; }
            public DateTime LastUpdatedTime { get; set; }
            public int Count { get; set; }
        }

これで、「4.SignalR送信用Webアプリ作成」で追加したコードが実行され、SignalRでセンサーデータが送信されたときに受信するHubのロジックが出来上がります。一見複雑そうですが、やっていることは簡単で、Updateメソッドの引数dataが受講者が作ったWebアプリから送られてくるデータ、それを受けて、テーブルを準備して、送られてきたDeviceIdに関するセンサーデータのレコードがあれば、最新情報で更新、なければ新規にレコードを追加、という処理です。

後は、Startup.csにあるConfigurationメソッドを

        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR();
        }

の様にapp.MapSignalR()を追加すれば実装終了。あとはVisual StudioでAzureに発行すれば準備完了。受講者のGR SAKURAやGR PEACH、FEZで各自のMobile Serviceにセンサーデータを送ると、このHubのUpdateメソッドがどんどんコールされ、各参加者毎の計測データが逐次蓄積されていきます。SensorReadingTableのプロパティ群(PartitionKey、RowKey、SensorType、SensorValue(文字列形式)、SensorValueD(数値形式)、CreatedTime、LastUpdatedTime、Count)がテーブルの各カラムになります。PartitionKeyにはDeviceIdが格納されます。

3/15に実施したGR PEACHを使ったハンズオンの場合は、http://1drv.ms/1xuYj1k からGR SAKURAを使ったハンズオン資料をダウンロードして、Mobile Service、Webアプリを作ってください。WebアプリのSignalRの転送先のURLを変えれば動きます。

修正が終わったらAzureに”発行”してください。
GR PEACHやGR SAKURAで温度を測ってクラウドに送信してください。温度を送信するとテーブルが出来上がります。逆にいうと、温度が送られない限りテーブルは作成されないので、発行したら、必ずボードをイーサネットに接続して温度センサーの値をクラウドに送ってくださいね。

次にExcelでの表示です。これはハンズオントレーニングのStep 5 分析の1.1、1.2で解説している手順がベースになります。Power Qeury、Power Mapのセットアップはこちらの手順書を参考にしてください。

Power QueryとPower Mapのアドインを入れたら、ExcelでHeatmapを作っていきます。

先ず、Excelを起動して、新しいシートを作成します。

リボンのPOWER QUERYタブをクリックします。

図の様に”Azureからインポート”をクリックし、”Microsoft Azureテーブルストレージから”を選択します。
ストレージアカウント名を入力して”OK"をクリックするとナビゲーターペインにテーブル名が表示されます。※今回は事情により”SensorReading2”がターゲットとしています。
インポートするテーブルをクリックすると、クエリエディターでAzureストレージに格納されているデータが表示されます。

Contentの右側の矢印ボタンをクリックするとSensorReadingTableで定義されたプロパティ名のデータが表示されます。クエリエディタを閉じればクラウド上のデータがダウンロードされて表示されます。

次に、POWER PIVOTタブをクリックして、

データモデルに追加をクリック。で、テーブルツールを閉じます。
各参加者の温度を棒グラフで表示する場所を次に定義します。

ここでは簡単のため4人の場合を想定しています。要は位置をPositionというシートにべた決めってことです。図は左上を原点(0,0)として、右方向がX軸の正方向、下方向がY軸の正方向です。01、02、03、04というラベルがついたセルの100×100ピクセルの画像を想定しています。DeviceIdと各座標を書いたら、マウスで選択して、POWER PIVOTの”データモデルを追加”をクリックします。

テーブルの作成ダイアログの”先頭行をテーブルの見出しとして使用する”にチェックを入れて”OK”をクリックします。
Power Pivot for Excelのページが表示されるので、”ダイアグラムビュー”をクリックします。

表示されたら、テーブルの名前を変えて、PositionのDeviceIdとSensorReadingのPartitionKeyをつなぎます。

これでPower Mapで表示するためのデータモデルが完成しました。POWER PIVOTのページを閉じて、

挿入タブをクリックし、”マップ”→”Power Mapの起動”を選択します。

図の様に、”シーンのオプション”をクリックして、表示する画像を選択します。

背景画像を設定し、”ピクセル領域”ボタンをクリックして”完了”をクリックして背景画像が設定されます。
位置情報は、

PositionのX,Yにチェックを入れて、ペインの下でX座標とY座標にマップします。

SensorValueD、Timestampにチェックを入れて完成です。

リボンの”データの更新”をクリックすると最新の情報で表示が更新されます。時系列でのアニメーションも可能です。

さて、クラウドからのデータのダウンロードですが、定期的に更新した場合には、以下の設定をしてください。

 

 

IoT Kit ハンズオントレーニングをエミュレータで行う

$
0
0

http://aka.ms/IoTKitHoLから公開中のハンズオントレーニング、現在はGHI Electronics社製FEZ Spiderを使った内容になっています。もうすぐGR PEACH+センサーボードを使った場合の内容も追加する予定ですが、ハードウェアが無くてもとりあえずやりたい、という方もいるかなと思うので、Emulatorによる実習方法を解説します。

Emulatorでの開発環境は、Visual Studio 2013 (有償版、Community版どちらでも可)に以下の二つのSDKをインストールします。

  • .NET Micro Framework SDK(http://netmf.codeplex.com/のdownloadからZIPファイルをダウンロードし、MSIとVSIXファイルを実行)
  • .NET Gadgeteer Core SDK(http://gadgeteer.codeplex.comのdownloadからGadgeteer Core SDKをダウンロードし、MSIファイルを実行)

次に、http://aka.ms/IoTKitHoLの”事前準備”ページから公開されているIoT Kit Emulatorのエミュレーターインストーラーをダウンロード&MSIファイルを実行してEmulator本体をインストールします。同じページの”エミュレーター用ライブラリ一式”をダウンロードしてファイルのプロパティでブロックを解除し、解凍しておきます。

これで準備は完了。

次に、IoT Kitハンズオントレーニングを実施するためのプロジェクト作成方法を説明します。

Visual Studio 2013を起動し、メニューの”ファイル”→”新規作成”→”プロジェクト”を選択し、”Visual C#”の”Micro Framework"カテゴリの”Console Application”で、新規にプロジェクトを作成します。

プロジェクト作成時にできた、ソリューションの場所をファイルエクスプローラーで開きます。(ソリューションビューで、ソリューションを右クリックして”エクスプローラーでフォルダーを開く”を選択)
その場所に”Library”という名前でフォルダーを作成し、エミュレータ用ライブラリ一式でダウンロードしたZIPファイルの中身を丸ごとコピーします。

ソリューションビューで、”参照設定”を右クリックし、”参照の追加”を選択します。表示されたダイアログの".NET”タブで、”Gadgeteer”を先ず追加します。次にもう一度参照設定のダイアログを表示させ、”参照”タブを選択して、”Library”フォルダーにコピーした、”EGIoTKit.dll"と”EGIoTKitEmulator.Modules.dll”を選択して、追加します。
これで、Emulatorに実装されている温度センサーや加速度センサーを使えるようになります。

さて、プロジェクトに、”EmulatorInitializer.cs”という名前で、C#ソースファイルを追加します。そして、その中身を、

using System;
using Microsoft.SPOT;

namespace ProjectName
{
    public partial class Program : Gadgeteer.Program
    {
        public static void Main()
        {
            Program.Mainboard = new EGIoTKitEmulator.Modules.EGIoTKiTEmulatorMainboard();

            var program = new Program();
            program.InitializeModules();

            program.ProgramStarted();

            program.Run();
        }

        private void InitializeModules()
        {
            //
        }

        protected new static EGIoTKitEmulator.Modules.EGIoTKiTEmulatorMainboard Mainboard
        {
            get
            {
                return ((EGIoTKitEmulator.Modules.EGIoTKiTEmulatorMainboard)(Gadgeteer.Program.Mainboard));
            }
            set
            {
                Gadgeteer.Program.Mainboard = value;
            }
        }
    }
}

とします。※"ProjectName"は、プロジェクト作成時に指定したプロジェクト名です。

次に、プロジェクトを作成した時に自動的に出来上がるProgram.csファイルのProgramクラスを以下の様に変更します。

    public partial class Program
    {
        public void ProgramStarted()
        {
            var accelerometer = Mainboard.AccelerometerSensor;
            var temperature = Mainboard.TemperatureSensor;
        }
    }

ProgramStartedメソッドの中では、Emulatorの加速度センサーと温度センサーを取り出すコードを書いています。この二つの変数を使えば、IoT KitハンズオントレーニングのStep2~5を実施できます。※Relayは、インテリセンスを駆使して自分で調べてみてください。

後は、ソリューションエクスプローラーで、プロジェクトを右クリックして”プロパティ”を選択し、”.NET Micro Framework”タブをクリックして、”Device:”を”EGIoTKitEmulator”に選択し直します。これで、F5実行で、以下の様なEmulatorが起動します。

右上のTemperatureは、Room Tの値にホワイトノイズが乗った値を供給します。Touchのチェックを入れると、Figure Tの値まで漸近していき、指でセンサーを触った状態をエミュレートします。チェックを外せば、Room Tに漸近していきます。
左下のAccelerometerは、デフォルトでは、Zのマイナス方向に1Gがかかった状態でホワイトノイズが乗った値を供給します。Shakeにチェックを入れるとボードを揺らした状態をエミュレートします。ピンク色の板をマウスで動かすと、ボードの角度が変わり、それに合わせて加速度のX、Y、Zの値が変わります。元の状態(Z軸のマイナス方向に1G)に戻したい場合はResetボタンをクリックします。

Emulator本体やライブラリは、https://github.com/ms-iotkithol-jp/Emulatorや、https://github.com/ms-iotkithol-jp/Gadgeteerから公開しているので興味のある方はご参照ください。

Viewing all 167 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>