mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 15:59:52 +03:00
add BSSID and Channel to network settings, full_scan
This commit is contained in:
@@ -82,7 +82,9 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
if (selectedNetwork) {
|
if (selectedNetwork) {
|
||||||
updateState('networkSettings', (current_data) => ({
|
updateState('networkSettings', (current_data) => ({
|
||||||
ssid: selectedNetwork.ssid,
|
ssid: selectedNetwork.ssid,
|
||||||
password: '',
|
bssid: selectedNetwork.bssid,
|
||||||
|
channel: selectedNetwork.channel,
|
||||||
|
password: current_data ? current_data.password : '',
|
||||||
hostname: current_data?.hostname,
|
hostname: current_data?.hostname,
|
||||||
static_ip_config: false,
|
static_ip_config: false,
|
||||||
enableIPv6: false,
|
enableIPv6: false,
|
||||||
@@ -117,6 +119,12 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
} catch (errors: any) {
|
} catch (errors: any) {
|
||||||
setFieldErrors(errors);
|
setFieldErrors(errors);
|
||||||
}
|
}
|
||||||
|
deselectNetwork();
|
||||||
|
};
|
||||||
|
|
||||||
|
const setCancel = async () => {
|
||||||
|
deselectNetwork();
|
||||||
|
await loadData();
|
||||||
};
|
};
|
||||||
|
|
||||||
const restart = async () => {
|
const restart = async () => {
|
||||||
@@ -139,10 +147,17 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
</ListItemAvatar>
|
</ListItemAvatar>
|
||||||
<ListItemText
|
<ListItemText
|
||||||
primary={selectedNetwork.ssid}
|
primary={selectedNetwork.ssid}
|
||||||
secondary={'Security: ' + networkSecurityMode(selectedNetwork) + ', Ch: ' + selectedNetwork.channel}
|
secondary={
|
||||||
|
'Security: ' +
|
||||||
|
networkSecurityMode(selectedNetwork) +
|
||||||
|
', Ch: ' +
|
||||||
|
selectedNetwork.channel +
|
||||||
|
', bssid: ' +
|
||||||
|
selectedNetwork.bssid
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
<ListItemSecondaryAction>
|
<ListItemSecondaryAction>
|
||||||
<IconButton onClick={deselectNetwork}>
|
<IconButton onClick={setCancel}>
|
||||||
<DeleteIcon />
|
<DeleteIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</ListItemSecondaryAction>
|
</ListItemSecondaryAction>
|
||||||
@@ -160,6 +175,27 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
margin="normal"
|
margin="normal"
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
<ValidatedTextField
|
||||||
|
fieldErrors={fieldErrors}
|
||||||
|
name="bssid"
|
||||||
|
label={'BSSID (leave blank for SSID only)'}
|
||||||
|
fullWidth
|
||||||
|
variant="outlined"
|
||||||
|
value={data.bssid}
|
||||||
|
onChange={updateFormValue}
|
||||||
|
margin="normal"
|
||||||
|
/>
|
||||||
|
<ValidatedTextField
|
||||||
|
fieldErrors={fieldErrors}
|
||||||
|
name="channel"
|
||||||
|
label="Channel (0=auto)"
|
||||||
|
fullWidth
|
||||||
|
variant="outlined"
|
||||||
|
value={numberValue(data.channel)}
|
||||||
|
onChange={updateFormValue}
|
||||||
|
type="number"
|
||||||
|
margin="normal"
|
||||||
|
/>
|
||||||
{(!selectedNetwork || !isNetworkOpen(selectedNetwork)) && (
|
{(!selectedNetwork || !isNetworkOpen(selectedNetwork)) && (
|
||||||
<ValidatedPasswordField
|
<ValidatedPasswordField
|
||||||
fieldErrors={fieldErrors}
|
fieldErrors={fieldErrors}
|
||||||
@@ -296,7 +332,7 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
</MessageBox>
|
</MessageBox>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{!restartNeeded && dirtyFlags && dirtyFlags.length !== 0 && (
|
{!restartNeeded && (selectedNetwork || (dirtyFlags && dirtyFlags.length !== 0)) && (
|
||||||
<ButtonRow>
|
<ButtonRow>
|
||||||
<Button
|
<Button
|
||||||
startIcon={<CancelIcon />}
|
startIcon={<CancelIcon />}
|
||||||
|
|||||||
@@ -65,7 +65,9 @@ const WiFiNetworkSelector: FC<WiFiNetworkSelectorProps> = ({ networkList }) => {
|
|||||||
</ListItemAvatar>
|
</ListItemAvatar>
|
||||||
<ListItemText
|
<ListItemText
|
||||||
primary={network.ssid}
|
primary={network.ssid}
|
||||||
secondary={'Security: ' + networkSecurityMode(network) + ', Ch: ' + network.channel}
|
secondary={
|
||||||
|
'Security: ' + networkSecurityMode(network) + ', Ch: ' + network.channel + ', bssid: ' + network.bssid
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
<ListItemIcon>
|
<ListItemIcon>
|
||||||
<Badge badgeContent={network.rssi + 'dBm'}>
|
<Badge badgeContent={network.rssi + 'dBm'}>
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ export interface NetworkStatus {
|
|||||||
|
|
||||||
export interface NetworkSettings {
|
export interface NetworkSettings {
|
||||||
ssid: string;
|
ssid: string;
|
||||||
|
bssid: string;
|
||||||
|
channel: number;
|
||||||
password: string;
|
password: string;
|
||||||
hostname: string;
|
hostname: string;
|
||||||
static_ip_config: boolean;
|
static_ip_config: boolean;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import type { NetworkSettings } from 'types';
|
|||||||
export const createNetworkSettingsValidator = (networkSettings: NetworkSettings) =>
|
export const createNetworkSettingsValidator = (networkSettings: NetworkSettings) =>
|
||||||
new Schema({
|
new Schema({
|
||||||
ssid: [{ type: 'string', max: 32, message: 'SSID must be 32 characters or less' }],
|
ssid: [{ type: 'string', max: 32, message: 'SSID must be 32 characters or less' }],
|
||||||
|
bssid: [{ type: 'string', max: 17, message: 'BSSID must be 17 characters or empty' }],
|
||||||
password: { type: 'string', max: 64, message: 'Password must be 64 characters or less' },
|
password: { type: 'string', max: 64, message: 'Password must be 64 characters or less' },
|
||||||
hostname: [{ required: true, message: 'Hostname is required' }, HOSTNAME_VALIDATOR],
|
hostname: [{ required: true, message: 'Hostname is required' }, HOSTNAME_VALIDATOR],
|
||||||
...(networkSettings.static_ip_config && {
|
...(networkSettings.static_ip_config && {
|
||||||
@@ -17,5 +18,9 @@ export const createNetworkSettingsValidator = (networkSettings: NetworkSettings)
|
|||||||
tx_power: [
|
tx_power: [
|
||||||
{ required: true, message: 'Tx Power is required' },
|
{ required: true, message: 'Tx Power is required' },
|
||||||
{ type: 'number', min: 0, max: 20, message: 'Tx Power must be between 0 and 20dBm' }
|
{ type: 'number', min: 0, max: 20, message: 'Tx Power must be between 0 and 20dBm' }
|
||||||
|
],
|
||||||
|
channel: [
|
||||||
|
{ required: true, message: 'Channel is required' },
|
||||||
|
{ type: 'number', min: 0, max: 13, message: 'Channel must be between 0 and 13' }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ void NetworkSettingsService::begin() {
|
|||||||
|
|
||||||
WiFi.mode(WIFI_MODE_MAX);
|
WiFi.mode(WIFI_MODE_MAX);
|
||||||
WiFi.mode(WIFI_MODE_NULL);
|
WiFi.mode(WIFI_MODE_NULL);
|
||||||
|
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); // default is FAST_SCAN
|
||||||
|
WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); // is default, no need to set
|
||||||
|
|
||||||
WiFi.onEvent(std::bind(&NetworkSettingsService::WiFiEvent, this, _1));
|
WiFi.onEvent(std::bind(&NetworkSettingsService::WiFiEvent, this, _1));
|
||||||
|
|
||||||
@@ -54,13 +56,7 @@ void NetworkSettingsService::manageSTA() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Connect or reconnect as required
|
// Connect or reconnect as required
|
||||||
WiFi.disconnect(true); // turn radio off
|
if ((WiFi.getMode() & WIFI_STA) == 0) {
|
||||||
WiFiMode_t currentWiFiMode = WiFi.getMode();
|
|
||||||
if (currentWiFiMode == WIFI_MODE_APSTA || currentWiFiMode == WIFI_MODE_AP) {
|
|
||||||
WiFi.mode(WIFI_MODE_AP);
|
|
||||||
} else {
|
|
||||||
WiFi.mode(WIFI_MODE_NULL);
|
|
||||||
}
|
|
||||||
if (_state.staticIPConfig) {
|
if (_state.staticIPConfig) {
|
||||||
WiFi.config(_state.localIP, _state.gatewayIP, _state.subnetMask, _state.dnsIP1, _state.dnsIP2); // configure for static IP
|
WiFi.config(_state.localIP, _state.gatewayIP, _state.subnetMask, _state.dnsIP1, _state.dnsIP2); // configure for static IP
|
||||||
}
|
}
|
||||||
@@ -75,15 +71,27 @@ void NetworkSettingsService::manageSTA() {
|
|||||||
if (_state.nosleep) {
|
if (_state.nosleep) {
|
||||||
WiFi.setSleep(false); // turn off sleep - WIFI_PS_NONE
|
WiFi.setSleep(false); // turn off sleep - WIFI_PS_NONE
|
||||||
}
|
}
|
||||||
WiFi.begin(_state.ssid.c_str(), _state.password.c_str()); // attempt to connect to the network
|
// attempt to connect to the network
|
||||||
|
uint mac[6];
|
||||||
|
if (!_state.bssid.isEmpty() && sscanf(_state.bssid.c_str(), "%X:%X:%X:%X:%X:%X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) {
|
||||||
|
uint8_t mac1[6];
|
||||||
|
for (uint8_t i = 0; i < 6; i++) {
|
||||||
|
mac1[i] = (uint8_t)mac[i];
|
||||||
|
}
|
||||||
|
WiFi.begin(_state.ssid.c_str(), _state.password.c_str(), _state.channel, mac1);
|
||||||
|
} else {
|
||||||
|
WiFi.begin(_state.ssid.c_str(), _state.password.c_str(), _state.channel);
|
||||||
|
}
|
||||||
|
|
||||||
// set power after wifi is startet, fixed value for C3_V1
|
// set power after wifi is startet, fixed value for C3_V1
|
||||||
#ifdef BOARD_C3_MINI_V1
|
#ifdef BOARD_C3_MINI_V1
|
||||||
// v1 needs this value, see https://github.com/emsesp/EMS-ESP32/pull/620#discussion_r993173979
|
// v1 needs this value, see https://github.com/emsesp/EMS-ESP32/pull/620#discussion_r993173979
|
||||||
WiFi.setTxPower(WIFI_POWER_8_5dBm); // https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi
|
WiFi.setTxPower(WIFI_POWER_8_5dBm); // https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi
|
||||||
#else
|
#else
|
||||||
esp_wifi_set_max_tx_power(_state.tx_power * 4);
|
// esp_wifi_set_max_tx_power(_state.tx_power * 4);
|
||||||
|
WiFi.setTxPower((wifi_power_t)(_state.tx_power * 4));
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// handles if wifi stopped
|
// handles if wifi stopped
|
||||||
|
|||||||
@@ -31,8 +31,10 @@ class NetworkSettings {
|
|||||||
public:
|
public:
|
||||||
// core wifi configuration
|
// core wifi configuration
|
||||||
String ssid;
|
String ssid;
|
||||||
|
String bssid;
|
||||||
String password;
|
String password;
|
||||||
String hostname;
|
String hostname;
|
||||||
|
uint8_t channel;
|
||||||
bool staticIPConfig;
|
bool staticIPConfig;
|
||||||
bool enableIPv6;
|
bool enableIPv6;
|
||||||
bool bandwidth20;
|
bool bandwidth20;
|
||||||
@@ -52,6 +54,8 @@ class NetworkSettings {
|
|||||||
static void read(NetworkSettings & settings, JsonObject & root) {
|
static void read(NetworkSettings & settings, JsonObject & root) {
|
||||||
// connection settings
|
// connection settings
|
||||||
root["ssid"] = settings.ssid;
|
root["ssid"] = settings.ssid;
|
||||||
|
root["bssid"] = settings.bssid;
|
||||||
|
root["channel"] = settings.channel;
|
||||||
root["password"] = settings.password;
|
root["password"] = settings.password;
|
||||||
root["hostname"] = settings.hostname;
|
root["hostname"] = settings.hostname;
|
||||||
root["static_ip_config"] = settings.staticIPConfig;
|
root["static_ip_config"] = settings.staticIPConfig;
|
||||||
@@ -75,6 +79,8 @@ class NetworkSettings {
|
|||||||
auto enableCORS = settings.enableCORS;
|
auto enableCORS = settings.enableCORS;
|
||||||
auto CORSOrigin = settings.CORSOrigin;
|
auto CORSOrigin = settings.CORSOrigin;
|
||||||
settings.ssid = root["ssid"] | FACTORY_WIFI_SSID;
|
settings.ssid = root["ssid"] | FACTORY_WIFI_SSID;
|
||||||
|
settings.bssid = root["bssid"] | "";
|
||||||
|
settings.channel = root["channel"] | 0;
|
||||||
settings.password = root["password"] | FACTORY_WIFI_PASSWORD;
|
settings.password = root["password"] | FACTORY_WIFI_PASSWORD;
|
||||||
settings.hostname = root["hostname"] | FACTORY_WIFI_HOSTNAME;
|
settings.hostname = root["hostname"] | FACTORY_WIFI_HOSTNAME;
|
||||||
settings.staticIPConfig = root["static_ip_config"] | false;
|
settings.staticIPConfig = root["static_ip_config"] | false;
|
||||||
|
|||||||
Reference in New Issue
Block a user