fix
lefengyang
2026-08-16 bdb5f6f25c47c22920eb5d81b63d2ae80759b933
fix
1 files modified
155 ■■■■■ changed files
ledApp/pages/index/index.vue 155 ●●●●● patch | view | raw | blame | history
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校验码+帧尾
@@ -891,9 +956,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 +1027,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) {