Microprocessor snelst verbinden met wifi

Door Thijsmans op vrijdag 26 april 2019 16:30 - Reacties (1)
Categorie: -, Views: 1.460

In mijn vorige blog maakte ik een temperatuur- en luchtvochtigheidssensor op een batterij. Daarbij beschreef ik dat het met Espruino niet mogelijk was om op voorhand een statisch IP-adres in te stellen om de langdurige DHCP-onderhandelingen tussen microprocessor en access point te omzeilen. Na het schrijven van de blog ben ik ten rade gegaan op het Espruino forum, waar gebruiker @MaBe mij van waardevol advies voorzag. Omdat ik vermoed dat het ook buiten Espruino om (Arduino, Lua, etc) bruikbaar is, deel ik hierbij mijn bevindingen van een benchmark.

MaBe schreef op het Espruino-forum:
>> DHCP is terribly slow and takes around 4 seconds

No, scan and connect to access point is the time consumer, not DHCP.

Using channel and bssid in Wifi.connect() speeds this up to one sec, watch issue #1640 and #1595.
[...]
@Thijsmans: If you like I can share my latest build which include this fixes via github , just let me know, so another person can run some test with it - what do you think?
Goed, we moeten dus een BSSID en een kanaal instellen. Het BSSID is het MAC-adres van het access point. Je zou verwachten dat dit alleen voordelen biedt als meerdere AP's hetzelfde SSID uitzenden: bij één AP is een BSSID immers niet méér onderscheidend. En toch wijst de praktijk uit dat het uitmaakt :) Omdat mijn AP wisselende kanalen gebruikt, test ik niet de invloed van het instellen van een vast kanaal.

Met de nieuwste firmware heb ik een benchmark gedraaid. Daarbij gebruikte ik deze code:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    var time_start = getTime();
    var wifi = require("Wifi");

    var random_octet = Math.floor( Math.random() * 51 ) + 100;

    wifi.setIP( { 
            ip: '192.168.1.' + random_octet, 
            gw: '192.168.1.1', 
            netmask: '255.255.255.0',
        }, function () {

            wifi.connect( 'INSERT_SSID', {
                    password:'INSERT_PASSWD',
                    bssid: 'INSERT_AP_MAC_ADDR',
                }, function (e) { 
                    if( e ) 
                        return false;

                    time_connected = getTime() - time_start;

                    console.log( "IP: " + wifi.getIP().ip + "; Connected in: " + time_connected + " seconds" );

                    setTimeout( function () { 
                            require("ESP8266").reboot(); 
                        }, 5000 );
                });
        });


Ik testte vier scenario's
  1. Statisch IP met BSSID (code hierboven);
  2. Statisch IP zonder BSSID (comment regel 14);
  3. DHCP met BSSID (comment regels 4 tot en met 10 en 27);
  4. DHCP zonder BSSID (comment regels 4 tot en met 10, 14 en 27).
De resultaten van 20 iteraties liegen er niet om:

https://tweakers.net/ext/f/bEzhDi6NvNfxUuoaX05lqDp2/full.png

Het snelste scenario (statisch IP met BSSID) leverde wel een aantal foutmeldingen op. De microprocessor bleek vervolgens wel met de wifi verbonden, maar dat is dus wel iets om rekening mee te houden in je code.

In de komende dagen zal ik dus ook het javascript voor mijn batterij-gevoede DHT22-sensor updaten :)

Volgende: Wemos DHT22-shield werkend maken 02-11 Wemos DHT22-shield werkend maken
Volgende: ESP8266 deep-sleep met Espruino 04-'19 ESP8266 deep-sleep met Espruino

Reacties


Door Tweakers user jandirks, vrijdag 3 mei 2019 16:53

Leuke test! Goed om te weten

Reageren is niet meer mogelijk