Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

BLE モジュール

まずは ble モジュールを作成しましょう。

ble/mod.rs ファイル

ここでは、シンプルな関数を定義します。この関数は softdevice_config(これはこの後 config.rs ですぐに定義します)を呼び出して SoftDevice の設定を取得します。次に、その設定を使って SoftDevice を有効化します。

#![allow(unused)]
fn main() {
pub mod adv;
pub mod config;

use crate::ble::config::softdevice_config;

use {defmt_rtt as _, panic_probe as _};

use nrf_softdevice::Softdevice;

pub fn get_soft_device() -> &'static mut Softdevice {
    let sd_config = softdevice_config();
    Softdevice::enable(&sd_config)
}

}

これにより、Softdevice 構造体のインスタンスが得られます。後で main 関数から get_soft_device() を呼び出し、そのインスタンスに対してさらに処理を行います。

ble/adv.rs ファイル

次に、アドバタイズデータを準備するためのモジュールを作成します。アドバタイズの背後にある中核的な考え方については、すでに GAP セクション で説明しました。

アドバタイズペイロードの準備には LegacyAdvertisementBuilder を使用します。ここでは、デバイスを discoverable にするためのフラグを設定します。たとえば、接続されるまでアドバタイズを継続するために GeneralDiscovery を使い、Bluetooth Classic をサポートしていないことを示すために LE_Only を使います。

また、central デバイスにサポート内容を知らせるため、BATTERY サービスの 16 ビット UUID も追加します。DEVICE_NAME は、後で config.rs ファイルで定義する定数("implRust")です。

#![allow(unused)]
fn main() {
use crate::ble::config::DEVICE_NAME;

use {defmt_rtt as _, panic_probe as _};

use nrf_softdevice::ble::{
    advertisement_builder::{
        Flag, LegacyAdvertisementBuilder, LegacyAdvertisementPayload, ServiceList, ServiceUuid16,
    },
    peripheral,
};

static ADV_DATA: LegacyAdvertisementPayload = LegacyAdvertisementBuilder::new()
    .flags(&[Flag::GeneralDiscovery, Flag::LE_Only])
    .services_16(ServiceList::Complete, &[ServiceUuid16::BATTERY])
    .full_name(DEVICE_NAME)
    .build();

static SCAN_DATA: [u8; 0] = []; 

pub fn get_adv() -> peripheral::ConnectableAdvertisement<'static> {
    peripheral::ConnectableAdvertisement::ScannableUndirected {
        adv_data: &ADV_DATA,
        scan_data: &SCAN_DATA,
    }
}
}

最後に、peripheral::ConnectableAdvertisement を使って ScannableUndirected アドバタイズタイプを返します。これは、私たちのデバイスが次のように振る舞うことを意味します。

  • 近くにいる任意の central に対してアドバタイズする(特定の相手を対象にしない)
  • 接続要求を受け付ける
  • 追加情報を含めてスキャン要求に応答する