feat(wifi) configurable AP/STA mode
This commit is contained in:
parent
80bbaf8f54
commit
794c02b94c
|
@ -2,11 +2,36 @@ import {type ApiJsonMsg, sendJsonMsg, WtModuleID} from '@/api'
|
||||||
|
|
||||||
export enum WifiCmd {
|
export enum WifiCmd {
|
||||||
UNKNOWN = 0,
|
UNKNOWN = 0,
|
||||||
WIFI_API_JSON_STA_GET_AP_INFO,
|
WIFI_API_JSON_STA_GET_AP_INFO = 1,
|
||||||
WIFI_API_JSON_CONNECT,
|
WIFI_API_JSON_CONNECT = 2,
|
||||||
WIFI_API_JSON_GET_SCAN,
|
WIFI_API_JSON_GET_SCAN = 3,
|
||||||
WIFI_API_JSON_DISCONNECT,
|
WIFI_API_JSON_DISCONNECT = 4,
|
||||||
WIFI_API_JSON_AP_GET_INFO,
|
WIFI_API_JSON_AP_GET_INFO = 5,
|
||||||
|
WIFI_API_JSON_GET_MODE = 6,
|
||||||
|
WIFI_API_JSON_SET_MODE = 7,
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum WifiMode {
|
||||||
|
/* permanent */
|
||||||
|
WIFI_AP_AUTO_STA_ON = 0,
|
||||||
|
|
||||||
|
WIFI_AP_STA_OFF = 4, /* 100 */
|
||||||
|
WIFI_AP_OFF_STA_ON = 5, /* 101 */
|
||||||
|
WIFI_AP_ON_STA_OFF = 6, /* 110 */
|
||||||
|
WIFI_AP_STA_ON = 7, /* 111 */
|
||||||
|
|
||||||
|
/* temporary */
|
||||||
|
WIFI_AP_STOP = 8,
|
||||||
|
WIFI_AP_START = 9,
|
||||||
|
WIFI_STA_STOP = 10,
|
||||||
|
WIFI_STA_START = 11,
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum WifiStatus {
|
||||||
|
WIFI_MODE_NULL = 0, /**< null mode */
|
||||||
|
WIFI_MODE_STA, /**< WiFi station mode */
|
||||||
|
WIFI_MODE_AP, /**< WiFi soft-AP mode */
|
||||||
|
WIFI_MODE_APSTA, /**< WiFi station + soft-AP mode */
|
||||||
}
|
}
|
||||||
|
|
||||||
interface WifiMsgOut extends ApiJsonMsg {
|
interface WifiMsgOut extends ApiJsonMsg {
|
||||||
|
@ -61,3 +86,40 @@ export interface WifiInfo extends ApiJsonMsg {
|
||||||
export interface WifiList extends ApiJsonMsg {
|
export interface WifiList extends ApiJsonMsg {
|
||||||
scan_list: Array<WifiInfo>;
|
scan_list: Array<WifiInfo>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IWifiMode extends ApiJsonMsg {
|
||||||
|
mode?: WifiMode;
|
||||||
|
status?: WifiStatus;
|
||||||
|
ap_on_delay?: number;
|
||||||
|
ap_off_delay?: number;
|
||||||
|
err?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function wifi_set_mode(req_mode: WifiMode, ap_on_delay = -1, ap_off_delay = -1) {
|
||||||
|
let msg: IWifiMode;
|
||||||
|
if (req_mode === WifiMode.WIFI_AP_AUTO_STA_ON && ap_on_delay !== -1 && ap_off_delay !== -1) {
|
||||||
|
msg = {
|
||||||
|
module: WtModuleID.WIFI,
|
||||||
|
cmd: WifiCmd.WIFI_API_JSON_SET_MODE,
|
||||||
|
mode: req_mode,
|
||||||
|
ap_on_delay: ap_on_delay,
|
||||||
|
ap_off_delay: ap_off_delay,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
msg = {
|
||||||
|
module: WtModuleID.WIFI,
|
||||||
|
cmd: WifiCmd.WIFI_API_JSON_SET_MODE,
|
||||||
|
mode: req_mode,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
sendJsonMsg(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function wifi_get_mode() {
|
||||||
|
const msg: IWifiMode = {
|
||||||
|
module: WtModuleID.WIFI,
|
||||||
|
cmd: WifiCmd.WIFI_API_JSON_GET_MODE,
|
||||||
|
};
|
||||||
|
|
||||||
|
sendJsonMsg(msg);
|
||||||
|
}
|
||||||
|
|
|
@ -54,22 +54,62 @@
|
||||||
</div>
|
</div>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
|
<el-divider></el-divider>
|
||||||
|
<div class="flex items-center">
|
||||||
|
<h5 class="text-md font-bold text-gray-800 w-24">Wi-Fi模式</h5>
|
||||||
|
<div class="flex shrink-0">
|
||||||
|
<el-tooltip effect="light">
|
||||||
|
<template #content>
|
||||||
|
<p>热点+终端模式并存会影响稳定性。且保持热点开启会增加功耗。</p>
|
||||||
|
<p>
|
||||||
|
<el-text size="small">智能模式:</el-text>
|
||||||
|
成功连接Wi-Fi,10秒后自动关闭热点;断开连接,5秒后自动打开热点
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<el-text size="small">热点+终端共存模式:</el-text>
|
||||||
|
方便使用,但是影响稳定性
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<el-text size="small">单热点模式缺点:</el-text>
|
||||||
|
无网络
|
||||||
|
</p>
|
||||||
|
</template>
|
||||||
|
<InlineSvg name="help" class="w-3.5 h-3.5 text-gray-500 cursor-help"></InlineSvg>
|
||||||
|
</el-tooltip>
|
||||||
|
</div>
|
||||||
|
<el-select v-model="wifiMode" placeholder="Select" :disabled="wsStore.state != ControlEvent.CONNECTED">
|
||||||
|
<el-option
|
||||||
|
v-for="item in wifiModeOptions"
|
||||||
|
:key="item.key"
|
||||||
|
:value="item.key"
|
||||||
|
:label="item.label"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
<el-button type="primary" @click="wifiChangeMode" :loading="wifiMode_loading">更改</el-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<el-divider></el-divider>
|
<el-divider></el-divider>
|
||||||
|
|
||||||
|
|
||||||
<el-descriptions
|
<el-descriptions
|
||||||
title="Wi-Fi终端信息"
|
title="Wi-Fi终端(STA)信息(路由器/手机热点等)"
|
||||||
:column="1"
|
:column="1"
|
||||||
border
|
border
|
||||||
class="description-style"
|
class="description-style"
|
||||||
>
|
>
|
||||||
|
<template #extra>
|
||||||
|
<el-switch v-model="wifiSta_On" :disabled="wsStore.state != ControlEvent.CONNECTED || !wifiAp_On"
|
||||||
|
active-text="已启用" inactive-text="未启用" :loading="wifiMode_loading"
|
||||||
|
:before-change="()=>beforeWifiModeChange('STA')"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
<el-descriptions-item label="asd">
|
<el-descriptions-item label="asd">
|
||||||
<template #label >
|
<template #label>
|
||||||
<div>
|
<div>
|
||||||
信号强度
|
信号强度
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #default >
|
<template #default>
|
||||||
{{ wifiStaApInfo.rssi }}
|
{{ wifiStaApInfo.rssi }}
|
||||||
</template>
|
</template>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
|
@ -92,7 +132,7 @@
|
||||||
<el-descriptions-item span="4">
|
<el-descriptions-item span="4">
|
||||||
<template #label>
|
<template #label>
|
||||||
<div>
|
<div>
|
||||||
IP
|
IP(内网地址)
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
{{ wifiStaApInfo.ip }}
|
{{ wifiStaApInfo.ip }}
|
||||||
|
@ -127,11 +167,17 @@
|
||||||
<el-divider></el-divider>
|
<el-divider></el-divider>
|
||||||
|
|
||||||
<el-descriptions
|
<el-descriptions
|
||||||
title="Wi-Fi热点信息"
|
title="Wi-Fi热点(AP)信息(调试器自发热点)"
|
||||||
:column="1"
|
:column="1"
|
||||||
border
|
border
|
||||||
class="description-style"
|
class="description-style"
|
||||||
>
|
>
|
||||||
|
<template #extra>
|
||||||
|
<el-switch v-model="wifiAp_On" :disabled="wsStore.state != ControlEvent.CONNECTED || !wifiSta_On"
|
||||||
|
active-text="热点已开启" inactive-text="热点已关闭" :loading="wifiMode_loading"
|
||||||
|
:before-change="()=>beforeWifiModeChange('AP')"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
<el-descriptions-item span="6">
|
<el-descriptions-item span="6">
|
||||||
<template #label>
|
<template #label>
|
||||||
<div>
|
<div>
|
||||||
|
@ -184,7 +230,6 @@
|
||||||
{{ wifiApInfo.netmask }}
|
{{ wifiApInfo.netmask }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
|
|
||||||
<el-divider></el-divider>
|
<el-divider></el-divider>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -193,21 +238,28 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {computed, onMounted, onUnmounted, reactive, ref} from "vue";
|
import {computed, onMounted, onUnmounted, reactive, ref} from "vue";
|
||||||
import {
|
import {
|
||||||
wifi_sta_get_ap_info,
|
type IWifiMode,
|
||||||
|
wifi_ap_get_info,
|
||||||
|
wifi_connect_to,
|
||||||
|
wifi_get_mode,
|
||||||
wifi_get_scan_list,
|
wifi_get_scan_list,
|
||||||
|
wifi_set_mode,
|
||||||
|
wifi_sta_get_ap_info,
|
||||||
WifiCmd,
|
WifiCmd,
|
||||||
type WifiInfo,
|
type WifiInfo,
|
||||||
type WifiList,
|
type WifiList,
|
||||||
wifi_ap_get_info, wifi_connect_to
|
WifiMode,
|
||||||
|
WifiStatus
|
||||||
} from "@/api/apiWifi";
|
} from "@/api/apiWifi";
|
||||||
import type {FormInstance} from "element-plus";
|
import type {FormInstance} from "element-plus";
|
||||||
|
|
||||||
import InlineSvg from "@/components/InlineSvg.vue";
|
import InlineSvg from "@/components/InlineSvg.vue";
|
||||||
import type {ApiJsonMsg, ControlMsg, ServerMsg} from "@/api";
|
import type {ApiJsonMsg, ControlMsg} from "@/api";
|
||||||
import {ControlEvent, ControlMsgType, WtModuleID} from "@/api";
|
import {ControlEvent, ControlMsgType, WtModuleID} from "@/api";
|
||||||
import {registerModule, unregisterModule} from "@/router/msgRouter";
|
import {registerModule, unregisterModule} from "@/router/msgRouter";
|
||||||
import {useWsStore} from "@/stores/websocket";
|
import {useWsStore} from "@/stores/websocket";
|
||||||
import {globalNotify, globalNotifyRightSide} from "@/composables/notification";
|
import {globalNotify, globalNotifyRightSide} from "@/composables/notification";
|
||||||
|
import {isDevMode} from "@/composables/buildMode";
|
||||||
|
|
||||||
const formRef = ref<FormInstance>()
|
const formRef = ref<FormInstance>()
|
||||||
let wifiListPlaceholder = ref("我的WIFI")
|
let wifiListPlaceholder = ref("我的WIFI")
|
||||||
|
@ -216,6 +268,29 @@ let ssidValidateForm = reactive({
|
||||||
password: "",
|
password: "",
|
||||||
})
|
})
|
||||||
|
|
||||||
|
let wifiSta_On = ref(false);
|
||||||
|
const wifiMode_loading = ref(false)
|
||||||
|
|
||||||
|
let wifiAp_On = ref(false);
|
||||||
|
|
||||||
|
let wifiMode = ref(-1);
|
||||||
|
|
||||||
|
let wifiModeOptions = [
|
||||||
|
{
|
||||||
|
label: "智能热点+常开终端(AP+STA)",
|
||||||
|
key: WifiMode.WIFI_AP_AUTO_STA_ON,
|
||||||
|
}, {
|
||||||
|
label: "仅开启热点(AP)",
|
||||||
|
key: WifiMode.WIFI_AP_ON_STA_OFF,
|
||||||
|
}, {
|
||||||
|
label: "[不推荐] 常开热点+常开终端(AP+STA)",
|
||||||
|
key: WifiMode.WIFI_AP_STA_ON,
|
||||||
|
}, /* {
|
||||||
|
value: "仅开启终端(STA)",
|
||||||
|
key: 2,
|
||||||
|
},*/
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
let wsStore = useWsStore();
|
let wsStore = useWsStore();
|
||||||
|
|
||||||
|
@ -295,6 +370,42 @@ const onClientMsg = (msg: ApiJsonMsg) => {
|
||||||
Object.assign(wifiApInfo, info);
|
Object.assign(wifiApInfo, info);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case WifiCmd.WIFI_API_JSON_SET_MODE:
|
||||||
|
wifi_get_mode();
|
||||||
|
/* falls through */
|
||||||
|
case WifiCmd.WIFI_API_JSON_GET_MODE: {
|
||||||
|
const modeInfo = msg as IWifiMode;
|
||||||
|
wifiMode_loading.value = false;
|
||||||
|
if (modeInfo.err !== undefined) {
|
||||||
|
globalNotifyRightSide("设置失败", "error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modeInfo.status !== undefined) {
|
||||||
|
wifiAp_On.value = modeInfo.status === WifiStatus.WIFI_MODE_AP || modeInfo.status === WifiStatus.WIFI_MODE_APSTA;
|
||||||
|
wifiSta_On.value = modeInfo.status === WifiStatus.WIFI_MODE_STA || modeInfo.status === WifiStatus.WIFI_MODE_APSTA;
|
||||||
|
}
|
||||||
|
if (modeInfo.mode !== undefined) {
|
||||||
|
if (modeInfo.mode < WifiMode.WIFI_AP_STOP) {
|
||||||
|
wifiMode.value = modeInfo.mode;
|
||||||
|
} else if (modeInfo.mode === WifiMode.WIFI_AP_START) {
|
||||||
|
wifiAp_On.value = true;
|
||||||
|
} else if (modeInfo.mode === WifiMode.WIFI_AP_STOP) {
|
||||||
|
wifiAp_On.value = false;
|
||||||
|
} else if (modeInfo.mode === WifiMode.WIFI_STA_START) {
|
||||||
|
wifiSta_On.value = true;
|
||||||
|
} else if (modeInfo.mode === WifiMode.WIFI_STA_STOP) {
|
||||||
|
wifiSta_On.value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log("@@@", wifiAp_On.value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
if (isDevMode()) {
|
||||||
|
console.log(msg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -311,6 +422,7 @@ const onClientCtrl = (msg: ControlMsg) => {
|
||||||
if (msg.data === ControlEvent.CONNECTED) {
|
if (msg.data === ControlEvent.CONNECTED) {
|
||||||
wifi_sta_get_ap_info();
|
wifi_sta_get_ap_info();
|
||||||
wifi_ap_get_info();
|
wifi_ap_get_info();
|
||||||
|
wifi_get_mode();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -334,6 +446,22 @@ function onConnectClick() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function beforeWifiModeChange(ap_sta: "AP" | "STA" = "AP") {
|
||||||
|
if (ap_sta === "AP") {
|
||||||
|
wifiMode_loading.value = true;
|
||||||
|
wifi_set_mode(wifiAp_On.value ? WifiMode.WIFI_AP_STOP : WifiMode.WIFI_AP_START);
|
||||||
|
} else {
|
||||||
|
wifiMode_loading.value = true;
|
||||||
|
wifi_set_mode(wifiSta_On.value ? WifiMode.WIFI_STA_STOP : WifiMode.WIFI_STA_START);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function wifiChangeMode() {
|
||||||
|
wifiMode_loading.value = true;
|
||||||
|
wifi_set_mode(wifiMode.value);
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
registerModule(WtModuleID.WIFI, {
|
registerModule(WtModuleID.WIFI, {
|
||||||
ctrlCallback: onClientCtrl,
|
ctrlCallback: onClientCtrl,
|
||||||
|
@ -342,6 +470,7 @@ onMounted(() => {
|
||||||
});
|
});
|
||||||
wifi_sta_get_ap_info();
|
wifi_sta_get_ap_info();
|
||||||
wifi_ap_get_info();
|
wifi_ap_get_info();
|
||||||
|
wifi_get_mode();
|
||||||
});
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
|
|
Loading…
Reference in New Issue