一、业务说明

业务线是这样的:

1、检测设备是否已完成检测。
如果完成检测,展示检测结果即可。
如果未检测过,自动触发mqtt服务连接,监听检测信息。
2、MQTT监听

监听时长为30秒。
如果提前检测通过,自动弹出设备通过二维码。赋予绿码。
如果30秒结束未通过检测,即为设备检测未通过。二维码赋予红码,不自动弹出。

3、二维码及检测记录

设备提前检测通过,通知服务端,检测时长以便生成检测记录。
设备未通过检测,当用户点击查看二维码时,通知服务端生成检测记录。

4、重新检测

在当前检测批次中,检测未通过时或已有检测记录的,可以重新检测。
检测批次过期后,都不可以重新检测。

二、安装mqtt

在uniapp项目根目录,打开命令行。

npm install mqtt@3.0.0

这样安装,容易遗失该项目使用的依赖列表。
建议:

1、安装前,在项目根目录执行
npm init

这样,在项目根目录会创建一个文件package.json。这样从git上重新获取到项目按列表安装一下就可以了。

2、有人讲,我只用了一个mqtt,你让我安装那么多包没别要啊。可以这样解决。安装完以后,将需要的包从node_modules中拿出来,放到工具目录。
三、代码说明
1、安装好以后,在main.js中加载成全局变量。或者局部引用也可以。
const mqtt = require('mqtt/dist/mqtt.js')
Vue.prototype.$mqtt = mqtt
2、代码示例:

template部分

<view class="air-test-tip">
	<rich-text class="test-tip-text" :nodes="htmlParser(testTipText)"></rich-text>
</view>
<view class="action-buttons">
	<button type="primary" :disabled="testState!=2" class="action-button " @tap="makeQrcode"><text
			class="action-button-text" :class="{disabled:testState!=2}">查看二维码</text></button>
	<button type="primary" :disabled="testState!=2 || haveTestRecord==2" class="action-button "
		@tap="startTest()"><text class="action-button-text"
			:class="{disabled:testState!=2}">重新检测</text></button>
</view>
<uni-popup ref="popup" type="center" :maskClick="false" maskBackgroundColor="transparent">
	<view class="loading">
		<text class="loading-icon iconfont icon-add"></text>
		<text class="loading-text">连接服务中~</text>
	</view>
</uni-popup>
<uni-qrcode class="canvas" cid="qrcode" ref="qrcode" :margin="20" :text="qrText"
	@makeComplete="makeComplete" />
<uni-popup ref="eqcodePopupRef" type="center" :maskClick="true" @change="eqcodePopupChange">
	<view class="eqcode-popup">
		<image class="eqcode-popup-img" :src="qrImgPath" mode="aspectFill"></image>
	</view>
</uni-popup>

JavaScript部分

htmlParser.js
百度一下

mqttConfig.js

export const MQTT_IP = '192.168.1.186:8083/mqtt'//mqtt地址端口
const MQTT_USERNAME = 'kongGanFactoryTest'//mqtt用户名
const MQTT_PASSWORD = 'kongGanFactoryTest'//密码
 
export const MQTT_OPTIONS = {
    connectTimeout: 15000,
    clientId: '',
    username: MQTT_USERNAME,
    password: MQTT_PASSWORD,
    // clean: false
}

业务代码:
this.client = this.$mqtt.connect(‘wx://’ + MQTT_IP, MQTT_OPTIONS)
这里wx为mqtt协议名。
如果是在app或小程序上使用,需要使用wx,mqtt工具会将它翻译成wxs。
如果是h5使用ws,会翻译成wss。
如果是支付宝小程序使用ali,会翻译成alis。
或者可以直接使用翻译后的名字。

// 开始测试
startTest() {
	return new Promise(resolve => {
		let that = this
		console.log(this.client);
		if (this.client) {
			that.testState = 1
			that.client.publish(`sn_${this.deviceTestResult.snCode}`, 'hello mqtt')
			return
		}
		this.$refs.popup.open()
		MQTT_OPTIONS.clientId = `fushikang_${this.deviceTestResult.snCode}`
		console.log('----------开启链接请求----------');
		this.client = this.$mqtt.connect('wx://' + MQTT_IP, MQTT_OPTIONS)
		this.client.on('connect', function() {
			console.log('----------请求已连接-----------');
			that.client.subscribe(`sn_${that.deviceTestResult.snCode}`, function(err) {
				console.log('err:', err);
				if (!err) {
					console.log(
						`----------订阅主题sn_${that.deviceTestResult.snCode}----------`
						);
					// that.client.publish(`sn_${that.deviceTestResult.snCode}`, 'hello mqtt')
					that.testState = 1
					that.$refs.popup.close()
					console.log('----------mqtt服务开启监听--------------');
					console.log('---------开启倒计时----------');
					that.countDownNum = that.originalNum //30 远端数据
					that.countDown()
				} else {
					console.log('----------订阅主题失败----------');
				}
			})
		}).on('reconnect', function() {
			console.log('-------------~服务重连~-------------')
		}).on('error', function(e) {
			console.log('on error' + e)
		}).on('end', function() {
			console.log('on end')
			that.client = null
		}).on('message', function(topic, message) {
			// 监听消息回复
			console.log('------------收到设备检测信息-----------');
			console.log('mqtt message:', message.toString());
			this.deviceTestResult = JSON.parse(message.toString())
			const resultStr = this.makeResultStr()
			if (resultStr.indexOf('F') > -1) {
				that.stopCountDownFlag = false
			} else {
				that.stopCountDownFlag = true
				this.makeQrcode()

			}

		})
	})
},
// 倒计时控制器
countDown() {
	this.countDownTimer = setTimeout(() => {
		this.countDownNum--
		console.log(this.countDownNum);
		if (this.countDownNum != 0) {
			if (!this.stopCountDownFlag) {
				this.countDown()
			} else {
				console.log('-----------检测结束,倒计时暂停-----------');
				this.actionEnding()
				console.log('-----------检测通过,自动弹出二维码-----------');
				this.ShowEqrcode = true
			}

		} else {
			console.log('-----------倒计时结束-----------');
			this.actionEnding()
		}
	}, 1000)
},
// 设置测试结束状态
actionEnding() {
	// 测试结束时,1、生成整体检测记录2、可查看二维码3、可以重新检测。
	this.testState = 2
	clearTimeout(this.countDownTimer)
	this.countDownTimer = null
	this.client.end()
	this.client = null
},
// 通知服务端 检测倒计时结束
makeEnding() {
	console.log('---------生成检测记录----------');
},

样式些,自己写就可以,这里不再贴了。

学习是件快乐的事,不要生拌樱桃。