古事連記帖

趣味のこと、技術的なこと、適当につらつら書きます。

Microsoft Flow で遊んでみたはなし

今更ながら、Microsoft Flow で遊んでみました。

flow.microsoft.com

要するに IFTTT を業務向けにしました的な。IFTTT 使ったことがないので形容が間違えているかもしれませんが、そんな感じだと認識してます。


業務向けを意識すると、Microsoft は日本語化に力を入れるんだなっていうのがわかるくらい、日本語化がしっかりしています。
もちろん個人でも使うことはできます。無料で使うことができて、15 分に 1 回発動できるかの自動チェックが走り、月 750 回まで実行することができます。
有料だともうちょっとチェック間隔は短く、実行回数も増えます。意外とお安いので気に入ったらお金払ってもいいかなあなんて思ってます。

基本的な登録の仕方や、Flow の作り方は id:kazuakix が書いてましたので紹介します。およそ1年前で、まだベータ的な感じの頃のですが、基本的なところは今も変わっていません。

blog.kazuakix.jp

ちなみに、無料のみ利用可能となりますが、Microsoft アカウントでも登録ができるようになっています。必要に応じて企業アカウント (Azure AD) を取ると、有料プランへの移行もできるようになります。
Azure AD 自体は無料で、僕の場合は Windows デベロッパーセンターで Azure AD を新規作成できる場所があったので、そこで作りました。Azure ポータルでも作れるかと思いますが、ごめんなさい、その辺まで調べ切れていないです。
デベロッパーセンターで Azure AD を作る方法は以前記事で書いていました。

ayano.hateblo.jp


今回やったことはひとつ。
JR東日本アイステイションズが提供している「鉄道運行情報」のメールを、Slack に転送する機能を作ってみました。

www.jikokuhyo.co.jp

Flow のいいところは、Outlook.com に対応しているところ。Outlook.com のメールを扱うサービスがあまりないので、この点はとてもありがたいです。
IFTTT だと Gmail には対応していますが、Outlook.com には対応していませんでした。

id:kazuakix の記事ではテンプレートを利用していましたが、今回は一から作ります。
f:id:ChiiAyano:20170407232731p:plain
f:id:ChiiAyano:20170407232939p:plain

Outlook.com を選んで、はじめて使うときはどのアカウントを使うか、ログインを求められるので、指示通りログインを進めて下さい。
登録できると、どんな条件で発動するかを設定できます。「開始」に差出人のアドレスを入れれば、特定のアドレスにだけ反応することができます。
f:id:ChiiAyano:20170407232945p:plain

次に Slack を追加します。
f:id:ChiiAyano:20170407233003p:plain

このときも、どのチームで使うかを聞いてきますので、設定しログインして下さい。
登録できると、どこにどうやって送信するかを設定できます。「メッセージテキスト」にメール本文、「ボット名」に件名を入れることで、簡易的なメール確認にも使えたりします。
f:id:ChiiAyano:20170407233139p:plain

これでひとまずはできあがり…ですが、メール本文は余計な文があったりして、必要な情報だけほしいと思ったとき、Flow の機能だけではうまくできませんでした。
そこで、半ば仕方なくですが Web API を作って一度そちらを経由し、メール本文を加工して使えるようにしました。

Visual StudioASP.NET Web アプリケーションを選んで…
f:id:ChiiAyano:20170407233911p:plain
今回は Azure API App を選びました
f:id:ChiiAyano:20170407233936p:plain
Azure API App は Swagger と呼ばれるフレームワークを積んだテンプレートになっています。Swagger はとりあえず作るにはかなり簡単なフレームワークで、サーバー初心者でも扱いやすかったです*1

今回はこのドキュメントを参考にしました
Azure App Service で API Apps、ASP.NET、Swagger を使用する

できあがったプロジェクトの Controllers に、受け口となる実装をしていきます。既に「ValuesController」がありますので、それを見ながら作っていくと楽かと思います。
こんな感じでコントローラーを書いてみました。

using System;
using System.Net;
using System.Web.Http;
using Swashbuckle.Swagger.Annotations;
using WebApplication2.Models;

namespace WebApplication2.Controllers
{
    public class HogeController : ApiController
    {
        [SwaggerResponse(HttpStatusCode.OK)]
        public HogeResponseModel Post(HogeRequestModel request)
        {
            var body = request.Body;
            var response = new HogeResponseModel();

            // なんか処理
            response.CreatedAt = DateTimeOffset.Now;
            response.Message = body;

            return response;
        }
    }
}

リクエストを受けるためのモデルとなるクラスはこんな感じ。これを Models の中に入れます。

namespace WebApplication2.Models
{
    public class HogeRequestModel
    {
        public string Body { get; set; }
    }
}

レスポンスを渡すためのモデルとなるクラスも同様に Models に入れます。

using System;

namespace WebApplication2.Models
{
    public class HogeResponseModel
    {
        public DateTimeOffset CreatedAt { get; set; }
        public string Message { get; set; }
    }
}

実際、これだけだとただ左から来たものを右へ受け流すだけの API になっていますが、実際はもうちょっといろいろ書いてます。

これで作れましたが、実際に動くかどうかも Swagger では試すことができます。
App_Start にある「SwaggerConfig」を開き、190 行目ほどにある

/*
    })
.EnableSwaggerUi(c =>
    {
*/

のコメントを外してあげると、ダッシュボードにアクセスできるようになります。
ひとまずデバッグ実行して、Web ブラウザーが立ちあがったら、そのアドレスに「/swagger」を足して下さい。

http://localhost:59819/swagger

とやると、ダッシュボードが立ちあがります。ここで、どんなエンドポイントで、どういうメッセージを送れば、どう返ってくるかがわかります。
f:id:ChiiAyano:20170408000051p:plain
試しに適当な JSON を流し込んでやると、ちゃんとレスポンスが作られることがわかると思います。
f:id:ChiiAyano:20170408000239p:plain

これでできあがりです。あとは Azure に投げるなり、自前のサーバーなどに置いてインターネットアクセスができる環境において下さい。
今回認証などのアクセス制限まわりに触れていませんが、おそらく必要になるケースは出てくると思います。その辺はまた時間があれば書きたいところ。


さて Flow に戻ります。
先ほど作ったフローに、今公開した API を使ってもらうようにします。
メールと Slack の矢印あたりをポイントすると「+」が表示されるので、それをクリックすると間に処理を追加することができます。
f:id:ChiiAyano:20170408000726p:plain

アクションは今回「HTTP」を選びました。Swagger が使えそうなアクションがありますが、HTTPS 通信でないとダメだったりしたので、地道に HTTP で作ります。

設定はこんな感じ。「本文」は JSON チックにし、メール本文の間にダブルクオーテーションを挟むのがポイントです。
f:id:ChiiAyano:20170408001108p:plain

次に JSON を解析します。Flow では JSON 解析するアクションがあるので、それを利用します。
「HTTP」の下の「+」をクリックして処理を追加します。

f:id:ChiiAyano:20170408001519p:plain
コンテンツは HTTP で受けた「本文」を入れて下さい。
スキーマはちょっと特殊ですが、こんな感じで書けると思います。

{
  "type": "object",
  "properties": {
    "CreatedAt": {
      "type": "string"
    },
    "Message": {
      "type": "string"
    }
  }
}

これで Web API を通してメッセージの加工ができるようになりました。

最後に Slack に投稿する設定を変更します。
パースした JSON の情報が使えるようになったので、それを「メッセージテキスト」に流し込みます。
f:id:ChiiAyano:20170408005424p:plain

これで以上です。

いろいろ設定して、実際に使うとこんな感じで動かしています。
f:id:ChiiAyano:20170408005547p:plain


Flow はモバイルでも動かすことができます。
これまでなぜか iOSAndroid のみアプリが提供されていましたが、つい先日 Windows 10 Mobile でもリリースされました。
www.microsoft.com
Flow のアクションを促すことができるボタンを用意して、モバイル端末から実行することができたり、既存のフローを編集したりすることができます。
f:id:ChiiAyano:20170408010242p:plain

で、試しにやってみたのですが…

リプライ飛ばしたはずなのに @ がついてない…だと…。

どうやらスパム防止としてあえて @ をフィルターしているようでした。
powerusers.microsoft.com
正しいっちゃ正しい。仕方ないですね。


そんなわけで長々と書いてしまいましたが、こんな感じで遊んでます。
他にも面白そうな遊び方があったら紹介したいです。


参考記事
blog.daruyanagi.jp

*1:個人の感想です

Windows 10 Insider Preview の Outlook メールで新着通知が表示されなくなったら

もうすぐ Creators Update がきますね
ここまでくる間に、Outlook メールも更新が何度かおこなわれました。で、気づくと PC と Mobile 共に新着メールの通知がこなくなっていました。Outlook メールの設定も、システムの設定も確認してみましたがすべてオンになっていて、オンとオフを繰り返してみたものの、全然通知がきませんでした。

Mobile のフィードバック Hubにはひとまず報告はしてありました。
Feedback Hub - Windows Insider Program


その後何度か OS のアップデートや Outlook メールのアップデートがきていましたが、一向に直る気配がなかったのですが、今になって解決方法を見つけました。


アカウントの設定をし直すと通知がきました


なんとあっさりでした。今までなぜ試さなかったのか…。
PC も Mobile も同じようにアカウントの設定をやり直すだけで通知が復活します。


お試しあれ。

Nintendo Switch を買いました

Nintendo Switch 一般予約開始日の争奪戦に Amazon で勝利し*1、3月3日の発売日にちょうど買うことができました。

Nintendo Switch Joy-Con (L) / (R) グレー

Nintendo Switch Joy-Con (L) / (R) グレー


f:id:ChiiAyano:20170303112555j:plain
自分用と、家族の用で2つあります。家族用のはヨドバシで予約が再開したタイミングでポチってます。

買ったのはもちろん、ゼルダの伝説 ブレス・オブ・ザ・ワイルド

ほぼ毎日寝る間も惜しむレベルで楽しんでますが、なかなか進められません(自分が下手という説も)

今回、自室に 3 枚あるモニターのうち 1 枚を、PC と Switch とで共用することにしました。
以前スプラトゥーンの記録を取るためにビデオキャプチャーデバイス AVT-C875 を買っていたので、これを利用することに。
このデバイスHDMI-OUT があり、モニターにパススルー接続ができるとあって、しばらくはこれを使っていたんですが、モニター側で認識がうまくいかないケースが結構ありました。
キャプチャーデバイスも活用して動画も撮りたかったので、結局別で HDMI スプリッターを買うことにしました。

これを利用して、モニターにはほぼ直接接続、キャプチャーデバイスも共用できて、かつ、モニター側の認識も正しくおこなわれるようになりました。


動画撮れるのは結構楽しいです。


Nintendo Switch では、ニンテンドー e ショップからダウンロードしたゲームは「ニンテンドーアカウントに紐付け」られているようです。
ただし、ニンテンドーアカウントでログインし、最初にダウンロードしたデバイス 1 台のみでダウンロード・プレイができ、他のデバイスで遊ぶ場合、「最初にダウンロードしたデバイス」を解除する必要があります。
www.nintendo.co.jp


Nintendo Switch は総じて満足度が高いです。
そこまで重くないので、持っても苦にならず、カバンにいつも入れることができて、すぐ遊べるし、ドックと接続してモニターでも遊べるしで、外で据え置き型ゲームが遊べたら良いのにがようやく実現したなあと感じています。
このあたりはスマートフォンでも、ジョイパッドの接続などで同じ体験ができるのは確かです。ただ、純粋にゲームだけができるデバイスで、ゲームメーカーが出しているというところが大きな違いかなと思います。スマートフォンだと割り込みが多いので不安定になりがちだったり、端末が熱くなったりすることが多いですが、Switch は動作が重くなったりせず*2、端末はほんのり暖かくなるレベルで落ち着いていました。
ただ、本体の画面、携帯モードだとちょうどいいんですが、テーブルモードだと画面が小さく感じます。これは割と仕方ない感じはありますが、1 画面を 4 人で共有する場面では割と窮屈になりがちです。複数のデバイスを使って、ひとり 1 台ないし 2 人グループごとに 1 台などしないといけないなあと感じました。
ひとりでもくもくプレイするなら、Joy-Con をくっつけて携帯モードで遊んだ方がだいぶ楽だなあと思います。スタンドは Surface RT と同じく 1 段階しかないですからね。


スプラトゥーン2 やマリオオデッセイに期待を寄せつつ、頑張ってゼルダ攻略します…。矢が足りない…。


Nintendo Switch Proコントローラー

Nintendo Switch Proコントローラー

モニター出力しているときはプロコンあった方が確実に楽です。

*1:残念ながらマイニンテンドーストアでは敗北

*2:モニター接続で処理落ちは割とありますが

Windows ストアに公開しているアプリが後から審査落ちした話

以前、位置情報共有アプリ「Mikaboshi」のお話をしました。

ayano.hateblo.jp

www.microsoft.com


これを公開してしばらく経ったある日、ふとアプリの更新をするべくデベロッパーセンターを開いたら、審査レポートが表示されていました。

f:id:ChiiAyano:20170310234134p:plain

10.2 Suspicious File Download

ストアポリシーで言う

10.2.3
望ましくないソフトウェアと悪意のあるソフトウェアに関する Microsoft の条件で定義されているマルウェアを、アプリに含めたり、アプリで有効にしたりすることはできません。

だと思うのですが、その辺あまり思い当たる節がなく、なんだろうなあ…というところ。
一つ考えられるのは、地図表示が WebView で、Google Maps を利用しているので、そのあたりだろうかと思ってはいます。
しかも期限内に申請しないと自動で取り下げられる上に、再公開にはメールで問い合わせろということが書かれています。こわい。

ひとまず何も考えずに次のバージョン 2.2 を更新申請しました。何かあったらまた記事書く予定です。


そういえば、最近は審査パスしたとかその辺の通知がメールで飛んできません。ちょっと困ってます。
これに気づくのもおとといとかそんな感じでした。ちょっとー。

あけましておめでとうございます

今週のお題「2017年にやりたいこと」

2017 年になりました。あけましておめでとうございます。
今年こそ音楽を頑張っていきたいと思っています。プログラミングも色んな事にチャレンジしていきたいですね。
せっかく UWP 触ってるので、Xamarin ちょっとやりたくないですか?地獄?今年 1 年あれば何かできるかな?

とにかく毎年言ってますがいろんなチャレンジをしていこうと思います。
今年 1 年よろしくお願いします。


f:id:ChiiAyano:20170101004220p:plain

このブログを作って4年が経ったらしいのと、冬コミのはなし

はてダも含めるともっと長い気がしますが(何年前だっけ…)
メールがきてました。メールしかよこさないらしく、なんかそれをこの記事に埋め込むとかそういうのができるのかなと思ったらそうじゃないらしいです?


今後もきっと気が向いたら書く、そんなブログになると思います。
今は冬コミの仕込みまっただ中です。頑張ります。ある程度形になったら告知します。いつも遅くてすんません。


一応お伝えできることだけ。
AncientChronicle は C91 の 1 日目、東レ-28b にて頒布します。
今回は初めてのアルバム CD を出します。C90 で頒布したものより 1 つ前までの曲を厳選したり、今回初めて入れる曲とかも入れてお届けする予定。あれもこれも詰め込んだら、2 枚組になるっぽいです。2 枚ですけど手焼きします。
細かいことはまた後ほど?

Bluetooth で OBD2 と接続して Mikaboshi で表示したい

この記事は、Windows 10 Mobile / Windows Phone Advent Calendar 2016 の 3 日目の記事です
www.adventar.org

先日の記事で、開発・公開している Windows 10 アプリ「Mikaboshi (みかぼし)」について書きましたが、きょうは今後予定している機能のうちのひとつを、開発手法とあわせて紹介します。

Mikaboshi のダウンロードはこちらからどうぞ
www.microsoft.com


Mikaboshi は、主に車載向け (自動車・バイク・自転車など) を想定して作っていますが、GPS の情報に頼る性質上、例えば高い建物の間を移動していたり、トンネル内を移動していたりしたときは地図の更新も、推定移動速度も更新されなくなります。そんな中でも、移動速度だけは更新させたいという気持ちから、OBD2 を使った移動速度の検知を試してみました。

OBD2 とは、いわゆる「自動車の自己診断機能」のことで、本来は自動車の故障個所などを検知する目的で使われるもののようですが、その情報の中には移動速度なども含まれており、また車からの情報なので即時性・正確性が高く、これを利用したアプリや車載機器*1が多くあります。


実装するにあたり、電話で使うので Bluetooth 接続できた方がありがたいですよね。Bluetooth 接続できる OBD2 アダプターデバイスは結構多く存在します。適当に Amazon でポチポチしてもいいと思いますが、なぜか当たりはずれの大きいものばかりなので、既に Windows Phone 向けにも OBD2 を使った情報収集できるアプリ「OBD Info-san!」を開発した がんち さんが紹介している OBD II マルチメーター M-OBD-V01 が割と安定して使えるかなと思います。ほかのやつと比べるとちょっと高いですけどね。

Mikaboshi で OBD2 検知機能を実装するにあたり、がんちさんのアプリには大変お世話になりました。

Bluetoothバイスを見つけて接続する

まず Bluetooth 接続を実装する前に、Package.appxmanifest で Bluetooth を使うように宣言します。
開いて、「機能」タブから「Bluetooth」にチェックを入れてください。これでアプリで Bluetooth が使えるようになります。

次に、使える Bluetoothバイスを列挙します。何が OBD2 アダプターなのかわかりませんからね。

使えるデバイスの一覧を拾うには、 Windows.Devices.Enumeration.DeviceInformation が使えます。
こんな感じ。

using Windows.Devices.Bluetooth.Rfcomm;
using Windows.Devices.Enumeration;

public async Task<DeviceInformationCollection> GetAvailableDevicesAsync()
{
    var services = await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));
    return services;
}

OBD2 アダプターがシリアルポートとして動くので、シリアルポートとして動くデバイスを探して列挙しておきます。

次に接続します。さきほど見つかったデバイスのうち、OBD2 アダプターデバイスを見つけておいてください*2。見つけたデバイスの DeviceInformation のインスタンスを保持しておきます。
そして接続します。こんな感じ。

using Windows.Devices.Bluetooth.Rfcomm;
using Windows.Devices.Enumeration;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;

private StreamSocket socket;
private DataWriter writer;

public async Task ConnectAsync(DeviceInformation device)
{
    var service = await RfcommDeviceService.FromIdAsync(device.Id);

    this.socket = new StreamSocket();
    await this.socket.ConnectAsync(
        service.ConnectionHostName,
        service.ConnectionServiceName,
        SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);
    this.writer = new DataWriter(this.socket.OutputStream);
}

StreamSocket.ConnectAsync() したとき、はじめての場合システムから許可を求められます。許可することで接続が確立します。2 回目以降は特にいわれませんので、ConnectAsync() してすぐに接続が確立します。

Bluetoothバイスとデータを送受信する (準備)

OBD2 アダプターデバイスは、データの送信と受信を一対一でおこないます。クライアントはデータを送信したら、OBD2 から受信を待機して、受け取った情報を解析するような流れをとります。
ですので、送信した後すぐ待機するようなコードを組むようにします。

using System.IO;
using Windows.Devices.Bluetooth.Rfcomm;
using Windows.Devices.Enumeration;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;

// これらに、すでにインスタンスが上記コードを使って入ってるものとします
private StreamSocket socket;
private DataWriter writer;

public async Task SendCommandAsync(string message)
{
    // OBD2 のコマンド終端は \r
    var bytes = Encoding.ASCII.GetBytes(message + '\r');
    this.writer.WriteBytes(bytes);

    // OBD2 へここでデータを投げる
    var result = await this.writer.StoreAsync();

    if (result == bytes.Length)
    {
        // たぶん成功してる
        await AnalyzeAsync();
    }
}

private async Task AnalyzeAsync()
{
    var stream = this.socket.InputStream.AsStreamForRead();
    var result = new List<byte>();

    while (true)
    {
        var b = stream.ReadByte();

        if (b <= 0) continue;

        result.Add((byte)b);

        // > がきたら応答が終わったとみなす
        if ((char)b == '>') break;
    }
    // 以下省略、続きは次で
}

こんな感じ。これで形はできました。
OBD2 のインターフェースである ELM327 がプロンプト形式でやりとりするので、「>」はユーザーからの入力待ちモードになってるって感じです。ユーザーからコマンドと「\r」をもらったら、それに応じて情報を返して、「>」で終わるという具合。
なので、「>」がきたらデバイスからの応答は終わったとみなしてOKでしょう。

Bluetoothバイスとデータを送受信する (送信と解析)

実際に送信してみましょう。
コマンドについては ELM327 のデータシートも参考にしながら。
https://www.elmelectronics.com/wp-content/uploads/2016/07/ELM327DS.pdf

まずリセットコマンドを送信しておきます。
リセットコマンドは次の 3 つです。

at z
at l0
at e0

z は初期化コマンド、e0 はコマンドのエコーをするかどうか (これでエコーしないようになります)、l0 はラインフィードを追加するか (これで追加しないようになります) を設定します。

OBD2 へ送信するコマンドはいろいろあります。先ほどのデータシートにもありますが、英語版 Wikipedia にも一覧が載っています。

OBD-II PIDs - Wikipedia

速度情報は Mode 01 に書かれているので、コマンドはこんな感じ。

01 0D

これを送信することで、応答に速度情報が返ってきます。
これらを先ほどのコードで実装した SendCommandAsync() に投げます。

そしてこれらの応答を解析するコードを実装します。

// 上記コードからの続き

public int Speed { get; private set; }

private async Task AnalyzeAsync()
{
    var result = new List<byte>();
    // 省略
    result = /* OBD2 応答 */;

    // 応答をバイト配列から文字列にしておく
    var buffer = result.Where(w => w > 0).Select(s => (char)s).ToArray();
    var resultStr = new string(buffer);

    // 文字列にした応答を、半角スペースと改行で配列に分ける
    var data = resultStr.Split(new[] { ' ', '\r' }, StringSplitOptions.RemoveEmptyEntries).ToArray();

    // 初期化処理以外で 41 で始まるデータが返ってこなければ、それは失敗してる
    if (data[0] != "41")
        return;

    switch (data[1])
    {
        case "0D":
            // 速度情報
            break;
        default:
            return;
    }
}

private AnalyzeVehicleSpeed(string[] data)
{
    // 使うデータは 3 バイト目
    var speedData = data[2];
    var speedValue = 0;
    int.TryParse(speedData, NumberStyles.AllowHexSpecifier, CultureInfo.CurrentUICulture, out speedValue);

    this.Speed = speedValue;
}

こんな感じ。
初期化コマンドの応答については処理について特に書いてませんが、ちゃんと返ってきます。

> at z
ELM327 v1.5
> at l0
OK
> at e0
>

特に処理する必要もないですが、初期化してから各種コマンドを投げた方がいいです。初期化については「41」で始まる応答を返しませんが、エラー扱いにすると危ないので気を付けた方がいいです。

そして、送信した速度情報のコマンドの応答は

41 0D 28

となっています。成功を示す「41」と、速度情報に応答したと示す「0D」のあとに続く「28」を解析してやればOK。単に 16 進数ですので、数字に変換してやれば速度情報になります。
つまり、OBD2 で得られる速度情報は、0 ~ 255 km/h までということですね。


速度情報はたいていの車で返してもらえると思いますが、車によっては返してもらえなかったり、返す値が微妙に違う (同じ応答を 2 つ返すなど) するらしいので、その辺の情報がちょっとほしいなあと思ったりはしています。
また、ほかのコマンドを叩けば、その情報も得ることができますし、先述の Wikipedia の記事にはフォーマットもありますので、割と楽に取れるかと思います。
取得する車が何のコマンドが使えるかは、「OBD Info-san!」を使うと一覧化してくれます。試用版でもできるので、拾いたい情報をそこから探すという手もあります。


…というのを、Mikaboshi で実装していて、現在テスト中です。速度情報のほかにエンジン回転数も表示できるようにする予定でいます。
実際使ってみるとかなり楽しいというか、目指してたものが実現できたので割と満足しています。

割と古い開発中のころのスクリーンショットですが、こんな感じ。
f:id:ChiiAyano:20161202100208p:plain


少し気になるのが、OBD2 アダプターデバイスの個体差があるのかもしれませんが、OBD2 から得られる情報の更新頻度が急に落ちたり、応答がなくなったりすることがときたま起きます。
再接続したり、アダプターデバイスの電源を入れなおしたり、コマンド送信から受信までタイムアウト時間を設けて、一定時間返ってこなければ自動再接続したりするなど対策はしていますが、更新頻度の低下はうまく検知できてない状態です。
このあたりうまくやれる方法があれば教えていただけると助かります…。
また、まだテストしてる車が、家のホンダ フィット (GP6) しかなく、ほかの車でも動かせるかどうかを確認したいところです。
準備ができ次第リリースするので、協力いただける方がいればよろしくお願いします。

寄付をお願いします

1 日目に引き続いて恐縮ですが、アプリの「?」をタップして表示される「バージョン情報」に「作者に寄付する」ボタンがあります。実際に使ってみて、よければ寄付ください。アプリ内課金を利用しています。寄付額は選べませんが、寄付いただければ例えば Xamarin 使ったマルチプラットフォーム対応とかやる気が起きます。お願いします。

Advent Calendar でした

4 日目は od_10z さんです。誰もが息をのむような、すごい記事に期待しています。
twitter.com

*1:油圧メーターなどの付加メーターやレーダー探知機など

*2:先述のデバイスの場合、たいてい「SPP」といった名前で見つかると思います