Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
4fead4a4
Commit
4fead4a4
authored
Oct 04, 2016
by
Johny Mattsson
Browse files
More WiFi module work.
Station connect/disconnect/scan, plus event handling via wifi.on().
parent
233bdc63
Changes
4
Hide whitespace changes
Inline
Side-by-side
components/modules/wifi.c
View file @
4fead4a4
...
@@ -35,10 +35,220 @@
...
@@ -35,10 +35,220 @@
#include "lextra.h"
#include "lextra.h"
#include "esp_wifi.h"
#include "esp_wifi.h"
#include "wifi_common.h"
#include "wifi_common.h"
#include "nodemcu_esp_event.h"
#include <string.h>
#include <string.h>
typedef
void
(
*
fill_cb_arg_fn
)
(
lua_State
*
L
,
const
system_event_t
*
evt
);
typedef
struct
{
const
char
*
name
;
system_event_id_t
event_id
;
fill_cb_arg_fn
fill_cb_arg
;
}
event_desc_t
;
// Forward declarations
static
void
on_event
(
const
system_event_t
*
evt
);
static
void
sta_conn
(
lua_State
*
L
,
const
system_event_t
*
evt
);
static
void
sta_disconn
(
lua_State
*
L
,
const
system_event_t
*
evt
);
static
void
sta_authmode
(
lua_State
*
L
,
const
system_event_t
*
evt
);
static
void
sta_got_ip
(
lua_State
*
L
,
const
system_event_t
*
evt
);
static
void
ap_staconn
(
lua_State
*
L
,
const
system_event_t
*
evt
);
static
void
ap_stadisconn
(
lua_State
*
L
,
const
system_event_t
*
evt
);
static
void
ap_probe_req
(
lua_State
*
L
,
const
system_event_t
*
evt
);
static
void
empty_arg
(
lua_State
*
L
,
const
system_event_t
*
evt
)
{}
static
const
event_desc_t
events
[]
=
{
{
"sta_start"
,
SYSTEM_EVENT_STA_START
,
empty_arg
},
{
"sta_stop"
,
SYSTEM_EVENT_STA_STOP
,
empty_arg
},
{
"sta_connected"
,
SYSTEM_EVENT_STA_CONNECTED
,
sta_conn
},
{
"sta_disconnected"
,
SYSTEM_EVENT_STA_DISCONNECTED
,
sta_disconn
},
{
"sta_authmode_changed"
,
SYSTEM_EVENT_STA_AUTHMODE_CHANGE
,
sta_authmode
},
{
"sta_got_ip"
,
SYSTEM_EVENT_STA_GOT_IP
,
sta_got_ip
},
{
"ap_start"
,
SYSTEM_EVENT_AP_START
,
empty_arg
},
{
"ap_stop"
,
SYSTEM_EVENT_AP_STOP
,
empty_arg
},
{
"ap_sta_connected"
,
SYSTEM_EVENT_AP_STACONNECTED
,
ap_staconn
},
{
"ap_sta_disconnected"
,
SYSTEM_EVENT_AP_STADISCONNECTED
,
ap_stadisconn
},
{
"ap_probe_req"
,
SYSTEM_EVENT_AP_PROBEREQRECVED
,
ap_probe_req
}
};
#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0]))
static
int
event_cb
[
ARRAY_LEN
(
events
)];
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_STA_START
,
on_event
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_STA_STOP
,
on_event
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_STA_CONNECTED
,
on_event
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_STA_DISCONNECTED
,
on_event
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_STA_AUTHMODE_CHANGE
,
on_event
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_STA_GOT_IP
,
on_event
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_AP_START
,
on_event
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_AP_STOP
,
on_event
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_AP_STACONNECTED
,
on_event
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_AP_STADISCONNECTED
,
on_event
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_AP_PROBEREQRECVED
,
on_event
);
static
int
wifi_getmode
(
lua_State
*
L
)
{
wifi_mode_t
mode
;
esp_err_t
err
=
esp_wifi_get_mode
(
&
mode
);
if
(
err
!=
ESP_OK
)
return
luaL_error
(
L
,
"failed to get mode, code %d"
,
err
);
lua_pushinteger
(
L
,
mode
);
return
1
;
}
static
int
event_idx_by_name
(
const
char
*
name
)
{
for
(
unsigned
i
=
0
;
i
<
ARRAY_LEN
(
events
);
++
i
)
if
(
strcmp
(
events
[
i
].
name
,
name
)
==
0
)
return
i
;
return
-
1
;
}
static
int
event_idx_by_id
(
system_event_id_t
id
)
{
for
(
unsigned
i
=
0
;
i
<
ARRAY_LEN
(
events
);
++
i
)
if
(
events
[
i
].
event_id
==
id
)
return
i
;
return
-
1
;
}
static
void
sta_conn
(
lua_State
*
L
,
const
system_event_t
*
evt
)
{
lua_pushlstring
(
L
,
(
const
char
*
)
evt
->
event_info
.
connected
.
ssid
,
evt
->
event_info
.
connected
.
ssid_len
);
lua_setfield
(
L
,
-
2
,
"ssid"
);
char
bssid_str
[
MAC_STR_SZ
];
macstr
(
bssid_str
,
evt
->
event_info
.
connected
.
bssid
);
lua_pushstring
(
L
,
bssid_str
);
lua_setfield
(
L
,
-
2
,
"bssid"
);
lua_pushinteger
(
L
,
evt
->
event_info
.
connected
.
channel
);
lua_setfield
(
L
,
-
2
,
"channel"
);
lua_pushinteger
(
L
,
evt
->
event_info
.
connected
.
authmode
);
lua_setfield
(
L
,
-
2
,
"auth"
);
}
static
void
sta_disconn
(
lua_State
*
L
,
const
system_event_t
*
evt
)
{
lua_pushlstring
(
L
,
(
const
char
*
)
evt
->
event_info
.
disconnected
.
ssid
,
evt
->
event_info
.
disconnected
.
ssid_len
);
lua_setfield
(
L
,
-
2
,
"ssid"
);
char
bssid_str
[
MAC_STR_SZ
];
macstr
(
bssid_str
,
evt
->
event_info
.
disconnected
.
bssid
);
lua_pushstring
(
L
,
bssid_str
);
lua_setfield
(
L
,
-
2
,
"bssid"
);
lua_pushinteger
(
L
,
evt
->
event_info
.
disconnected
.
reason
);
lua_setfield
(
L
,
-
2
,
"reason"
);
}
static
void
sta_authmode
(
lua_State
*
L
,
const
system_event_t
*
evt
)
{
lua_pushinteger
(
L
,
evt
->
event_info
.
auth_change
.
old_mode
);
lua_setfield
(
L
,
-
2
,
"old_mode"
);
lua_pushinteger
(
L
,
evt
->
event_info
.
auth_change
.
new_mode
);
lua_setfield
(
L
,
-
2
,
"new_mode"
);
}
static
void
sta_got_ip
(
lua_State
*
L
,
const
system_event_t
*
evt
)
{
char
ipstr
[
IP_STR_SZ
]
=
{
0
};
ip4str
(
ipstr
,
&
evt
->
event_info
.
got_ip
.
ip_info
.
ip
);
lua_pushstring
(
L
,
ipstr
);
lua_setfield
(
L
,
-
2
,
"ip"
);
ip4str
(
ipstr
,
&
evt
->
event_info
.
got_ip
.
ip_info
.
netmask
);
lua_pushstring
(
L
,
ipstr
);
lua_setfield
(
L
,
-
2
,
"netmask"
);
ip4str
(
ipstr
,
&
evt
->
event_info
.
got_ip
.
ip_info
.
gw
);
lua_pushstring
(
L
,
ipstr
);
lua_setfield
(
L
,
-
2
,
"gw"
);
}
static
void
ap_staconn
(
lua_State
*
L
,
const
system_event_t
*
evt
)
{
char
mac
[
MAC_STR_SZ
];
macstr
(
mac
,
evt
->
event_info
.
sta_connected
.
mac
);
lua_pushstring
(
L
,
mac
);
lua_setfield
(
L
,
-
2
,
"mac"
);
lua_pushinteger
(
L
,
evt
->
event_info
.
sta_connected
.
aid
);
lua_setfield
(
L
,
-
2
,
"id"
);
}
static
void
ap_stadisconn
(
lua_State
*
L
,
const
system_event_t
*
evt
)
{
char
mac
[
MAC_STR_SZ
];
macstr
(
mac
,
evt
->
event_info
.
sta_disconnected
.
mac
);
lua_pushstring
(
L
,
mac
);
lua_setfield
(
L
,
-
2
,
"mac"
);
lua_pushinteger
(
L
,
evt
->
event_info
.
sta_disconnected
.
aid
);
lua_setfield
(
L
,
-
2
,
"id"
);
}
static
void
ap_probe_req
(
lua_State
*
L
,
const
system_event_t
*
evt
)
{
char
str
[
MAC_STR_SZ
];
macstr
(
str
,
evt
->
event_info
.
ap_probereqrecved
.
mac
);
lua_pushstring
(
L
,
str
);
lua_setfield
(
L
,
-
2
,
"from"
);
lua_pushinteger
(
L
,
evt
->
event_info
.
ap_probereqrecved
.
rssi
);
lua_setfield
(
L
,
-
2
,
"rssi"
);
}
static
int
wifi_setmode
(
lua_State
*
L
)
static
void
on_event
(
const
system_event_t
*
evt
)
{
int
idx
=
event_idx_by_id
(
evt
->
event_id
);
if
(
idx
<
0
||
event_cb
[
idx
]
==
LUA_NOREF
)
return
;
lua_State
*
L
=
lua_getstate
();
lua_rawgeti
(
L
,
LUA_REGISTRYINDEX
,
event_cb
[
idx
]);
lua_pushstring
(
L
,
events
[
idx
].
name
);
lua_createtable
(
L
,
0
,
5
);
events
[
idx
].
fill_cb_arg
(
L
,
evt
);
lua_call
(
L
,
2
,
0
);
}
static
int
wifi_eventmon
(
lua_State
*
L
)
{
const
char
*
event_name
=
luaL_checkstring
(
L
,
1
);
if
(
!
lua_isnoneornil
(
L
,
2
))
luaL_checkanyfunction
(
L
,
2
);
lua_settop
(
L
,
2
);
int
idx
=
event_idx_by_name
(
event_name
);
if
(
idx
<
0
)
return
luaL_error
(
L
,
"unknown event: %s"
,
event_name
);
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
event_cb
[
idx
]);
event_cb
[
idx
]
=
lua_isnoneornil
(
L
,
2
)
?
LUA_NOREF
:
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
return
0
;
}
static
int
wifi_mode
(
lua_State
*
L
)
{
{
int
mode
=
luaL_checkinteger
(
L
,
1
);
int
mode
=
luaL_checkinteger
(
L
,
1
);
bool
save
=
luaL_optbool
(
L
,
2
,
DEFAULT_SAVE
);
bool
save
=
luaL_optbool
(
L
,
2
,
DEFAULT_SAVE
);
...
@@ -66,8 +276,19 @@ static int wifi_start (lua_State *L)
...
@@ -66,8 +276,19 @@ static int wifi_start (lua_State *L)
}
}
static
int
wifi_stop
(
lua_State
*
L
)
{
esp_err_t
err
=
esp_wifi_stop
();
return
(
err
==
ESP_OK
)
?
0
:
luaL_error
(
L
,
"failed to stop wifi, code %d"
,
err
);
}
static
int
wifi_init
(
lua_State
*
L
)
static
int
wifi_init
(
lua_State
*
L
)
{
{
for
(
unsigned
i
=
0
;
i
<
ARRAY_LEN
(
event_cb
);
++
i
)
event_cb
[
i
]
=
LUA_NOREF
;
wifi_init_config_t
cfg
=
WIFI_INIT_CONFIG_DEFAULT
();
wifi_init_config_t
cfg
=
WIFI_INIT_CONFIG_DEFAULT
();
esp_err_t
err
=
esp_wifi_init
(
&
cfg
);
esp_err_t
err
=
esp_wifi_init
(
&
cfg
);
return
(
err
==
ESP_OK
)
?
return
(
err
==
ESP_OK
)
?
...
@@ -80,8 +301,11 @@ extern const LUA_REG_TYPE wifi_ap_map[];
...
@@ -80,8 +301,11 @@ extern const LUA_REG_TYPE wifi_ap_map[];
static
const
LUA_REG_TYPE
wifi_map
[]
=
static
const
LUA_REG_TYPE
wifi_map
[]
=
{
{
{
LSTRKEY
(
"setmode"
),
LFUNCVAL
(
wifi_setmode
)
},
{
LSTRKEY
(
"getmode"
),
LFUNCVAL
(
wifi_getmode
)
},
{
LSTRKEY
(
"on"
),
LFUNCVAL
(
wifi_eventmon
)
},
{
LSTRKEY
(
"mode"
),
LFUNCVAL
(
wifi_mode
)
},
{
LSTRKEY
(
"start"
),
LFUNCVAL
(
wifi_start
)
},
{
LSTRKEY
(
"start"
),
LFUNCVAL
(
wifi_start
)
},
{
LSTRKEY
(
"stop"
),
LFUNCVAL
(
wifi_stop
)
},
{
LSTRKEY
(
"sta"
),
LROVAL
(
wifi_sta_map
)
},
{
LSTRKEY
(
"sta"
),
LROVAL
(
wifi_sta_map
)
},
{
LSTRKEY
(
"ap"
),
LROVAL
(
wifi_ap_map
)
},
{
LSTRKEY
(
"ap"
),
LROVAL
(
wifi_ap_map
)
},
...
...
components/modules/wifi_common.c
0 → 100644
View file @
4fead4a4
/*
* Copyright 2016 Dius Computing Pty Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
* - Neither the name of the copyright holders nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @author Johny Mattsson <jmattsson@dius.com.au>
*/
#include "wifi_common.h"
#include <stdio.h>
#include "lwip/sockets.h"
#include "lwip/ip_addr.h"
#include "lwip/ip4_addr.h"
void
macstr
(
char
*
str
,
const
uint8_t
*
mac
)
{
sprintf
(
str
,
"%02x:%02x:%02x:%02x:%02x:%02x"
,
mac
[
0
],
mac
[
1
],
mac
[
2
],
mac
[
3
],
mac
[
4
],
mac
[
5
]);
}
void
ipstr
(
char
*
out
,
const
ip_addr_t
*
ip
)
{
if
(
ip
->
type
==
IPADDR_TYPE_V4
)
ip4str
(
out
,
&
ip
->
u_addr
.
ip4
);
else
if
(
ip
->
type
==
IPADDR_TYPE_V6
)
ip6str
(
out
,
&
ip
->
u_addr
.
ip6
);
}
void
ip4str
(
char
*
out
,
const
ip4_addr_t
*
ip
)
{
ip4addr_ntoa_r
(
ip
,
out
,
IP_STR_SZ
);
}
void
ip6str
(
char
*
out
,
const
ip6_addr_t
*
ip
)
{
ip6addr_ntoa_r
(
ip
,
out
,
IP_STR_SZ
);
}
components/modules/wifi_common.h
View file @
4fead4a4
...
@@ -33,6 +33,9 @@
...
@@ -33,6 +33,9 @@
#ifndef _NODEMCU_WIFI_H_
#ifndef _NODEMCU_WIFI_H_
#define _NODEMCU_WIFI_H_
#define _NODEMCU_WIFI_H_
#include <stdint.h>
#include "tcpip_adapter.h"
// Shared sta/ap macros
// Shared sta/ap macros
#define DEFAULT_SAVE false
#define DEFAULT_SAVE false
...
@@ -45,4 +48,16 @@
...
@@ -45,4 +48,16 @@
} while(0)
} while(0)
/* The mac/ip formatters should probably go into its own utility file... */
// String buffer for a formatted MAC/BSSID
#define MAC_STR_SZ (6*2+5+1)
void
macstr
(
char
*
out
,
const
uint8_t
*
mac
);
// String buffer for a formatted IPv4 or IPv6 address
#define IP_STR_SZ (8*4+7+1)
void
ipstr
(
char
*
out
,
const
ip_addr_t
*
ip
);
void
ip4str
(
char
*
out
,
const
ip4_addr_t
*
ip
);
void
ip6str
(
char
*
out
,
const
ip6_addr_t
*
ip
);
#endif
#endif
components/modules/wifi_sta.c
View file @
4fead4a4
...
@@ -33,11 +33,14 @@
...
@@ -33,11 +33,14 @@
#include "module.h"
#include "module.h"
#include "lauxlib.h"
#include "lauxlib.h"
#include "lextra.h"
#include "lextra.h"
#include "lmem.h"
#include "nodemcu_esp_event.h"
#include "nodemcu_esp_event.h"
#include "wifi_common.h"
#include "wifi_common.h"
#include "esp_wifi.h"
#include "esp_wifi.h"
#include <string.h>
#include <string.h>
static
int
scan_cb_ref
=
LUA_NOREF
;
static
void
do_connect
(
const
system_event_t
*
evt
)
static
void
do_connect
(
const
system_event_t
*
evt
)
{
{
...
@@ -94,15 +97,168 @@ static int wifi_sta_config (lua_State *L)
...
@@ -94,15 +97,168 @@ static int wifi_sta_config (lua_State *L)
return
luaL_error
(
L
,
"invalid BSSID: %s"
,
bssid
);
return
luaL_error
(
L
,
"invalid BSSID: %s"
,
bssid
);
}
}
lua_getfield
(
L
,
1
,
"auto"
);
bool
auto_conn
=
luaL_optbool
(
L
,
-
1
,
true
);
SET_SAVE_MODE
(
save
);
SET_SAVE_MODE
(
save
);
esp_err_t
err
=
esp_wifi_set_config
(
WIFI_IF_STA
,
&
cfg
);
esp_err_t
err
=
esp_wifi_set_config
(
WIFI_IF_STA
,
&
cfg
);
if
(
err
!=
ESP_OK
)
return
luaL_error
(
L
,
"failed to set wifi config, code %d"
,
err
);
if
(
auto_conn
)
err
=
esp_wifi_connect
();
if
(
err
!=
ESP_OK
)
return
luaL_error
(
L
,
"failed to begin connect, code %d"
,
err
);
err
=
esp_wifi_set_auto_connect
(
auto_conn
);
return
(
err
==
ESP_OK
)
?
return
(
err
==
ESP_OK
)
?
0
:
luaL_error
(
L
,
"failed to set wifi config, code %d"
,
err
);
0
:
luaL_error
(
L
,
"failed to set wifi auto-connect, code %d"
,
err
);
}
static
int
wifi_sta_connect
(
lua_State
*
L
)
{
esp_err_t
err
=
esp_wifi_connect
();
return
(
err
==
ESP_OK
)
?
0
:
luaL_error
(
L
,
"connect failed, code %d"
,
err
);
}
static
int
wifi_sta_disconnect
(
lua_State
*
L
)
{
esp_err_t
err
=
esp_wifi_disconnect
();
return
(
err
==
ESP_OK
)
?
0
:
luaL_error
(
L
,
"disconnect failed, code %d"
,
err
);
}
static
int
wifi_sta_getconfig
(
lua_State
*
L
)
{
wifi_config_t
cfg
;
esp_err_t
err
=
esp_wifi_get_config
(
WIFI_IF_STA
,
&
cfg
);
if
(
err
!=
ESP_OK
)
return
luaL_error
(
L
,
"failed to get config, code %d"
,
err
);
lua_createtable
(
L
,
0
,
3
);
size_t
ssid_len
=
strnlen
(
cfg
.
sta
.
ssid
,
sizeof
(
cfg
.
sta
.
ssid
));
lua_pushlstring
(
L
,
cfg
.
sta
.
ssid
,
ssid_len
);
lua_setfield
(
L
,
-
2
,
"ssid"
);
size_t
pwd_len
=
strnlen
(
cfg
.
sta
.
password
,
sizeof
(
cfg
.
sta
.
password
));
lua_pushlstring
(
L
,
cfg
.
sta
.
password
,
pwd_len
);
lua_setfield
(
L
,
-
2
,
"pwd"
);
if
(
cfg
.
sta
.
bssid_set
)
{
char
bssid_str
[
MAC_STR_SZ
];
macstr
(
bssid_str
,
cfg
.
sta
.
bssid
);
lua_pushstring
(
L
,
bssid_str
);
lua_setfield
(
L
,
-
2
,
"bssid"
);
}
bool
auto_conn
;
err
=
esp_wifi_get_auto_connect
(
&
auto_conn
);
if
(
err
!=
ESP_OK
)
return
luaL_error
(
L
,
"failed to get auto-connect, code %d"
,
err
);
lua_pushboolean
(
L
,
auto_conn
);
lua_setfield
(
L
,
-
2
,
"auto"
);
return
1
;
}
static
void
on_scan_done
(
const
system_event_t
*
evt
)
{
(
void
)
evt
;
lua_State
*
L
=
lua_getstate
();
lua_rawgeti
(
L
,
LUA_REGISTRYINDEX
,
scan_cb_ref
);
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
scan_cb_ref
);
scan_cb_ref
=
LUA_NOREF
;
int
nargs
=
1
;
if
(
!
lua_isnoneornil
(
L
,
-
1
))
{
uint16_t
num_ap
=
0
;
esp_err_t
err
=
esp_wifi_get_ap_num
(
&
num_ap
);
wifi_ap_list_t
*
aps
=
luaM_malloc
(
L
,
num_ap
*
sizeof
(
wifi_ap_list_t
));
if
((
err
==
ESP_OK
)
&&
(
aps
)
&&
(
err
=
esp_wifi_get_ap_list
(
&
num_ap
,
aps
))
==
ESP_OK
)
{
lua_pushnil
(
L
);
// no error
lua_createtable
(
L
,
num_ap
,
0
);
// prepare array
++
nargs
;
for
(
unsigned
i
=
0
;
i
<
num_ap
;
++
i
)
{
lua_createtable
(
L
,
0
,
6
);
// prepare table for AP entry
char
bssid_str
[
MAC_STR_SZ
];
macstr
(
bssid_str
,
aps
[
i
].
bssid
);
lua_pushstring
(
L
,
bssid_str
);
lua_setfield
(
L
,
-
2
,
"bssid"
);
size_t
ssid_len
=
strnlen
((
const
char
*
)
aps
[
i
].
ssid
,
sizeof
(
aps
[
i
].
ssid
));
lua_pushlstring
(
L
,
(
const
char
*
)
aps
[
i
].
ssid
,
ssid_len
);
lua_setfield
(
L
,
-
2
,
"ssid"
);
lua_pushinteger
(
L
,
aps
[
i
].
primary
);
lua_setfield
(
L
,
-
2
,
"channel"
);
lua_pushinteger
(
L
,
aps
[
i
].
rssi
);
lua_setfield
(
L
,
-
2
,
"rssi"
);
lua_pushinteger
(
L
,
aps
[
i
].
authmode
);
lua_setfield
(
L
,
-
2
,
"auth"
);
lua_pushstring
(
L
,
(
aps
[
i
].
second
==
WIFI_SECOND_CHAN_NONE
)
?
"ht20"
:
"ht40"
);
lua_setfield
(
L
,
-
2
,
"bandwidth"
);
lua_rawseti
(
L
,
-
2
,
i
+
1
);
// add table to array
}
}
else
lua_pushfstring
(
L
,
"failure on scan done"
);
luaM_free
(
L
,
aps
);
lua_call
(
L
,
nargs
,
0
);
}
}
static
int
wifi_sta_scan
(
lua_State
*
L
)
{
if
(
scan_cb_ref
!=
LUA_NOREF
)
return
luaL_error
(
L
,
"scan already in progress"
);
luaL_checkanytable
(
L
,
1
);
wifi_scan_config_t
scan_cfg
;
memset
(
&
scan_cfg
,
0
,
sizeof
(
scan_cfg
));
// TODO: support ssid/bssid/channel/hidden features of wifi_scan_config_t
luaL_checkanyfunction
(
L
,
2
);
lua_settop
(
L
,
2
);
scan_cb_ref
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
esp_err_t
err
=
esp_wifi_scan_start
(
&
scan_cfg
,
false
);
if
(
err
!=
ESP_OK
)
{
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
scan_cb_ref
);
scan_cb_ref
=
LUA_NOREF
;
return
luaL_error
(
L
,
"failed to start scan, code %d"
,
err
);
}
else
return
0
;
}
}
const
LUA_REG_TYPE
wifi_sta_map
[]
=
{
const
LUA_REG_TYPE
wifi_sta_map
[]
=
{
{
LSTRKEY
(
"config"
),
LFUNCVAL
(
wifi_sta_config
)
},
{
LSTRKEY
(
"config"
),
LFUNCVAL
(
wifi_sta_config
)
},
{
LSTRKEY
(
"connect"
),
LFUNCVAL
(
wifi_sta_connect
)
},
{
LSTRKEY
(
"disconnect"
),
LFUNCVAL
(
wifi_sta_disconnect
)
},
{
LSTRKEY
(
"getconfig"
),
LFUNCVAL
(
wifi_sta_getconfig
)
},
{
LSTRKEY
(
"scan"
),
LFUNCVAL
(
wifi_sta_scan
)
},
{
LNILKEY
,
LNILVAL
}
{
LNILKEY
,
LNILVAL
}
};
};
...
@@ -111,3 +267,4 @@ const LUA_REG_TYPE wifi_sta_map[] = {
...
@@ -111,3 +267,4 @@ const LUA_REG_TYPE wifi_sta_map[] = {
// Currently no auto-connect, so do that in response to events
// Currently no auto-connect, so do that in response to events
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_STA_START
,
do_connect
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_STA_START
,
do_connect
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_STA_DISCONNECTED
,
do_connect
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_STA_DISCONNECTED
,
do_connect
);
NODEMCU_ESP_EVENT
(
SYSTEM_EVENT_SCAN_DONE
,
on_scan_done
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment