feat(wifi) configurable AP credential

This commit is contained in:
kerms 2024-07-12 20:29:14 +08:00
parent 794c02b94c
commit d45dde9261
2 changed files with 76 additions and 22 deletions

View File

@ -9,6 +9,7 @@ export enum WifiCmd {
WIFI_API_JSON_AP_GET_INFO = 5, WIFI_API_JSON_AP_GET_INFO = 5,
WIFI_API_JSON_GET_MODE = 6, WIFI_API_JSON_GET_MODE = 6,
WIFI_API_JSON_SET_MODE = 7, WIFI_API_JSON_SET_MODE = 7,
WIFI_API_JSON_AP_SET_CRED = 8,
} }
export enum WifiMode { export enum WifiMode {
@ -34,13 +35,14 @@ export enum WifiStatus {
WIFI_MODE_APSTA, /**< WiFi station + soft-AP mode */ WIFI_MODE_APSTA, /**< WiFi station + soft-AP mode */
} }
interface WifiMsgOut extends ApiJsonMsg { export interface WiFiCredential extends ApiJsonMsg {
ssid?: string; ssid?: string;
password?: string; password?: string;
err?: string;
} }
export function wifi_get_scan_list() { export function wifi_get_scan_list() {
const msg : WifiMsgOut = { const msg : WiFiCredential = {
module: WtModuleID.WIFI, module: WtModuleID.WIFI,
cmd: WifiCmd.WIFI_API_JSON_GET_SCAN, cmd: WifiCmd.WIFI_API_JSON_GET_SCAN,
} }
@ -48,7 +50,7 @@ export function wifi_get_scan_list() {
} }
export function wifi_sta_get_ap_info() { export function wifi_sta_get_ap_info() {
const msg : WifiMsgOut = { const msg : WiFiCredential = {
module: WtModuleID.WIFI, module: WtModuleID.WIFI,
cmd: WifiCmd.WIFI_API_JSON_STA_GET_AP_INFO, cmd: WifiCmd.WIFI_API_JSON_STA_GET_AP_INFO,
} }
@ -56,7 +58,7 @@ export function wifi_sta_get_ap_info() {
} }
export function wifi_ap_get_info() { export function wifi_ap_get_info() {
const msg : WifiMsgOut = { const msg : WiFiCredential = {
module: WtModuleID.WIFI, module: WtModuleID.WIFI,
cmd: WifiCmd.WIFI_API_JSON_AP_GET_INFO, cmd: WifiCmd.WIFI_API_JSON_AP_GET_INFO,
} }
@ -64,7 +66,7 @@ export function wifi_ap_get_info() {
} }
export function wifi_connect_to(ssid: string, password: string) { export function wifi_connect_to(ssid: string, password: string) {
const msg: WifiMsgOut = { const msg: WiFiCredential = {
module: WtModuleID.WIFI, module: WtModuleID.WIFI,
cmd: WifiCmd.WIFI_API_JSON_CONNECT, cmd: WifiCmd.WIFI_API_JSON_CONNECT,
ssid: ssid, ssid: ssid,
@ -74,6 +76,17 @@ export function wifi_connect_to(ssid: string, password: string) {
} }
export interface WifiInfo extends ApiJsonMsg { export interface WifiInfo extends ApiJsonMsg {
rssi: number;
ssid: string;
password: string;
gateway: string;
ip: string;
mac: string;
netmask: string;
wifiLogo?: string;
}
export interface WifiScanInfo extends ApiJsonMsg {
rssi: number; rssi: number;
ssid: string; ssid: string;
gateway: string; gateway: string;
@ -84,7 +97,7 @@ export interface WifiInfo extends ApiJsonMsg {
} }
export interface WifiList extends ApiJsonMsg { export interface WifiList extends ApiJsonMsg {
scan_list: Array<WifiInfo>; scan_list: Array<WifiScanInfo>;
} }
export interface IWifiMode extends ApiJsonMsg { export interface IWifiMode extends ApiJsonMsg {
@ -123,3 +136,13 @@ export function wifi_get_mode() {
sendJsonMsg(msg); sendJsonMsg(msg);
} }
export function wifi_ap_set_credential(ssid: string, password: string) {
const msg : WiFiCredential = {
module: WtModuleID.WIFI,
cmd: WifiCmd.WIFI_API_JSON_AP_SET_CRED,
ssid: ssid,
password: password,
}
sendJsonMsg(msg);
}

View File

@ -85,7 +85,7 @@
:label="item.label" :label="item.label"
/> />
</el-select> </el-select>
<el-button type="primary" @click="wifiChangeMode" :loading="wifiMode_loading">更改</el-button> <el-button type="primary" @click="wifiChangeMode" :loading="wifiMode_loading">保存</el-button>
</div> </div>
<el-divider></el-divider> <el-divider></el-divider>
@ -116,7 +116,7 @@
<el-descriptions-item span="1"> <el-descriptions-item span="1">
<template #label> <template #label>
<div> <div>
SSID Wi-Fi名(SSID)
</div> </div>
</template> </template>
{{ wifiStaApInfo.ssid }} {{ wifiStaApInfo.ssid }}
@ -127,7 +127,7 @@
<!-- 密码--> <!-- 密码-->
<!-- </div>--> <!-- </div>-->
<!-- </template>--> <!-- </template>-->
<!-- <password-viewer password="asdasdasd"></password-viewer>--> <!-- <password-viewer :password="wifiStaApInfo.password"></password-viewer>-->
<!-- </el-descriptions-item>--> <!-- </el-descriptions-item>-->
<el-descriptions-item span="4"> <el-descriptions-item span="4">
<template #label> <template #label>
@ -174,26 +174,28 @@
> >
<template #extra> <template #extra>
<el-switch v-model="wifiAp_On" :disabled="wsStore.state != ControlEvent.CONNECTED || !wifiSta_On" <el-switch v-model="wifiAp_On" :disabled="wsStore.state != ControlEvent.CONNECTED || !wifiSta_On"
active-text="热点已开启" inactive-text="热点已关闭" :loading="wifiMode_loading" :loading="wifiMode_loading" active-text="已开启" inactive-text="未开启"
:before-change="()=>beforeWifiModeChange('AP')" :before-change="()=>beforeWifiModeChange('AP')"
/> />
</template> </template>
<el-descriptions-item span="6"> <el-descriptions-item span="6">
<template #label> <template #label>
<div> <div>
SSID Wi-Fi名(SSID)
</div> </div>
</template> </template>
{{ wifiApInfo.ssid }} <div class="flex">
<el-input v-model="wifiApInfo.ssid"></el-input>
</div>
</el-descriptions-item>
<el-descriptions-item span="6">
<template #label>
<div>
密码
</div>
</template>
<el-input v-model="wifiApInfo.password"></el-input>
</el-descriptions-item> </el-descriptions-item>
<!-- <el-descriptions-item span="6">-->
<!-- <template #label>-->
<!-- <div>-->
<!-- 密码-->
<!-- </div>-->
<!-- </template>-->
<!-- <password-viewer password="asdasdasd"></password-viewer>-->
<!-- </el-descriptions-item>-->
<el-descriptions-item span="4"> <el-descriptions-item span="4">
<template #label> <template #label>
<div> <div>
@ -230,6 +232,9 @@
{{ wifiApInfo.netmask }} {{ wifiApInfo.netmask }}
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<div class="flex justify-center mt-4">
<el-button type="primary" :loading="wifiMode_loading" @click="wifiApChangeCredential">保存</el-button>
</div>
<el-divider></el-divider> <el-divider></el-divider>
</div> </div>
@ -240,6 +245,7 @@ import {computed, onMounted, onUnmounted, reactive, ref} from "vue";
import { import {
type IWifiMode, type IWifiMode,
wifi_ap_get_info, wifi_ap_get_info,
wifi_ap_set_credential,
wifi_connect_to, wifi_connect_to,
wifi_get_mode, wifi_get_mode,
wifi_get_scan_list, wifi_get_scan_list,
@ -249,7 +255,9 @@ import {
type WifiInfo, type WifiInfo,
type WifiList, type WifiList,
WifiMode, WifiMode,
WifiStatus type WifiScanInfo,
type WiFiCredential,
WifiStatus,
} from "@/api/apiWifi"; } from "@/api/apiWifi";
import type {FormInstance} from "element-plus"; import type {FormInstance} from "element-plus";
@ -275,6 +283,8 @@ let wifiAp_On = ref(false);
let wifiMode = ref(-1); let wifiMode = ref(-1);
const wifiTestString = ref("666");
let wifiModeOptions = [ let wifiModeOptions = [
{ {
label: "智能热点+常开终端AP+STA", label: "智能热点+常开终端AP+STA",
@ -303,6 +313,7 @@ const defWifiInfo: WifiInfo = {
rssi: 0, rssi: 0,
netmask: "未连接", netmask: "未连接",
ssid: "未连接", ssid: "未连接",
password: "",
} }
let wifiStaApInfo = reactive<WifiInfo>({...defWifiInfo}); let wifiStaApInfo = reactive<WifiInfo>({...defWifiInfo});
@ -311,7 +322,7 @@ let wifiApInfo = reactive<WifiInfo>({...defWifiInfo});
let scanning = ref(false); let scanning = ref(false);
let scan_cb: any; let scan_cb: any;
let connectBtnClicked = 0; let connectBtnClicked = 0;
let options: Array<WifiInfo> = []; let options: Array<WifiScanInfo> = [];
const scanText = computed(() => { const scanText = computed(() => {
return scanning.value ? "扫描中" : "扫描"; return scanning.value ? "扫描中" : "扫描";
}); });
@ -401,6 +412,17 @@ const onClientMsg = (msg: ApiJsonMsg) => {
console.log("@@@", wifiAp_On.value); console.log("@@@", wifiAp_On.value);
break; break;
} }
case WifiCmd.WIFI_API_JSON_AP_SET_CRED: {
const wifiCred = msg as WiFiCredential;
if (wifiCred.err !== undefined) {
globalNotifyRightSide(wifiCred.err, "error");
} else {
globalNotifyRightSide("已保存配置", "success");
}
wifiMode_loading.value = false;
break;
}
default: default:
if (isDevMode()) { if (isDevMode()) {
console.log(msg); console.log(msg);
@ -462,6 +484,15 @@ function wifiChangeMode() {
wifi_set_mode(wifiMode.value); wifi_set_mode(wifiMode.value);
} }
function wifiApChangeCredential() {
if (wifiApInfo.ssid === "") {
globalNotifyRightSide("请输入AP名称", "error");
return;
}
wifiMode_loading.value = true;
wifi_ap_set_credential(wifiApInfo.ssid, wifiApInfo.password);
}
onMounted(() => { onMounted(() => {
registerModule(WtModuleID.WIFI, { registerModule(WtModuleID.WIFI, {
ctrlCallback: onClientCtrl, ctrlCallback: onClientCtrl,