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などしてみてください。 このイベントで、ストアアプリを創ってストア公開まで行くと、良いことあるかも。それは当日のお楽しみということで、では、参加お待ちしております!!      


.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 =…


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…


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メソッドを使ってデバイスと接続します。…


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…


10/17 .NET Micro Framework ハンズオンセミナー第二弾開催します

NET Micro Framework Funの皆様(そうでない皆さんも)、こんにちは。 9/6に開催した、.NET Micro Frameworkハンズオンセミナーですが、好評につき、10/17に二回目を開催します。 https://www.facebook.com/micjapan/posts/722473487768919 1回目のフィードバックで、「実習時間が短い!!」というご意見を頂いたので、なんと今回は10:00~17:00と、一日かけてのセミナーです。 FEZ Spider (ARM 7ボード) LCD(QVGAタッチ) ボタンスイッチ×2 カメラ SDカード 温度・湿度センサー フルカラーLED イーサネット ジョイスティック の構成で、Visual Studioで組込み開発を体験できます。皆さん是非こぞってご参加ください!!    


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