ESP8266 random() – przykład kodu, inicjalizacja randomSeed, TRNG, ets_random, Arduino IDE

Pytanie

esp8266 random() przykład kodu

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Najprostszy przykład użycia funkcji random() na ESP8266 (Arduino IDE) przedstawiono poniżej.
  • Generator należy raz zainicjalizować funkcją randomSeed(), np. szumem z pinu A0 lub licznikiem micros().
/*
 *  ESP8266 – podstawowy przykład PRNG
 */
void setup() {
  Serial.begin(115200);
  // Inicjalizacja „ziarna” (entropia z pływającego wejścia + licznik µs)
  randomSeed(analogRead(A0) ^ micros());
  Serial.println("\n--- PRNG – demo ---");
}
void loop() {
  long v1 = random(100);        // 0‒99
  long v2 = random(10, 51);     // 10‒50
  long kostka = random(1, 7);   // 1‒6
  Serial.printf("0-99  : %ld\n", v1);
  Serial.printf("10-50 : %ld\n", v2);
  Serial.printf("Kostka: %ld\n\n", kostka);
  delay(2000);
}

Kluczowe punkty
random(max) → 0…max-1; random(min,max) → min…max-1
• Bez jednorazowego randomSeed() każdorazowy restart da identyczną sekwencję.
• Funkcja jest pseudolosowa – nie stosować do kryptografii.


Szczegółowa analiza problemu

1. PRNG w core Arduino

Wszystkie płyty ESP8266 dziedziczą po Arduino funkcje:

void   randomSeed(unsigned long seed);
long   random(long max);
long   random(long min, long max);

Pracują one na 32-bitowym liniowym kongruentnym generatorze (LCG).

Ziarno (seed) – pojedyncza wartość 32-bitowa – definiuje całą przyszłą sekwencję.
Jeżeli seed będzie stały, wynik również.

Typowe źródła entropii w praktyce:
• analogRead(A0) z niepodłączonym przewodem,
micros() przy pierwszym wejściu do setup(),
• fragmenty MAC-a modułu (WiFi.macAddress()),
• sumy kontrolne RAM-u RTC.

Przykładowy, „mocniejszy” sposób:

unsigned long seed = 0;
for (uint8_t i = 0; i < 32; ++i) {          // 32 bity
  seed |= (analogRead(A0) & 1) << i;
  delay(1);
}
seed ^= micros();
randomSeed(seed);

2. Sprzętowe źródła losowości w ESP8266

ESP8266 zawiera wewnętrzny TRNG, ale nie jest on owinięty metodą ESP.random() (ta nazwa występuje jedynie w ESP32).
Dostęp do TRNG uzyskuje się poprzez funkcję SDK:

extern "C" {
  #include <esp8266/ets_sys.h>   // udostępnia ets_random()
}
uint32_t hwRnd = ets_random();   // każdy wywołanie ≈ prawdziwy los

Wewnętrznie wykorzystywany jest szum RF; jakość rośnie, gdy moduł ma włączone Wi-Fi (tryb STATION lub AP).

Alternatywa „na skróty” – biblioteka ESP8266TrueRandom (GitHub: marvinroger/ESP8266TrueRandom), która łączy kilka odczytów TRNG i dodatkowej entropii, dostarczając prostą funkcję:

#include <ESP8266TrueRandom.h>
uint32_t x = ESP8266TrueRandom.random();    // 0…2^32-1

3. Kiedy które podejście?

Zastosowanie Wystarcza PRNG Wymagany TRNG (ets_random / TrueRandom)
Efekty LED, gry, próby losowe
Losowe opóźnienia w RF (back-off)
Tokeny sesji, nonce, klucze, hasła
Symulacja czujników

Aktualne informacje i trendy

• Od wersji core ESP8266 3.x funkcja ets_random() jest stabilna i szybka (≈ 40 ns/4 B).
• Niektórzy twórcy bibliotek (np. MQTT-TLS) domyślnie pobierają entropię właśnie z TRNG.
• W testach (2024) średnia entropia ets_random() oceniana entropicznie wynosi ≥ 7.98 bitów/byte.
• Coraz popularniejsze są zewnętrzne układy TRNG (np. Microchip ATECC608), ale na ESP8266 zwykle wystarcza wbudowany generator.


Wspierające wyjaśnienia i detale

random() zwraca typ long, czyli signed 32-bit (-2 147 483 648…2 147 483 647).
ets_random() zwraca uint32_t, a zakres można dociąć:

uint32_t rnd = ets_random() % 1000;   // 0–999

• Jeśli potrzebujesz liczby zmiennoprzecinkowej z przedziału 0–1:

float frnd = (float)ets_random() / 4294967295.0f;

Aspekty etyczne i prawne

• Wykorzystanie słabego generatora do ochrony danych może narazić użytkowników na ataki (np. podsłuch, replay).
• W aplikacjach medycznych/agro z elementem losowości (np. dawkowanie, losowe testy) należy wykazać powtarzalność i/lub dowieść jakości źródła losowości w dokumentacji zgodnie z ISO 13485 lub FDA 21 CFR 820.
• W UE szyfrowanie i generowanie kluczy podlega ogólnym przepisom RODO – klucz z kiepskiego RNG = potencjalny wyciek danych osobowych.


Praktyczne wskazówki

  1. Do większości projektów makerskich seeding PRNG + random() jest wystarczający.
  2. Jeżeli włączasz Wi-Fi, wykorzystaj ets_random() – to „prawie za darmo”.
  3. Nie łącz pinu A0 z masą lub VCC podczas zbierania szumu – wartość będzie stała.
  4. Do testów losowości możesz użyć pakietu dieharder (próbki przez Serial).
  5. Wersja release core ESP8266 ≥ 3.1: ets_random() jest thread-safe w RTOS SDK.

Ewentualne zastrzeżenia lub uwagi dodatkowe

ets_random() traci jakość, gdy RF jest wyłączone (WiFi.forceSleepBegin()).
• W starych wersjach core 2.x wywołanie os_random()/ets_random() wymagało #include <osapi.h>; aktualnie wystarczy esp8266/ets_sys.h.
• Biblioteka ESP8266TrueRandom dodaje ~2 kB FLASH – na najmniejszych modułach może mieć znaczenie.


Sugestie dalszych badań

• Porównaj statystyki PRNG (random()) vs. TRNG (ets_random()) narzędziem NIST STS.
• Zaimplementuj własny akumulator entropii łączący szum ADC, TRNG i licznik RTC.
• Sprawdź nowy projekt Espressifa „Ai-Thinker RNG Co-Processor” – nieduży układ I²C z certyfikatem CAVP.
• Jeżeli planujesz migrację na ESP32-C3/-S3, od razu użyj esp_random() (sprzęt RNG AES-CTR-DRBG).


Krótkie podsumowanie

  1. random() + randomSeed() = szybki, przenośny PRNG dla prostych zadań.
  2. Prawdziwą losowość na ESP8266 dostarcza ets_random() lub biblioteka ESP8266TrueRandom.
  3. Jakość seeda decyduje o nieprzewidywalności PRNG; RF TRNG eliminuje ten problem.
  4. Do zastosowań kryptograficznych i bezpieczeństwa zawsze wybieraj TRNG.
  5. Pamiętaj o aktualizacji środowiska (core ≥ 3.0), by mieć najnowsze poprawki RNG i Wi-Fi.

Oceń odpowiedź:

Zadaj dodatkowe pytanie Sztucznej Inteligencji

Czekaj (1min)...
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.