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