草庐IT

使用uni-app创建扫码连接wifi小程序

笑道三千 2023-07-25 原文

好久没接触小程序了,突然想起来之前注册了个号。
广东突然降温,周末窝在被窝里没事干。
就写个一键连接wifi的小工具吧。
可以作为初学者的练习项目哈。

一,新建项目

下载安装HBuilde,然后新建项目

二,从目录机构到小程序发布流程

1,目录结构介绍

新建完成后可以看到项目的目录结构:

2,将项目运行到浏览器

如下图操作,即可将项目跑到chrome浏览器中:

3,填写uni-app配置

打开manifest.json文件,按照要求填写信息,主要是这个DCloud-appId,这个需要注册账户后登录这个账户生成。

4,发布小程序

以前小程序的发布只能在微信开发者工具中进行,今天我发现HBuilder已经接入了微信提供的miniprogram-ci,这是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。
于是开发者可不打开小程序开发者工具,独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。
想要详细了解的,可以看这里:https://developers.weixin.qq.com/miniprogram/dev/devtools/ci.html
现在说如何发布小程序,操作栏-发行-微信小程序,会弹出一个对话框,填写相关内容即可:

备注
【1】微信小程序的appid获取地址:https://mp.weixin.qq.com/wxamp/basicprofile/index,设置页面拉到最下面,小程序Id(appId)便是。
【2】密钥文件获取地址:打开微信公众平台官网, 扫码登录,左侧菜单【开发 -> 开发管理】,点击tab【开发设置】,如下图:

接下来,需要配置发行程序的ip白名单:

当然,你也可以把这个功能关闭。
然后继续点击发布,就可以看到控制台上传成功,这时候打开微信开发者网页,可以将刚上传的版本选为体验版,如果测试完成,就能够提交审核,变更为正式版供用户使用啦!

三,书写项目代码

1,首页的ui书写

先实现功能,我需要的是利用用户输入的wifi账号和密码来生成对应的二维码。
所以需要如下的表单页面:

经过我喝了半杯可乐,吃了一个汉堡、两个橘子地呕心沥血创作之后。基本的页面就出来了:

<template>
	<view class="content">
		<div class="content-box">
			<view class="uni-form-item">
				<view class="title">WIFI名称:</view>
				<input class="uni-input" focus placeholder="自动获得焦点" v-model="wifiName"/>
			</view>
			<view class="uni-form-item">
				<view class="title">WIFI密码:</view>
				<input class="uni-input" password type="text" placeholder="这是一个密码输入框" v-model="wifiPwd"/>
			</view>
			
			<button type="primary" @click="createCode" :loading="createFlag">生成WIFI码</button>
		</div>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				wifiName:'1',
				wifiPwd:"23",
				createFlag:false,
			}
		},
		onLoad() {

		},
		methods: {
			createCode(){
				console.log("开始生成二维码",this.wifiName,this.wifiPwd)
				this.createFlag=true
				setTimeout(()=>{
					this.createFlag=false
				},1500)
			}
		}
	}
</script>

<style scoped lang="scss">
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
		position: relative;
		width: 100%;
		height: 100vh;
	}

	.content-box {
		width: 100%;
		padding: 25rpx;
		box-sizing: border-box;
		position: absolute;
		top: 30%;
		.uni-form-item{
			display: flex;
			justify-content: space-between;
			margin: 0 50rpx 40rpx 50rpx;
			.uni-input{
				border-radius: 4rpx;
				border: 1px solid #5e5e5e;
			}
		}
	}
</style>

实现的页面效果:

这个uni-app还是挺好用的哈,简化了项目搭建和路由配置,感觉新手使用起来专注于页面的切图代码就好了。接下来实现生成wifi码的过程。

2,生成wifi码的原理一

其实到目前为止,我还不知道是啥原理实现的,但是并不妨碍我去借鉴(抄袭)一下别人的实现哈~
参考这个网站:
https://www.mywifisign.com/zh-hans**

当我输入wifi的名字和密码的时候,就会生成一张二维码,这个二维码使用手机摄像头(注意是手机摄像头)扫,就会在屏幕中提示,是否加入“TP-LINK_586995”,是不是很神奇?
然后我们用微信扫一扫,就可以得到这个二维码隐藏的信息。

WIFI:S:TP-LINK_586995;T:WPA;P:1234567890;
`WIFI` 表示这个是一个连接 WiFi 的协议
`S` 表示后面是 WiFi 的 SSID,也就是 WiFi 的名称
`P` 表示后面是 WiFi 的密码,也就是 WiFi 的密码
`T` 表示后面是密码的加密方式,`WPA/WPA2` 大部分都是这个加密方式,也使用`WPA`。如果写`WPA/WPA2`部分手机可能无法识别。
`H` 表示这个WiFi是否是隐藏的,直接打开 WiFi 扫不到这个信号。苹果还不支持隐藏模式。

所以,这就提供了一种直接通过原生层调用wifi模块连接的实现。
这种实现呢,它的好处是用户只有有手机,无需联网,无需打开微信等扫一扫的app,就可以连接上网络。

3,生成wifi码的原理二

但是正常人看到二维码,基本上会习惯性地打开微信扫一扫功能,那如何生成让微信识别的wifi码呢?

其实这种方法应该是基于第一种,只不过是被微信封装了一层而已。

原理就是用这些信息生成二维码,用户扫码时进入我写的小程序,小程序调用微信的api,微信的api调用手机的wifi对应sdk,从而实现原理一的操作。

【3.1】uniapp项目运行到微信开发者工具中

查看官方的文档:
wx.startWifi(Object object)

基础库 1.6.0 开始支持,低版本需做兼容处理。
以 Promise 风格 调用:支持
小程序插件:支持,需要小程序基础库版本不低于 2.9.1
相关文档: 无线局域网 (Wi-Fi)

基础库,我新创建的uniapp项目居然没有这个api,应该就是基础库不支持,没找到uniapp项目如何配置微信小程序的基础库,于是无奈的我只能下载微信开发者工具,然后将这个项目编译后导入。
因为要在微信开发者工具中导入uniapp编译后的项目,并且热更新,就需要打开微信开发者工具的端口:微信开发者工具 -> 设置 -> 安全设置 -> 开启服务端口
然后在HBuilder中运行到微信开发者工具:

然后修改基础库:

接下来,我们在HBuilder中修改代码,微信开发者工具中就会热更新。
【3.2】微信开发者工具真机联调

这样之后,手机微信扫一扫,就可以真机联调了,同时会在电脑上生成它的调试面板。
接下来讲代码的具体实现。

四,原理一的实现

原理一的实现很简单,就是将我们的wify信息编码成二维码展示到页面上就行了。
将信息转化为二维码我使用的库是:weapp_qrcode
具体的代码实现:

<template>
	<view class="content">
		<div class="content-box">
			<view class="uni-form-item">
				<view class="title">WIFI名称:</view>
				<input class="uni-input" focus placeholder="自动获得焦点" v-model="SSID"/>
			</view>
			<view class="uni-form-item">
				<view class="title">WIFI密码:</view>
				<input class="uni-input" password type="text" placeholder="这是一个密码输入框" v-model="password"/>
			</view>
			
			<button type="primary" @click="createCode" :loading="createFlag">生成WIFI码</button>
		</div>
		
		<!-- 二维码弹出层 -->
		<div class="popup" v-if="showQrcode">
			<view class="hidden-box" >
				<div class="upop-content-box">
					<view class="code-tit">扫二维码连接wifi</view>
					<view class="qrcode-box">
						<img src="../../static/empty.png" alt="" v-if="!qrcode" class="empty">
						<view class="qrcode" v-else>
						   <canvas style="width: 350rpx; height: 350rpx;margin: 0 auto;" canvas-id="myQrcode"></canvas>
						</view>
					</view>
					<view class="code-tit tips" v-if="tips">使用说明</view>
					<view class="explain-text" >{{ tips }}</view>
				</div>
			</view>
			<div class="mask" @click="showQrcode=false"></div>
		</div>
	</view>
</template>

<script>
	import drawQrcode from '../../utils/weapp_qrcode.js'
	export default {
		data() {
			return {
				SSID:'TP-LINK_586995',
				password:"1234567890",
				createFlag:false,
				showQrcode:false,
				qrcode:'',
				codeWidth:this.rpxToPx(350),
				tips:'本二维码可在断网情况下使用手机相机(不是微信扫一扫)识别使用'
			}
		},
		methods: {
			createWithoutNetQrcode(){
				drawQrcode({
				  width: this.codeWidth,
				  height: this.codeWidth,
				  canvasId: 'myQrcode',
				  text: this.qrcode,
				  image: {
				    imageResource: '',
				  }
				})
				
			},
			// rpx转px
			rpxToPx(rpx) {
			  const screenWidth = uni.getSystemInfoSync().screenWidth
			  return (screenWidth * Number.parseInt(rpx)) / 750
			}
		}
	}
</script>

实现的效果是这样的:

手机无论是否联网,只要扫这个二维码,都能连接无线。

五,原理二的代码实现

1,初始化判断用户设备

因为只有安卓七和ios12及以上才支持,所以第一步肯定是需要判断下用户的手机的。

		data() {
			return {
				platform: '', //系统 
			}
		},
		onLoad() {
			var _this = this;
			//检测手机型号
			wx.getSystemInfo({
			  success: function (res) {
				var system = '';
				if (res.platform == 'android') system = parseInt(res.system.substr(8));
				if (res.platform == 'ios') system = parseInt(res.system.substr(4));
				if (res.platform == 'android' && system < 6) {
					console.log("手机版本暂时不支持")
				  return
				}
				if (res.platform == 'ios' && system < 11) {
					console.log("手机版本暂时不支持")
					return
				}
				_this.platform=res.platform;
				//初始化 Wi-Fi 模块
				_this.startWifi(_this);
			  }
			})
		},

2,初始化wifi模块

官方文档:
https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.startWifi.html
相关代码:

//初始化 Wi-Fi 模块。
   startWifi(_this) {
		wx.startWifi({
		  success: function (res) {
			console.log("初始化成功,这里要写连接模块")
		  },
		  fail: function (res) {
			  console.log("wifi启动失败")
			_this.startError=res.errMsg;
		  }
		})
   }

3,连接wifi的代码实现

官方文档:
https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.connectWifi.html
对应的实现代码:

//wifi连接
connectWifi(_this){
	wx.connectWifi({
	  SSID: _this.SSID,
	  password: _this.password,
	  success (res) {
	    console.log("wifi连接成功")
	  },
	  fail: function (res) {
		console.log("wifi连接失败")
		_this.startError=res.errMsg;
	  }
	})
}

4,绘制二维码的实现

上文只是使用wifi信息连接的wifi,而我们的正确业务流程是:

1,用户填写wifi信息
2,点击生成wifi二维码
3,用户使用wifi二维码扫码,可以进入我的小程序。连接wifi。

这篇文章写到这里,看了文档,生成微信小程序的菊花形状二维码,需要后端提供支持。这里我才用云开发。
这个东西比较多,我也没接触过,所以另开一篇文章讲这个过程。

有关使用uni-app创建扫码连接wifi小程序的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  7. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  8. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  9. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  10. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

随机推荐