Windows 10 IoT CoreをはじめとするUWPアプリでBLEデバイスを扱う

先ずは、IoT Kitハンズオントレーニング のデバイス側で、Windows 10 IoT CoreのUWPアプリ(Windows 10 PCでも実施可能)とTexas InstrumentsのSensor Tag(CC2541、CC2650)の組合せを追加したことをお知らせします。https://github.com/ms-iotkithol-jp/IoTKitHoLV3 のWinIoTCoreTIIoTHubAppフォルダーに入っているソリューション一式がそれです。TI Sensor TagをデバイスやPCとペアリングすれば、あとは、WpfEmuIoTHubAppと同じ要領で自学自習可能ですので、TI Sensor Tag持っている人は是非試してみてください。一般のPC、Raspberry Pi3やDragonBoardなどBLE対応のデバイスであれば特にBLEのドングルなどなくても実習可能です。 さて本題です。このアプリを作っている過程で、BLEデバイスにアクセスするためのWindows Runtime APIの使い方でてこずりました。ライブラリー群は、非同期メソッドなので、await 句を付けてコールすれば通常は問題なく使えるのですが、HandsOn.csファイルの中で、普通のやり方をやっても実行がブロックされて戻ってきません。では、Taskのまま受けて、Wait()で待って、結果をResultで受け取って…を試してみたら、デバッガーで一行一行ステップバイステップで動かすと、一応動くのですが、一気通貫で実行しようとすると、Wait()から帰ってこない!最悪のパターンだ…どうしよう、ってな状況になってしまいました。しかしなぁ…サンプルでは動いてるしなぁ…何が違うの? と考えて動くものと動かないものを比較した結果、解が得られました。どうやら、UWPアプリとして作ったプロジェクトの中ではawaitやWait()がうまく動かないらしく、UWPアプリプロジェクトを作った時に出来上がるソリューションに、別途UWPクラスライブラリプロジェクトを作って追加、そのクラスライブラリ上にBLEデバイスにアクセスするFindAllAsyncやらなんやらをコールするコードを置くとうまく動くんですな。Gitに挙げているサンプルもそういう作りになっています。 ってことで、await機能しないじゃん、なにこれ?…と首をかしげてる皆さん、この方法試してみてください。 ではでは

0

MSC2013/ET2013でデモ&展示したMicro Device+Cloud連携

ちょっと時間がたってしまいましたが、昨年(2013)の11月に開催されたMSC、及び、ET2013でデモ&展示した、Micro Device+Cloud連携を紹介します。紹介するのは以下の二つです。 ICTコンセプトデモMSCデベロッパーキーノートでデモ、ET2013マイクロソフトブースで展示 アグリカルチャーセンサークラウドプロトタイプET2013マイクロソフト招待講演でデモ、MSC2013VSブース、及び、ET2013マイクロソフトブースで展示 先ずは、ICTコンセプトデモです。まぁこの構成でICTと言ってしまうのは非常に微妙ですが、イメージとしては、 のごく一部の実装です。 Windows AzureのWebサイトにSignalR対応のASP.NETアプリを稼働させ、センサーで計測したデータをSignalRで送信する、というシステムを、MSCのデベロッパーキーノートの中のデモで、同僚の田中達彦さんが、荷台に.NET Micro Frameworkのボードが載ったトラックを使ってデモしていました。 荷台に搭載されていたボードは、 こういう構成です。このボード、スイッチを入れると、 Wi-Fiでインターネットに接続 Wi-Fiでの接続に失敗した場合、有線LANで接続 タイムサーバーから現在時刻を取得して時刻設定 WebサイトにSignalRで接続 加速度センサー、ジャイロセンサー、方位センサー、GPSで計測したデータをSignalRでWebサーバーに2秒ごとに送信 加速度センサーで、ボードがすごく傾いたことを検知すると、StatusをRegularからTroubleに切り替えて送信 という動作を行います。他にも、このボード自体がREST形式でセンサー計測データを提供するWebサーバーとなる機能を持っていて、ネットワークにつながっている別のデバイスから、XML形式で計測データを取得できます。.NET Micro Frameworkによる詳細は、このブログの過去の投稿で説明しているのでそちらをご覧ください。 次にアグリカルチャーセンサープロトタイプです。こちらは、ET2013の金曜日のマイクロソフトの招待講演の中で私がデモしたものです。ET2013のマイクロソフトブース、MSCのWindows 8ハンズオン会場、及びVSブースで展示されていました。こちらは、以下の様なシステムを想定しています。 このシステムは、.NET Micro Frameworkのボードで計測した各種センサーデータを、Windows Azure モバイルサービスのテーブルに逐次格納し、Windows Azureモバイルサービス対応のストアアプリから参照するものです。ICTプロトタイプと同じく、REST形式によるネットワーク越しの計測データ取得、クラウドへの計測データアップロードの開始と停止、リレーのOFF/ON制御が可能です。他にUDP Multicat通信にも対応していて、UDP Muticastによるメッセージ通信で、リレーをOFF/ONすることも可能です。モバイルサービスのテーブルに格納した計測データは、勿論、ExcelのPower Map、Power Queryによる参照も可能です。 ボードの構成は、 です。温度が30度を超えると、ストアアプリにPush Notificationを通知するよう、ステータスを変えてモバイルサービスにデータを送信します。このボードは以下の動作を行います。 ネットワークに接続する ネットワーク上のタイムサービスを使って現在時刻設定 REST形式によるWebサービス起動 UDP Multicast Group通信用にグループにJoin センサー計測データをLCDに表示 REST形式でのアクセスにより、センサー計測データの取得、リレーのOFF/ON制御と状態取得、Windows Azure モバイルサービスへのデータ送信開始停止要求受付 UDP Multicast Group通信でリレーのOFF/ON要求が来たら対応 Windows Azure モバイルサービスにデータをアップロードしていない間は、マイクロSDカードにデータ蓄積したら完璧(すいません。未実装です) デモのしやすさを考えて、有線LANが未接続状態で起動した場合には、センサー計測&LCDへの表示のみを開始し、LANケーブルが接続された時点で、時刻設定、REST形式WEBサービス起動、Multicast Group通信設定を行い、Windows Azure…

0

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

.NET Micro FrameworkとWindows AzureとWindows Store Appsでプチセンサークラウドを試してみる

.NET Micro Frameworkでセンサーで物理データが収集できて、Aureでクラウドが使えて、Windows 8 ストアアプリでネットワークからデータを参照できるとなると、センサークラウド試してみるしかないですよね。 デバイス側をやっている人達からすると、いきなりホンキのクラウドでやろうというのは、マインド的にハードルが高いかなと思うので、クラウド側はPC上のエミュレータ(Windows Azureはエミュレータがあるのでテストも楽ですね)を使い、センサーデバイスもハードウェアを持っていない人も試せるように.NET Micro FrameworkのEmulatorを使って説明します。 クラウド側の開発 先ず、Cloud側ですが、センサーデータのアップロードと蓄積データを取得するREST APIを提供するクラウドサービスを作成します。蓄積データはAzureストレージサービスのテーブルに格納します。言語はすべてC#で解説します。作業を始める前に、Windows Azure開発に必要なSDKをインストールしてください。 Visual Studioで、メニューから、”新規作成”→”プロジェクト”を選択して、C#の”Windows Azure クラウドサービス”を作成します。本格的にはASP.NET系のWebロールを使うところですが、基本は一緒なので説明をシンプルにするため、”WCFサービス Web ロール”を一つ作成します。名前はそれっぽく変えてください。ここではSensorServiceとしておきます。 出来上がったSensorServiceプロジェクトのIService1.csとService1.svcは削除してください。 先ずは、Azure Storageのテーブルとテーブルにアクセスする仕組みを作成します。 SensorServiceプロジェクトにSensorDataTableクラスを追加します。 ソリューションエクスプローラーにできたSensorDataTable.csを以下の様に修正します。     public class SensorDataTableManagement    {        public static readonly string TableName = “SensorDataTable”;        private CloudTableClient tableClient;         public CloudTableClient Initialize(CloudStorageAccount accont)        {            tableClient = new CloudTableClient(accont.TableEndpoint.ToString(), accont.Credentials);            tableClient.CreateTableIfNotExist(TableName);             return tableClient;        }…

0

Windows Phone FM Radioの電波強度測定 – 数値計算は誤差が憑き物だよね

私にとって実世界の情報を取り込むものは全てセンサーだ…って訳でWindows Phone 7のFM Radioの電波強度測定を試してみた。 Windows Phone 7のFM Radioをアプリから操作するのは凄く簡単。Microsoft.Devices.Radio名前空間のFMRadioクラスを使います。このクラスはシングルトンで、インスタンスは、 FMRadio.Instance で取り出せます。そして、このクラスのFrequencyというプロパティが周波数を、SignalStrengthというプロパティが電波強度を意味しています。※MSDNのSignalStrengthプロパティの説明には、”Retrieves the received signal strength indicator (RSSI) value for the currently tuned frequency.”とあるので、Frequencyに指定した周波数の強度であることは間違いない模様なので、 FMRadio.Instance.PowerMode = RadioPowerMode.On; // ラジオのスイッチをオンFMRadio.Instance.Frequency = 81.3var strength = FMRadio.Instance.SignalStrength; と書けば、直ぐ特定の周波数の電波強度を測れるわけです。あ、イヤホンのコードがアンテナなので、レィディオを使う場合にはイヤフォンをぶっさしておくことを忘れずに。 色々試してみた結果を以下に列記しますね。 Frequencyプロパティに設定できる値の範囲:Frequencyに代入できる値は、FMRadioのCurrentRegionプロパティに設定されている値で変わります。CurrentRegionにはRagioRegion列挙子で定義された、Europe、UnitedStates、Japanの三つを指定できます。日本では当然Japanであり、指定できるのは76.0~90.0の範囲です。この範囲より小さかったり、大きかったりする値を代入しようとすると、例外が発生するのでご注意。私がアプリを作った時には、何故か?CurrentRegionがUnitedStatesになっていたので、アプリの初期化時に確認してJapanを代入するコードを入れておくと良いでしょう。 Frequencyプロパティに設定できる値の制限:更に、Frequencyには、小数点第2位以下が0の値しか代入できません。これも中途半端な値を入れると例外が発生してしまうのでご注意。なので、Sliderで周波数を指定しようとすると一発で嵌ります。Sliderを使う場合には、0.1単位で丸める処理を入れないと正しく動きません。これに関連して、例えば以下のようなコード、 double freq = 76.0;double delta = 0.1;while (freq <= 90.0){    ….    freq += delta;} と書いて順次周波数を変えて、全周波数を舐めよう…なんてコードを書くと上手く動きません。なぜなら、doubleというデータ型には誤差があるからです。.NETのdoubleはIEEE754フォーマットを採用しています。浮動少数の有効桁が15桁~16桁しかなく、単純に足し算すると誤差が出てしまいます。ためしにWPFアプリで、以下のコードを書いて試してみてください。             double x =…

3

Windows Phone 7 Sensor Checkerその後

以前のポストで拒否られたことをお伝えしたSensor Checkerアプリ、実は再度の拒否りにあって、修正し、再度のチャレンジでようやく認証が通ったようです。多分もう直ぐMarketPlaceに公開されると思います。 拒否られた理由は「Locaiton APIを使う場合は何に使うのか明示せい」という点。一回目の修正では「Locaiton API使うさ」ぐらいの簡単なOK、NGで、「嫌」んなら、Location APIにアクセスする機能を選択できなくするという修正をしたのですが、それじゃぁ足りないということですね。なので、Locatio APIでアクセス、取得したデータの使い道、Locationデータは端末の中だけでしか使わず外には出さない、という記述を加え、更に、Locaiton APIにアクセスするページ等を起動するときに「つかうよ~」的なNoticeも、これでもかぐらいに入れて再チャレンジ。これでOKになったようです。 アプリの名前は「Sensor Checker」 沢山インストールしてくれると嬉しいです。ソースコードは、http://mangosensorchecker.codeplex.com/ で公開しているのでそちらも見てくださいね。 Windows Phone 7のCompassは北極優位なAPI。南半球でどういう値が計測できるのか、とか、北極や磁極の北極付近で、地図がちゃんと表示されるのか、非常に興味深いところ。もしそのへんに居る読者が居たら、試してみて報告していただけるとありがたし。(・・・っていないか笑)

1

Socket マルチキャスト通信 – Windows Phone編

Windows Phone 7でのSocketマルチキャスト通信の使い方を説明します。 スマートフォンは基本各人がそれぞれのデバイスを持っていますよね。各人が各人の端末を操作して、各端末から発せられるデータを共有したい場面、結構、あると思うのですよ。例えばセミナーでのジャンケン大会とか、投票とか、フィーリングカップル5対5とか、カードゲームとか、合コン席決めとか(パーティ系か)。”FacebookとかTwitter、その他のクラウドサービス使えば良いじゃん”という声が聞こえてきそうですが、キャリアの通信トラフィックを増やすのもなんだし、当然通信の遅延も発生するし、…で、Wi-FiでLANに接続できる環境であれば、Socketマルチキャスト通信という選択も、そんなに悪くないかなと。3人以上で1つの端末に顔寄せ合って、操作するのもねぇ… Windows Phone 7では、UdpAnySourceMulticastClientというクラスが用意されていて、Multicast通信を簡単にアプリに組み込むことが出来ます。 このクラスはSystem.Net.dllコンポーネントに入っていて、System.Net.Sockets名前空間に属するものです。             UdpAnySourceMulticastClient myClient = new UdpAnySourceMulticastClient(groupAddress, groupPort);            try            {                myClient.BeginJoinGroup(                    result =>                    {                        try                        {                            myClient.EndJoinGroup(result);                            myClient.MulticastLoopback = true;                        }                        catch (Exception ex)                        {                            MessageBox.Show(“Join succeeded. but something wrong. ” + ex.Message);                        }                    }, null                );            }            catch (Exception ex)            {                MessageBox.Show(“Join failed. ” + ex.Message);            }…

0

Windows Phone アプリ登録初体験 – センサーチェッカーアプリ

実は、MSCやUX-TVでお見せしたセンサーアプリをMarket Placeに登録して、どうやら問題があるらしく、公開できない旨のメールを受け取っていました。時間が無くて放っておいたwのですが、昨日のTFセミナーでテンションが上がった(というか高橋エバの話を聞いて)ので、セミナーの内容にしたがって(実は何回も過去に聞いた話だし、最後は達彦エバにも聞いたのですが(笑))トライしてみました。 先ず、App Hubを開いて滞っているアプリのページの下のほうのリンクをクリックして、何が悪いのか書いてあるPDFを見ました。そうすると、 The following requirements apply to applicationsthat receive the location of a user’s mobile device:2.7.2 The privacy policy of your application mustinform users about how location data from theLocation Service API is used and disclosed and thecontrols that users have over the use and sharingof location data. This can be hosted within…

0

Windows Phone 7.1 アプリ Sensor Checker 更新

MSC2011 D1-401セッションで披露した、センサーデモアプリを公開しているサイト、http://mangosensorchecker.codeplex.com に最新のコードをチェックインしました。 アニメーションに関するコードなど、関連する一連のブログで紹介したものが全て入っています。コンパスのVisual表示では、BingMapとも組み合わせてみました。現在Sensor Checkerという名前でMarketplaceに登録しているものとほぼ同じです。ただし、BingMapは各アプリ用に必要なキーがあり、それを公開するわけにはいかないので、省略しています。Bingまpとの連動を試したい方は、http://www.bingmapsportal.com/ で開発者登録とアプリ登録をして自分のキーを取得してPageCompassVisual.xamlのmap要素にCredentialProvider属性を追加してください。 このデモアプリに関するほかのポストは、http://blogs.msdn.com/b/hirosho/archive/2011/09/30/windows-phone-sensor-checker.aspx から辿ってくださいまっせぇ。  

0

Windows Phone 7.1 簡単なメーター表示

MSC2011 D1-401セッションのセンサー系フォロー最終投稿です。ここではデモでお見せしたコンパス(Visual系)を紹介します。 コードは、http://mangosensorchecker.codeplex.com/SourceControl/list/changesets のPageCompassVisual.xamlと、PageCompassVisual.xaml.csを見てください。 図のコンパスみたいな絵がCompassセンサーのTrueHeadingの値に従って回転します。 ファイル名は、Compass.pngとしておきます。 この画像はPowerPointを使ってちょろっと作って、PNGファイルとして保存したものです。これをWindows Phone 7 Silverlightアプリケーションプロジェクトのフォルダーにコピーして、ソリューションエクスプローラーで既存のファイルの追加を使って、プロジェクトに追加します。 そして、この画像を、以下のXAMLコードでPageに貼り付けます。             <Canvas Grid.Row=”1″ Width=”400″ Height=”400″>                <Image x:Name=”imageCompass” Canvas.Left=”20″ Canvas.Top=”20″ Source=”Compass.png”>                    <Image.RenderTransform>                        <TransformGroup>                            <RotateTransform x:Name=”compassRotation” CenterX=”180″ CenterY=”180″ Angle=”0″/>                        </TransformGroup>                    </Image.RenderTransform>                </Image>            </Canvas> 太文字で示した部分が、Imageをはめ込む為の定義。図を描くためのキャンバスを用意して、図を置く左と上の位置を指定して、ソースファイルを指定すればOK。そして、後でこの図を回転するために、赤字で示したRotateTransformを定義しておきます。図は360×360ピクセルで作ってあるので、CenterX/CenterYをその中心に指定してAngleの値を変えていけばこの図画回転するという寸法。 コードビハインド(PageCompassVisual.xaml.cs)側では、センサーの使い方基礎で説明したようにCompassクラスのインスタンス(名前はmySensorとしておきます)を使うために必要なコードを書いておいて、CurrentValueChangedイベントのハンドラーの中で、             Deployment.Current.Dispatcher.BeginInvoke(delegate()            {                double trueHeading = e.SensorReading.TrueHeading;                tbTrueHeading.Text = String.Format(“{0:0.000}”, trueHeading);                compassRotation.Angle = trueHeading;            }); XAMLで用意しておいたRotateTransform要素(名前はcompassRotation)のAngleに値をぶち込めば、図のNは計測された真の北極の方向に合わせて、図が回転します。 以上、これだけで回転しちゃうのですが、これだと、Compassセンサーの値が変わるたびにカクカク動いてしまいあまり格好良くないんです。 で、単に値を更新するのではなく、BeginInvokeブロックの中身を、以下のようなコードにすると、                 double durationUnit…

0