uniapp+vue2+onenet联网解析

1.第一部分:

<template>

		<view class="dev-area">
				
			<!-- #温度 -->
			<view class="dev-cart">
				<view class="">
					<view class="dev-name">温度</view>
					<image class="dev-logo" src="../../static/temp.png" mode=""></image>
				</view>
				<view class="dev-data">{{temp}} ℃</view>
			</view>
			<!-- #湿度 -->
			<view class="dev-cart">
				<view class="">
					<view class="dev-name">湿度</view>
					<image class="dev-logo" src="../../static/humi.png" mode=""></image>
				</view>
				<view class="dev-data">{{humi}} %</view>
			</view>
			<!-- #噪音 -->
			<view class="dev-cart">
				<view class="">
					<view class="dev-name">噪音</view>
					<image class="dev-logo" src="../../static/300.png" mode=""></image>
				</view>
				<view class="dev-data">{{parseFloat(volume).toFixed(2)}} dB</view>
			</view>
			<!-- #MQ2.5 -->
			<view class="dev-cart">
				<view class="">
					<view class="dev-name">MQ2.5</view>
					<image class="dev-logo" src="../../static/200.png" mode=""></image>
				</view>
				<view class="dev-data">{{parseFloat(MQ_25).toFixed(2)}} μg/m3</view>
			</view>
			<!-- #MQ135 -->
			<view class="dev-cart">
				<view class="">
					<view class="dev-name">MQ135</view>
					<image class="dev-logo" src="../../static/200.png" mode=""></image>
				</view>
				<view class="dev-data">{{parseFloat(MQ_135).toFixed(2)}} μg/m3</view>
			</view>
			<!-- #台灯 -->
			
			<!-- #MQ135 -->
			
			<view class="dev-cart1">
				<view class="">
					<view class="dev-name">台灯</view>
					<image class="dev-logo" src="../../static/lamp.png" mode=""></image>
				</view>
				<switch :checked="led" @change="onLedSwitch" color="#F0F0F0"/>
			</view>
			<!--设置-->
	</view>

</template>

解析:

部分一:

代码中使用了 `<view>` 标签,它可能是前端框架中定义的组件或者元素。这些 `<view>` 标签通过设置 `class` 属性来添加样式类,实现样式的控制。在代码中可以看到有多个 `<view>` 标签嵌套的结构,用于组织和布局页面的内容。

其中:

- 第一个 `<view>` 标签中应用了 `class="dev-cart"` 样式类,是用于设置该区块的整体样式。
- 在第二个 `<view>` 标签中没有设置样式类,是一个容器元素。
- 在第三个 `<view>` 标签中应用了 `class="dev-name"` 样式类,这个标签用于显示设备的名称。
- `<image>` 标签用于显示图片,其中通过 `class="dev-logo"` 样式类设置样式,`src="../../static/temp.png"` 设置图片的路径。

最后的 `<view>` 标签中应用了 `class="dev-data"` 样式类,这个标签用于显示设备的数据,如温度数值。

<view class="dev-cart">
				<view class="">
					<view class="dev-name">温度</view>
					<image class="dev-logo" src="../../static/temp.png" mode=""></image>
				</view>
				<view class="dev-data">{{temp}} ℃</view>
			</view>

部分二:

- 第一个 `<view>` 标签应用了 `class="dev-cart"` 样式类,是用于设置整个设备卡片的样式。
- 在第二个 `<view>` 标签中没有设置样式类,是一个容器元素。
- 在第三个 `<view>` 标签中应用了 `class="dev-name"` 样式类,用于显示设备的名称,这里显示的是 "MQ135"。
- `<image>` 标签用于显示图片,其中通过 `class="dev-logo"` 样式类设置样式,`src="../../static/200.png"` 设置了图片的路径。

最后的 `<view>` 标签应用了 `class="dev-data"` 样式类,用于显示设备的数据。在这里,通过 `{{parseFloat(MQ_135).toFixed(2)}}` 进行了数据的处理和展示。其中 `MQ_135` 是一个变量,`parseFloat()` 函数用于将其转换为浮点数,并且使用 `toFixed(2)` 方法保留两位小数。最后,数据的单位是 "μg/m3"。

综合起来,这段代码可能是用于展示一个名为 "MQ135" 的设备的名称、图片和相应的测量数据,并为它们设置了对应的样式。具体的效果和样式可能需要结合整个页面的 HTML 结构和 CSS 样式来看。

<view class="dev-cart">
				<view class="">
					<view class="dev-name">MQ135</view>
					<image class="dev-logo" src="../../static/200.png" mode=""></image>
				</view>
				<view class="dev-data">{{parseFloat(MQ_135).toFixed(2)}} μg/m3</view>
			</view>

部分三:

- 第一个 `<view>` 标签应用了 `class="dev-cart1"` 样式类,是用于设置整个设备卡片的样式。
- 在第二个 `<view>` 标签中没有设置样式类,是一个容器元素。
- 在第三个 `<view>` 标签中应用了 `class="dev-name"` 样式类,用于显示设备的名称,这里显示的是 "台灯"。
- `<image>` 标签用于显示图片,其中通过 `class="dev-logo"` 样式类设置样式,`src="../../static/lamp.png"` 设置了图片的路径。

最后的 `<switch>` 标签使用了 Vue.js 的指令(使用冒号 `:`)和事件(使用 `@`),具体解析如下:
- `:checked="led"` 通过 `checked` 属性绑定了 `led` 变量的值,作为开关的默认状态。
- `@change="onLedSwitch"` 定义了 `change` 事件的处理方法为 `onLedSwitch`。

通过后面我们知道onLedSwitch是函数名。

综合起来,这段代码可能是用于展示一个名为 "台灯" 的设备的名称、图片和一个可切换的开关。开关的状态通过 `led` 变量控制,并且当开关状态发生改变时会触发 `onLedSwitch` 方法进行处理。

<view class="dev-cart1">
				<view class="">
					<view class="dev-name">台灯</view>
					<image class="dev-logo" src="../../static/lamp.png" mode=""></image>
				</view>
				<switch :checked="led" @change="onLedSwitch" color="#F0F0F0"/>
			</view>

2.第二部分:

<script>
	const {
		createCommonToken
	} = require('@/key.js')
	//定义数据属性初始值
	export default {
		data() {
			return {
				temp: '',
				humi: '',
				led: true,
				token: '',
				volume:'0',
				MQ_25:'0',
				MQ_135:'0',
			}
		},
		onLoad() {
			const params = {
				author_key: 'obgbcQ3j/hVw0gbcPqcmteDVY7AFJqZtWLfkuIJ5TAowjv7a3N5E6/+2B00I6EYyJhf0k1qodGNLLSy512ZGfg==',
				version: '2022-05-01',
				user_id: '327163',
			}
			this.token = createCommonToken(params);
		},
		//将显示的数据显示出来,包括温度和湿度
		onShow() {
			this.fetchDevData();
			setInterval(()=>{
				this.fetchDevData();
			},3000)
		},
		methods: {
			one(){
				uni.switchTab({
					url:'/pages/index/me',
				})
			},
			fetchDevData() {
				uni.request({
					url: 'https://iot-api.heclouds.com/thingmodel/query-device-property', //仅为示例,并非真实接口地址。
					method: 'GET',
					data: {
						product_id: 'iKF1Y2o58G',
						device_name: 'd1',
					},
					header: {
						'authorization': this.token //自定义请求头信息
					},
					//成功返回res.data 的长串数据
					success: (res) => {
						console.log(res.data);
						this.temp = res.data.data[4].value;
						this.humi = res.data.data[0].value;
						this.led = res.data.data[1].value === 'true';
						this.volume=res.data.data[5].value;
						this.MQ_25=res.data.data[3].value;
						this.MQ_135=res.data.data[2].value;

					}
				});
			},
			//上传脚本
			onLedSwitch(event) {
				//--LED灯
				console.log(event.detail.value);
				let value1 = event.detail.value;
				uni.request({
					url: 'https://iot-api.heclouds.com/thingmodel/set-device-property', 
					method: 'POST',
					data: {
						product_id: 'iKF1Y2o58G',
						device_name: 'd1',
						//上传的数据报文
						params: {
							"led": value1, //LED灯的值
						}
					},
					//请求报文头
					header: {
						'authorization': this.token //自定义请求头信息
					},
					//上传成功得到的回复
					success: () => {
						console.log('LED ' + (value1 ? 'ON' : 'OFF') + ' !');
					},
					
				});
			},
			

		}
	}
</script>

解析:

1.

const {
		createCommonToken
	} = require('@/key.js')

这段代码是在 JavaScript 中导入一个名为 `createCommonToken` 的函数。同时,它还导入了一个名为 `key.js` 的模块(或者相对路径的文件)。

根据代码中的 `require('@/key.js')`,`require()` 是用来在 Node.js 中导入模块的函数。`@` 符号可能是用来指示模块的根路径或者别名。

总结起来,这段代码是导入了一个名为 `createCommonToken` 的函数,并导入了一个 `key.js` 模块(或文件)作为其来源。

以下是key.js

const crypto = require('crypto')

function createCommonToken(params) {
    const access_key = Buffer.from( params.author_key, "base64")

    const version = params.version
    let res = 'userid' + '/' + params.user_id
    const et = Math.ceil((Date.now() + 365 * 24 * 3600 * 1000) / 1000)   
    const method = 'sha1'

    const key = et + "
" + method + "
" + res + "
" + version
    
    let sign = crypto.createHmac('sha1', access_key).update(key).digest().toString('base64')

    res = encodeURIComponent(res)
    sign = encodeURIComponent(sign)
    const token = `version=${version}&res=${res}&et=${et}&method=${method}&sign=${sign}`

    return token
}

module.exports = {
  createCommonToken
};

这段代码是一个用于创建通用token(common token)的函数,使用了 Node.js 的 `crypto` 模块。首先,通过 `require('crypto')` 导入了 Node.js 的 `crypto` 模块,用于进行加密操作。然后,定义了一个名为 `createCommonToken` 的函数,它接受一个名为 `params` 的参数对象。该函数的作用是生成一个通用token,并最终返回该token

函数内部逻辑如下:

1. 将 `params.author_key` 使用 base64 解码为 Buffer,并赋值给 `access_key` 变量。

2. 定义一个名为 `version` 的常量,其值为 `params.version`。`version` 在后续的拼接中会被使用到。

3. 拼接一个字符串 `res`,值为 `'userid' + '/' + params.user_id`。将其赋值给 `res` 变量。这个字符串的具体内容可能需要根据实际需求进行调整。

4. 计算一个名为 `et` 的值,通过获取当前时间戳加上一年的秒数,并使用 `Math.ceil()` 向上取整。这个值表示令牌的过期时间。

5. 定义一个名为 `method` 的常量,其值为 `'sha1'`,表示使用 SHA-1 算法进行加密。

6. 根据一定的格式,拼接一个名为 `key` 的字符串,其值为 `et + "
" + method + "
" + res + "
" + version`,其中 `
` 表示换行符。

7. 使用 `crypto.createHmac('sha1', access_key)` 创建一个 HMAC 对象,使用 `access_key` 作为密钥,并调用其 `update` 方法并传入 `key` 进行摘要计算。

8. 调用 `digest` 方法获取计算结果,并将其以 base64 格式进行编码,然后将其赋值给 `sign` 变量。

9. 使用 `encodeURIComponent` 方法分别对 `res` 和 `sign` 进行编码,将编码后的值重新赋给 `res` 和 `sign` 变量。

10. 最后,根据一定的格式,拼接一个名为 `token` 的字符串,其中包含了 `version`、`res`、`et`、`method` 和 `sign` 这些参数。

11. 将 `token` 返回,完成函数的执行。

最后,通过 `module.exports` 导出了一个对象,该对象包含了一个键值对,其中键为 `createCommonToken`,值为 `createCommonToken` 函数本身,从而允许该函数在其他模块中被使用。

2.

data() {
			return {
				temp: '',
				humi: '',
				led: true,
				token: '',
				volume:'0',
				MQ_25:'0',
				MQ_135:'0',
			}
		}

这段代码是用于在 Vue.js 组件中定义 `data` 属性的一个方法。 `data` 属性用于存储组件的数据,并在页面渲染中进行绑定和使用。

根据代码,`data()` 方法返回了一个对象,其中包含了多个属性及其初始值:

- `temp` 属性的初始值为空字符串 `''`。
- `humi` 属性的初始值为空字符串 `''`。
- `led` 属性的初始值为布尔值 `true`。
- `token` 属性的初始值为空字符串 `''`。
- `volume` 属性的初始值为字符串 `'0'`。
- `MQ_25` 属性的初始值为字符串 `'0'`。
- `MQ_135` 属性的初始值为字符串 `'0'`。

这些属性可以在组件的模板中直接引用和操作,例如通过双花括号 `{{}}` 语法显示属性的值或通过指令绑定在组件中修改属性的值。

3.

onLoad() {
			const params = {
				author_key: 'obgbcQ3j/hVw0gbcPqcmteDVY7AFJqZtWLfkuIJ5TAowjv7a3N5E6/+2B00I6EYyJhf0k1qodGNLLSy512ZGfg==',
				version: '2022-05-01',
				user_id: '327163',
			}
			this.token = createCommonToken(params);
		},

在加载页面时会执行 `onLoad()` 函数。函数内部定义了一个名为 `params` 的常量对象,包含了 `author_key`、`version` 和 `user_id` 这些属性。

然后,调用 `createCommonToken` 函数,并传入 `params` 对象作为参数,将返回的token赋值给 `this.token`。

总结起来,这段代码的作用是在页面加载时生成一个通用token,并将其赋值给 `this.token` 属性。您可以在后续的代码中使用 `this.token` 来表示·token的值。

4.

onShow() {
			this.fetchDevData();
			setInterval(()=>{
				this.fetchDevData();
			},3000)
		},

在页面展示时会执行 `onShow()` 函数。

函数内部首先调用 `this.fetchDevData()` 方法,用于获取设备数据。

然后,通过调用 `setInterval()` 方法创建一个定时器,每隔 3000 毫秒(即 3 秒)调用一次 `this.fetchDevData()` 方法,用于定时更新设备数据。

总结起来,这段代码的作用是在页面展示时初始化设备数据,并通过定时器每 3 秒刷新一次设备数据。这样可以确保设备数据始终保持最新。

5.

methods: {
			one(){
				uni.switchTab({
					url:'/pages/index/me',
				})
			},

在 `methods` 对象中定义了一个名为 `one` 的方法。该方法内部使用 `uni.switchTab()` 方法,用于跳转到指定的 Tab 页。在这个例子中,通过设置 `url` 参数为 `'/pages/index/me'`,表示跳转到名为 `me` 的 Tab 页。总结起来,这段代码的作用是定义了一个方法 `one`,当调用该方法时,会切换到名为 `me` 的 Tab 页。这个没看明白的同学可以去看

uniapp学习笔记---tabbar

6.

fetchDevData() {
				uni.request({
					url: 'https://iot-api.heclouds.com/thingmodel/query-device-property', //仅为示例,并非真实接口地址。
					method: 'GET',
					data: {
						product_id: 'iKF1Y2o58G',
						device_name: 'd1',
					},
					header: {
						'authorization': this.token //自定义请求头信息
					},
					//成功返回res.data 的长串数据
					success: (res) => {
						console.log(res.data);
						this.temp = res.data.data[4].value;
						this.humi = res.data.data[0].value;
						this.led = res.data.data[1].value === 'true';
						this.volume=res.data.data[5].value;
						this.MQ_25=res.data.data[3].value;
						this.MQ_135=res.data.data[2].value;

					}
				});
			},

`fetchDevData()` 方法用于从服务器获取设备数据。

在方法内部,使用 `uni.request()` 方法发起 HTTP 请求。请求的 URL 是 `https://iot-api.heclouds.com/thingmodel/query-device-property`,请求方法是 `GET`。同时,还提供了 `product_id` 和 `device_name` 作为请求参数。

请求头中包含了名为 `authorization` 的自定义请求头,其值为 `this.token`,即前面通过 `onLoad()` 方法生成的通用令牌。

当请求成功返回后,通过 `success` 回调函数处理返回的数据。在这个例子中,将返回的数据保存在 `res.data` 中,并通过该数据的结构来获取特定属性的值,将这些值保存在相应的变量中。

具体来说,将 `res.data.data[4].value` 的值保存在 `this.temp` 变量中,将 `res.data.data[0].value` 的值保存在 `this.humi` 变量中,将 `res.data.data[1].value` 是否等于 `'true'` 的结果保存在 `this.led` 变量中,将 `res.data.data[5].value` 的值保存在 `this.volume` 变量中,将 `res.data.data[3].value` 的值保存在 `this.MQ_25` 变量中,将 `res.data.data[2].value` 的值保存在 `this.MQ_135` 变量中。

总结起来,这段代码的作用是通过发送 HTTP 请求,从服务器获取设备数据,并将返回的数据中的特定属性值保存在相应的变量中,以供后续使用。

7.

	onLedSwitch(event) {
				//--LED灯
				console.log(event.detail.value);
				let value1 = event.detail.value;
				uni.request({
					url: 'https://iot-api.heclouds.com/thingmodel/set-device-property', 
					method: 'POST',
					data: {
						product_id: 'iKF1Y2o58G',
						device_name: 'd1',
						//上传的数据报文
						params: {
							"led": value1, //LED灯的值
						}
					},
					//请求报文头
					header: {
						'authorization': this.token //自定义请求头信息
					},
					//上传成功得到的回复
					success: () => {
						console.log('LED ' + (value1 ? 'ON' : 'OFF') + ' !');
					},
					
				});
			},

`onLedSwitch(event)` 方法用于切换 LED 灯的状态。

在方法内部,首先使用 `console.log()` 打印出 `event.detail.value` 的值,即切换开关的新状态。

然后,将切换开关的新状态保存在名为 `value1` 的变量中。

接下来,使用 `uni.request()` 方法发起 HTTP 请求。请求的 URL 是 `https://iot-api.heclouds.com/thingmodel/set-device-property`,请求方法是 `POST`。同时,还提供了 `product_id` 和 `device_name` 作为请求参数。

请求体中包含了一个名为 `params` 的对象,其中 `led` 属性的值为 `value1`,即切换开关的新状态。

请求头中包含了名为 `authorization` 的自定义请求头,其值为 `this.token`,即前面通过 `onLoad()` 方法生成的通用令牌。

当请求成功返回后,通过 `success` 回调函数处理返回的数据。在这个例子中,打印出 `LED ON` 或 `LED OFF`,具体取决于切换开关的新状态。

总结起来,这段代码的作用是通过发送 HTTP 请求,将切换开关的新状态作为参数,控制 LED 灯的开关状态,同时在控制成功后进行相应的反馈。

3.第三部分:

仅供参考:

<style>
	.wrap {
		  position: absolute;
		  top: 0;
		  left: 0;
		  right: 0;
		  bottom: 0;

	  background-image: url(../../static/2.jpg);
	  background-size: cover;
	  background-position: center;

	}


	.dev-area {
		
		display: flex;
		justify-content: space-between;
		flex-wrap: wrap;
	}

	.dev-cart {
		background-color: white;
		height: 150rpx;
		width: 320rpx;
		border-radius: 30rpx;
		margin-top: 30rpx;
		display: flex;
		justify-content: space-around;
		align-items: center;
		box-shadow: 0 0 15rpx #ccc;
	}

	.dev-cart1 {
		background-color: white;
		height: 300rpx;
		width: 700rpx;
		border-radius: 30rpx;
		margin-top: 30rpx;
		display: flex;
		justify-content: space-around;
		align-items: center;
		box-shadow: 0 0 15rpx #aab3ff;

	}
	
	.video-wrapper {
	  position: relative;
	  width: 100%;
	  height: 0;
	  margin-top: 30rpx;
	  padding-bottom: 56.25%; /* 16:9 宽高比视频占容器高度的百分比,可以根据需要调整 */
	}
	
	.video {
	  position: absolute;
	  top: 30;
	  left: 20;
	  width: 100%;
	  height: 100%;
	  object-fit: fill;
	}
	
	
	
	.dev-name {
		font-size: 20rpx;
		width: 5em; /* 适当调整宽度以容纳4个字 */
		text-align: center;
		color: #6d6d6d;

	}

	.dev-logo {
		width: 70rpx;
		height: 70rpx;
		margin-top: 10rpx;
	}

	.dev-data {
		font-size: 50rpx;
		color: #6d6d6d;
	}
	
	.dev-data1 {
		font-size: 40rpx;
		color: #6d6d6d;
	}

	.number-input {
	    width: 50px;
	    height: 20px;
		border-radius: 0rpx;
	    border: 1px solid #ccc;
	    padding: 5px;
	    outline: none;
	}

	.input-container {
	  display: flex;
	  flex-direction: column;
	}
</style>