SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

.NET nanoFrameworkとESP32でIoTプログラミング

センサーデータをブロードキャストしよう! .NET nanoFrameworkとESP32でIoTプログラミング

.NET nanoFrameworkとESP32でIoTプログラミング 第7回

ESP32のアプリケーション(2)

Bluetooth Low Energy(BLE)でブロードキャスト通信

 BLEのブロードキャスト通信とは、ペリフェラル(データを送信するデバイス)が不特定多数に一方的に送信するものです。これは、デバイスがいわゆる接続待ちの状態になっていることを伝える信号です。

 この仕組みのことを「アドバタイズ」と呼びます。アドバタイズ信号を受けて、セントラル(データを受信する側)が周囲のデバイスを認識できます。

 今回は1対1の通信ではなく、このアドバタイズを利用して、センサーの測定値を送信するようにしました。アドバタイズであれば、複数の環境からデータを確認できます。

アドバタイズの設定

 .NET nanoFrameworkで、BLEのアドバタイズを行うには、BluetoothLEAdvertisementPublisherクラスを利用します。アドバタイズの設定を行うInitializeAdvertiserメソッドは、次のようになります。

[リスト3]Program.csの一部
// アドバタイズ信号を送信するパブリッシャーオブジェクト
private static BluetoothLEAdvertisementPublisher _publisher;

public class Program
{
    private static void InitializeAdvertiser()
    {
        // アドバタイズ信号のペイロードの設定(1)
        BluetoothLEAdvertisement advertisement = new()
        {
            LocalName = "BME680"
        };

        // パブリッシャーオブジェクトの作成(2)
        _publisher = new(advertisement);

       // アドバタイズの開始(3)
        _publisher.Start();
    } 
    ~中略~
}

 まず、アドバタイズ信号のペイロード部分(制御情報を除いたデータ本体)は、BluetoothLEAdvertisementオブジェクトを利用して設定します(1)。ここでは、LocalNameプロパティを設定しています。

 Local Nameはデバイスの名称となるもので、今回はこの名称を利用してデバイスを判別します。この段階では、Local Name以外は何も設定せずに、パブリッシャーオブジェクトを作成して(2)、アドバタイズを開始します(3)。

センサーデータを送信する

 ReadSensorDataデリゲートから呼び出される、センサーの測定値を送信するSendSensorDataメソッドは、次のようになります。

 このメソッドのなかで、アドバタイズ信号のペイロードを更新しています。

[リスト4]Program.csの一部
private static void SendSensorData(double temp, double humidity,  double pressure, double gas)
{
    // データをJSON形式に変換(1)
    var jsonData = 
        $"{{\"d\":[{temp:F1},{humidity:F1},{pressure:F0},{gas:F0}]}}";

    // 既存のManufacturerDataを更新(2)
    DataWriter writer = new();

    writer.WriteString(jsonData);

    _publisher.Advertisement.ManufacturerData.Clear();
    _publisher.Advertisement.ManufacturerData.Add(
        new BluetoothLEManufacturerData(0xfffe, writer.DetachBuffer() 
    ));

    // アドバタイズをいったん停止して再開する(3)
    _publisher.Stop();
    _publisher.Start();
}

 SendSensorDataメソッドでは、BME680の測定値それぞれが引数として設定されています。最初にこの測定値をJSON文字列に変換します。C#では、オブジェクトをJSONに変換するには、System.Text.Json名前空間のクラスを利用するのが一般的です。

 ただここでは、JSON文字列をできる限り短くするために、文字列補間を利用して、直接次のJSON文字列を作成しています。

{"d": [27.9, 45.8,1010,250]}

 このJSON文字列は、dという文字をキーとした数値(観測値)の配列データを意味するものです。

 JSON文字列を短くする理由は、アドバタイズでの送信パケットのデータサイズに制限があるからです。アドバタイズ信号の全体のペイロードは最大31バイトであり、そのなかで、任意に設定できる領域であるManufacturer Specific Dataも収まるようにしなければなりません。

 Manufacturer Specific Data(コードでは、ManufacturerDataプロパティ)は、先頭の2バイトに企業識別子と呼ばれる部分があり、その後が任意に設定できるデータ領域です。ここでは、BluetoothLEManufacturerDataオブジェクトを利用して、企業識別子の0xfffeと、JSON文字列を設定しています(2)。

 なお、BluetoothLEManufacturerDataでは、送信データをBufferオブジェクトで指定する必要があるため、DataWriterクラスを利用しています。

 ManufacturerDataの更新後、アドバタイズをいったん停止して再開します(3)。

JSON文字列以外の方法

 JSON文字列では、可読性はよいものの、長くて可変長のデータとなります。限られた領域に納めるには、測定値をそのままバイナリで格納するほうがよい場合もあります。

 C#では、float型は4バイト長なので、4つの測定値であれば16バイトで済みます。精度もfloatで十分でしょう。

 測定値をflot型の値として格納する場合は、DataWriter.WriteStringの代わりに、WriteSingleメソッドを用います。

// 測定値をflot型の値で格納する
writer.WriteSingle((float)temp);
writer.WriteSingle((float)humidity);
writer.WriteSingle((float)pressure);
writer.WriteSingle((float)gas);

 各観測値を、float型の4バイトで送信できます。なお、バイト配列からfloat型に変換するには、BitConverter.ToSingleメソッドを用います。

動作確認

 今回のアプリのMainメソッドは、次のようになります。

[リスト5]Program.csの一部
public static void Main()
{
    InitializeAdvertiser();         // アドバタイズ設定
    InitializeBme680Sensor();   // センサー設定
    Thread.Sleep(Timeout.Infinite);
}

 動作の確認は、Android版の「LightBlue」アプリを利用しました。BME680という名前で、アドバタイズ信号が確認できます。Manufacturer Specific Dataデータには、JSON文字列が文字コードの16進数で表示されています。

データの受信
データの受信

次のページ
Wi-Fi経由でAmbientに送信する

この記事は参考になりましたか?

.NET nanoFrameworkとESP32でIoTプログラミング連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/21307 2025/04/14 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー