From c7bbc2936d13523042187b112e72ea9b5b5566a2 Mon Sep 17 00:00:00 2001
From: lefengyang <lefengyang@tencent.com>
Date: Thu, 27 Aug 2026 21:23:40 +0800
Subject: [PATCH] 颜色选择器

---
 ledApp/pages/index/index.vue |  157 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 153 insertions(+), 4 deletions(-)

diff --git a/ledApp/pages/index/index.vue b/ledApp/pages/index/index.vue
index 2c326cc..1cab6ac 100644
--- a/ledApp/pages/index/index.vue
+++ b/ledApp/pages/index/index.vue
@@ -56,6 +56,10 @@
 					</view>
 				</view>
 				<view class="item_btn" v-if="dId == item.id">
+					<!-- <uv-button type="primary" shape="circle" text="已存序列" size="small" :plain="true"
+						@click="commandLIST"></uv-button>
+					<uv-button type="primary" shape="circle" :text="screenOn ? '关闭屏幕' : '打开屏幕'" size="small" :plain="true"
+						@click="toggleScreen()"></uv-button> -->
 					<uv-button type="primary" shape="circle" text="调节亮度" size="small" :plain="true"
 						@click="this.$refs.popupBRIG.open();"></uv-button>
 					<uv-button type="primary" shape="circle" text="发送LED" size="small" :plain="true"
@@ -186,7 +190,8 @@
 				baseURL: '',
 				dId: '' ,//已连接的设备id,
 				devKwh: '',
-				platform: ''
+				platform: '',
+				screenOn: true
 			}
 		},
 		onLoad() {
@@ -641,6 +646,66 @@
 				}, 500);
 
 			},
+			// 切换屏幕状态
+			toggleScreen() {
+				if (this.screenOn) {
+					this.commandBLAC()
+				} else {
+					this.commandOPAC()
+				}
+			},
+			// 关闭屏幕
+			commandBLAC() {
+				console.log('关闭屏幕BLAC----')
+				const startBytes = new Array(10).fill(0x55);
+				const frameHeader = 0x7E;
+				const packageType = 0x41;
+				const command = [0x42, 0x4C, 0x41, 0x43];
+
+				const data = [
+					...startBytes,
+					frameHeader,
+					packageType,
+					...command
+				];
+
+				const crc = this.calcCRC16(data.slice(11));
+				data.push((crc >> 8) & 0xFF);
+				data.push(crc & 0xFF);
+				data.push(frameHeader);
+				console.log('BLAC data----', this.hexArrayToHexString(data))
+
+				const buffer = new Uint8Array(data).buffer;
+				setTimeout(() => {
+					this.writeBLECharacteristicValue(buffer)
+				}, 500);
+			},
+			// 打开屏幕
+			commandOPAC() {
+				console.log('打开屏幕OPAC----')
+				const startBytes = new Array(10).fill(0x55);
+				const frameHeader = 0x7E;
+				const packageType = 0x41;
+				const command = [0x4F, 0x50, 0x41, 0x43];
+
+				const data = [
+					...startBytes,
+					frameHeader,
+					packageType,
+					...command
+				];
+
+				const crc = this.calcCRC16(data.slice(11));
+				data.push((crc >> 8) & 0xFF);
+				data.push(crc & 0xFF);
+				data.push(frameHeader);
+				console.log('OPAC data----', this.hexArrayToHexString(data))
+
+				const buffer = new Uint8Array(data).buffer;
+				setTimeout(() => {
+					this.writeBLECharacteristicValue(buffer)
+				}, 500);
+			},
 			//添加信息指令(INST)
 			commandINST(hexString) {
 				// 1.手机发指令:启动+帧头+包头段(0x43+简易绑定号+屏大小)+INST+信息属性+文件名+总帧数+当前帧*+块描述+块数据+CRC校验码+帧尾
@@ -676,8 +741,6 @@
 
 				// 块数据
 				const blockDescription = this.hexStringToArray(hexString)
-				//const blockString = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF0000FF000000000000000000000000000000000000000000000000000000000000FF0000000000000000000000000000000000000000000000FF0000000000000000FF0000FF00000000000000000000000000000000FF0000FF000000000000000000FF0000000000FF0000FF00FF0000FF0000FF000000000000000000FF00FF0000FF000000000000000000FF00000000000000000000FF000000FF0000FF0000FF0000FF0000000000FF0000000000000000000000FF0000000000000000000000FF0000FF0000000000000000FF0000FF0000000000000000000000000000FF00FF000000000000000000000000FF00FF0000FF000000000000000000FF00000000000000FF0000FF0000FF0000FF0000FF0000000000000000FF0000FF000000000000000000000000FF0000000000FF0000000000000000000000000000000000000000FF0000000000000000000000000000000000FF0000000000000000000000000000000000FF00000000000000000000000000FF0000FF000000FF0000FF0000000000000000000000FF00000000000000FF0000FF000000FF00FF0000FF000000000000FF0000000000000000000000000000000000000000000000FF0000000000FF0000000000000000000000FF0000000000000000000000000000000000000000FF0000000000000000FF0000000000000000FF0000000000000000FF00000000000000FF0000FF0000FF0000FF000000000000000000FF00000000000000FF0000FF0000FF0000FF0000FF000000000000000000000000000000000000FF0000FF0000000000000000FF0000000000000000FF0000000000000000FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
-				//const blockDescription = this.hexStringToArray(blockString)
 
 				// 组合数据
 				const data = [
@@ -891,9 +954,26 @@
 								//that.deviceList[that.listIndex].isLink = true;
 								//that.commandPOWR()
 							} else if (resName == 'LIST') {
-								//that.parseFileList(result)
+								that.parseFileList(result)
 							} else if (resName == 'BRIG') {
 
+							} else if (resName == 'BLAC') {
+								console.log('BLAC----', result)
+								if (that.screenOn) {
+									that.screenOn = false;
+									uni.showToast({
+										title: '屏幕已关闭',
+										icon: 'none',
+										duration: 1500
+									});
+								} else {
+									that.screenOn = true;
+									uni.showToast({
+										title: '屏幕已打开',
+										icon: 'none',
+										duration: 1500
+									});
+								}
 							} else if (resName == 'PLAY') {
 
 							} else if (resName == 'INST') {
@@ -945,6 +1025,75 @@
 					}
 				});
 			},
+			//查询智能壳已存信息序列(LIST)
+			commandLIST() {
+				//1.手机发指令:启动字节+帧头+包头段(0x43+简易绑定号+屏大小)+LIST+信息属性+CRC校验码+帧尾。
+				//2.智能壳指令:启动字节+帧头+包头段+LIST+返回标志+加密地址+文件数+[信息名1+信息名2+...+信息名n]+CRC校验码+帧尾。
+				// 构建指令数据
+				const startBytes = new Array(10).fill(0x55); // 10个启动字节
+				const frameHeader = 0x7E; // 帧头
+				const packageType = 0x43; // 包类型
+				// 使用新的简易绑定号生成函数
+				const simpleBindId = this.generateSimpleBindId();
+
+				// 屏大小 (2 bytes): 从ID中获取
+				const screenSize = this.hexStringToArray(this.checId.slice(20, 24));
+				const packageHeader = [packageType, ...simpleBindId, ...screenSize];
+				const command = [0x4C, 0x49, 0x53, 0x54]; // "LIST"的ASCII码
+				const infoAttribute = 0x00; // 信息属性: 0=一般信息
+				// 组合数据
+				const data = [
+					...startBytes,
+					frameHeader,
+					...packageHeader,
+					...command,
+					infoAttribute
+				];
+
+				// 计算CRC校验码(从包头段开始计算)
+				const crc = this.calcCRC16(data.slice(11));
+
+				// 添加CRC和帧尾
+				data.push((crc >> 8) & 0xFF); // CRC高8位
+				data.push(crc & 0xFF); // CRC低8位
+				data.push(frameHeader); // 帧尾
+				console.log('LIST data----', this.hexArrayToHexString(data))
+
+				const buffer = new Uint8Array(data).buffer;
+				setTimeout(() => {
+					this.writeBLECharacteristicValue(buffer)
+				}, 1000);
+			},
+			// 获取文件名称文件数量
+			parseFileList(hexString) {
+				// 文件数占1字节(2个十六进制字符
+				const fileCountHex = hexString.slice(32, 34);
+				const fileCount = parseInt(fileCountHex, 16);
+				console.log('文件数:', fileCount);
+
+				// 获取文件名称列表
+				const fileNames = [];
+				let nameStartIndex = 34; // 文件数后开始
+
+				for (let i = 0; i < fileCount; i++) {
+					// 每个信息名占2个字节(4个十六进制字符)
+					const nameHex = hexString.slice(nameStartIndex, nameStartIndex + 4);
+					const nameBytes = nameHex.match(/.{2}/g);
+					if (nameBytes && nameBytes.length === 2) {
+						// 将两个字节转换为ASCII字符
+						const char1 = String.fromCharCode(parseInt(nameBytes[0], 16));
+						const char2 = String.fromCharCode(parseInt(nameBytes[1], 16));
+						const fileName = char1 + char2;
+						fileNames.push({
+							fileName: fileName,
+							nameHex: nameHex
+						});
+					}
+
+					nameStartIndex += 4; // 移动到下一个文件名
+				}
+				console.log('文件名称列表:', fileNames);
+			},
 			// 生成简易绑定号
 			generateSimpleBindId() {
 				if (!this.checId || !this.password) {

--
Gitblit v1.10.0