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 MeasuredTimeAzure Table
クライアント・デバイスから アップロードされたデータを格納SOAP
API
REST
API
※各パラメータは、Windows 7 Sensor & Location Platformの定義を活用
RIAで活用
データの提供
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サービスアプリケーション”を作成
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形式のアクセスは 実行時、対応するメソッドに マップされ、コールされる
とりあえず試してみる
ブラウザで…
Windows Azure上でのホスティング
クラウド用プロジェクト作成
Visual Studioで新規プロジェクト作成
• “Windows Azureプロジェクト”テンプレートを使用
エンドポイント毎に、WCFサービスを追加
コントラクトの定義と実装
Azure上に配置し実行
詳しくは、こちらをご参照ください
http://msdn.microsoft.com/ja-jp/windowsazure/
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
© 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.