uniapp中使用腾讯云小程序配网sdk过程

推荐另一种配网方式,参见小程序SoftAP配网

下面依然介绍使用sdk的过程

  1. 引入依赖,在腾讯云注册
  2. 规划页面
  3. 开始开发

这里需要注意的是官方demo和我自己在这里集成的,使用真机调试模式都无法配网。
只有点击预览才行,所幸预览可以打开调试,能在这种模式下查看日志及问题。

引入依赖

如果项目中没有用npm,那么先初始化

npm init -y

然后安装airkiss及相关依赖

npm install qcloud-iotexplorer-appdev-sdk
npm install qcloud-iotexplorer-appdev-plugin-wificonf-core
npm install qcloud-iotexplorer-appdev-plugin-wificonf-airkiss
  • 初始化sdk
    需要在腾讯物联网平台注册账号,添加应用
    https://console.cloud.tencent.com/iotexplorer
    在这里插入图片描述

  • 在应用开发中查看相关信息
    在这里插入图片描述

页面

根据设计,基础页面需求如下:

  • 确认配网状态,如指示灯是否在闪烁的提示
  • 判断wifi连接状态,填充wifi名称和密码
  • 调用配网sdk进行配网操作
  • 提示配网成功
{
	"path": "pages/configWiFi/tipspage/tipspage",
	"style": {
		"navigationBarTitleText": "配网提示",
		"enablePullDownRefresh": false
	}
}, {
	"path": "pages/configWiFi/formpage/formpage",
	"style": {
		"navigationBarTitleText": "获取wifi",
		"enablePullDownRefresh": false
	}

}, {
	"path": "pages/configWiFi/interlinkage/interlinkage",
	"style": {
		"navigationBarTitleText": "配网",
		"enablePullDownRefresh": false
	}

}, {
	"path": "pages/configWiFi/seccusspage/seccusspage",
	"style": {
		"navigationBarTitleText": "配网成功",
		"enablePullDownRefresh": false
	}
}

指示灯提示和成功提示这些基础页面就不在此细说了,都没有繁琐的外部操作。

wifi信息获取页面

先定义在wifi调用过程中的状态码和状态值的对应关系

const errEnum = {
	12000: '未先调用 startWifi 接口',
	12001: '当前系统不支持相关能力',
	12002: '密码错误',
	12003: '连接超时, 仅 Android 支持',
	12004: '重复连接 Wi-Fi',
	12005: 'Android 特有,未打开 Wi-Fi 开关',
	12006: 'Android 特有,未打开 GPS 定位开关',
	12007: '用户拒绝授权链接 Wi-Fi',
	12008: '无效 SSID',
	12009: '系统运营商配置拒绝连接 Wi-Fi',
	12010: '系统其他错误,需要在 errmsg 打印具体的错误原因',
	12011: '应用在后台无法配置 Wi-Fi',
	12013: '系统保存的 Wi-Fi 配置过期,建议忘记 Wi-Fi 后重试,仅 Android 支持',
	12014: 'iOS 特有,无效的 WEP / WPA 密码'
}

定义要调用的method。

getWifi() {
	const $t = this
	uni.getConnectedWifi({
		success(res) {
			$t.form.name = res.wifi.SSID
			$t.jinyongs = false
			uni.showToast({
				title: '已连接wifi网络'
			})
		},
		fail(err) {
			let errMsg = ''
			if (!err.errCode) {
				errMsg = err.errMsg
			} else {							
				errMsg = errEnum[err.errCode]
			}
			uni.showModal({
				content: errMsg,
				showCancel: false
			});
		}
	})
},
// 在监听了网络状态变更的同时又监听了`onWifiConnected`,是因为前者在iOS环境下当网络切换为wifi时再调用`uni.getConnectedWifi`会非常慢
onWifiConnected() {
	const $t = this
	uni.onWifiConnected(res => {
		$t.form.name = res.wifi.SSID
		uni.showToast({
			title: '已连接wifi网络'
		})
	})
},
onNetworkStatusChange() {
	let this_ = this;
	uni.onNetworkStatusChange(function(res) {
		console.log(res);
		if (res.networkType !== 'wifi') {
			this_.content = '当前非WiFi网络,请连接2.4G WiFi'
		} else {
			// this_.getWifi()
		}
	})
},

onLoad()destroyed()这两个时机进行环境判断和时间监听的注册

onLoad() {
	// 先检查环境,并注册监听
	const $t = this
	wx.startWifi({
	  success (res) {
		$t.getWifi();
		$t.onWifiConnected();
		$t.onNetworkStatusChange();
	  }
	})
},
destroyed() {
	uni.offNetworkStatusChange()
	uni.stopWifi()
},

配网页面

首先引入sdk中相关包,并定义基础函数

const {
		AppDevSdk
	} = require('qcloud-iotexplorer-appdev-sdk');
	const WifiConfConstants = require('qcloud-iotexplorer-appdev-plugin-wificonf-core').constants;
	const AirKissPlug = require('qcloud-iotexplorer-appdev-plugin-wificonf-airkiss').default;
	
	const {
	  // 步骤code
	  WifiConfStepCode,
	  // 步骤code的中文描述
	  WifiConfStepDesp,
	  // 错误的中文描述
	  WifiConfErrorMsg,
	} = WifiConfConstants;
	
	  const onComplete = (deviceInfo) => {
	    console.log('配网完成(onComplete):', deviceInfo);
	
	    uni.showModal({
	    	content: '配网完成',
	    	showCancel: false
	    });
	  };
	
	  const onError = async ({ code, detail }) => {
	    const msg = WifiConfErrorMsg[code];
	    console.log('配网错误(onError)', code, msg, detail);
		// uni.showModal({
		// 	content: '配网错误',
		// 	showCancel: false
		// });
	  };

	const getAccessToken = async () => {
		// 获取小程序登录凭证(code)
		const code = await new Promise((resolve, reject) => {
			wx.login({
				success: (res) => resolve(res.code),
				fail: reject
			});
		});

		// 获取小程序用户信息
		const userInfo = await new Promise((resolve, reject) => {
			wx.getUserInfo({
				success: (res) => resolve(res.userInfo),
				fail: reject
			});
		});

		// 调用开发者自建的后台服务端获取 AccessToken
		// 请根据实际情况调整实现
		const resp = await new Promise((resolve, reject) => {
			wx.request({
				url: '我们自己的后台地址接口',
				method: 'POST',
				data: {
					code: code,
					userInfo: userInfo
				},
				header: {
					'content-type': 'application/json'
				},
				success(res) {
					console.log('这里是自己返回的token吧:');
					console.log(res, res.data.content);
					resolve(res.data.content);
				},
				fail(err) {
					reject(err);
				}
			});
		});

		return {
			Token: resp,
			ExpireAt: 7200,
		};
	};

基础必要的data定义

targetWifiInfo: {
	SSID: '',
	password: '',
},
content: '正在配网(请将设备靠近路由器)……',
sdk: {},

回调中

destroyed() {
	wx.stopWifi()
},
onLoad(options) {
	console.log(options)
	const $t = this
	// this.wifiName = options.wifiName;
	this.targetWifiInfo = {
		SSID: options.wifiName,
		password: options.pwd
	}
	// this.setlianjie(options.names)

	const sdk = new AppDevSdk({
		debug: true,
		appKey: 'mZFOqyJJeVCa',
		getAccessToken: getAccessToken,
	});
	sdk.usePlugin(AirKissPlug);
	sdk.init()
	AirKissPlug.install(sdk);
	// sdk.init(options) => Promise<void>

	// this.sdk = sdk
	// this.airkiss()
	wx.startWifi()
	sdk.requestApi('AppCreateDeviceBindToken')
		.then((data) => {
			const bindDeviceToken = data.Token;
			this.bindDeviceToken = bindDeviceToken
			console.log('wifi设备配网Token=', bindDeviceToken);
			sdk.plugins['wifiConfAirKiss'].start({
				wifiConfToken: 'bindDeviceToken',
				targetWifiInfo: this.targetWifiInfo,
				autoRetry: true, // 自动处理故障流程
				familyId: 'default',
				roomId: '1',
				onProgress: $t.onProgress,
				onComplete,
				onError
			});
		});
},

method中只定义了onProgress的回调函数,用来更新页面提示

onProgress( val ) {
	const msg = WifiConfStepDesp[val.code];
	console.log('配网步骤更新_(onProgress)', val.code, msg, val.detail);
	switch (val.code) {
	  case WifiConfStepCode.PROTOCOL_SUCCESS:
		this.content = '配网成功'
		break;
	  case WifiConfStepCode.CREATE_UDP_CONNECTION_SUCCESS:
		this.content = msg
		break;
	 //  case WifiConfStepCode.BUSINESS_QUERY_TOKEN_STATE_SUCCESS:
		// this.content = msg
		// break;
	 //  case WifiConfStepCode.WIFI_CONF_SUCCESS:
		// this.content = msg
		// break;
	}
  },

此处可以判断只要当code为case WifiConfStepCode.PROTOCOL_SUCCESS:时,即算是配网成功。
虽然后续控制台会进行诸多报错,那是因为sdk中存在一些和腾讯云物联网平台设计的一些验证协议。

### 如何在 UniApp 中集成和使用微信小程序云开发服务 #### 置环境与初始化项目 为了使 UniApp 支持微信小程序云开发,需先安装最新版本的 HBuilderX 或者其他支持插件化扩展的 IDE,并创建一个新的 UniApp 项目。确保已下载并安装好微信开发者工具用于后续真机调试[^2]。 #### 开启云开发能力 进入微信公众平台的小程序管理后台,在设置中的“开发设置”里找到“云开发”,点击开启按钮完成首次部署操作。这一步骤会自动生成默认数据库、存储空间及相关权限置[^1]。 #### 安装依赖包 通过命令行工具进入到项目的根目录下执行如下 npm 命令来添加必要的 SDK: ```bash npm install @cloudbase/framework --save ``` 此过程将会把 CloudBase Framework 添加到 package.json 文件之中以便于管理和更新[^3]。 #### 编写云函数代码 按照官方文档指导新建 `cloudfunctions` 文件夹放置所有的 serverless 函数文件。下面是一个简单的例子展示怎样定义一个名为 `sendSms` 的云函数用来调用腾讯云 API 发送短信通知给指定手机号码: ```javascript // cloudfunctions/sendSms/index.js const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV // 使用当前云环境 }) exports.main = async (event, context) => { try { const result = await cloud.callFunction({ name: 'tencent-sms', // 这里应该是实际存在的另一个负责具体业务逻辑处理的云函数名称 data: event.data, }) return { success: true, message: "发送成功", ...result } } catch (err) { console.error(err) return { success: false, errorMessage: err.message || JSON.stringify(err) } } } ``` #### 调用云函数 最后,在前端页面或者其他合适的地方发起请求触发上述编写的服务器端方法。这里给出一段基于 Vue 组件生命周期钩子的方法作为示范: ```javascript import { ref, onMounted } from 'vue' export default { setup() { let smsResult = ref(null) function sendVerificationCode(phoneNumber) { uniCloud.callFunction({ name: 'sendSms', data: { phoneNumber }, }).then(res => { smsResult.value = res.result }).catch(err => { console.log(`Error occurred while sending SMS:${JSON.stringify(err)}`) }); } onMounted(() => { // 可在此处模拟自动发送验证码场景 setTimeout(() => { sendVerificationCode('+861xxxxxxxxxx') }, 1000); }) return { smsResult } } } ``` 以上就是整个流程的大致介绍,当然实际情况可能会更加复杂一些,比如还需要考虑安全性验证等问题。希望这些信息能够帮助理解如何在 UniApp 中利用微信小程序云开发特性构建高效的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值