esp8266 random() przykład kodu
random()
na ESP8266 (Arduino IDE) przedstawiono poniżej. 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.
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);
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
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 | ✔ |
• 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.
• 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;
• 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.
random()
jest wystarczający. ets_random()
– to „prawie za darmo”. dieharder
(próbki przez Serial). ets_random()
jest thread-safe w RTOS SDK.• 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.
• 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).
random()
+ randomSeed()
= szybki, przenośny PRNG dla prostych zadań. ets_random()
lub biblioteka ESP8266TrueRandom
.