From ba616e9307681da4781b7610ec3c27721d793379 Mon Sep 17 00:00:00 2001
From: guifei zhu <guifeizhu@guifeideiMac.local>
Date: 星期三, 18 九月 2024 12:13:37 +0800
Subject: [PATCH] 添加mqtt通讯

---
 /dev/null                |    0 
 common/request/fly.js    |    2 
 pages/login/login.vue    |   18 
 lib/mqttTool.js          |  141 ++++++++++
 pages/tabBar/general.vue |   98 ++++++
 pages/tabBar/device.vue  |  200 ++++++++-------
 main.js                  |    5 
 pages/device/control.vue |  199 +++++++++++++--
 common/api.js            |   38 ++
 App.vue                  |   32 ++
 common/constant.js       |   35 ++
 11 files changed, 617 insertions(+), 151 deletions(-)

diff --git a/App.vue b/App.vue
index 40bd8c3..93ab3b0 100644
--- a/App.vue
+++ b/App.vue
@@ -32,13 +32,41 @@
 			console.log('App Launch')
 		},
 		onShow: function() {
-			//console.log('App Show')
+			 console.log('App Show')
+			 // this.conn()
+			 
 
 		},
 		onHide: function() {
-			//console.log('App Hide')
+			 console.log('App Hide')
+			 // this.disconn()
 		},
 		methods:{
+			//澶勭悊鎺夌嚎閲嶈繛
+			conn(){
+				console.log(this.$mqttTool.client)
+				if(this.$mqttTool.client){
+					console.log(this.$mqttTool.client.connected)
+				}
+				if(this.$mqttTool.client && !this.$mqttTool.client.connected){
+					console.info("寮�濮嬮噸杩�")
+					this.$mqttTool.reconnect()
+				}else {
+					
+				}
+			},
+			disconn(){
+				console.log(this.$mqttTool.client)
+				if(this.$mqttTool.client){
+					console.log(this.$mqttTool.client.connected)
+				}
+				// if(this.$mqttTool.client){
+				// 	this.$mqttTool.end().then(res =>{
+				// 		console.log('缁堟锛�')
+				// 	})
+				
+				// }
+			}
 			
 		},
 		mounted() {
diff --git a/common/api.js b/common/api.js
index 23f7dd3..7da8c93 100644
--- a/common/api.js
+++ b/common/api.js
@@ -2,12 +2,14 @@
 	fly
 } from '@/common/request/fly.js'
 //閰嶇疆璇锋眰鍩哄湴鍧�
-fly.config.baseURL = "http://192.168.2.6:8800/herb"
+fly.config.baseURL = "http://192.168.12.20:9999"
 const url = uni.getStorageSync('baseurl');
 if (url) {
 	fly.config.baseURL = url + "/herb"
-}
-
+}
+
+const mqttBaseUrl = "223.241.221.20"; 
+const emqxBaseUrl = "http://"+mqttBaseUrl +":18083/api/v5"
 
 // 娴嬭瘯
 function test(params) {
@@ -35,8 +37,12 @@
 function getOrderList(params) {
 	fly.config.loading = true
 	return fly.get('/dry/dryOrder/list', params);
+}
+//璁惧鍒楄〃
+function queryEquList(params){
+	fly.config.loading = true
+	return fly.get('/mobile/equ/list', params);
 }
-
 
 //
 function getMonth(params) {
@@ -47,8 +53,22 @@
 function sendCommand(params) {
 	fly.config.loading = true
 	return fly.post('/dry/real/sendCommand', params);
+}
+
+
+//emqx 鎺ュ彛
+function emqxClients() {
+	fly.config.loading = true
+	return fly.get(emqxBaseUrl + "/clients", {
+		auth: {
+		  username: "a3dc6758f6abc41a",
+		  password: "FvBwJcmqhAuQ0aBg4FLl5gQA9A9BE64bpl0oJTg9A6I0bK"
+		},
+		headers: {
+      'Content-Type': 'application/json',
+    },
+	});
 }
-
 
 
 
@@ -57,7 +77,11 @@
 	login,
 	getRealTimeData,
 	getAnalyList,
-	getOrderList,
+	getOrderList,
+	queryEquList,
 	getMonth,
-	sendCommand
+	sendCommand,
+	
+	emqxClients,
+	mqttBaseUrl
 }
\ No newline at end of file
diff --git a/common/constant.js b/common/constant.js
new file mode 100644
index 0000000..5c7525c
--- /dev/null
+++ b/common/constant.js
@@ -0,0 +1,35 @@
+//涓婅鎸囦护鍓嶇紑
+const MOBILE_UP = "mobile/up"
+//璇锋眰鏌ヨ璁惧鐘舵��
+const MOBILE_QUERY_EQU_STATU = MOBILE_UP + "/query/equ/statu"
+
+//鍙戦�佹搷浣滄寚浠�
+const MOBILE_REQ_EQU_CMD = MOBILE_UP + "/req/equ/cmd"
+
+//瑙f瀽鏃秂qu鏇挎崲鎴愮湡瀹炶澶囧敮涓�鏍囪瘑
+//涓嬭鎸囦护鍓嶇紑
+const SERVICE_DOWN = "service/down/res"
+//璇锋眰鏌ヨ璁惧鐘舵��
+const SERVICE_RES_EQU_STATU = SERVICE_DOWN + "/equ/statu"
+//鎺ユ敹鎸囦护鍝嶅簲
+const SERVICE_RES_EQU_CMD = SERVICE_DOWN + "/equ/cmd";
+
+
+
+/***********************缂撳瓨鐩稿叧********************************/
+
+//璁惧id(uni.getSystemInfo)
+const DEVICE_ID = "device_id"
+
+
+export default {
+	MOBILE_QUERY_EQU_STATU,
+	SERVICE_RES_EQU_STATU,
+	SERVICE_DOWN,
+	MOBILE_REQ_EQU_CMD,
+	SERVICE_RES_EQU_CMD,
+
+
+
+	DEVICE_ID
+}
\ No newline at end of file
diff --git a/common/request/fly.js b/common/request/fly.js
index 68d4550..49cbd5b 100644
--- a/common/request/fly.js
+++ b/common/request/fly.js
@@ -4,7 +4,7 @@
 
 fly.config.loading = true;
 //瀹炰緥绾ч厤缃�
-//fly.config.timeout=6000;
+fly.config.timeout=10000;
 //娣诲姞鎷︽埅鍣�
 fly.interceptors.request.use((config, promise) => {
 	console.info(fly.config.loading)
diff --git a/lib/mqttTool.js b/lib/mqttTool.js
new file mode 100644
index 0000000..0dba4b4
--- /dev/null
+++ b/lib/mqttTool.js
@@ -0,0 +1,141 @@
+/* main.js 椤圭洰涓诲叆鍙f敞鍏ュ疄渚� */
+// import mqttTool from './lib/mqttTool.js'
+// Vue.prototype.$mqttTool = mqttTool
+
+/* 浣跨敤鑼冧緥瑙� /pages/index/index.vue */
+// mqtt鍗忚锛欻5浣跨敤ws/wss APP-PLUS浣跨敤wx/wxs
+
+var mqtt = require('mqtt/dist/mqtt.js')
+
+//瀹㈡埛绔�
+let mqttTool = {
+	client: null
+}
+
+//杩炴帴鎭�
+mqttTool.connect = function(params){
+	let options = {
+		clientId: params.clientId,
+		username: params.username,
+		password: params.password,
+		clean: true,
+		keepalive:10,  //蹇冭烦 鍗曚綅锛歴
+		connectTimeout: 10*1000, //杩炴帴瓒呮椂 鍗曚綅锛歮s
+		cleanSession: true
+	}
+	let client = mqtt.connect(params.url, options);
+	mqttTool.client = client
+	return client;
+}
+
+mqttTool.end = function(){
+	return new Promise((resolve, reject) => {
+		if(mqttTool.client == null){
+			resolve('鏈繛鎺�')
+			console.log('App_text' + ":end 鏈繛鎺�")
+			return;
+		}
+		mqttTool.client.end()
+		mqttTool.client = null
+		resolve('杩炴帴缁堟')
+	})
+}
+
+mqttTool.reconnect = function(){
+	return new Promise((resolve, reject) => {
+		if(mqttTool.client == null){
+			resolve('鏈繛鎺�')
+			console.log('App_text' + ":reconnect 鏈繛鎺�")
+			return;
+		}
+		mqttTool.client.reconnect()
+	})
+}
+
+mqttTool.subscribe = function(params){
+	return new Promise((resolve, reject) => {
+		if(mqttTool.client == null){
+			resolve('鏈繛鎺�')
+			console.log('App_text' + ":unconnect 鏈繛鎺�")
+			return;
+		}
+		mqttTool.client.subscribe(params.topic, {qos:params.qos}, function(err,res) {
+			console.log(err,res)
+			if (!err && res.length>0) {
+				resolve('璁㈤槄鎴愬姛')
+				console.log('App_text' + ":subscribe success 璁㈤槄鎴愬姛")
+			}else{
+				resolve('璁㈤槄澶辫触')
+				console.log('App_text' + ":subscribe failed 璁㈤槄澶辫触")
+				return;
+			} 
+		})  
+	})
+}
+
+mqttTool.unsubscribe = function(params){
+	return new Promise((resolve, reject) => {
+		if(mqttTool.client == null){
+			resolve('鏈繛鎺�')
+			console.log('App_text' + ":unconnect 鏈繛鎺�")
+			return;
+		}
+		mqttTool.client.unsubscribe(params.topic, function(err) {
+			if (!err) {
+				resolve('鍙栨秷璁㈤槄鎴愬姛')
+				console.log('App_text' + ":unsubscribe success 鍙栨秷璁㈤槄鎴愬姛")
+			}else{
+				resolve('鍙栨秷璁㈤槄澶辫触')
+				console.log('App_text' + ":unsubscribe failed 鍙栨秷璁㈤槄澶辫触")
+				return;
+			} 
+		})  
+	})
+}
+
+mqttTool.publish = function(params){
+	return new Promise((resolve, reject) => {
+		if(mqttTool.client == null){
+			resolve('鏈繛鎺�')
+			console.log('App_text' + ":unconnect 鏈繛鎺�")
+			return;
+		}
+		mqttTool.client.publish(params.topic, params.message, function(err){
+			if (!err) {
+				resolve(params.topic + '-' + params.message + '-鍙戦�佹垚鍔�')
+				console.log('App_text' + ":publish success 鍙戦�佹垚鍔�")
+			}else{
+				resolve(params.topic + '-' + params.message + '-鍙戦�佸け璐�')
+				console.log('App_text' + ":publish failed 鍙戦�佸け璐�")
+				return;
+			} 
+		})
+	})
+}
+
+//娑堟伅澶勭悊
+mqttTool.message = function(){
+	return new Promise((resolve, reject) => {
+		if(mqttTool.client == null){
+			resolve('鏈繛鎺�')
+			console.log('App_text' + ":unconnect 鏈繛鎺�")
+			return;
+		}
+		if(mqttTool.client != null && ! mqttTool.client.connected){
+			mqttTool.client.reconnect()
+		}
+		 
+		mqttTool.client.on('message', function(topic, message, buffer) {
+			console.info(topic)
+			console.info(message)
+			 setTimeout(() => {
+			      resolve({topic, message, buffer })
+			    }, 300)
+		})
+	 
+	})
+}
+
+
+
+export default mqttTool
diff --git a/main.js b/main.js
index 52c9bf1..f1d37dd 100644
--- a/main.js
+++ b/main.js
@@ -16,6 +16,11 @@
     // 鍏ㄥ眬鎸傝浇鍚庝娇鐢�
 Vue.prototype.$api = api
 
+import constant from '@/common/constant.js'
+    // 鍏ㄥ眬鎸傝浇鍚庝娇鐢�
+Vue.prototype.$constant = constant
+
+
 import lget from '@/common/loadshget.js'
     // 鍏ㄥ眬鎸傝浇鍚庝娇鐢�
 Vue.prototype.$lget = lget
diff --git a/pages/device/control.vue b/pages/device/control.vue
index 12746c5..9a54dfc 100644
--- a/pages/device/control.vue
+++ b/pages/device/control.vue
@@ -37,10 +37,17 @@
 							</view>
 							<view class="h-tr h-tr-2">
 								<view class="h-td">
-									<u-tag size="mini" text="鍦ㄧ嚎" type="success" plain plainFill></u-tag>
+									<u-tag v-if="connected" size="mini" text="鍦ㄧ嚎" type="success" plain
+										plainFill></u-tag>
+									<u-tag v-else size="mini" text="绂荤嚎" type="error" plain plainFill></u-tag>
 								</view>
 								<view class="h-td">
-									<u-tag size="mini" text="姝e湪骞茬嚗" type="success" plain plainFill></u-tag>
+									<template v-if="runStatu">
+										<u-tag size="mini" text="姝e湪骞茬嚗" type="success" plain plainFill></u-tag>
+									</template>
+									<template v-else>
+										<u-tag size="mini" text="寰呮満" type="error" plain plainFill></u-tag>
+									</template>
 								</view>
 								<view class="h-td">{{$lget(model,'windTemp')}}</view>
 								<view class="h-td">{{$lget(model,'windTemp')}}</view>
@@ -74,7 +81,7 @@
 
 							</view>
 							<view class="h-tr h-tr-2">
-								<view class="h-td">鐢熷湴榛�</view>
+								<view class="h-td">{{$lget(model,'herbName')}}</view>
 								<view class="h-td">{{$lget(model,'envTemp') == "" ? "--" :  $lget(model,'envTemp')}}m鲁
 								</view>
 								<view class="h-td">{{$lget(model,'envHum') == "" ? "--" :$lget(model,'envHum') }}kg
@@ -136,11 +143,12 @@
 				<uni-section title="鎸囦护" type="line">
 					<view class="flex justify-center padding-lg bg-white">
 						<view class="margin-right-sm">
-							<u-button text="寮�鏈�" type="success" @click="$u.throttle(showModal(), 500)"></u-button>
+							<u-button :disabled="connected" text="寮�鏈�" type="success"
+								@click="$u.throttle(showModal(1), 500)"></u-button>
 						</view>
-
 						<view class="margin-left-sm">
-							<u-button text="鍏虫満" type="error" :disabled="true"></u-button>
+							<u-button :disabled="!connected" text="鍏虫満" type="error"
+								@click="$u.throttle(showModal(2), 500)"></u-button>
 						</view>
 
 
@@ -150,8 +158,8 @@
 
 				<uni-section title="鎺у埗鍙�" type="line" class="margin-top-sm ">
 					<view class="padding-left-sm padding-right-sm padding-bottom-sm">
-						<view class="text-sm text-gray">12:00:20: <寮�鏈�>鎸囦护鎿嶄綔鎴愬姛</view>
-						<view class="text-sm text-gray  margin-top-sm">12:00:10: 鍙戦��<寮�鏈�>鎸囦护</view>
+						<view class="text-sm text-gray" :class="{'margin-top-sm':index>0}"  v-for="(log,index) in logList">{{log}}</view>
+						<!-- <view class="text-sm text-gray  margin-top-sm">12:00:10: 鍙戦��<寮�鏈�>鎸囦护</view> -->
 					</view>
 
 				</uni-section>
@@ -162,15 +170,15 @@
 		</swiper>
 
 
-
-
-
-		<u-modal :show="show" title="楠岃瘉浜岀骇瀵嗙爜" @confirm="confirm" :showCancelButton="true" @cancel="show=false"
-			ref="uModal" :asyncClose="true">
+		<u-modal :show="show" @confirm="confirm" :showCancelButton="true" @cancel="show=false" ref="uModal"
+			:asyncClose="true">
 
 			<slot>
-				<view>
-					<u--input style="width: 100%;" placeholder="璇疯緭鍏ヤ簩绾у瘑鐮�" border="surround" password
+				<view style="width: 100%;height:100%;">
+					<view style="color:red">
+						杩滅▼鎺у埗鎿嶄綔鍙兘瀛樺湪瀹夊叏椋庨櫓锛岃璋ㄦ厧鎿嶄綔
+					</view>
+					<u--input style="width: 100%;" placeholder="璇疯緭鍏ヤ簩绾у畨鍏ㄥ瘑鐮�" border="surround" password
 						clearable></u--input>
 				</view>
 			</slot>
@@ -187,6 +195,14 @@
 	export default {
 		data() {
 			return {
+				//涓婁釜椤甸潰浼犻�掕繃鏉ョ殑鏁版嵁
+				option: {},
+				//鎿嶄綔鎸囦护log
+				logList: [],
+				//褰撳墠璁惧杩炴帴鐘舵��
+				connected: false,
+				//寮�鍏虫満鎸囦护 1-寮�鏈� 2-鍏虫満
+				cmd: -1,
 				show: false,
 				swiperList: ["鐩戞祴", "鎺у埗"],
 				swiperCurrent: 0,
@@ -221,8 +237,8 @@
 				notice: "2023-03-1812:00:001鍙锋満鍙颁綆娓╂姤璀�",
 				model: {},
 				queryParam: {
-					machineid: "GM001",
-					tenantid: 1003
+					machineid: "",
+					tenantid: null
 				},
 				bannerList: [{
 					imageUrl: '../../static/image/zcy_gzj1.png'
@@ -232,11 +248,21 @@
 			}
 		},
 		onShow() {
+			console.info("onShow")
 			this.startTimer()
 
 		},
 
-		onLoad(e) {
+		onLoad(option) {
+			const userinfo = uni.getStorageSync('userinfo');
+			this.option = option
+			this.option.tenantid = userinfo.loginTenantId
+			this.option.username = userinfo.username
+
+
+			//鍒濆鍖栨煡璇㈠弬鏁�
+			this.queryParam.machineid = option.code
+			this.queryParam.tenantid = userinfo.loginTenantId
 
 		},
 		onBackPress() {
@@ -254,31 +280,131 @@
 		},
 		onReady() {
 			//this.getServerData()
+			// this.$mqttTool.message().then(res => {
+			// 	console.error("瑙f瀽鏁版嵁")
+			// 	if (res.topic == this.$constant.SERVICE_RES_EQU_STATU) {
+			// 		const msgstr = res.message.toString();
+			// 		const message = JSON.parse(msgstr);
+			// 		console.error(message)
+			// 		console.error(message.success)
+			// 	}
+			// })
+			let _this = this
+			this.$mqttTool.client.on('message', function(topic, message, buffer) {
+
+				console.error("瑙f瀽鏁版嵁")
+				const msg = JSON.parse(message);
+				console.error(topic)
+				console.error(msg)
+				console.error(msg.success)
+				if (topic == _this.$constant.SERVICE_RES_EQU_STATU.replace('equ', _this.deviceId)) {
+					if (msg.success) {
+						_this.connected = msg.connected
+					} else {
+						_this.connected = false
+					}
+				} else if (topic == _this.$constant.SERVICE_RES_EQU_CMD.replace('equ', _this.deviceId)) {
+					//鍙戦�佹寚浠ゆ敹鍒板搷搴�
+					//娣诲姞log
+					let log = this.getCurrentTime() +'杩斿洖锛�' +  + '鎸囦护' ;
+					this.logList.push(log)
+					
+					setTimeout(() => {
+						// 3绉掑悗鑷姩鍏抽棴
+						uni.showToast({
+							title: msg.msg,
+							icon: 'none',
+							mask: true
+						});
+						_this.show = false;
+					}, 1000)
+				}
+			})
+
+			this.queryEquStatu()
 
 		},
 		methods: {
-			showModal() {
+			//MQTT
+			queryEquStatu() {
+
+				//1.鏌ヨ璁惧瀹炴椂鐘舵��
+				const message = {
+					clientId: this.option.clientId,
+					timestamp: new Date(),
+					req: this.deviceId
+				}
+				let opts = {
+					topic: this.$constant.MOBILE_QUERY_EQU_STATU,
+					message: JSON.stringify(message),
+				}
+
+				this.$mqttTool.publish(opts).then(res => {
+					console.error(res)
+				})
+
+			},
+
+			sendEquCmd() {
+				//娣诲姞log
+				let log = this.getCurrentTime() +'鍙戦��' + (this.cmd == 1 ? "锛氥�婂紑鏈恒��" : "锛氥�婂叧鏈恒��") + '鎸囦护' ;
+				this.logList.push(log)
+		 
+				//1.鍙戦�佸紑鍏虫満鎸囦护 1-寮�鏈�  2-鍏虫満
+				const message = {
+					clientId: this.option.clientId,
+					cmd: this.cmd,
+					timestamp: new Date(),
+					req: this.deviceId
+				}
+				let opts = {
+					topic: this.$constant.MOBILE_REQ_EQU_CMD,
+					message: JSON.stringify(message),
+				}
+
+				this.$mqttTool.publish(opts).then(res => {
+					console.error(res)
+				})
+
+			},
+
+			showModal(cmd) {
 				this.show = true;
+				this.cmd = cmd;
 			},
 			confirm() {
-				setTimeout(() => {
-					// 3绉掑悗鑷姩鍏抽棴
-					uni.showToast({
-						title: '鎿嶄綔鎴愬姛~',
-						icon: 'none',
-						mask: true
-					});
-					this.show = false;
-				}, 3000)
+				this.sendEquCmd()
+				// setTimeout(() => {
+				// 	// 3绉掑悗鑷姩鍏抽棴
+				// 	uni.showToast({
+				// 		title: '鎿嶄綔鎴愬姛~',
+				// 		icon: 'none',
+				// 		mask: true
+				// 	});
+				// 	this.show = false;
+				// }, 3000)
+
+
+
+
 			},
 			startTimer() {
 				console.info("鐩戞帶椤甸潰鏄剧ず")
 				this.getRealData()
+				//涓嶉棿鏂煡璇㈠緟鎿嶄綔骞茬嚗鏈虹殑鐘舵�侊紝瀹炴椂鏇存柊
+				//this.queryEquStatu()
 				if (!this.$monitorTimer) {
 					this.$monitorTimer = setInterval(() => {
 						console.info("瀹氭椂鍣ㄥ伐浣�")
 						console.info(this.$monitorTimer)
 						this.getRealData()
+
+						/**
+						 * TODO 浣跨敤last_will浠f浛杞
+						 */
+						//涓嶉棿鏂煡璇㈠緟鎿嶄綔骞茬嚗鏈虹殑鐘舵�侊紝瀹炴椂鏇存柊   
+						//this.queryEquStatu()
+
 					}, 1000 * 12)
 				}
 
@@ -303,6 +429,20 @@
 				this.swiperCurrent = e.detail.current;
 				console.log(e.detail.current)
 				this.$refs.tabs.unlockDx();
+			},
+			getCurrentTime() {
+				// 鑾峰彇褰撳墠鏃堕棿  
+				let now = new Date();
+				// 鏍煎紡鍖栨椂闂�  
+				let year = now.getFullYear();
+				let month = (now.getMonth() + 1).toString().padStart(2, '0');
+				let day = now.getDate().toString().padStart(2, '0');
+				let hours = now.getHours().toString().padStart(2, '0');
+				let minutes = now.getMinutes().toString().padStart(2, '0');
+				let seconds = now.getSeconds().toString().padStart(2, '0');
+
+				// 杩斿洖缁撴灉  
+				return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
 			},
 			getServerData() {
 				//妯℃嫙浠庢湇鍔″櫒鑾峰彇鏁版嵁鏃剁殑寤舵椂
@@ -452,6 +592,9 @@
 			}
 		},
 		computed: {
+			deviceId() {
+				return uni.getStorageSync(this.$constant.DEVICE_ID);
+			},
 			//杩愯鐘舵��
 			runStatu() {
 				let stop = this.$lget(this.model, 'stop');
diff --git a/pages/login/login.vue b/pages/login/login.vue
index 438a26d..d1539e1 100644
--- a/pages/login/login.vue
+++ b/pages/login/login.vue
@@ -34,8 +34,8 @@
 		data() {
 			return {
 				model: {
-					username: "",
-					password: ""
+					username: "tongjitang",
+					password: "123456"
 				},
 				rules: {
 					'username': {
@@ -51,7 +51,7 @@
 						trigger: ['blur', 'change']
 					},
 				},
-
+				 
 			};
 		},
 		onLoad() {
@@ -62,14 +62,14 @@
 
 		},
 
-		methods: {
+		methods: {
+		 
 			forget() {
 				uni.navigateTo({
 					url: "/pages/tabBar/demo"
 				})
 			},
-			submit() {
-
+			submit() {
 				if (this.model.username.startsWith("http")) {
 					uni.setStorageSync('baseurl', this.model.username);
 					this.model.username = null
@@ -86,7 +86,8 @@
 			},
 			login() {
 				this.$api.login(this.model).then((res) => {
-					if (res.success) {
+					if (res.success) {
+						 
 
 						console.log('request success', res)
 						uni.showToast({
@@ -97,7 +98,8 @@
 
 						uni.setStorageSync('account', this.model);
 						uni.setStorageSync('userinfo', res.result.userInfo);
-						uni.setStorageSync('token', res.result.token);
+						uni.setStorageSync('token', res.result.token);
+				 
 
 						uni.switchTab({
 							url: '/pages/tabBar/general'
diff --git a/pages/tabBar/device.vue b/pages/tabBar/device.vue
index f6ca562..faff43c 100644
--- a/pages/tabBar/device.vue
+++ b/pages/tabBar/device.vue
@@ -12,13 +12,14 @@
 
 				<view class="card-box dynamic shadow">
 					<view class="title-box margin-bottom-sm">
-						<view  style="width: 100vw;" class="left justify-between">
+						<view style="width: 100vw;" class="left justify-between">
 							<view class="flex align-center">
 								<uni-text class="cuIcon-titles text-blue"></uni-text>
 								<view class="title">鎬昏</view>
 							</view>
 							<view>
-								<text class="text-gray margin-right-lg">2024-07-14</text>
+								<text
+									class="text-gray margin-right-lg">{{new Date().toLocaleDateString().replace(/\//g, '-')}}</text>
 							</view>
 
 						</view>
@@ -28,20 +29,20 @@
 						<view class="flex">
 							<view class="flex-sub flex flex-direction text-center">
 								<text class="text-df">璁惧鎬绘暟</text>
-								<text class="text-bold text-sl margin-top-xs  text-gray margin-top-sm">20
+								<text class="text-bold text-sl margin-top-xs  text-gray margin-top-sm">{{equCount}}
 									<text class="text-gray text-sm margin-left-xs">鍙�</text></text>
-							</view>
-							
-							<view class="flex-sub flex flex-direction text-center">
-								<text class="text-df">寮�鏈鸿澶�</text>
-								<text class="text-bold text-sl margin-top-xs text-gray margin-top-sm">10
-									<text class="text-gray text-sm margin-left-xs">鍙�</text></text>
-							</view>
-							
-							<view class="flex-sub flex flex-direction text-center">
-								<text class="text-df">杩愯璁惧</text>
-								<text class="text-bold text-sl margin-top-xs text-cyan margin-top-sm">10
-									<text class="text-gray text-sm margin-left-xs">鍙�</text></text>
+							</view>
+
+							<view class="flex-sub flex flex-direction text-center">
+								<text class="text-df">寮�鏈鸿澶�</text>
+								<text class="text-bold text-sl margin-top-xs text-gray margin-top-sm">{{onlineCount}}
+									<text class="text-gray text-sm margin-left-xs">鍙�</text></text>
+							</view>
+
+							<view class="flex-sub flex flex-direction text-center">
+								<text class="text-df">杩愯璁惧</text>
+								<text class="text-bold text-sl margin-top-xs text-cyan margin-top-sm">{{onlineCount}}
+									<text class="text-gray text-sm margin-left-xs">鍙�</text></text>
 							</view>
 						</view>
 						<view class="margin-top">
@@ -58,62 +59,64 @@
 
 
 			</template>
-			
-			 
-			
-			<u-skeleton
-			        class=" "
-					rows="20"
-					:loading="loading"
-					:title="false"
-				>
-			<!-- 濡傛灉甯屾湜鍏朵粬view璺熺潃椤甸潰婊氬姩锛屽彲浠ユ斁鍦▃-paging鏍囩鍐� -->
-			<view class="card-box dynamic shadow" v-for="(item,index) in dataList" :key="index"
-				@click="itemClick(item)">
-				<view class="title-box">
-					<view class="left flex-sub">
-						<uni-text class="cuIcon-titles text-blue"></uni-text>
-						<view class="title text-cut">1#鏅鸿兘骞茬嚗鏈�</view>
-						<view class="flex title text-green text-sm">
-							<u-tag size="mini" text="鍦ㄧ嚎" type="success" plain plainFill></u-tag>
-							<u-tag class="margin-left-xs" size="mini" text="鍋滄満" type="error" plain plainFill></u-tag>
+
+
+
+			<u-skeleton class=" " rows="20" :loading="loading" :title="false">
+				<!-- 濡傛灉甯屾湜鍏朵粬view璺熺潃椤甸潰婊氬姩锛屽彲浠ユ斁鍦▃-paging鏍囩鍐� -->
+				<view class="card-box dynamic shadow" v-for="(item,index) in dataList" :key="index"
+					@click="itemClick(item)">
+					<view class="title-box">
+						<view class="left flex-sub">
+							<uni-text class="cuIcon-titles text-blue"></uni-text>
+							<view class="title text-cut">{{$lget(item,'name')}}</view>
+							<view class="flex title text-green text-sm">
+								<u-tag v-if="item.online" size="mini" text="鍦ㄧ嚎" type="success" plain plainFill></u-tag>
+								<u-tag v-else class="" size="mini" text="鍋滄満" type="error" plain plainFill></u-tag>
+							</view>
 						</view>
-					</view>
-					<view class="right" style="min-width: 240rpx;">
-						<!-- <u-badge :isDot="true" type="success"></u-badge> -->
-						<view class="title text-gray text-sm">寮�鏈烘椂闂�:</view>
-						<view class="title text-gray text-sm">10:00:10</view>
-					</view>
-				</view>
-
-				<view class="info-box">
-					<view class="left flex-sub">
-						<view class="title text-sm">鐑樺共鑽潗:</view>
-						<view class="title text-sm">鐢熷湴榛�</view>
-					</view>
-					<view class="right" style="min-width: 240rpx;">
-						<view class="title text-sm">鐑樺共鏃堕棿:</view>
-						<view class="title text-sm">01:20:00</view>
-					</view>
-				</view>
-
-				<view class="info-box">
-					<view class="left flex-sub">
-						<view class="title text-sm text-cut">鎶ヨ淇℃伅:</view>
-						<view class="flex  title text-sm">
-							<u-tag size="mini" text="娓╁害浼犳劅鍣ㄦ姤璀�" type="warning" plain plainFill></u-tag>
-							<u-tag size="mini" class="margin-left-xs" text="鍓嶉棬鏈叧" type="warning" plain
-								plainFill></u-tag>
-							<u-tag size="mini" class="margin-left-xs" text="椋庣浣庝綅鎶ヨ" type="error" plain
-								plainFill></u-tag>
+						<view class="right" style="min-width: 240rpx;">
+							<!-- <u-badge :isDot="true" type="success"></u-badge> -->
+							<!-- <view class="title text-gray text-sm">寮�鏈烘椂闂�:</view> -->
+							<view class="title text-gray text-sm">{{$lget(item,'upTime')}}</view>
 						</view>
 					</view>
 
+					<view class="info-box">
+						<view class="left flex-sub">
+							<view class="title text-sm">鐑樺共鑽潗:</view>
+							<view class="title text-sm text-gray">--</view>
+						</view>
+						<view class="right" style="min-width: 240rpx;">
+							<view class="title text-sm">鐑樺共鏃堕棿:</view>
+							<view class="title text-sm text-gray">--</view>
+						</view>
+					</view>
+
+					<view class="info-box">
+						<view class="left flex-sub">
+							<view class="title text-sm text-cut">鎶ヨ淇℃伅:</view>
+							<view class="flex  title text-sm">
+								<template v-if="item.online && !item.fault">
+									<u-tag size="mini" text="姝e父" type="success" plain plainFill></u-tag>
+								</template>
+								<template v-else-if="item.fault">
+									<u-tag size="mini" text="娓╁害浼犳劅鍣ㄦ姤璀�" type="warning" plain plainFill></u-tag>
+									<u-tag size="mini" class="margin-left-xs" text="鍓嶉棬鏈叧" type="warning" plain
+										plainFill></u-tag>
+									<u-tag size="mini" class="margin-left-xs" text="椋庣浣庝綅鎶ヨ" type="error" plain
+										plainFill></u-tag>
+								</template>
+								<template v-else>
+								</template>
+							</view>
+						</view>
+
+					</view>
+
 				</view>
 
-			</view>
-
-		   </u-skeleton>
+			</u-skeleton>
 		</z-paging>
 	</view>
 </template>
@@ -121,46 +124,53 @@
 <script>
 	export default {
 		data() {
-			return {
-				loading:true,
+			return {
+				loading: true,
 				// v-model缁戝畾鐨勮繖涓彉閲忎笉瑕佸湪鍒嗛〉璇锋眰缁撴潫涓嚜宸辫祴鍊硷紒锛侊紒
-				dataList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
+				dataList: [],
 			}
 		},
 		methods: {
-			queryList(pageNo, pageSize) {
+			queryList(pageNo, pageSize) {
 				this.loading = true;
 				// 缁勪欢鍔犺浇鏃朵細鑷姩瑙﹀彂姝ゆ柟娉曪紝鍥犳榛樿椤甸潰鍔犺浇鏃朵細鑷姩瑙﹀彂锛屾棤闇�鎵嬪姩璋冪敤
 				// 杩欓噷鐨刾ageNo鍜宲ageSize浼氳嚜鍔ㄨ绠楀ソ锛岀洿鎺ヤ紶缁欐湇鍔″櫒鍗冲彲
 				// 妯℃嫙璇锋眰鏈嶅姟鍣ㄨ幏鍙栧垎椤垫暟鎹紝璇锋浛鎹㈡垚鑷繁鐨勭綉缁滆姹�
-				// const params = {
-				// 	pageNo: pageNo,
-				// 	pageSize: pageSize,
-				// }
-				// this.$request.queryList(params).then(res => {
-				// 	// 灏嗚姹傜殑缁撴灉鏁扮粍浼犻�掔粰z-paging
-				this.$refs.paging.complete(this.dataList);
-				// }).catch(res => {
-				// 	// 濡傛灉璇锋眰澶辫触鍐檛his.$refs.paging.complete(false);
-				// 	// 娉ㄦ剰锛屾瘡娆¢兘闇�瑕佸湪catch涓啓杩欏彞璇濆緢楹荤儲锛寊-paging鎻愪緵浜嗘柟妗堝彲浠ュ叏灞�缁熶竴澶勭悊
-				// 	// 鍦ㄥ簳灞傜殑缃戠粶璇锋眰鎶涘嚭寮傚父鏃讹紝鍐檜ni.$emit('z-paging-error-emit');鍗冲彲
-				// 	this.$refs.paging.complete(false);
-				// })
-				setTimeout(() => {
-					this.loading = false
-				}, 1000)
-			},
-			itemClick(item){
-				uni.navigateTo({
-					url:"/pages/device/control"
-				})
+				const params = {
+					pageNo: pageNo,
+					pageSize: pageSize,
+				}
+				this.$api.queryEquList(params).then((res) => {
+					// 	// 灏嗚姹傜殑缁撴灉鏁扮粍浼犻�掔粰z-paging
+					this.$refs.paging.complete(res.result.records);
+					this.loading = false
+				}).catch(res => {
+					// 濡傛灉璇锋眰澶辫触鍐檛his.$refs.paging.complete(false);
+					// 娉ㄦ剰锛屾瘡娆¢兘闇�瑕佸湪catch涓啓杩欏彞璇濆緢楹荤儲锛寊-paging鎻愪緵浜嗘柟妗堝彲浠ュ叏灞�缁熶竴澶勭悊
+					// 鍦ㄥ簳灞傜殑缃戠粶璇锋眰鎶涘嚭寮傚父鏃讹紝鍐檜ni.$emit('z-paging-error-emit');鍗冲彲
+					this.$refs.paging.complete(false);
+					this.loading = false
+				})
+
+			},
+			itemClick(item) {
+				uni.navigateTo({
+					url: "/pages/device/control?code="+item.code+"&clientId="+item.clientId
+				})
 			}
 
-		},onReady() {
-			
-			setTimeout(() => {
-				this.loading = false
-			}, 1000)
+		},
+		onReady() {
+
+		},
+		computed: {
+			equCount() {
+				return this.dataList.length
+			},
+			onlineCount() {
+				const list = this.dataList.filter(item => item.online)
+				return list.length
+			}
 		}
 	}
 </script>
diff --git a/pages/tabBar/general.vue b/pages/tabBar/general.vue
index ec2c61e..ae71ad0 100644
--- a/pages/tabBar/general.vue
+++ b/pages/tabBar/general.vue
@@ -177,7 +177,8 @@
 					<view class="flex">
 						<text>涓崏鑽�</text>
 						<text>涓�</text>
-						<text @click="showLongName(showValue(item.herbName))" class="text-cut flex-twice">{{showValue(item.herbName)}}</text>
+						<text @click="showLongName(showValue(item.herbName))"
+							class="text-cut flex-twice">{{showValue(item.herbName)}}</text>
 						<!-- <view class="margin-lr-sm">
 							<u-tag text="鎶ヨ涓�娆�" plain size="mini" type="warning"></u-tag>
 						</view> -->
@@ -356,21 +357,98 @@
 
 		},
 		onReady() {
+			const userinfo = uni.getStorageSync('userinfo');
+			const tenantid = userinfo.loginTenantId
+			uni.getSystemInfo({
+				success: (res) => {
+					let deviceId = res.deviceId
+					if (!deviceId) {
+						deviceId = 'mobile-' + tenantid + '-' + Date.parse(new Date())
+					}
+					uni.setStorageSync(this.$constant.DEVICE_ID, 'mobile-' + tenantid + '-' + res.deviceId);
+				}
+			})
+			this.startConnect();
+
+
+
 			let month = uni.$u.timeFormat(new Date(), 'yyyy-mm')
 			this.getMonth(month)
 
 			let day = uni.$u.timeFormat(new Date(), 'yyyy-mm-dd')
-			this.getOrderList(day, day);
-		 
+			this.getOrderList(day, day);
+
 
 		},
-		methods: {
-			showLongName(longName){
-					this.$refs.uToast.show({
-						type: 'default',
-						message: longName
-					})
-				
+		methods: {
+			/* 杩炴帴MQTT */
+			async startConnect() {
+				var _this = this
+				const account = uni.getStorageSync('account');
+				const deviceid = uni.getStorageSync(this.$constant.DEVICE_ID);
+
+				if (!account) {
+
+					return false
+				}
+				let opts = {
+					// #ifdef H5
+					url: 'ws://' + this.$api.mqttBaseUrl + ':8083/mqtt',
+					// #endif
+					// #ifdef APP-PLUS
+					url: 'wx://' + this.$api.mqttBaseUrl + ':8083/mqtt',
+					// #endif
+					clientId: deviceid,
+					username: account.username,
+					password: account.password
+				}
+				if (!this.$mqttTool.client) {
+					var client = await this.$mqttTool.connect(opts);
+				}
+				//璁㈤槄鏌ヨ璁惧鐘舵�佽繑鍥炴暟鎹�
+				this.$mqttTool.subscribe({
+					topic: this.$constant.SERVICE_DOWN + '/' + deviceid + '/#',
+					qos: 0
+				}).then(res => {
+					console.error(res)
+				})
+				//璁㈤槄鍙戦�佹寚浠よ繑鍥炵粨鏋�
+				// this.$mqttTool.subscribe({
+				// 	topic: this.$constant.SERVICE_RES_EQU_CMD,
+				// 	qos: 0
+				// }).then(res => {
+				// 	console.error(res)
+				// })
+				// if (!client) {
+				// 	return false
+				// }
+
+				client.on('connect', function(res) {
+					console.error('杩炴帴鎴愬姛')
+				})
+				client.on('reconnect', function(res) {
+					console.error('閲嶆柊杩炴帴')
+				})
+				client.on('error', function(res) {
+					console.info('杩炴帴閿欒')
+				})
+				client.on('close', function(res) {
+
+					console.error('鍏抽棴鎴愬姛')
+
+				})
+				client.on('message', function(topic, message, buffer) {
+					//console.info(message)
+				})
+			},
+
+
+			showLongName(longName) {
+				this.$refs.uToast.show({
+					type: 'default',
+					message: longName
+				})
+
 			},
 			dayChange(dayInfo) { // 鐐瑰嚮鏃ユ湡
 				this.model.date = dayInfo.date
diff --git a/static/splash.png b/static/splash.png
deleted file mode 100644
index eb17b17..0000000
--- a/static/splash.png
+++ /dev/null
Binary files differ

--
Gitblit v1.9.3