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 に対してアドバタイズする(特定の相手を対象にしない)
- 接続要求を受け付ける
- 追加情報を含めてスキャン要求に応答する