プログラマ視点でBluetoothダーツボードを科学する！

近年、「自宅でもダーツマシン同様に遊びたい！」という需要は増え、様々なメーカーからいろいろなダーツボードがリリースされています。
その中でも、スマートフォンやPCとBluetoothで連携することで、ダーツマシンさながらのプレイができる電子ダーツボードもあります。
この記事は、そんなBluetooth電子ダーツボードを、プログラマ視点で科学してみたという記事です。

# 注意
分解して基板のプログラムをハックしたとかみたいなそこまで踏み込んだことは調べてないので、**皆さんでもできる範囲での科学**となっています。

# 今回科学するダーツボード
「**DARTSLIVE-200S**」と、「**GRANBOARD dash**」を科学します。
他にもBluetoothで連携できるボード、更にはPC専用の[PC-DARTS](https://epoch.jp/tv-darts/pc2/product.html)もありますが、~~持ってない~~あまりメジャーではないので今回は除外します。

## DARTSLIVE-200S
ダーツマシンでもお馴染みのダーツライブ社による家庭用電子ボードで、Android・iOS・**Windows**・**Mac**に接続し、かつ専用のアプリを導入することで電子ダーツボードとして遊べます。
このアプリ、なんとDARTSLIVE2のシステムがほぼ完全に移植されているため、DARTSLIVE2さながらにプレイできます。~~さすがセガ系列！家庭用にも強い！~~
そして、このダーツボードのプログラマ的なもう1つの強み、それは**入力を文字入力として受け取ることができる**というものがあります。
これについていくつか[解説](https://www.infiniteloop.co.jp/blog/2016/01/dartslive_as_keyboard/)[記事](https://tech.recruit-mp.co.jp/gadget/post-14929/)も掲載されているのですが、1つだけ注意点があります。**STARTボタンとCHANGEボタンを除き、接続する端末を変える度にセグメントに対する入力のアサインが変わります。**
恐らく混信を避けるための措置であると思われますが、ある日1のシングルに入れてみたらブル扱いになった……ということが起こるので、もしこのボードを使って何かしたいということがある時は注意が必要です。
入力を受け取るプログラムをC++とDXライブラリで書いてみました。
初期化はコンストラクタでINIファイルから呼び出すなりしてセグメントと文字の対応を割り当てましょう。

```c++:board.h
class Board
{
public:
    struct Segment
    {
        int point;
        int pos;
    }

private:
    std::array<Segment, 256> segs;

public:
    Board();
    ~Board();

    const Segment& GetSegment()
    {
        return segs[GetInputChar(true)];
    }
}
```

あと、DARTSLIVE-200Sは普通に使う分にもオススメです。

## GRANBOARD dash
GRANBOARDの[公式発表](https://www.facebook.com/granboard.official/posts/1778523395718845/)では、特徴としてこのようなことを挙げています。
> GRAN BOARDは独自プロファイルで端末とBluetooth通信を行います。そのためGRAN BOARDがキーボードとして認識されてしまうことはありません。

これは事実のようで、実際にAndroidでBluetoothのプロファイルを調べるアプリを使い調査したところ、実際に独自プロファイルを使用して通信を行っているようで、GRANBOARDアプリ以外でキーボード、ゲームパッド入力といったあらゆる汎用的な入力を受け取ることができず、Windowsに接続してもペアリングまではできるものの同じく入力を受け取ることはできませんでした。
一方で、プロファイルに関しては[パソコンの選び方と買い方](https://pcinformation.info/interface/bluetooth-profile.html)によると、このように解説されています。
>もし Bluetooth 機器が各製品で独自に Bluetooth 通信時の動作や送受信するデータの内容を定義することになれば、その独自の定義に従って Bluetooth 通信できる製品同士のみ Bluetooth 通信可能となってしまい、Bluetooth の相互接続性は確立しません。 
> Bluetooth 機器は、製品によって対応しているプロファイルが異なりますが、通信する2つの Bluetooth 機器は同じプロファイルに対応している必要があります。プロファイルに対応していないと、2つの Bluetooth 機器は通信することができません。 

この記述だと、AndroidもしくはiOSだけにGRANBOARDを接続するためのプロファイルが存在すればGRANBOARDは実際にその独自プロファイルで接続することができますが、GRANBOARDのために端末メーカー、もしくはGoogleあるいはAppleがGRANBOARDの独自プロファイル入力を受け取るためのハード・ソフト的なサポートをするとは思えないので、恐らくソフト、そしてアプリというレイヤーとしてGRANBOARDアプリだけにその独自プロファイルを接続するための機構があるということになります。
そもそも独自プロファイルという概念がBluetooth 4.0で策定された仕様で、「2つの機器は同じプロファイルに対応していなければならない」ことが変わっていないとすれば、恐らくアプリというレイヤーでに独自プロファイルの入力を受け取るための機構を実装すれば「2つの機器は同じプロファイルに対応していなければならない」という条件は充足するということになるものと思います。
要は何が言いたいかというと、**GRANBOARDの入力をGRANBOARDアプリ以外で受け取ることはできません。**
なおこれはGRANBOARD dashで試したものですが、恐らく上位モデルのGRANBOARD 2、GRANBOARD 3も同じだと思われます。
……とここまでdisみたいな感じで言ってきましたが、電子ダーツボードとしては普通に使える方だと思うので、普通に使う場合やれることはDARTSLIVE-200Sとそんなに違いはないです。

## あとがき
もともとダーツに興味があったところ、某YouTuberの動画の影響でそのYouTuberが動画中で行っていたルールをアプリとして実装したい！と思いBluetooth対応電子ボードに目を付けました。
すると、Bluetoothの知識を深めることができるようになったので、何がきっかけで新しいことを覚える機会があるかは、誰にもわからないものです。
しかし、興味があることを調べてみることは、プラスにならなくてもマイナスになることはないと思うので、皆さんも興味があることはすぐに調べてみると新しい知見があると思います！
……という一言で、本記事の締めとさせていただきます。