C#でBLE(Bluetooth Low Energy)制御をマスター!初心者向け開発入門
生徒
「C#を使って、Bluetoothで動く機械やセンサーと通信する方法ってありますか?」
先生
「C#とBLEという技術を組み合わせると、スマートフォンやパソコンから身の回りのデバイスを自由に操作できるようになりますよ。」
生徒
「BLEって何ですか?プログラミング未経験でも理解できますか?」
先生
「BLEは省電力で動く無線通信技術のことです。仕組みから順を追って解説しますね。」
1. BLE(Bluetooth Low Energy)とは何か
BLEは、近距離でデータをやり取りするための無線通信規格です。「Low Energy」という名前の通り、非常に少ない消費電力で通信できるのが特徴です。例えば、スマートウォッチが常にスマートフォンと連携していたり、温度センサーがずっと動いていたりするのは、このBLEの仕組みのおかげです。C#を使ってこの技術を扱うことで、自作のIoT(モノのインターネット)デバイスを作ることができます。
IoTとは、本来インターネットに繋がっていなかった家電やセンサーを、通信機能を持たせて便利にする技術のことです。BLEデバイス同士は、決まった手順で「話しかけ」たり「返事」をしたりして通信します。
2. C#によるBLE開発の基本
Windows環境でC#を使ってBLEを制御する場合、Windowsが標準で提供している「Windows.Devices.Bluetooth」という機能を使います。これを使うことで、Bluetoothアダプタを通じて近くにあるデバイスを探したり、データを受け取ったりできます。
プログラム開発には「Visual Studio」というツールを使います。これは、プログラミングに必要な道具がすべて揃った大きなワークスペースのようなものです。まずは、デバイスを探すための準備コードを見てみましょう。
using Windows.Devices.Bluetooth.Advertisement;
var watcher = new BluetoothLEAdvertisementWatcher();
watcher.Received += (s, e) =>
{
Console.WriteLine($"デバイスを発見: {e.BluetoothAddress}");
};
watcher.Start();
3. デバイスとの接続とサービスの検索
BLEの世界では、デバイスの中に「サービス」と「キャラクタリスティック」という箱があります。「サービス」は機能のまとまり(例えば、心拍数センサー機能など)で、「キャラクタリスティック」はその中の具体的なデータ(今の心拍数の値など)が入っている場所です。接続するには、まずこれらの場所を探す必要があります。
接続は、デバイスを見つけた後に行います。接続するための専用のクラスを作成し、デバイスの情報を取得します。
using Windows.Devices.Bluetooth;
BluetoothLEDevice device = await BluetoothLEDevice.FromBluetoothAddressAsync(address);
Console.WriteLine($"デバイス名: {device.Name}");
4. データの読み取りと書き込み
接続が完了したら、いよいよデータを送受信します。センサーの値を読み取る場合は「Read」、LEDを点灯させたいときなどは「Write」という命令を送ります。この作業は「特性(Characteristic)」に対して行います。
ここでは、特定のサービスからデータを読み取って画面に表示する流れをプログラムにしてみましょう。データはそのままでは読めないので、型を変換して扱うのがポイントです。
var result = await characteristic.ReadValueAsync();
var reader = Windows.Storage.Streams.DataReader.FromBuffer(result.Value);
byte[] data = new byte[reader.UnconsumedBufferLength];
reader.ReadBytes(data);
Console.WriteLine($"読み取った値: {BitConverter.ToString(data)}");
5. イベント通知を受け取る方法
センサーの値が変わったときに、プログラム側に自動で知らせてほしい場合があります。これを「通知(Notification)」と呼びます。自分で何度も「値は変わった?」と聞かなくても、デバイス側から「値が変わりましたよ」と教えてくれる仕組みです。
通知設定を有効にすると、特定の関数(イベントハンドラ)が自動的に呼び出されるようになります。
characteristic.ValueChanged += (sender, args) =>
{
Console.WriteLine("値が更新されました");
};
await characteristic.WriteClientCharacteristicConfigurationDescriptorAsync(
GattClientCharacteristicConfigurationDescriptorValue.Notify);
6. トラブルシューティングと注意点
BLE開発でよくある失敗は、「許可設定」を忘れることです。Windowsのアプリケーション設定で「Bluetoothを使用する」という項目にチェックを入れておかないと、どれだけ正しいプログラムを書いても動作しません。また、デバイスとの距離が離れすぎていると通信が切れてしまうこともあります。
また、C#で非同期処理(async/await)を正しく扱うことも大切です。Bluetoothの通信は時間がかかるため、処理が終わるまでプログラムが止まらないようにする工夫が必要です。非同期処理とは、裏側で別の作業を進めながら、終わったら続きを行う技術のことです。これを使うことで、画面が固まらないスムーズなアプリケーションを作ることができます。