You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

290 lines
8.2 KiB
Vue

4 months ago
<template>
<view>
<text>这是实时监测页面</text>
<view class="u-demo-block__content">
<u-row customStyle="margin-bottom: 10px">
<u-col span="6" style="margin: 0rpx 10rpx 0rpx 10rpx;padding: 25rpx">
<view class="demo-layout bg-purple-light">
<u-button type="primary" :text="connectText" @click="clickConnectOrNot()"></u-button>
<!-- <view class="uni-row connect-btn" @click="clickConnectOrNot()">
<text>{{connectText}}</text>
</view> -->
</view>
</u-col>
<u-col span="6" >
<view class="state">
{{state}}
</view>
</u-col>
</u-row>
<u-row customStyle="margin-bottom: 10px">
<u-col span="6" style="margin: 0rpx 10rpx 0rpx 10rpx;padding: 25rpx">
<u-button type="primary" text="发送" @click="clickSend()"></u-button>
</u-col>
</u-row>
<u-row customStyle="margin-bottom: 10px">
<u-col span="6" style="margin: 0rpx 10rpx 0rpx 10rpx;padding: 25rpx">
<view class="state">
<text>监测状态</text>
</view>
</u-col>
<u-col span="6" style="margin: 0rpx 10rpx 0rpx 10rpx;padding: 25rpx">
<view class="demo-layout bg-purple-light">
<u-switch v-model="value3" size="28" :disabled="!mqttConnected"></u-switch>
</view>
</u-col>
</u-row>
</view>
<view class="uni-column" style="padding: 20rpx;border: 3px solid green;">
<view class="uni-column" v-for="(item,index) in list">
<view class="uni-row" style="margin: 10rpx;" v-show="item.gravity=='left'">
<text>{{item.content}}</text>
</view>
<view class="uni-row" style="width: 100%;margin: 10rpx;" v-show="item.gravity=='right'">
<text style="width: 100%;text-align: end;">{{item.content}}</text>
</view>
</view>
</view>
<view class="">
<u-popup :show="showMqttEditConfig" mode="bottom" @close="closeEditConfig" @open="openEditConfig">
<view style="height: 300rpx;">
<u-button type="info" @click="readConfig()">json</u-button>
<u-button type="info" @click="savejson()">json</u-button>
<u-button type="info" @click="resetConfig()">json</u-button>
</view>
</u-popup>
<!-- <view class="btn" @click="showMqttEditConfig = true">打开弹出层</view> -->
</view>
<view class="showMqttEdit" @click="showMqttEditConfig = true">
<u-icon name="setting" size="28" color="#fff"></u-icon>
</view>
</view>
</template>
<script>
const mqttModule = uni.requireNativePlugin("jushi-MqttPlugin");
import mqttconfig from '@/static/mqttconfig.json';
import ConfigManager from '@/utils/configManager.js';
import EditMqttConfig from '../edit-mqtt-config/edit-mqtt-config.vue'
// 默认配置
const defaultConfig = {
"host": "ws://101.126.7.123:8083",
"userName": "taytest",
"psw": "txgy1929",
"clientId": "123@jk1bh0"
};
export default {
components: {
EditMqttConfig
},
data() {
return {
list: [],
sendMsg: [],
value3:false,
showMqttEditConfig: false,
monitorStatus:false,
state: 'mqtt未连接',
mqttConnected:false,
connectText: '开始连接',
stateColor: "#666666",
currentMqttConfig : {
host: '',
userName: '',
psw: '',
clientId: ''
},
inputValue: '手机发送的数据'
}
},
created() {
this.readConfig();
console.log('读取配置');
this.mqttCallback()
// mqttModule.enabledDebug(true)//开启日志输出需要用Android studio才能查看插件日志
},
methods: {
change(e) {
console.log('change', e);
},
openEditConfig() {
this.showMqttEditConfig = true;
},
closeEditConfig() {
this.showMqttEditConfig = false;
// console.log('close');
},
mqttCallback() { //mqtt回调监听
mqttModule.addCallback(res => {
console.log("回调结果:" + res)
var json = JSON.parse(res)
switch (parseInt(json.code)) {
case 0: //mqtt连接成功
this.toSubscribe()
this.state = "mqtt已连接"
this.stateColor = "#008577"
this.connectText = "断开连接"
this.mqttConnected=true;
break
case -2: //手动断开连接
this.state = "mqtt未连接"
this.stateColor = "#666666"
this.connectText = "开始连接"
this.mqttConnected=false;
break
case 2: //收到消息(对方发的和自己发的都会走到这里)
this.handleMsg(json)
break
}
})
},
clickConnectOrNot() {
mqttModule.isConnected(res => {
console.log("mqtt是否已连接" + res)
if (res) {
mqttModule.disconnect()
} else {
var sever = "ws://101.126.7.123:8083";
var userName = "taytest";
var psw = "txgy1929";
var clientId = "123@jk1bh0";
// mqttModule.connect(sever, userName, psw, clientId) //mqtt连接方法1
this.connectMqtt(sever, userName, psw, clientId) //mqtt连接方法2
}
})
},
connectMqtt(sever, userName, psw, clientId) {
mqttModule.connectUseJson({
sever: sever, //服务地址 示例wss://ip:port
userName: userName, //用户名
password: psw, //密码
clientId: clientId, //客户端id
autoReconnect: true, //是否自动重连默认是true也可以使用setAutoReconnect(true/false)函数设置
isCleanSession: true, //是否持久会话默认为true
connectionTimeout: 20, //连接超时时间 默认20s
keepAliveInterval: 10 //心跳时间 默认10s
})
},
toSubscribe() { //连接成功,订阅主题
mqttModule.subscribe("testtopic/1")
},
toUnsubscribe() { //取消订阅
mqttModule.unsubscribe("testtopic/1")
},
clickSend() { //点击发送
mqttModule.isConnected(res => {
if (!res) {
this.toast("MQTT未连接")
return
}
var msg = JSON.stringify(this.inputValue)
this.sendMsg.push(msg)
mqttModule.publish(msg, "testtopic/1")
this.inputValue = ''
})
},
toast(msg) {
uni.showToast({
icon: "none",
title: msg
})
},
handleMsg(json) { //处理收到的消息(对方发的和自己发的都会走到这里)
var isSend = false
for (var i = 0; i < this.sendMsg.length; i++) {
if (this.sendMsg[i] == json.data.message) {
isSend = true
break
}
}
var data = {
content: `Topic${json.data.topic}\n ${json.data.message}`,
gravity: isSend ? "right" : "left"
}
this.list.push(data)
},
// 1. 初始化配置文件
initializeConfig() {
ConfigManager.initializeConfigFile(defaultConfig, (error, config) => {
if (error) {
console.error('初始化配置文件失败:', error);
} else {
console.log('配置文件已初始化:', config);
}
});
},
// 2. 读取配置文件
readConfig() {
ConfigManager.readConfigFile((error, config) => {
if (error) {
console.error('读取配置文件失败:', error);
} else {
console.log('当前配置:', config);
this.currentMqttConfig=config;
}
});
},
// 3. 修改并保存配置文件
saveConfig(newConfig) {
ConfigManager.saveConfigFile(newConfig, (error) => {
if (error) {
console.error('保存配置文件失败:', error);
} else {
console.log('配置文件已更新:', newConfig);
}
});
},
// 4. 重置配置文件
resetConfig() {
ConfigManager.resetConfigFile(defaultConfig, (error) => {
if (error) {
console.error('重置配置文件失败:', error);
} else {
console.log('配置文件已重置为默认内容:', defaultConfig);
}
});
},
savejson() {
this.saveConfig(this.currentMqttConfig);
}
}
}
</script>
<style lang="scss">
.connect-btn {
width: 100%;
justify-content: center;
border-radius: 10rpx;
border: 1rpx solid #aaaaaa;
font-size: 30rpx;
padding: 5rpx 20rpx 5rpx 20rpx;
}
.showMqttEdit {
width: 100rpx;
height: 100rpx;
background: #2196F3;
color: #fff;
display: flex;
justify-content: center;
align-items: center;
border-radius: 50%;
font-size: 60rpx;
position: fixed;
right: 60rpx;
bottom: 120rpx;
box-shadow: 0 0 20 rpx rgba(43, 153, 57, 0.6);
}
.state{
margin: 0rpx 10rpx 0rpx 10rpx;
padding: 70rpx 0;
text-align: center;
font-size: 36rpx;
}
</style>