Philips hueをWindows ストアアプリから制御する

de:code 14等で紹介した、Philips hueをコントロールするストアアプリのサンプルを公開します。 http://eg-sample-filedowload.azurewebsites.net/FileDownload/GetFile?id=RemoteLightControlTemplate ストアアプリのプロジェクトテンプレート形式で公開しているので、ダウンロードしたZIPファイルを、各自のVisual Studio 2013フォルダー(Projectsフォルダーのあるところ)の Templates\ProjectTemplates\Visual C# というフォルダーにコピーして、Visual Studio 2013を起動し、新規プロジェクト作成で、 Remote Light Control Appを選んでプロジェクトを作成してください。UI部分を作りかえれば、ほぼ、ストアに申請可能な形式です。この中に、UDP Multicast Group通信によるUPNPのSSDPプロトコルや、hueを見つけるコード、REST APIアクセスなどすべてあるので、是非、参考にしてくださいね。 ※あくまでもサンプルコードです。利用は各自の責任において行ってください。利用したことにより発生するいかなる責任も負いませんのでご承知おきください。    

0

Windows Store アプリでUDP Multicast Group通信

このブログでは、過去に、.NET Micro Frameworkや、Windows Phone 7、デスクトップアプリによるUDP Multicast Group通信について解説しました。 そろそろ、Echonet-LiteとかにもWindows Storeアプリつなぎたいし、.NET Micro Frameworkや、他のPlatformのスマホアプリとも連携したいな…ってことで、Windows Storeアプリで、UDP Multicast Group通信をする方法を解説します。 UDP Multicast Group通信って何?って方、同じローカルネットにつながっている端末同士で、UDP/IPを使って同報通信する為のプロトコルです。インターネット上のサービスにアクセスする場合に指定するURLなど必要なく、あらかじめ知っているグループアドレス(224.0.0.0 ~ 239.255.255.255)とグループポート番号に対して、仲間入りすれば、そのグループアドレス、ポート番号にデータを送るだけで、仲間入りしているデバイスがデータを受信できるという、単に情報を発信してあとは受信したデバイスの自由的な通信ができます。WS-DiscoveryのようなAd-Hocに端末やサービスを見つけ出すプロトコルなどでも利用されています。イメージとしては、何かのパーティで、部屋のWi-Fiに、タブレットと複数のスマートフォンやタブレットをつないで、ビンゴゲームをするとか、複数名が自分の端末で自分の手札と山だけを見ながらカードゲームをし、傍からそのゲームの進行状況を見てる、なんていうアプリが作れるわけです。 早速本題に入ります。 Windows Storeアプリでは、WinRT APIのDatagramSocketを使ってUDP Multicast Group通信を行います。先ずは、Multicast GroupにJoinするところまでのコードです。 先ずは、クラスのメンバー変数として以下を定義しておきます。 DatagramSocket udpMCSocket;DataWriter udpMCDataWriter;string groupAddress = “2xx.xxx.xxx.xxx”;int groupPort = 50000;string joinigMessage = “Hello Joined”; 次に、グループにJoinするコードです。     var groupIp = new HostName(groupAddress);    udpMCSocket = new DatagramSocket();    try    {        udpMCSocket.MessageReceived += udpMCSocket_MessageReceived;           …

0

Windows 8.1ストアアプリでBluetooth 2.0接続周辺デバイスと通信する

Windows 8.1で強化されたWinRT APIによる周辺デバイス連携に関するポスト、第一弾です。 Bluetooth 2.0でPCにリモート接続され、仮想COMポートにマップされてシリアル通信する周辺デバイスは沢山あります。このポストでは、WinRT APIを使って、このような周辺デバイスと通信する方法を解説します。 Bluetooth 2.0デバイスと通信するには、手動でWindows 8.1 PCと周辺デバイスのペアリングが必要です。Windows 8.1では、設定チャーム→PC設定の変更→PCとデバイス→Bluetoothで、つなぎたいデバイスとペアリングができます。 プログラムの流れは、以下の通りです。 つなぎたいデバイスに関するRfcommDeviceServiceを検索 見つけたRfcommDeviceServiceを基にStreamSocketを作成 通信用のDataWriterとDataReaderを作成 DataWriter、DataReaderでデータを送受信 具体的なコードを以下に説明していきます。以下の名前空間に対するusing宣言をしておいてください。 using Windows.Devices.Enumeration;using Windows.Devices.Bluetooth.Rfcomm;using Windows.Networking.Sockets;using Windows.Storage.Streams; 1. つなぎたいデバイスに関するRfcommDeviceServiceを検索 通信するデバイスの名前は、”NXT”とします。     RfcommDeviceService deviceService;    var servicesInfos = await DeviceInformation.FindAllAsync(        RfcommDeviceSrevice.GetDeviceSelector(RfcommServiceId.SerialPort));    foreach (var serviceInfo in serviceInfos)    {        if (serviceInfo.Name == “NXT”)        {            deviceService = await RfcommDeviceService.FromIdAsync(serviceInfo.Id);            break;        }    } これで、Bluetooth 2.0で接続するためのDeviceServiceを取得できました。 2.見つけたRfcommDeviceServiceを基にStreamSocketを作成    …

2

WinRT APIによるセンサー利用

自分のブログを振り返ってみて、あれ?WinRT APIのセンサー系に関する投稿が無い!!…ってことで、WinRT APIによるセンサープログラミングの解説です。 Windows 8のタブレットでは、WinRT APIを通じて以下の7つのセンサーを利用したプログラミングが可能です。 Accelerometer: 加速度センサー Gyrometer: ジャイロセンサー Compass: コンパス LightSensor: 照度センサー Inclinometer: 傾斜計 SimpleOrientationSensor: シンプルな方向センサー OrientationSensor: 方向センサー これらはWindows.Devices.Sensors 名前空間で提供されるクラス群です。これらのクラスを使ってタブレットの姿勢や向いている方向、動き、周囲の明るさをアプリケーションのシナリオに取り込むことができるわけです。各センサーから得られる値の種別は、センサー毎に異なりますが、全て同じ流儀で計測値を取得できます。Accelerometerを例に、センサープログラミングのパターンを説明しますね。 まず、センサーへの参照の取り出し方です。 var mySensor = Windows.Devices.Sensors.Accelerometer.GetDefault(); 各センサーのクラスにはGetDefault()という名前のスタティックメソッドが用意されています。このメソッドをコールすることにより、センサーへの参照が取得できます。残念ながら全てのWindows 8 PCにセンサーが装備されているわけではありません。センサーが装備されていないPCでこのコードを実行すると、nullが返されます。センサーを活用するアプリを開発する場合には、センサーが装備されていない場合の考慮も必要です。ストア申請で、「アプリにはセンサーが必要」と明記するか、キーボードやマウスによる代替入力手段を用意するかしておきましょう。勿論、センサーが装備されていない場合(GetDefaultでnullが返された場合)に、不用意にmySensorにアクセスしないようにnullチェックを入れる必要があります。 センサーが計測したデータを取得する方法は二種類あります。一つはセンサーの計測値が必要な時点で計測値を要求する方法で、もう一つは、センサーがデータを計測した時点でイベントハンドラで計測値を受ける方法です。前者のコードは以下のようになります。 if (myAccel != null){    var reading = mySensor.GetCurrentReading(); 各センサーのクラスには、必ずGetCurrentReading()というメソッドが用意されていて(※SimpleOrientationSensorを除く)、このメソッドをコールすることにより、センサー計測値を参照したいときに値を取り出すことができます。Accelerometerクラスの場合、このメソッドが返すのはAccelerometerReadingという型の変数です。他のセンサーの場合も、クラス名にReadingという接尾詞がついた型が用意されています。AccelerometerReadingの場合は、X、Y、Zというプロパティが定義されていて、それぞれX方向、Y方向、Z方向の加速度が格納されています。 次に、センサーがデータを計測した時点でのイベントハンドラで計測値を受ける方法ですが、  if (mySensor != null) {    mySensor.ReadingChanged += mySensor_ReadingChanged; } とイベントハンドラを登録します。前者と同様、各センサーのクラスには、ReadingChangedというイベントが用意されています(※SimpleOrientationSensorを除く) 登録したイベントハンドラは、 void mySensor_ReadingChanged(Windows.Devices.Sensors.Accelerometer sender, Windows.Devices.Sensors.AccelerometerReadingChangedEventArgs args){    var reading = args.Reading;    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, ()…

0

シリーズもののWindows ストアアプリを開発する

ようやく、青空文庫の岡本綺堂 半七捕物帖 69巻を全部ストアアプリ化終了しました。 結果、現在、Windows ストアの検索で、”岡本綺堂”、”半七捕物帖”とやると、 …いやぁ、壮観ですね。せっかく作って公開したので、皆さん是非インストールして読んでほしいなぁと。このシリーズのほかに、数はまだ3つですが、歴オタシリーズなども作ってます。これ、まだ続けるから乞うご期待(次は素戔嗚編) …だけで終わると、「単なる見せびらかし」になってしまうので、同じテーマでコンテンツが異なる多数のアプリを効率よく開発するコツを紹介していきます。 その1 テーマを決めてアプリを一つ作る 先ず、テーマを決めましょう。操作性は同一で、コンテンツを変えればアプリになるものを考えましょう。上の例でいえば、書籍、クイズ。他にはホワイトボード系、キャラが変わる定型ゲーム、写真集や楽譜、観光ガイド、ロボットの組み立てと操作などなど、考えれば考えるほど色々出てきますね。最初からテンプレート的に使える環境を作るのは難しいので、まずは1つストアアプリを開発してストアに申請し、ストアの審査に通るところまでを確認しましょう。 その2 アプリをテンプレート化する ストア審査が通ったプロジェクトをテンプレート化します。その際、なるべく手間をかけずに、多くのアプリが開発できるように、プロジェクトを改造していきます。写真や文章などのコンテンツをコピー&ペーストすればアプリが出来上がるような形態が理想です。http://msdn.microsoft.com/ja-jp/jj556277.aspx から公開されているテンプレートのうち、縦書きビューワーとクイズアプリはそのような形式になっているので、参考にしてみるとよいでしょう。形を整えた後、Visual Studioの機能を使ってプロジェクトテンプレートを作成します。具体的な作り方は、別途投稿しますが、基本は、Visual Studioメニューの”ファイル”→”プロジェクトテンプレートのエクスポート”で、テンプレート一式を作り、MyTemplate.vstemplateとPackage.appxmanifestファイルを整えて、再ZIP化し、所定の場所におけばOK。念のため、作成したテンプレートを使って、二個目のアプリを作って、ストアに申請しましょう。この時点で類似のアプリがあるので、「価値なし」という審判が下るかもしれません。その時にはアプリのテーマを見直して、見かけ上異なるアプリに仕上がるように軌道修正します。 その3 更なる効率化 さて、冒頭の半七捕物帖の絵をもう一度見てみましょう。ストアロゴは絵柄は同じで、巻数とタイトルだけが異なっています。5~6個程度を作るなら一つ一つデザインしていくのも、まぁ許せますが、69個となるとなると無理。アプリを量産していくときに意外と時間がかかるのは、実はロゴなんですね。このシリーズの場合、Logo、WideLogo、SplashScreen全てアプリごとに違うものを用意しました。アプリの善し悪しを決めるコンテンツ作成に時間がかかるのは仕方ありません。本筋の作業なので。シリーズものの場合は、ほぼ同じロゴでちょいがえなので、効率化を図るため、ベースとなる画像を作って、異なる部分だけ埋め込むアプリを作ってしまいましょう。半七捕物帖シリーズと歴オタシリーズは、そんな感じでロゴファイルを作成しています。 上の図はロゴ生成工房です。各巻ごとのフォルダーにそれぞれのロゴが生成されています。フォルダーに入っているロゴファイルをVisual Studioのソリューションビュー上でAssetsフォルダにドラッグ&ドロップすればアプリの申請準備が整うという寸法です。ストアアプリ開発に限らず、生産性向上の基本の一つは、「定型化された作業は自動化するべし」ですね。つぅか、プログラマーは何でもプログラム化するっていうのが本能。 半七捕物帖も歴オタも入ってはいませんが、Ad SDKを使って広告など入れて、World Wide向けにアプリをリリースすれば、Adによる収入なんかも見込めるわけです。それを狙うなら、一つのアプリより複数のアプリで確率を高めた方がいいですね。勿論、アプリが提供するコンテンツに価値が無ければアプリのダウンロード数は伸びないので、素敵なコンテンツを世に発信してくださいね。 Visual StudioはVisual Studio SDKをインストールすると、ソリューションやプロジェクトを自動生成するアプリも開発可能です。コンテンツのバリエーションが豊富でコンテンツの量が豊富な場合、かつ、コンテンツを作る人たちが一般の開発者でない人達の場合、そんなアプリをサービス化して、必要なコンテンツを提出するとプロジェクト一式を生成(Windows Azure Mobile Serviceのように)して、ストアへの登録だけしてもらう…なんてビジネスも可能だったりします。 その他のTips ストアにアプリを申請する際の注意点ですが、最初のうちはバグが残っていたりして審査に落ちる可能性があります。幾ら一度に沢山アプリができるからといって、一気に10も20も上げるのはお勧めしません。特に最初のうちは一個づつ審査を通して、バグがあるようならプロジェクトテンプレートを修正して、品質を継続的に向上しましょう。既に審査が通っているアプリについても、面倒くさがらずに(作業が半自動化されているから簡単でしょ)再度アプリを作りなおしてストアに対してアップデート申請をしましょう。半七捕物帖について云えば、1,2,3と来て、5、4、10、6、7、8,9という順でストアに上がっています。順番が狂っているところは、審査の際に不具合があって申請が通らなかったせいです。他にも、例えば5個一気にストアに申請したとしても個々のアプリの審査期間はバラバラなので、申請順に公開されるとは限りません。岡本綺堂 半七捕物帖で検索して最新順で並べ替えるとそんな事情で順番が入れ替わっている場所が結構あります。 ダウンロード数を分析すると、4から10に飛んだところでダウンロード数が劇的に下がっています。シリーズもので順番にユーザーに届けたい場合には、1個づつ順番に審査を通していった方が良いでしょう。 以上、ストアアプリ開発の参考になれば。

0

今更ですが ~ Windows ストアアプリを使ってみよう

このブログではこれまでWindows 8 ストアアプリの作り方に関する技術コンテンツを数多く投稿してきました。Windows 8が昨年10月にリリースされて早10か月、本当に今更なのですが、Windows 8 ストアアプリを改めて紹介しようかなと。 このブログを読んでくれている皆さんの中には、既にWindows 8 PCを購入して使っている方は沢山いることと思います。しかし、デスクトップアプリばっかり使っていませんか?折角なので、もっとWindows ストアアプリを使ってみてください。既にいろんなアプリがストアを通じて公開されています。 Windows 8は起動すると、スタート画面が表示されますね。下の図で示したタイルが、Windowsストアです。 先ずは、このタイルを、タッチ、または、マウスでクリックしてください。Windowsストアが起動します。

0

Windows ストアアプリにC/C++ライブラリを組み込む

今更の話題な気もしますが、Windowsストアアプリに既存のC/C++ライブラリを組み込む場合の注意点を説明します。 例えば信号処理や画像処理など、色々なプラットフォームで動くようにANSI Cなどの標準にだけ従って開発されたライブラリがある場合、そのライブラリを組込んだWindows ストアアプリを開発することは可能です。他にも、http://msdn.microsoft.com/library/windows/apps/br205757.aspx で紹介されているWin32/COM APIを使って作られているC/C++ライブラリも組込み可能です。以下、具体的に組込み方法を説明していきます。 UIの部分は、HTML/JS、XAML/C#、XAML/VB、XAML/C++ で開発します。それぞれのアプリ、開発組織に合わせた言語を選択してください。先ずは、Visual Studio 2012で、それぞれ用のストアアプリテンプレートを使ってストアアプリプロジェクトを作成します。そちらはそちらで、アプリのUIをがっつり構築します。 そのプロジェクトが属するソリューションに、VC++→Windows Runtime Componentプロジェクトを作成します。 出来上がったC++プロジェクトのフォルダーに、既存のコード一式をコピー&ペーストします。そして、C++プロジェクトを右クリックして、追加→既存の項目を選択し、既存のコードのソースファイル、ヘッダーファイル、その他必要なリソースファイルなどをプロジェクトに追加してください。追加したライブラリを使うためのラッパーを、VC++のManagedのクラスで作成します。C++プロジェクトを作成したときにできたClass1.h、Class1.cppのクラス名を適切に変更して、使うのが便利です。基本は、 ヘッダーファイル: namespace WindowsRuntimeComponent1{    public ref class Class1 sealed    {    public:        Class1();         // wrapper method        int DoWork(int x);    }; } というように、名前空間を定義して、refとsealedを指定すれば、JSやC#、Visual Basicから参照可能になります。そして、既存のライブラリの機能をコールするためのメソッド(この例ではint DoWork(int x))を追加します。例えば、DoWorkメソッド内で、CWork.h, CWork.c で定義&実装されている、int Calculate(int x)という関数をコールしたい場合には、 ソースファイル内で、 #include “CWork.h”….int Class1::DoWork(int){    return Calculate(int x);} と、ヘッダーファイルをインクルードし、メソッドの中で、既存ライブラリの関数をコールするコードを書いて結び付けていきます。Visual C++の場合は、ManagedとNativeのコードを混在させて書けるので便利ですね。 後は、Windows Runtime Componentのプロジェクトを、UIのプロジェクトの参照に追加(UIプロジェクトを右クリックし、参照の追加でOK)すれば、名前空間をきちんと指定すれば、JSでもC#でもVBでも利用可能になります。例えば、JSの場合は、 var lib = new…

0

WinRT APIでJSONフォーマットをデシリアライズする方法

前に投稿した、WinRT APIでJSONフォーマットをでシリアライズする方法 の続編です。   シリアライズしたいJSONのフォーマットが、 {“__type”:”UserTypeA:#UserTypeNS”,”Properties”:{“PropertyX”:”ValueX”, “PropertyY”:”ValueY”},”DataPackets”:[{“__type”:”UserTypeB:#UserTypeNS”,”PropertyA”:”ValueA”,”PropertyB”:”ValueB”}],”Values”:[“1″,”2″,”5”]} といったような形式をとる場合のデシリアライズロジックを紹介します。 先ず、JSONのデータを表現するクラスを定義します。 namespace UserTypeNS{     [DataContract]    public class UserTypeA    {        [DataMember]        public List<UserTypeB> DataPacketA;        [DataMember]        public List<int> Values;    }     [DataContract]    public class UserTypeB    {        [DataMember]        public string PropertyA;        [DataMember]        public string PropertyB;    }     [DataContract]    public class PropertiesType    {        [DataMember]        public string PropertyX;        [DataMember]        public string PropertyY;    }}…

0

PlayToを使って、リモートでメディアを再生

Windows 8のWinRT APIが提供するUI部品には、MediaElementという部品があります。音ファイルや動画ファイル、写真ファイルを表示する部品です。 XAMLでメディアを再生するには、     <MediaElement x:Name=”mediaElem” Souce=”ファイルのURI”/> と書けば、簡単に再生可能です。この部品は、単にメディアファイルを再生するだけではなく、http://msdn.microsoft.com/ja-jp/library/windows/apps/windows.media.playto.aspx に書いてあるように、 「リモート再生を使用すると、ユーザーは自分のコンピューターのオーディオ、ビデオ、またはイメージを、簡単にホーム ネットワークのデバイスにストリーム転送できます。たとえば、アプリケーションでビデオを再生しているユーザーは、そのビデオを自分のテレビにストリームできるため、室内のすべてのユーザーがそのビデオを見ることができます。」 なんていう素敵な機能がついているんです。これを使わない手はありません。XAMLのページに<MediaElement../>タグを書いて、そのコードビハインドのC#コードのページのクラスに、         protected override void OnNavigatedTo(NavigationEventArgs e)        {            var prayToManager = PlayToManager.GetForCurrentView();            prayToManager.SourceRequested += new TypedEventHandler<PlayToManager, PlayToSourceRequestedEventArgs>(prayToManager_SourceRequested);            base.OnNavigatedTo(e);        } を追加します。OnNavigatedToメソッドは、このページにナビゲートされて表示されるときにコールされるメソッドです。PlayToManagerというクラスは、Windows.Media.PlayTo名前空間に属する、リモート再生にかかわるライブラリです。上のコードでは、カレントのビューに付随しているPlayToManagerインスタンスを取得して、リモート再生要求があった時にコールされるハンドラ、playToManager_SourceRequestedメソッドを登録しています。 このページが表示されている状態で、デバイスチャームからリモートディスプレイを指定すると、prayToManager_SourceRequestedメソッドがコールされます。このメソッドでやることの基本は、以下の通り。         async void prayToManager_SourceRequested(PlayToManager sender, PlayToSourceRequestedEventArgs args)        {            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>            {                var deferal = args.SourceRequest.GetDeferral();                args.SourceRequest.SetSource(mediaElem.PlayToSource);                deferal.Complete();            });        } これで、要求があった時にMediaElementで表示されているメディアがリモート再生されるっていうすんぽうです。…あ、Playと書くべきところがPrayになっている…ま、Windows 8…

0

Proximity APIでWi-Fi Direct通信

WinRT APIは、Proximity APIを通じてWi-Fi Direct通信を行えます。通常のWi-Fiは、アクセスポイントを通じてインターネットにつながったデバイスの間で通信が可能ですが、アクセスポイントが無ければデバイス間で通信はできません。Wi-Fi Directは、アクセスポイントが無くても、サポートしているデバイス間でP2Pで接続し、データ通信を可能にする技術です。ハードウェアは通常のWi-Fiと同じものが使えます。アクセスポイントを介さずにつなげられるので、データ漏えいの危険も減ります。考えてみれば、単にデータを交換したいだけならば、インターネットに接続する必要はないわけです。近場にいる人とのショートメッセージやイメージデータの交換ができるので、ローカルSNSや近場のマルチユーザーゲームなど、アイデア次第で様々な応用が考えられます。 http://www.wi-fi.org/discover-and-learn/wi-fi-direct を見ると、Wi-Fi Directはデータ転送が250Mbpsとかなり高速、ハードウェアは従来のWi-Fiそのままが使える、通信に関するセキュリティ、アクセスポイントとの併用など、かなりいい感じです。これを活用しない手はありません。しかし、現時点ではすべてのWindows 8 PCがWi-Fi Directをサポートしているわけではないので、ご注意。ま、持ってる者同士でつながってください。 使い方を以下に説明していきます。Wi-Fi Directは、Windows.Networking.Proximity名前空間のPeerFinderクラスを使います。最初に、アプリが動作しているPCでWi-Fi Directが使えるかをチェックします。PeerFinderクラスのSupportedDiscoveryTypesプロパティをチェックします。         if ((PeerFinder.SupportedDiscoveryTypes & PeerDiscoveryTypes.Browse) == PeerDiscoveryTypes.Browse) このプロパティは、ビットフラグなので、上の様なチェックをします。この条件がtrueであれば、Wi-Fi Directを利用可能です。falseの場合には、「Wi-Fi Direct機能付きのPCを購入してね」といったメッセージを出しましょうw。 Wi-Fi Directで接続するためには、別のPCからブラウズできるようにしておく必要があります。                PeerFinder.ConnectionRequested +=                   new TypedEventHandler<object, ConnectionRequestedEventArgs>                       (PeerFinder_ConnectionRequested);               PeerFinder.Start(); Start()をコールすると、同じストアアプリがフロントで動いているPC上で、探すことができるようになります。ConnectionRequestedイベントは、別のPCからの接続要求を受け付けるためのものです。 同じストアアプリが動いていて、Start()メソッドをコール済みのPCを探すには、             var peers = await PeerFinder.FindAllPeersAsync();            foreach (var peer in peers)            { と、FindAllPeersAsync()を使います。peersは、PeerInformationというクラスのインスタンスのリストです。DisplayNameプロパティで相手のデバイスの名前が判ります。 Wi-Fi Directで接続する場合、                 var streamSocket =…

0