Skip to content

Device Configuration Guide

Amir Nathoo edited this page Dec 8, 2024 · 1 revision

Overview

The DeviceBuilder provides a fluent interface to configure RadioMesh devices with different capabilities. This guide shows how to create and configure devices based on actual test examples.

Basic Device Creation

DeviceBuilder builder;
std::array<byte, DEV_ID_LENGTH> device_id = {0x11, 0x11, 0x11, 0x11};

IDevice* device = builder.start()
                        .build("MyDevice", device_id);

Adding Capabilities

Radio Configuration

// Using preset configurations for Heltec WiFi LoRa 32 V3
const LoraRadioParams radioParams = LoraRadioPresets::HELTEC_WIFI_LORA_32_V3;

device = builder.start()
                .withLoraRadio(radioParams)
                .build("MyDevice", device_id);

// Custom radio configuration
const LoraRadioParams customParams = LoraRadioParams(
    PinConfig(8, 12, 13, 14),  // ss, di1, rst, di0
    915.0,                     // frequency band MHz
    20,                        // tx power
    125.0,                     // bandwidth
    8,                         // spreading factor
    0,                         // gain
    true                       // private network
);

Display Support

// OLED display configuration
OledDisplayParams displayParams = OledDisplayParams(
    SCL_OLED,      // clock pin
    SDA_OLED,      // data pin  
    RST_OLED,      // reset pin
    RM_FONT_SMALL  // font size
);

device = builder.start()
                .withOledDisplay(displayParams)
                .build("MyDevice", device_id);

WiFi Capabilities

// As a client
WifiParams wifiParams = {"MyNetwork", "MyPassword"};
device = builder.start()
                .withWifi(wifiParams)
                .build("MyDevice", device_id);

// As an access point
WifiAccessPointParams apParams = {
    "WarpPortal",    // SSID
    "firefly2424",   // Password
    "192.168.20.1"   // IP Address
};

device = builder.start()
                .withWifiAccessPoint(apParams)
                .build("MyDevice", device_id);

Message Handling

void RxCallback(const RadioMeshPacket *packet, int err) {
    // Handle received packets
}

device = builder.start()
                .withRxPacketCallback(RxCallback)
                .build("MyDevice", device_id);

Security

std::vector<byte> key = { 
    0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
    0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
    0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
    0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
};

std::vector<byte> iv = {
    0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
    0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
};

SecurityParams securityParams(key, iv, SecurityMethod::AES);
device = builder.start()
                .withSecureMessaging(securityParams)
                .build("MyDevice", device_id);

Complete Example

// Full-featured device based on test_DeviceBuilder.cpp
device = builder.start()
                .withLoraRadio(radioParams)
                .withWifi(wifiParams)
                .withWifiAccessPoint(apParams)
                .withRelayEnabled(true)
                .withRxPacketCallback(RxCallback)
                .withSecureMessaging(securityParams)
                .withOledDisplay(displayParams)
                .build("MyDevice", device_id, MeshDeviceType::STANDARD);

Device Types

  • MeshDeviceType::STANDARD: Regular mesh node that can send/receive messages and optionally relay
  • MeshDeviceType::HUB: Network coordinator with additional capabilities including device inclusion
  • MeshDeviceType::UNKNOWN: Default type before configuration

Storage Support

ByteStorageParams storageParams(128);  // 128 bytes of storage
device = builder.start()
                .withStorage(storageParams)
                .build("MyDevice", device_id);

See Also