Bluetooth SMART デバイス(LE GATT Profile)と連携するWindows Store Appsの開発

最近、Bluetooth SMARTというロゴのついた健康器具や時計など、ガジェットが増えてきました。家電量販店に行ったらパッケージをガン見していくと、結構おいてあります。そして、残念ながら、AndroidやiOS対応と書かれているもの多数で、Windowsストアアプリ対応のものが少ないのが現実。うん、でも、欲しければ作ってストアから公開してしまえばよいのです。それがソフトウェア開発者の生きる道(なんてね) Bluetooth SMARTのロゴがついているデバイスは、Bluetooth Low Energy GATT(Generic Attribute) Profileという、標準規格に則ってインターフェイスが規定されています。 http://blogs.msdn.com/b/hirosho/archive/2013/10/04/whatkindofdevicestobeabletoconnecttowindows81storeapps.aspx で紹介したように、これ、Windows 8.1で追加された新しいAPIでアクセス可能です。基本は上のURLのページを見て勉強してください。Bluetooth SMARTのインターフェイス群は、 https://developer.bluetooth.org/gatt/Pages/default.aspx で公開されています。一つのデバイスは、複数のServiceを提供し、Serviceには複数のCharacteristicsが含まれ、Characteristicsは、Descriptorを含む場合があります。これらすべて、Bluetooth Orgのページにデータの取得方法について記載があります。 標準化されているプロファイル膨大です。売られているガジェットにはどんなServiceをサポートしているか公開されているものはほとんどありません。連携するStoreアプリを開発するには、先ず、各ガジェットがサポートするService群を調べる必要があります。 サポートしているServiceを調べるために、ストアアプリを作って公開してみました。 http://apps.microsoft.com/windows/app/eg-bluetooth-smart-gatt-profile/87207696-068a-410c-bfdd-a96f44d43b3f 調べたいガジェットを先ず、設定チャーム→PC設定の変更→PCとデバイス→Bluetooth でペアリングしてください。Bluetooth SMARTデバイスは大抵の場合ボタン電池で動いていて、PCに近づければデバイスのリストに表示されるはずです。 ペアリング後、このアプリを起動してください。リストにBluetooth SMARTデバイス群が表示されます。調べたいデバイスをタップすると、そのデバイスがサポートしているServiceがリストの右側に表示されます。Serviceの項目をタップすると、そのServiceが含んでいるCharacteristicsのリストが表示されるページに移動します。更にDescriptorのリストが表示され、詳細を調べていくことが可能です。 点線で囲んだ部分をタップすると、Bluetooth ORGの仕様詳細ページに飛びます。 Service、Characteristics、Descriptorで、水色のWinRT API Supportedアイコンが表示されている項目は、Windows.Devices.Bluetooth.GenericAttributeProfile名前空間の、GattServiceUuids、GattCharacteristicUuids、GattDescriptorUuidsで、あらかじめWinRT APIの列挙子として定義されているものであることを示しています。 ストアアプリ内でのデバイス発見は、     var deviceWatcher = DeviceInformation.CreateWatcher(GattDeviceService.GetDeviceSelectorFromUuid(GattServiceUuids.BloodPressure));    deviceWatcher.Added += deviceWatcher_Added; こんな感じで、WinRT APIで定義された列挙子定義を使って取り扱いが可能なものです。 一方、 という、アイコンの項目のものは、WinRTには定義がありません。でも問題Nothing。私が公開したアプリで表示される各項目のUuid、これを直接指定してガジェットと接続することができるんです。例えば、     var deviceWatcher = DeviceInformation.CreateWatcher(GattDeviceService.GetDeviceSelectorFromUuid(Guid.Parse(“{00001816-0000-1000-8000-00805f9b34fb}”))); こんな形で、Uuidの値を直書きすれば接続できます。ちなみにこの値は、CYCLING_SPEED_AND_CADENCE です。GattDeviceService、GattCharacteristicクラスのメソッドにそれぞれ、Uuidを指定して含んでいる定義の取り出しが用意されていますが、それらも、全て同じ感じでアクセス可能です。Uuidは、アプリが表示するUuidを使ってください。で、具体的にどんなデータ構造、とか、呼び出し形式とかは、Bluetooth Orgの標準仕様の説明を見てくださいね。 サンプルは、http://code.msdn.microsoft.com/Bluetooth-Generic-5a99ef95 を参考にすると良いでしょう。 はい、では、連携アプリどんどん作ってくださいね。 あ、ストアアプリ+デバイス連携については、Facebookのグループページもあるので、興味のある方ご参加ください。ストアで公開されたアプリの自慢もOK。…

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 ストアアプリで、USBで接続されたWebカメラやマイクと連携する

USBで接続したWebカメラから画像を取り込みたい場合もありますよね。最近のNote PCやタブレットではカメラがほぼデフォルトでついていますが、デスクトップやちょっと前のNote PCだとついていないので、WebカメラをUSBでつなぐシーンはよくある事と思います。 最近、BluetoothやUSBで接続する機器との連携方法を解説していますが、プログラムの流れはほぼ同じで、Visual(カメラ)デバイスやAudio(マイク)デバイスを列挙して接続、MediaElementやCaptureElementで利用、という流れになります。 先ず、デバイスの列挙ですが、     var devInfoCollection = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);    DeviceInformation cameraDI=null;    foreach (var devInfo in devInfoCollection)    {        if (devInfo.Name == “Camera Device Name”)        {            cameraDI = devInfo;            break;        }    } Windows.Devices.Enumelation名前空間のDeviceClassの列挙子を使って、FindAllAsync()で列挙します。DeviceClassにはAudioなど幾つか種類が用意されているので、列挙したいものを指定してください。Camera Device Nameは、つないでいるWebカメラの名前です。コントロールパネルのデバイスマネージャーで確認しましょう。実はこのデバイスの列挙で、Note PCやタブレットに装備されているカメラも取り出すことができます。XAMLでUIを定義していて、任意の場所に画像を取り込みたい場合にもこの記事は活用可能です。 Webカメラからの画像は、MediaCaptureクラスを使って取り出し、CaptureElementクラスを使ってUI上に表示します。     var mediaCapture = new Windows.Media.Capture.MediaCapture();    var settings = new Windows.Media.Capture.MediaCaptureInitializationSettings();    settings.VideoDeviceId = cameraDI.Id;     devInfoCollection = await DeviceInformation.FindAllAsync(DeviceClass.AudioCapture);    var…

0

11/11のWin8.1+周辺機器連携ミニハッカソン紹介

周辺機器を操るスマートフォンやタブレットのアプリを創っている皆さん、こんにちは。 11月11日にWindows 8.1 ストアアプリ+周辺機器連携のミニハッカソンを開催します。お申し込みは https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032568380&Culture=ja-JP&community=0 から。 当日は、実際にデバイスと連携するアプリの動作確認ができるよう、各社様のご協力により、いくつかガジェットを用意してます。当日使えるガジェットは、 (株)アフレル様より Lego Mindstorms EV3 Bluetooth 2.0 SPPでシリアル通信可能です。 次は、ELECOM様提供のUC-SGT RS232Cケーブルで接続する周辺機器と連携可能です。このケーブルを使いたい方は、RS232Cで接続できるガジェットとヌルモデムケーブルを持参してください。会場では、.NET Gadgeteer RS232接続式を1セット用意しています。 次は、カシオ様のG-SHOCK   Bluetooth LE GATTプロファイルで制御可能。 他にも、会場では幾つかWindows 8.1ストアアプリと連携するガジェットの展示を予定しているのでお楽しみに。イベント参加登録ページに記載されている要件を満たす周辺機器を持参していただいても構いません。 セミナーの名前がコミュニティーフレーバーではありますが、真面目なセミナーです(コミュニティー系のイベントも勿論真面目なものがほとんどですが)ので、自社製品・ガジェットと連携するWindows 8.1ストアアプリ開発の技術スキルを身に着けたいという仕事系の皆さんも大歓迎です。当日はその道のプロ?が会場に揃っているので、Q&Aなどしてみてください。 このイベントで、ストアアプリを創ってストア公開まで行くと、良いことあるかも。それは当日のお楽しみということで、では、参加お待ちしております!!      

0

.NET Micro FrameworkからSignalRでデータをWebサイトに送る

…ようやくつながった。 ※と思いきや、この投稿の内容では、SignalR2.0では動かないようなので、ご注意ください。SignalR2.0版は、後日投稿の予定です。 って訳で、.NET Micro Frameworkから、SignalRでデータをWebサイトに送信する方法を紹介します。想定シナリオとしては、.NET Micro Framework上でセンサー計測情報を送り続けるというものです。ネット越しにSignalRで.NET Micro Frameworkがデータを受け取りモータなどを制御するというシナリオも考えられますが、ネット越しにリアルタイム的な制御をするのは結構難しいので、ここでは、.NET Micro FrameworkからWebへのデータ送信のみを取り扱います。 先ず、SignalRって何って方、 http://msdn.microsoft.com/ja-jp/windowsazure/dn146079.aspx こちらご覧ください。簡単にいうと、ネットワークを介したリアルタイム通信機構です。 Webサイト側は、 http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-high-frequency-realtime-with-signalr-20 を参考に、Webアプリを作ってください。このWebアプリを動かすためのサイトは、http://www.windowsazure.com/ja-jp/ でサブスクリプション契約し、Webサイトを使ってくださいね。一日当たりの使用に制限つきですが無料枠あります。Webサイトの作成は、http://msdn.microsoft.com/ja-jp/windowsazure/jj983748.aspx  を参考にやってください。 Internet ExplorerのF12や、Fiddlerなどを使って解析すると、SignalRを使った通信は、最初にWebサイトに対してネゴシエーションを行い、ConnectionTokenを取得し、データを送り続けるという形式をとります。これを、.NET Micro Frameworkで実装すると、 ネゴシエーションフェーズ:         string entryPoint = serverUri + “negotiate?_=1369908593886”;        var request = HttpWebRequest.Create(entryPoint) as HttpWebRequest;        request.Method = “GET”;        var response = request.GetResponse() as HttpWebResponse;        if (response.StatusCode == HttpStatusCode.OK)        {            using (var resStream = response.GetResponseStream())            {                var reader =…

0

Windows 8.1 ストアアプリからWinUSBを通じて.NET Gadgeteerと連携する

最近、Windows 8.1 の周辺機器連携に関する記事を書いていますが、今回は、UsbDeviceクラスを使って、.NET Gadgeteerとシリアル通信する方法を紹介します。 使った製品は、 ELECOM製、UC-SGT(RS232C USB変換ケーブル) FEZ Spider (.NET Micro Frameworkが動くARM7ボード) FEZシリーズのRS232Cボード FEZシリーズの加速度センサーなど です。手元にあったものを使ってみました。 以前もこのブログで紹介していますが、ELECOM製UC-SGTケーブルは、ELECOMさんからWinUSBクラスで認識するためのソフトウェアを、 http://www2.elecom.co.jp/search/link/search.asp?group=/cable/usb/uc-s/gt/&link_type=3 から、公開していただいているので、予め、Windows 8.1 PCにこのソフトウェアを当てておきます。 写真の様に、UC-SGTケーブルと、FEZ SpiderのRS232Cボードを、RS232Cヌルモデムケーブル経由でつなぎます。 これで、UC-SGTケーブルをWindows 8.1 PCのUSBポートにつなげば、ストアアプリとFEZ Spiderボードの間でシリアル通信ができます。この時、UC-SGTケーブルを介してつながったデバイスは、Communication Device Classで接続されます。 FEZ Spider側は、 こんな風にボードをつなぎます。左下のボードがRS232Cボードです。送受信プログラムは、Program クラスの ProgramStartedメソッドで、以下の初期設定コードを追加             rs232.Initialize();            rs232.serialPort.DataReceived += serialPort_DataReceived; します。DataReceivedイベントに登録しているハンドラは、         void serialPort_DataReceived(GT.Interfaces.Serial sender, System.IO.Ports.SerialData data)        {            int bytes = rs232.serialPort.BytesToRead;            byte[] buffer = new byte[bytes];           …

2

Bluetooth SPP(Rfcomm)双方向通信

前のポストで、Windows 8.1の新機能、Bluetooth Serial Port Profileを介して接続するデバイスとの通信方法について、基本を説明しました。 実際のデバイスとのデータ通信では、ハンドシェーク的なコマンドの送信だけでなく、単に送るだけのコマンドあり、デバイスの方から任意のタイミングで送信してくる通知もあります。例えばLego Mindstormsとの通信の場合もそうです。 .NET FrameworkのSerialPortクラスにはデータ受信を知るためのイベントハンドラが用意されていたり、Threadを駆使したマルチスレッドプログラミングでこなせました。WinRT APIでは、これらの方法は使えないので、別のパターンが必要です。 このポストでは、非同期プログラミングの仕組みと、タスク間の同期をとるManualResetEventクラスを使います。Lego Mindstorms NXTとの通信を例として説明します。 通知は任意の時点で送信されてきます。応答コマンドはPCから応答付コマンドを送信した時その応答として送信されてきます。デバイスから送られてくる送信を常に受信するループを用意します。PCから応答付コマンドを送信する場合、データ送信後に待ちにはいり、受信ループ側ではデータパケットを受信した時、通知か応答付コマンドの応答かを判断し、応答であればデータ送信後の待ちを解除する、通知であればバッファリング、もしくは、イベントを発行するなどでロジックを組めば、うまく動きます。 先ず、以下のメンバー変数、メソッドを用意します。     private ManualResetEvent mre = new ManualResetEvent( false );    private byte lastCommandSent;    private List<byte[]> receivedMessages = new List<byte[]>();     private async Task DataReceive(StreamSocket socket)    {        DataReader dataReader = new DataReader(socket.InputStream);        while (btSocket != null)        {            var loadResult = await dataReader.LoadAsync(2);            byte[]…

1

.NET Gadgeteer – カメラ画像の表示

.NET Gadgeteerでカメラ画像をWPFのクラス群を使って、LCDに表示する方法を紹介します。ボードの構成は、 FEZ Spider Display T35 Camera を前提とします。 Gadgeteerの.NET Gadgeteer Applicationプロジェクトテンプレートを使ってプロジェクトを作成します。Program.csのProgramクラスのProgramStarted()メソッドの下に、以下のメソッドとメンバー変数を追加します。         // カメラ画像をはめ込むRectangle        Rectangle photoRect;        // WPFでGUIを構成        void SetupGUI()        {            display_T35.SimpleGraphics.AutoRedraw = true;            display_T35.WPFWindow.Background = new SolidColorBrush(Colors.Black);             var panel = new StackPanel();            panel.Orientation = Orientation.Vertical;             photoRect = new Rectangle(160, 120);            panel.Children.Add(photoRect);             display_T35.WPFWindow.Child = panel;        } WPFでDisplay_T35に画像を表示するための要素を組み立てています。 カメラ画像をキャプチャーするために以下のメソッドとメンバー変数を追加します。         Bitmap cameraBitmap;        void…

0

Windows 8.1 ストアアプリでHIDデバイスを制御する

気がついたら、Windows 8.1が正式リリースされ、誰でも使えるようになりましたね。更に、Windows 8.1ストアアプリも開発者ダッシュボードに審査申請できるようになりました。これで心置きなくWinodws 8.1で新たに加わった機能を使いこなしたストアアプリの開発&公開ができるようになったわけです。 さて、このブログではWindows 8.1で新たに加わったデバイスプロトコルAPIを使って周辺機器と連携するストアアプリの開発方法について色々と紹介しているわけですが、今回はUSB接続でHID(Human Interface Device)クラスでつながる周辺機器をストアアプリで制御する方法を解説します。 HIDクラスって皆さんご存知?Human Interface Deviceという名前の通り、元々はキーボードやマウス、ジョイスティックなど、ホストに各種情報を供給するデバイスのUSB接続向けのクラスです。しかしのこのHID、単にデバイスからデータをホスト側に送れるだけでなく、ホスト側からデバイス側にデータを送ることもでき、プロトコルも比較的シンプルなので、パッと見入力機器には見えないものもこのHIDクラスでつながっている機器が多いんです。手持ちのデバイスをUSBで接続したときに、デバイスマネージャーの”ヒューマンインターフェイスデバイス”というカテゴリに項目が増えたら、そのデバイスはHIDでつながっている証拠。 このポストでは、HIDデバイス連携で世界中の人がいろいろ試しているミサイルラウンチャー( http://www.dreamcheeky.com/thunder-missile-launcher )を例に解説します。HIDデバイスを制御するプログラムは、 HIDデバイス情報を探す HIDデバイスを接続する HIDデバイスとデータを送受信する という流れで書いていきます。 1.HIDデバイス情報を探す 制御したいHIDデバイスのVendor ID、Product ID、Usage Page、Usage Idをあらかじめ調べておき、それらの値を使って、DeviceInformationインスタンスを検索します。     string selector = HidDevice.GetDeviceSelector(usagePage, usageId, vendorId, productId);    var deviceInformations = await DeviceInformation.FindAllAsync(selector);    DeviceInformation deviceInformation = null;    if (deviceInformations.Count > 0)    {        deviceInformation = deviceInformations.First();    } ミサイルラウンチャーの場合、usagePage=0x01, usageId=0x10, vendorId=0x2123, productId=0x1010です。検索したdeviceInfomationで、HIDデバイスと接続します。 2.HIDデバイスを接続する HidDeviceクラスのFromIdAsyncメソッドを使ってデバイスと接続します。…

0

Windows 8.1 ストアアプリと連携できる周辺機器概要

@ITさん主催の「2013流行語アプリ選手権&総選挙」というコンテスト(http://www.atmarkit.co.jp/ait/subtop/features/kwd/wintabcontest.html)始まりました。その一部門に「デバイスと大連携でしょ」ってのがあります。ガジェット好きのみんなには是非応募してほしい!!! ということで、Windows 8.1のストアアプリから連携できる周辺機器達を紹介します。そういえばもう再来週には8.1の正式リリースですねぇ。紹介すると簡単に言っても、つながるデバイスは星の数ほどあって全てを紹介するのは無理…なので、つながるデバイスの種別と一部のデバイスについて紹介していきますね。 Windows 8.1ストアアプリで周辺機器を制御する方法を大別すると以下の3種類になります。 WinRT APIで機器種別ごとに提供されるAPIで制御 USBやBluetoothで接続されたデバイスを制御 Windows ストアデバイスアプリとしてアプリを作りデバイスを制御 3番目のタイプは、Windows 8時代からもあった方法で、デバイスメーカーが、自社製品のコンパニオン的なストアアプリを開発&提供する際に使うプロフェッショナルな方法なのでこの投稿では割愛します。興味のある人はhttp://msdn.microsoft.com/ja-jp/library/windows/hardware/dn265141(v=vs.85).aspx を見てください。     1番目の「WinRT APIで機器種別ごとに提供されるAPIで制御」というのは、各種別ごとに名前空間が用意され操作用のAPが提供されている周辺機器です。 名前空間と種別を列記すると、 Windows.Devices.Portable Windows ポータブルデバイス メディアデバイスやストレージデバイス等 Windows.Graphics.Printing プリンター Windows.Devices.Scanners イメージスキャナー Windows.Devices.PointOfService バーコードリーダー、磁気カードリーダー Windows.Media.Devices オーディオ、ビデオ機器 となっています。以上の機器でも素敵なアプリであれば十分コンテストの表彰対象になるので、周辺機器お持ちの方、チャレンジしてみてください。…あれ?3D Printerがない?と思った方、大丈夫ですよ~。3D Printerは、通常(2D)のプリンターへの印刷の拡張として機能追加されていて、特に3D Printer用のWinRT APIはなく、Win32 and COM APIから提供されているIXpsDocumentPackageTarget3DやiXpsOMPackageWriter3D等も使って3D Printerへのデータを送ります。3D Printerの活用を考えている方は、http://msdn.microsoft.com/ja-jp/library/windows/apps/bg182882.aspx#printer を参考にしてチャレンジしてください。     次に2番目の「USBやBluetoothで接続されたデバイスを制御」について解説します。 USB接続の周辺機器でストアアプリから制御可能なのは、 HID(Human Interface Device)クラスで接続されるデバイス WinUSBクラスで接続されるデバイス の2種類です。HIDデバイスは、元々はキーボードやマウス、タッチパッドなどをつなぐクラスですが、データの入出力が簡単なので色々な周辺機器で利用されています。異色なところでは、http://www.dreamcheeky.com/thunder-missile-launcher のミサイルラウンチャーもHIDでPCにつながります。(ってことはストアアプリで制御可能ってことですな)。http://msdn.microsoft.com/ja-jp/library/windows/apps/bg182882.aspx#one の辺りを参考にしながらトライしてみてください。機会があればこのネタの投稿も今後しようと思ってます。 2番目のWinUSBクラスについては、http://msdn.microsoft.com/ja-jp/library/windows/apps/bg182882.aspx#three を参考にしてください。USBでつないで仮想COMポートにマップして.NET FrameworkのSerialPortクラスを使ってデスクトップアプリを開発していた方も多いと思います。SerialPortクラスのようにダイレクトにはストアアプリからは使えませんが、一旦WinUSBのデバイスとして認識させてしまえば、Windows.Devices.Usbのクラス群を使っての制御が可能です。RS232CでPCと通信するデバイスをもっている方は、エレコムのUC-SGT(USB To シリアルケーブル)を介して接続して試してみてください。 http://www2.elecom.co.jp/search/link/search.asp?group=/cable/usb/uc-s/gt/&link_type=3 で公開されているWindows 8.1でWinUSBとして認識させるためのInfファイルを使えば、ストアアプリからの制御が可能です。 Windows.Devices.HumanInterfaceDevice、Windows.Devices.Usbで提供されるAPIで制御可能な周辺機器は、元々Windowsにインストールされているインハウスドライバーで接続できるデバイスでないと駄目です。私個人の希望としては、シリアル通信のUSBで仮想COMポートで接続するタイプの周辺機器を販売しているメーカー企業の皆さんには、是非、WinUSBクラスとして周辺機器を認識させるINFファイルを提供していただきたいなと、思っている次第です。 さて、Bluetoothで接続されるデバイスです。最近はBluetoothでつながる周辺機器が増えているので、制御できるデバイスは多そうです。Bluetoothには、Bluetooth LE(4.0)と昔ながらのBluetooth 2.0系の2種類があります。Windows…

0