センサ値をBLEビーコンのアドバタイズパケットとして発信する方法(ソフトウェア編)【第4回】
こんにちは。ムセンコネクト三浦です。
前回の記事では「センサ搭載BLEビーコンのハードウェア構成」について解説しましたが、今回は「BLEビーコンのファームウェア」について解説します。
【連載企画】センサ搭載BLEビーコンと受信アプリの作り方【第1回】
こんにちは、ムセンコネクトCMOの清水です。(プロフィール紹介はこちら) ムセンコネクトは新しい連載企画「センサ搭載BLEビーコンと受信アプリの作り方」をスタートし…
センサ搭載BLEビーコンの作り方(ハードウェア編)【第3回】
こんにちは。ムセンコネクト三浦です。 「【連載企画】センサ搭載BLEビーコンと受信アプリの作り方」の第3回目をお届けします。 センサ搭載BLEビーコンのハードウェア構…
目次
概要・前提条件
今回はnRF5 SDKのビーコンのサンプルファームウェアをベースに、ムセンコネクトの「オープンセンササービス」を配信するファームウェアについて解説します。配信するセンサデータは、照度(データ種別:0x13)です。
BLEによるセンサデータ送信の仕組みとビーコンフォーマット「オープンセンササービス」の仕様解説【第2回】
こんにちは。ムセンコネクト三浦です。 今回は「【連載企画】センサ搭載BLEビーコンと受信アプリの作り方」の第2回目、BLEによるセンサデータ送信の仕組みとビーコンフ…
ビーコンのデモボード構成
構成 | 型番 | メーカー |
---|---|---|
DKボード | PCA10040(nRF52832) | Nordic Semiconductor |
照度センサ | BH1745NUC | ROHM Semiconductor |
ハードウェアの詳細はこちら
開発環境
IDE | Segger Embedded Studio v5.42a |
nRF5 SDK | nRF5_SDK_17.1.0_ddde560 |
ベースサンプル | https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.1.0/ble_sdk_app_beacon.html |
動作仕様
BLE関連
ベースサンプルのまま変更なしとしています。
項目 | 値 |
---|---|
アドバタイズPDUタイプ | ADV_NONCON_IND |
アドバタイズインターバル | 100ms |
アドバタイズパケットフォーマット
今回は配信するセンサデータが「照度(データ種別:0x13)のみ」であるため、フォーマットは下記の通りです。
Offset | Size | Field | Description | 備考 |
---|---|---|---|---|
0 | 1 | 0x0B | Length | |
1 | 1 | 0x16 | Service Device data type value | |
2 | 2 | 0xFCBE | Open Sensor Service | オープンセンササービスでは固定値0xFCBEを利用します |
4 | 1 | 0x01 | Data Schema Version | 現状は固定値0x01を利用します |
5 | 4 | 0xXXXXXXXX | 個体識別番号 | 4バイト固定 |
9 | 1 | 0x13 | データ種別=照度(2byte) | |
10 | 2 | 0xXXXX | 照度データ | 2バイト unsigned 単位:0.1lx |
照度センサ関連
項目 | 値 |
---|---|
通信方式 | I2C |
スレーブアドレス | 0x39(ADDR=1) |
測定周期(Measurement time) | 160ms |
測定値読み出し周期 | 1,000ms |
ソースコード解説
アドバタイズモジュールの初期化
次の関数でアドバタイズモジュールを以下のパラメータで初期化します。
- アドバタイズPDUタイプ:BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED (ADV_NONCON_IND)
- アドバタイズインターバル:NON_CONNECTABLE_ADV_INTERVAL(100ms)
- アドバタイズデータを格納する構造体(
m_adv_data
)のポインタ
static void advertising_init(void)
{
uint32_t err_code;
// Initialize advertising parameters (used when starting advertising).
memset(&m_adv_params, 0, sizeof(m_adv_params));
m_adv_params.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED;
m_adv_params.p_peer_addr = NULL; // Undirected advertisement.
m_adv_params.filter_policy = BLE_GAP_ADV_FP_ANY;
m_adv_params.interval = NON_CONNECTABLE_ADV_INTERVAL;
m_adv_params.duration = 0; // Never time out.
err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, &m_adv_params);
APP_ERROR_CHECK(err_code);
}
アドバタイズデータの生成・更新
次の配列でサービスデータの16bit UUID以降のデータを定義します。
#define DATA_SCHEMA_VERSION 0x01 /**< Reserved area. */
#define DEVICE_IDENTIFIER 0x11, 0x22, 0x33, 0x44 /**< Temporary value. */
#define DATA_TYPE_ILLUMINANCE 0x13 /**< Illuminance (unit:0.1lux). */
#define ILLUMINANCE_LUX 0x00, 0x00 /**< Illuminance value. */
static uint8_t m_beacon_info[] =
{
DATA_SCHEMA_VERSION,
DEVICE_IDENTIFIER,
DATA_TYPE_ILLUMINANCE,
ILLUMINANCE_LUX,
};
次の関数で、新しい照度値でアドバタイズデータを再生成し、アドバタイズモジュールが参照する構造体( m_adv_data
)を更新します。
本関数実行後に配信されるアドバタイズから、新しいアドバタイズデータが適用されます。
static void advertising_update(uint16_t illuminance_0_1lux)
{
uint32_t err_code;
ble_advdata_t advdata;
m_beacon_info[6] = (uint8_t)((illuminance_0_1lux >> 8) & 0x00FF);
m_beacon_info[7] = (uint8_t)((illuminance_0_1lux >> 0) & 0x00FF);
ble_advdata_service_data_t service_data;
service_data.service_uuid = OPEN_SENSOR_SERVICE;
service_data.data.p_data = &m_beacon_info[0];
service_data.data.size = sizeof(m_beacon_info);
// Build and set advertising data.
memset(&advdata, 0, sizeof(advdata));
advdata.p_service_data_array = &service_data;
advdata.service_data_count = 1;
err_code = ble_advdata_encode(&advdata, m_adv_data.adv_data.p_data, &m_adv_data.adv_data.len);
APP_ERROR_CHECK(err_code);
}
今回解説したBLEビーコンのファームウェアのソースコードは下記リンクからダウンロード可能です。
これでBLEビーコンのハードウェア、ソフトウェア解説は終了です。
最終回となる次回はBLEビーコンが発信したセンサ値を受信するためのWindowsアプリについて解説します。
Bluetooth APIを用いたWindowsアプリでのBLEアドバタイズパケットの受信方法【第5回】
こんにちは。ムセンコネクト三浦です。 前回の記事で「センサ搭載BLEビーコン」が完成しました。最終回となる今回は「WindowsパソコンでBLEスキャンを行い、ビーコンが…