如何在nodejs中连接wifi(亲测在windows以及linux下均可使用)🚀

问题: 如何在nodejs中连接wifi?

1. 使用技术栈: Vue3+Vite+Electron

因为需要使用到nodejs,所以单纯的Vue3+Vite并不能满足需求,具体的原因可以看我之前的文章Vue连接串口,包括如何搭建一个简单的Vue3+Vite+Electron的框架也可以看我之前的文章搭建一个Vue+Electron的框架,有这两篇文章作为铺垫,就可以直接码代码了

2. 第三方库介绍

这里使用了使用node-wifi库,在框架搭建好之后,可以直接使用npm或者yarn工具下载此库

3. 关键代码片段

  1. 连接wifi前置操作
js 复制代码
// 导入wifi
const wifi = require('node-wifi');

// 初始化 WiFi 模块
wifi.init({
  iface: null, // 在 Windows 上通常不需要指定接口
});
  1. 检查wifi列表
js 复制代码
// 扫描可用的 WiFi 网络
  wifi.scan((error, networks) => {
    if (error) {
      console.log(error);
      return;
    }
    // 扫描成功,得到wifi列表
    console.log(networks)
  });
  1. 连接wifi
js 复制代码
// 连接到 WiFi 网络
  wifi.connect({ ssid: 网络名称, password: 网络密码 }, error => {
    if (error) {
      // wifi连接失败
      console.log(error)
      return
    }
   // wifi连接成功
   console.log('wifi连接成功')     
  1. 断开wifi
js 复制代码
// 断开当前连接的 WiFi 网络
  wifi.disconnect(error => {
    if (error) {
      console.log(error);
    } else {
      console.log('wifi连接已断开!');
    }
  });
  1. 检查wifi连接状态
js 复制代码
wifi.getCurrentConnections((error, currentConnections) => {
    if (error) {
      console.error(error);
      return;
    }
    // 如果存在已连接的wifi信息
    if (currentConnections.length > 0) {
     console.log(currentConnections[0])
    } else {
      console.log('当前未连接到任何 WiFi 网络。');
    }
  });

有了以上的几个node-wifi的API代码片段,写起来就简单多了,只需要根据api来写业务逻辑即可

4. nodejs连接wifi案例

以下是我做的一个建议的wifi连接页面,包含了wifi列表展示,wifi连接,wifi断开连接,刷新wifi等功能,先看效果图

wifi连接工具源码:

js 复制代码
<!--
 * @Author: wangzhiyu <w19165802736@163.com>
 * @Date: 2023-12-15 11:05:46
 * @LastEditTime: 2024-04-17 17:17:10
 * @Descripttion: Home页面
-->
<template>
  <div>
    <!-- 判断wifi是否开启 -->
    <a-button class="refreshWifi" @click="getWifiList" type="primary">刷新wifi</a-button>
    <!-- 刷新wifi -->
    <div v-if="wifiOpen" class="wifiList">
      <!-- 循环展示当前扫描到的wifi列表 -->
      <div v-for="item in wifiList" class="wifiItem">
        <!-- wifi名称 -->
        <div class="wifiSSid">{{ item.ssid }}</div>
        <!-- 连接wifi -->
        <a-button
          :type="item.isConnect ? 'default' : 'primary'"
          :danger="item.isConnect"
          @click="
            () => {
              if (item.isConnect) {
                // 断开wifi
                disconnectWifi(item);
              } else {
                // 连接wifi
                connectWifi(item);
              }
            }
          "
        >
          {{ item.isConnect ? '断开 wifi' : '连接 wifi' }}
        </a-button>
      </div>
    </div>

    <!-- wifi功能未开启提示 -->
    <div v-else>本机wifi未开启,请开启wifi后重试!</div>

    <!-- 连接wifi输入密码弹框 -->
    <a-modal :width="550" v-model:open="openModal" title="连接wifi" @ok="handleOk" cancelText="取消连接" okText="确认连接">
      <a-form>
        <a-form-item label="wifi名称">
          <a-input disabled :value="selectWifiInfo.ssid"></a-input>
        </a-form-item>
        <a-form-item label="wifi密码">
          <a-input-password v-model:value="wifiPassword" placeholder="请输入wifi密码" />
        </a-form-item>
      </a-form>
    </a-modal>
  </div>
</template>

<script setup>
import { message } from 'ant-design-vue';
const wifi = require('node-wifi');

// wifi列表
const wifiList = ref([]);

// 判断是否开启网络
const wifiOpen = ref(false);

// 弹框开启/关闭状态
const openModal = ref(false);

// 选中连接的wifi信息
const selectWifiInfo = ref({});

// wifi密码
const wifiPassword = ref('');

// 初始化 WiFi 模块
wifi.init({
  iface: null, // 在 Windows 上通常不需要指定接口
});

// 获取wifi列表
const getWifiList = () => {
  // 扫描可用的 WiFi 网络
  wifi.scan((error, networks) => {
    // 扫描wifi失败
    if (error) {
      wifiOpen.value = false;
      console.log(error, 'error');
      return;
    }
    wifiOpen.value = true;

    // wifi扫描成功,获取wifi列表
    wifiList.value = networks.filter(item => item.ssid);

    // 检查当前wifi的连接状态
    getWifiState();
  });
};
getWifiList();

// 获取当前网络连接信息
const getWifiState = () => {
  // 获取当前连接的 WiFi 网络信息
  wifi.getCurrentConnections((error, currentConnections) => {
    if (error) {
      console.error(error);
      return;
    }
    // 如果存在已连接的wifi信息
    if (currentConnections.length > 0) {
      // 当前已经连接的 WiFi 网络
      const connectedNetwork = currentConnections[0].mac;

      // 标记当前连接的wifi
      wifiList.value.forEach(item => {
        if (item.ssid === connectedNetwork) {
          item.isConnect = true;
        } else {
          item.isConnect = false;
        }
      });
    } else {
      console.log('当前未连接到任何 WiFi 网络。');
    }
  });
};

// 连接wifi
const connectWifi = wifiInfo => {
  // 打开弹框
  openModal.value = true;
  selectWifiInfo.value = wifiInfo;
};

// 确认连接wifi
const handleOk = () => {
  // 连接到 WiFi 网络
  wifi.connect({ ssid: selectWifiInfo.value.ssid, password: wifiPassword.value }, error => {
    if (error) {
      // 提示wifi连接失败
      message.error('wifi连接失败,请检查账号密码后重试!');
    } else {
      // 提示wifi连接成功
      message.success('wifi连接成功!');

      // 标记当前连接的wifi
      wifiList.value.forEach(item => {
        if (item.ssid === selectWifiInfo.value.ssid) {
          item.isConnect = true;
        } else {
          item.isConnect = false;
        }
      });
    }

    // 清空密码
    wifiPassword.value = '';
    // 关闭弹框
    openModal.value = false;
  });
};

// 断开wifi连接
const disconnectWifi = () => {
  // 断开当前连接的 WiFi 网络
  wifi.disconnect(error => {
    if (error) {
      console.log(error);
    } else {
      message.success('wifi连接已断开!');
      wifiList.value.forEach(item => {
        item.isConnect = false;
      });
    }
  });
};
</script>

<style lang="scss">
.refreshWifi {
  position: absolute;
  left: 30%;
}
.wifiList {
  position: relative;
  width: 30%;
  min-width: 200px;
  margin: 0 auto;
  border: 1px solid #000;
  border-radius: 10px;
  max-height: 90vh;
  overflow: auto;

  &::-webkit-scrollbar {
    /*滚动条整体样式*/
    width: 10px; /*高宽分别对应横竖滚动条的尺寸*/
    height: 1px;
  }
  &::-webkit-scrollbar-thumb {
    /*滚动条里面小方块*/
    border-radius: 10px;
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
    background: #535353;
  }
  &::-webkit-scrollbar-track {
    /*滚动条里面轨道*/
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
    border-radius: 10px;
    background: #ededed;
  }
  .wifiItem {
    display: flex;
    align-items: center;
    justify-content: space-between;
    height: 50px;
    border-bottom: 1px solid #000;
    padding-right: 50px;
    box-sizing: border-box;
    &:last-child {
      border-bottom: none;
    }
    .wifiSSid {
      width: 75%;
      white-space: nowrap; /* 禁止文本换行 */
      overflow: hidden; /* 隐藏溢出部分 */
      text-overflow: ellipsis; /* 显示省略号 */
      padding-left: 20px;
    }
  }
}
</style>

5. 以上就是本次分享的全部内容了,有问题欢迎私信😁

相关推荐
豆豆41 分钟前
为什么用PageAdmin CMS建设网站?
服务器·开发语言·前端·php·软件构建
看到请催我学习1 小时前
如何实现两个标签页之间的通信
javascript·css·typescript·node.js·html5
twins35202 小时前
解决Vue应用中遇到路由刷新后出现 404 错误
前端·javascript·vue.js
qiyi.sky2 小时前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js
煸橙干儿~~2 小时前
分析JS Crash(进程崩溃)
java·前端·javascript
安冬的码畜日常2 小时前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺
l1x1n03 小时前
No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史
前端·http·html
昨天;明天。今天。3 小时前
案例-任务清单
前端·javascript·css
zqx_74 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架
惜.己4 小时前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5