Arduino で Bluetooth シリアル変換モジュール(HC-05)を使う | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6819
では、Windows ストアアプリを使って Bluetooth の RFCOMM を利用したわけですが、これってストアアプリとか Windows Phone からしか出来ないのか?と思っていたのですが、コンソールからもできました。ということは、Windows フォームや WPF からもできます。
デスクトップからWinRTを参照させる
デスクトップアプリからWinRT APIを使用する – 酢ろぐ!
http://blog.ch3cooh.jp/entry/20121204/1354596483
デスクトップ アプリからのWinRT API利用 | ++C++; // 未確認飛行 C ブログ
https://ufcpp.wordpress.com/2012/09/18/%e3%83%87%e3%82%b9%e3%82%af%e3%83%88%e3%83%83%e3%83%97-%e3%82%a2%e3%83%97%e3%83%aa%e3%81%8b%e3%82%89%e3%81%aewinrt-api%e5%88%a9%e7%94%a8/
そうそう、デスクトップアプリから WinRT を参照させれば RfcommDeviceService クラスが使えるかもしれない。ということで上記を参考にして設定をします。
TargetPlatformVersion を 8.1 にして挿入します。8.0 だとデバイス関係がないので「8.1」で。
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9B7AD65D-3475-4D63-B5AC-6AB73477AC30}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>BluetoothConsole</RootNamespace>
<AssemblyName>BluetoothConsole</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetPlatformVersion>8.1</TargetPlatformVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
Windows.winmd を追加します。
System.Runtime.WindowsRuntime.dll を参照設定します。
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5.1\System.Runtime.WindowsRuntime.dll
Windows ストアアプリ版のコードを書き換えて、コンソールアプリで呼び出せるようにします。ストアアプリではマニフェストの追加が必要ですが、デスクトップアプリの場合は必要ありません。アクセス権が自由なので、これだと作りやすいですよね(配布はしづらいですが)。
class Program
{
static void Main(string[] args)
{
new Program().mainAsync().Wait();
}
Guid serviceGuid = Guid.Parse("00001101-0000-1000-8000-00805f9b34fb");
RfcommDeviceService rfcommService;
StreamSocket socket;
DataWriter writer;
DataReader reader;
async Task mainAsync()
{
/// 接続
string selector = RfcommDeviceService.GetDeviceSelector(RfcommServiceId.FromUuid(serviceGuid));
DeviceInformationCollection collection = await DeviceInformation.FindAllAsync(selector);
if (collection.Count > 0)
{
try
{
DeviceInformation info = collection.First();
rfcommService = await RfcommDeviceService.FromIdAsync(info.Id);
socket = new StreamSocket();
await socket.ConnectAsync(rfcommService.ConnectionHostName, rfcommService.ConnectionServiceName);
writer = new DataWriter(socket.OutputStream);
reader = new DataReader(socket.InputStream);
Console.WriteLine("{0} 接続しました", rfcommService.ConnectionHostName );
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("デバイスが見つかりませんでした");
return;
}
// 試しに最初のキーを送る
SendCommand("start");
while (true)
{
// コマンド待ち受けfs
string text = Console.ReadLine();
if (text == "quit" || text == "end") break;
SendCommand(text);
}
/// 切断する
writer.Dispose();
reader.Dispose();
}
async void SendCommand(string text)
{
Console.WriteLine("W:" + text);
// 8文字にして送る
if (text.Length < 8)
{
text = text.PadRight(8, '*');
}
else
{
text = text.Substring(0, 8);
}
writer.WriteString(text);
await writer.StoreAsync();
// そのまま受信待ち
var res = await reader.LoadAsync(8);
var text2 = reader.ReadString(8);
Console.WriteLine("R:" + text2 );
}
}
お次は、iPhone から…と思っていたのですが、調べていくと iPhone からは RFCOMM が使えないことが判明。正確には MFi というのを Apple から取得して作成すれば使えるようになるそうなのですが、個人アプリレベルでは無理話。そうなると Bluetooth LE を使っての接続が必要になるのです。
Arudino に BLE のシールドも無くはないのですが結構高い。2,3台作るとなると結構な値段になるし、ちょっと手が出しにくい(まあ、1個だけは RedBearLab に注文して買うんですけど)。このあたりは、コントローラー自体が iPhone である必要もないので、RFCOMM をそのまま使うか、WiFi でさっくり作ってテストするかって感じですかね。ちょっと思案中。
Xamarin.iOS で BLE はやっておきたいので、これはまた別途。iPhone からノートPCのUSB付けた Bluetooth 4.0 で実験すればよいので。



