Microsoft Platform Ready スペシャルイベント
○○とWindows Azure連携
2011年4月11日
日本マイクロソフト株式会社 デベロッパー&プラットフォーム統括本部 太田 寛 Blog:http://blogs.msdn.com/hirosho/ Twitter:http://twitter.com/embedded_george
アジェンダ
ネットワークプログラミング基本の基
つながる先のWindows Azureサービス
Windows 7系での ネットワークプログラミング
.NET Micro Frameworkでの ネットワークプログラミング
自習書紹介
ネットワークによるサービス・機器間連携
インターネット+HTTP
事実上の標準
普及率は一般家庭でさえ、90%を超える ※総務省調べ2010年現在
ネットワークは“和”の世界
様々なベンダーのサービス、機器が相互接続
インターオペラビリティを保障する各種標準
“つながる”、“つなげる”ことが重要
一般的なインターフェイス様式
SOAP
REST
SOAPの基本
デバイス サービス
SOAPエンベローブ XMLテキスト
WSDL XMLによるWeb Serviceの インターフェイス定義
公開
SOAP Header
SOAP BODY
作成
要求 送信
ロジック
SOAPエンベローブ
作成
応答 受信
WSDLの定義 に従って作成
下位プロトコルは何でも良い
• かっちり定義 • メソッドコールとの親和性 • 業界標準など
REST
デバイス サービス
HTTPのメソッド(GET/POST/DELETE)と、URLでサービスを構成
HTTP要求
Header
Content
HTTP応答
Header
Content
作成
要求 送信
ロジック
作成
応答 受信
ステータス
基本はブラウザが行っているのと
全く同じ
ContentデータはXMLでもJSONでもバイナリデータで
も何でも可
• 非常にシンプル • 柔軟性が高い • クラウド向き
センサーデータの蓄積と共有
SensorId FormatId PropertyId SensedValue MeasuredTime
Azure Table
クライアント・デバイスから アップロードされたデータを格納
SOAP API
REST API
※各パラメータは、Windows 7 Sensor & Location Platform
の定義を活用
RIAで活用 データの提供 データの活用
Cloud サービス
SOAPベースのインターフェイス定義
[ServiceContract] public interface ISensorService { [OperationContract] SensorValue UploadSensorValue(SensorValue value); [OperationContract] List<SensorValue> GetSensors(); [OperationContract] List<SensorValue> GetSensor (Guid sensorId); }
インターフェイスに“ServiceContract”属性を追加
これで3つのSOAPメッセージの定義が出来上がる 後は、このインターフェイスを適切に実装するクラスを作成する
メソッドに“OperationContract”属性を追加
SOAPベースのデータ定義
[DataContract] public class SensorValue { [DataMember] public Guid SensorId { get; set; } [DataMember] public Guid SensorTypeId { get; set; } [DataMember] public Guid FormatId { get; set; } [DataMember] public int PropertyId { get; set; } [DataMember] public string SensedValue { get; set; } [DataMember] public DateTime MeasuredTime { get; set; } }
クラスに“DataContract”属性を追加
プロパティに “DataMember”属性を追加
ネットワーク上でデータを 交換する際、適切にシリアライズ、デシリアライズが行われる。
とりあえず、試してみる
Visual Studio 2010で “WCFサービスアプリケーション”を作成
SOAP APIの定義を実装し、デバッグ実行
RESTベースのインターフェイス定義
[ServiceContract] public interface ISensorService { using System.ServiceModel.Web; [OperationContract] [WebInvoke(UriTemplate= “sensorvalue/{sensorId}”, Method= “POST”)] SensorValue UploadSensorValue( string sensorId, SensorValue value); [OperationContract] [WebGet(UriTemplate= “sensors”)] List<SensorValue> GetSensors(); [OperationContract] [WebGet(UriTemplate= “sensor/{sensorId}”)] List<SensorValue> GetSensor (string sensorId); }
WebInvoke、WebGet 属性の付与
HTTPへのURL形式のアクセスは実行時、対応するメソッドにマップされ、コールされる
とりあえず試してみる
ブラウザで…
HTTPのGET/POSTで、データを取得・登録
Windows Azure上でのホスティング
クラウド用プロジェクト作成
Visual Studioで新規プロジェクト作成
• “Windows Azureプロジェクト”テンプレートを使用
エンドポイント毎に、WCFサービスを追加
コントラクトの定義と実装
Azure上に配置し実行
詳しくは、こちらをご参照ください
http://msdn.microsoft.com/ja-jp/windowsazure/
15
Windowsのネットワークプログラミング
簡単なサーバー側、クライアント側開発
WCFライブラリの利用
Visual StudioによるProxyコードの自動生成
SOAP、RESTのどちらも迅速に開発可能
Address
Binding
Contract
通信のエンドポイント
プロトコル+エンコーディング+トランスポート BasicHttpBinding、WSHttpBinding、 NetNamedPipeBinding、NetMsmqBinding
サービスのインターフェイス定義
クライアント側でProxyを作成する - SOAP
Visual StudioによるProxyの自動生成
①参照設定を右クリックし、 サービス参照を選択
②追加したいURLを入力し移動をクリック
③名前空間を入力 ④OKをクリック
SOAPアクセス ~ データのアップロード
… using (var client = new SensorCloud. SensorServiceClient ()) { var uploaded = client.UploadSensorValue( new SensorCloud. SensorValue () { SensorId = sensorId, SensorTypeId = sensorTypeId, FomatId = formatId, PropertyId = propertyId, SensedValue = sensedValue, MeasuredTime = measuredTime }); }
Proxyオブジェクト作成
ProxyオブジェクトのUploadSensorValue() メソッドをコールし、 計測したセンサーデータをアップロード
UploadSensorValue()メソッド実行時、 • SOAPメッセージの組み立て • Web Serviceへのデータが送信 • Web Service側でのストレージへの蓄積 • Web Service側からの応答 と、一連の処理が行われるが、プログラム上は ローカルコールと形式上同一
SOAPアクセス ~ データの取得
… using (var client = new SensorCloud. SensorServiceClient ()) { var values = client.GetSensor(sensorId); foreach (var v in values) { Guid typeId = v.SensorTypeId, Guid fmtId = v.FormatId, int propId = v.PropertyId, string value = v.SensedValue, DateTime mst = v.MeasuredTime … } }
ProxyオブジェクトのGetSensor() メソッドをコールし、 センサーデータを取得
UploadSensorValue()メソッドと同様、 メソッドのローカルコールと同一の形式 での利用が可能。 ※実際にはネットワーク越しの非同期処理が 行われていることは留意の必要あり
リストで返ってくるので、必要なアイテムを取り出し処理ロジックで利用
.NET Micro Frameworkのネットワーク機能
Socket
IP、TCP、UDPなどの低レベルプロトコル対応
HTTP・HTTPS
HttpWebRequest、HttpWebResponse、及び、 ストリーム、マルチエンコードなどの関連クラス
SSLやX509対応
Web Service
各種WS-* Profile対応
DPWS:Device Profile for Web Service
ローカルネットでのアドホック連携
Webサービスへのアクセス方法
HTTPによるアクセス
.NET Micro Frameworkの場合、Visual Studioに標準でビルトインされたツールは存在しない
HttpWebRequest・HttpWebResponseクラスを 使用して、XMLやJSONフォーマットを送受信
Windowsとの互換性
HttpWebRequest・HttpWebResponseをはじめとする関連クラスは、.NET Micro Frameworkにも揃っている
Windowsでの経験があれば、同じスキルをそのまま 活用できる
RESTアクセス ~ データのアップロード
String url = “http://...”; HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest; request.Method = “POST”; request.ContentType = “text/xml ;charset=utf-8”; String content = “<SensorValue xmlns=…>”+ “<FormatId>” + formatId + “</FormatId>” + “<PropertyId>” + propId + “</PropertyId>” + “<SensedTime>” + time + “</SensedTime>” + “<SensedValue>” + value + “</SensedValue>” + “<SensorId>” + sensorId + “</SensorId>” + “</SensorValue>”; byte[] bytes = Encoding.UTF8.GetBytes(content); request.ContentLength = bytes.Length;
HTTP要求用の、オブジェクト作成
HTTP要求メソッドをPOSTに設定 要求時、データ送信フォーマットを XML形式のテキストに指定
センサーデータを XML形式の文字列に 組み立てる
XML形式の文字列を バイトデータに変換し、データ長を設定
RESTアクセス ~ データのアップロード
var reqStream = request.GetRequestStream(); reqStream.Write(byte, 0, bytes.Length); reqStream.Close(); try { HttpWebResponse response = request.GetResponse() as HttpWebResponse; if (response.StatusCode == HttpStatusCode.OK) { var resStream = response.GetResponse(); // 登録結果がXML形式で返ってくる // 必要に応じてパース } } catch (WebException ex) { // 例外への対応 }
サーバーに送信する為のストリームを取り出し、バイトデータを書き込む
応答オブジェクトを取り出し、応答メッセージを必要に応じて解析
REST APIのWebサービスの基本パターン 必要に応じて要求ヘッダーやURLへの引数を追加 .NET Micro Frameworkは高速のXML Parserが用意されているので、JSONフォーマットよりXMLフォーマットが、More Better
RESTアクセス ~ データの取得
String url = “http://...”; HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest; request.Method = “GET”; try { HttpWebResponse response = request.GetResponse() as HttpWebResponse; if (response.StatusCode == HttpStatusCode.OK) { var resStream = response.GetResponse(); // 次ページに続く
HTTP要求メソッドをGETに設定
応答オブジェクトを取り出し、 送られてきたデータを取得する為のためのストリームを 取り出す
RESTアクセス ~ データの取得
// XMLテキストの解析 var reader = XmlReader.Create(resStream); while (reader.Read()); { switch (reader.NodeType) { case XmlNodeType.Element: // 要素の利用 if (reader.Name.CompateTo( “SensorValue”) == 0) { … } break; } } } }
XMLデータ解析用にXmlReaderオブジェクトを作成
Read()メソッドで 順番にXMLテキストを 解析
必要なタグのデータを 見つけ、処理を行う
REST APIのWebサービスの基本パターン 必要に応じて要求ヘッダーやURLへの引数を追加 JSONフォーマットの場合は、TextReaderクラスを用いて、順に文字列を取り出し、解析
第1部 基礎編 4/6公開済み
.NET Micro Frameworkの基本
ユーザーインターフェイス基礎
ネットワークへのアクセス基礎
第2部 Azure連携編 4月末公開予定
REST形式によるAzure上サービスへの接続
HTTPSによるセキュアー通信
.NET Micro Framework自習書
ご活用ください!!
まとめ
Windows Azure上のサービス
Tableなどのストレージによるデータ蓄積
REST、SOAPによるWebサービス
RIAによるWebアプリケーション
Windowsによるネットワークアクセス
WCFによる容易な接続
Windows Embeddedでも同じく活用可能
.NET Micro Frameworkによるネットワークアクセス
HttpWebRequest・HttpWebResponseで 容易にREST、SOAPへアクセス
参考資料
講師の Blog http://blogs.msdn.com/b/hirosho/
講師の Twitter http://twitter.com/embedded_george
組込み開発者向け技術情報サイト http://www.microsoft.com/japan/windows/kumikomidev
Windows Azure http://msdn.microsoft.com/ja-jp/windowsazure
WCF http://msdn.microsoft.com/ja-
jp/netframework/aa663324
.NET Micro Framework http://msdn.microsoft.com/ja-
jp/netframework/bb267253
© 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other
countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentations. Because Microsoft must respond to
changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this
presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.