Skip to content

Commit dfd09bb

Browse files
authored
Merge pull request #3433 from astrobokonon/esp32s2-bssid
ESP32S2: Allow connecting to specific bssid
2 parents 8cf0171 + 1805e92 commit dfd09bb

File tree

7 files changed

+57
-6
lines changed

7 files changed

+57
-6
lines changed

locale/circuitpython.pot

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ msgid ""
88
msgstr ""
99
"Project-Id-Version: PACKAGE VERSION\n"
1010
"Report-Msgid-Bugs-To: \n"
11-
"POT-Creation-Date: 2020-09-11 13:30+0200\n"
11+
"POT-Creation-Date: 2020-09-16 17:07-0700\n"
1212
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414
"Language-Team: LANGUAGE <[email protected]>\n"
@@ -960,6 +960,10 @@ msgstr ""
960960
msgid "Invalid BMP file"
961961
msgstr ""
962962

963+
#: shared-bindings/wifi/Radio.c
964+
msgid "Invalid BSSID"
965+
msgstr ""
966+
963967
#: ports/stm/common-hal/analogio/AnalogOut.c
964968
msgid "Invalid DAC pin supplied"
965969
msgstr ""

ports/esp32s2/common-hal/wifi/Network.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ mp_obj_t common_hal_wifi_network_get_ssid(wifi_network_obj_t *self) {
3535
return mp_obj_new_str(cstr, strlen(cstr));
3636
}
3737

38+
#define MAC_ADDRESS_LENGTH 6
39+
40+
mp_obj_t common_hal_wifi_network_get_bssid(wifi_network_obj_t *self) {
41+
return mp_obj_new_bytes(self->record.bssid, MAC_ADDRESS_LENGTH);
42+
}
43+
3844
mp_obj_t common_hal_wifi_network_get_rssi(wifi_network_obj_t *self) {
3945
return mp_obj_new_int(self->record.rssi);
4046
}

ports/esp32s2/common-hal/wifi/Radio.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,24 @@ void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self) {
104104
self->current_scan = NULL;
105105
}
106106

107-
wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t* ssid, size_t ssid_len, uint8_t* password, size_t password_len, uint8_t channel, mp_float_t timeout) {
107+
wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t* ssid, size_t ssid_len, uint8_t* password, size_t password_len, uint8_t channel, mp_float_t timeout, uint8_t* bssid, size_t bssid_len) {
108108
// check enabled
109109
wifi_config_t* config = &self->sta_config;
110110
memcpy(&config->sta.ssid, ssid, ssid_len);
111111
config->sta.ssid[ssid_len] = 0;
112112
memcpy(&config->sta.password, password, password_len);
113113
config->sta.password[password_len] = 0;
114114
config->sta.channel = channel;
115+
// From esp_wifi_types.h:
116+
// Generally, station_config.bssid_set needs to be 0; and it needs
117+
// to be 1 only when users need to check the MAC address of the AP
118+
if (bssid_len > 0){
119+
memcpy(&config->sta.bssid, bssid, bssid_len);
120+
config->sta.bssid[bssid_len] = 0;
121+
config->sta.bssid_set = 1;
122+
} else {
123+
config->sta.bssid_set = 0;
124+
}
115125
esp_wifi_set_config(ESP_IF_WIFI_STA, config);
116126
self->starting_retries = 5;
117127
self->retries_left = 5;

shared-bindings/wifi/Network.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,23 @@ const mp_obj_property_t wifi_network_ssid_obj = {
5858
};
5959

6060

61+
//| bssid: bytes
62+
//| """BSSID of the network (usually the AP's MAC address)"""
63+
//|
64+
STATIC mp_obj_t wifi_network_get_bssid(mp_obj_t self) {
65+
return common_hal_wifi_network_get_bssid(self);
66+
67+
}
68+
MP_DEFINE_CONST_FUN_OBJ_1(wifi_network_get_bssid_obj, wifi_network_get_bssid);
69+
70+
const mp_obj_property_t wifi_network_bssid_obj = {
71+
.base.type = &mp_type_property,
72+
.proxy = { (mp_obj_t)&wifi_network_get_bssid_obj,
73+
(mp_obj_t)&mp_const_none_obj,
74+
(mp_obj_t)&mp_const_none_obj },
75+
};
76+
77+
6178
//| rssi: int
6279
//| """Signal strength of the network"""
6380
//|
@@ -94,6 +111,7 @@ const mp_obj_property_t wifi_network_channel_obj = {
94111

95112
STATIC const mp_rom_map_elem_t wifi_network_locals_dict_table[] = {
96113
{ MP_ROM_QSTR(MP_QSTR_ssid), MP_ROM_PTR(&wifi_network_ssid_obj) },
114+
{ MP_ROM_QSTR(MP_QSTR_bssid), MP_ROM_PTR(&wifi_network_bssid_obj) },
97115
{ MP_ROM_QSTR(MP_QSTR_rssi), MP_ROM_PTR(&wifi_network_rssi_obj) },
98116
{ MP_ROM_QSTR(MP_QSTR_channel), MP_ROM_PTR(&wifi_network_channel_obj) },
99117
};

shared-bindings/wifi/Network.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
const mp_obj_type_t wifi_network_type;
3737

3838
extern mp_obj_t common_hal_wifi_network_get_ssid(wifi_network_obj_t *self);
39+
extern mp_obj_t common_hal_wifi_network_get_bssid(wifi_network_obj_t *self);
3940
extern mp_obj_t common_hal_wifi_network_get_rssi(wifi_network_obj_t *self);
4041
extern mp_obj_t common_hal_wifi_network_get_channel(wifi_network_obj_t *self);
4142

shared-bindings/wifi/Radio.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,12 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_stop_scanning_networks_obj, wifi_rad
108108
//| ...
109109
//|
110110
STATIC mp_obj_t wifi_radio_connect(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
111-
enum { ARG_ssid, ARG_password, ARG_channel, ARG_timeout };
111+
enum { ARG_ssid, ARG_password, ARG_channel, ARG_bssid, ARG_timeout };
112112
static const mp_arg_t allowed_args[] = {
113113
{ MP_QSTR_ssid, MP_ARG_REQUIRED | MP_ARG_OBJ },
114114
{ MP_QSTR_password, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
115115
{ MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
116+
{ MP_QSTR_bssid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
116117
{ MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
117118
};
118119

@@ -125,7 +126,6 @@ STATIC mp_obj_t wifi_radio_connect(size_t n_args, const mp_obj_t *pos_args, mp_m
125126
timeout = mp_obj_get_float(args[ARG_timeout].u_obj);
126127
}
127128

128-
129129
mp_buffer_info_t ssid;
130130
mp_get_buffer_raise(args[ARG_ssid].u_obj, &ssid, MP_BUFFER_READ);
131131

@@ -138,7 +138,19 @@ STATIC mp_obj_t wifi_radio_connect(size_t n_args, const mp_obj_t *pos_args, mp_m
138138
}
139139
}
140140

141-
wifi_radio_error_t error = common_hal_wifi_radio_connect(self, ssid.buf, ssid.len, password.buf, password.len, args[ARG_channel].u_int, timeout);
141+
#define MAC_ADDRESS_LENGTH 6
142+
143+
mp_buffer_info_t bssid;
144+
bssid.len = 0;
145+
// Should probably make sure bssid is just bytes and not something else too
146+
if (args[ARG_bssid].u_obj != MP_OBJ_NULL) {
147+
mp_get_buffer_raise(args[ARG_bssid].u_obj, &bssid, MP_BUFFER_READ);
148+
if (bssid.len != MAC_ADDRESS_LENGTH) {
149+
mp_raise_ValueError(translate("Invalid BSSID"));
150+
}
151+
}
152+
153+
wifi_radio_error_t error = common_hal_wifi_radio_connect(self, ssid.buf, ssid.len, password.buf, password.len, args[ARG_channel].u_int, timeout, bssid.buf, bssid.len);
142154
if (error == WIFI_RADIO_ERROR_AUTH) {
143155
mp_raise_ConnectionError(translate("Authentication failure"));
144156
} else if (error == WIFI_RADIO_ERROR_NO_AP_FOUND) {

shared-bindings/wifi/Radio.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ extern mp_obj_t common_hal_wifi_radio_get_mac_address(wifi_radio_obj_t *self);
5151
extern mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self);
5252
extern void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self);
5353

54-
extern wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t* ssid, size_t ssid_len, uint8_t* password, size_t password_len, uint8_t channel, mp_float_t timeout);
54+
extern wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t* ssid, size_t ssid_len, uint8_t* password, size_t password_len, uint8_t channel, mp_float_t timeout, uint8_t* bssid, size_t bssid_len);
5555

5656
extern mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self);
5757

0 commit comments

Comments
 (0)