Переглянути джерело

feat(bluetooth): 添加读取旧地址功能并优化地址处理逻辑

- 在蓝牙页面添加 ORead 按钮和旧地址输入框
- 实现 readOldValue 方法用于获取旧设备地址
- 优化地址更新逻辑,增加空值校验
- 修改 modbus 配置,添加 WRITE_ADDRESS_OLD 指令支持
- 调整页面布局高度以适配新增内容
- 修复部分数值转换逻辑问题
mws 1 місяць тому
батько
коміт
eb2cae7767

+ 35 - 3
pages/bluetooth/index/index.vue

@@ -43,6 +43,7 @@
           <u-button type="info" size="medium" class="control-btn" @click="openBluetoothAdapter()">搜索蓝牙</u-button>
           <u-button type="info" size="medium" class="control-btn" @click="listViewTap()">连接蓝牙</u-button>
           <u-button type="info" size="medium" class="control-btn" @click="readAddress()">读取地址</u-button>
+          <u-button type="info" size="medium" class="control-btn" @click="readOldValue()">ORead</u-button>
         </view>
 
         <!-- 设备地址行 -->
@@ -69,6 +70,15 @@
             <u-button type="info" size="medium" class="control-btn" @click="writeAddress()">写地址</u-button>
           </u-col>
         </u-row>
+        <!-- 新设备地址行 -->
+        <u-row gutter="10" customStyle="margin-bottom: 10px">
+          <u-col span="3">
+            <view class="label-box">ODev:</view>
+          </u-col>
+          <u-col span="5">
+            <u-input v-model="oldValue"  type="number" placeholder="" class="address-input"></u-input>
+          </u-col>
+        </u-row>
 
       </view>
       <DeviceStatusInfo/>
@@ -82,6 +92,7 @@ import BluetoothHeader from '@/pages/components/header.vue';
 import DeviceStatusInfo from '@/pages/components/DeviceStatusInfo.vue';
 import {ecBLE,ecUI,initBLE,writeRegister,startHeartbeat,stopHeartbeat,setGlobalSlaveAddress,getGlobalSlaveAddress,setAgreement,getConnected} from '@/utils/modbus.js';
 import i18 from '@/utils/i18.js';
+import {setTime} from "../../../utils/modbus";
 let deviceListData = [];
 let ctx;
 export default {
@@ -93,6 +104,7 @@ export default {
     return {
       step:"",
       editStatus: false,
+      oldValue: "",
       selectedDeviceId: null, //选中的设备
       timer: "",  //设备列表数据定时刷新
       deviceListDataShow: [
@@ -114,6 +126,7 @@ export default {
       deviceAddress:'',
       communicationLink_one: false,
       communicationTimer: null, // 添加这一行用于保存定时器 ID
+      readOldValueStatus:false,
     }
 
   },
@@ -176,6 +189,18 @@ export default {
         throw error;
       }
     },
+    async readOldValue() {
+        this.readOldValueStatus = true;
+        ecUI.showLoading("正在获取旧地址");
+        // 读取旧值
+        writeRegister("WRITE_ADDRESS_OLD", null);
+        let that = this;
+        setTimeout(() => {
+          if (that.readOldValueStatus){
+            ecUI.hideLoading();
+          }
+        }, 3000);
+    },
     closeBlue(){
       ecUI.showLoading("正在断开并重新扫描");
       ecBLE.closeBLEConnection();
@@ -191,10 +216,16 @@ export default {
     },
     updateSensorData(data){
       console.log('接收到的数据地址:', data.Addres_23);
-      this.deviceAddress = data.Addres_23;
+      if (data.Addres_23 != null && data.Addres_23 !== ''){
+        this.deviceAddress = data.Addres_23;
+      }
+      if (data.oldAddressValue != null && data.oldAddressValue !== ''){
+        this.oldValue = data.oldAddressValue;
+      }
+
     },
     updataAddress(){
-      if (this.deviceAddress == null || this.deviceAddress == '') {
+      if (this.deviceAddress == null || this.deviceAddress === '') {
         this.$modal.showToast("请输入通讯地址");
         return;
       }
@@ -438,13 +469,14 @@ export default {
   display: flex;
   flex-direction: column;
   gap: 20px;
+  height: 100%;
 }
 
 // 显示区域
 .display-area {
   .display-window {
     width: 100%;
-    height: 230px;
+    height: 250px;
     background-color: #000;
     border: 2px solid #ddd;
     border-radius: 8px;

+ 2 - 1
pages/bluetooth/set/one.vue

@@ -375,6 +375,7 @@ export default {
       })
     },
     updateSensorData(data) {
+      if (data.device !== '255')
       // 根据蓝牙数据更新参数值
       if (data.Longitude_50 !== undefined && this.params.timezoneMode == 'read') {
         this.params.longitude = data.Longitude_50
@@ -474,7 +475,7 @@ export default {
 .content {
   flex: 1;
   padding: $custom-spacing-md;
-  height: calc(100vh - 190px);
+  height: calc(100vh - 180px);
 }
 
 .param-section {

+ 1 - 1
pages/components/header.vue

@@ -64,7 +64,7 @@ export default {
             clearTimeout(this.communicationTimer)
             this.communicationTimer = null
           }
-          if (newData.device !== '255'){
+          if (newData.device !== '255' && newData.device !== ''){
               // 设置通信链接状态为 true
               this.linkStatus = true
           }

+ 46 - 21
utils/modbus.js

@@ -121,7 +121,8 @@ export function writeRegister(action, valueToWrite) {
             stopHeartbeat();
         }
         let value = valueToWrite;
-        if (!TS.includes(action) && valueToWrite !== null && valueToWrite !== '' && valueToWrite !== undefined) {
+        // 特殊处理 WRITE_ADDRESS_OLD,避免将数组转换为整数
+        if (!TS.includes(action) && valueToWrite !== null && valueToWrite !== '' && valueToWrite !== undefined && action !== "WRITE_ADDRESS_OLD") {
             value = parseInt(valueToWrite, 10);
         }
         if (action =='WRITE_ADDRESS'){
@@ -226,7 +227,7 @@ function generateModbusFrame(protocol, action, valueToWrite) {
     if ((valueToWrite == NaN || valueToWrite == null) && config.value !== undefined && config.value !== null) {
         valueToWrite = config.value;
     }
-    if (action !== 'WRITE_ADDRESS' && action !== "GET_ADDRESS"){
+    if (action !== 'WRITE_ADDRESS' && action !== "GET_ADDRESS" && action !== "WRITE_ADDRESS_OLD"){
         slaveAddress = _globalSlaveAddress;
     }
 
@@ -257,19 +258,37 @@ function generateModbusFrame(protocol, action, valueToWrite) {
         finalBuffer[buffer1.length + 1] = crc[1];
         buffer = finalBuffer;
     } else {
-        buffer = new Uint8Array(6);
-        buffer[0] = slaveAddress;
-        buffer[1] = functionCode;
-        buffer[2] = (startAddress >> 8) & 0xFF;
-        buffer[3] = startAddress & 0xFF;
-        buffer[4] = (valueToWrite >> 8) & 0xFF;
-        buffer[5] = valueToWrite & 0xFF;
-
-        const crc = calculateCRC(buffer);
-        const finalBuffer = new Uint8Array(buffer.length + crc.length);
-        finalBuffer.set(buffer);
-        finalBuffer.set(crc, buffer.length);
-        buffer = finalBuffer;
+        // 特殊处理 WRITE_ADDRESS_OLD 指令 - 不添加CRC
+        if (action === "WRITE_ADDRESS_OLD" && Array.isArray(valueToWrite)) {
+            // 为 WRITE_ADDRESS_OLD 创建特定的帧格式,不带CRC
+            buffer = new Uint8Array(4 + valueToWrite.length * 2); // 4字节头 + 数据
+            buffer[0] = slaveAddress;
+            buffer[1] = functionCode;
+            buffer[2] = (startAddress >> 8) & 0xFF;
+            buffer[3] = startAddress & 0xFF;
+            
+            // 填充数据 (两个16位寄存器值)
+            for (let i = 0; i < valueToWrite.length; i++) {
+                const offset = 4 + (i * 2);
+                buffer[offset] = (valueToWrite[i] >> 8) & 0xFF;
+                buffer[offset + 1] = valueToWrite[i] & 0xFF;
+            }
+        } else {
+            // 原有逻辑保持不变
+            buffer = new Uint8Array(6);
+            buffer[0] = slaveAddress;
+            buffer[1] = functionCode;
+            buffer[2] = (startAddress >> 8) & 0xFF;
+            buffer[3] = startAddress & 0xFF;
+            buffer[4] = (valueToWrite >> 8) & 0xFF;
+            buffer[5] = valueToWrite & 0xFF;
+
+            const crc = calculateCRC(buffer);
+            const finalBuffer = new Uint8Array(buffer.length + crc.length);
+            finalBuffer.set(buffer);
+            finalBuffer.set(crc, buffer.length);
+            buffer = finalBuffer;
+        }
     }
 
     return buffer;
@@ -362,11 +381,15 @@ export function parseBluetoothData(hexString) {
     const byteStrings = formattedHexString.split(' ').filter(s => s.length > 0);
     console.log("字节字符串数组:", JSON.stringify(byteStrings));
     console.log("字节数组长度:", byteStrings.length);
+
     if (byteStrings.length < 10 ){  //其他操作执行成功
+        //就地址23 42 02 23 23 0C 96
+        register.oldAddressValue = parseInt(byteStrings[0], 16);
         // 其他操作执行成功
-        return;
+        return register;
     }
 
+
     if (!byteStrings || byteStrings.length < 3) {
         throw new Error('蓝牙数据不完整');
     }
@@ -467,10 +490,10 @@ export function parseBluetoothData(hexString) {
             register.Interval_61 = insertDecimal(register.inter_61.toString(), 2);
         } else if (i === 61) { // 上坡度_两位小数
             register.UpGrade_62 = valueInt16.toString();
-            register.UpGrade_62 = insertDecimal(register.UpGrade_62, 2);
+            register.UpGrade_62 = insertDecimal(register.UpGrade_62.toString(), 2);
         } else if (i === 62) { // 下坡度_两位小数
             register.DownGrade_63 = valueInt16.toString();
-            register.DownGrade_63 = insertDecimal(register.DownGrade_63, 2);
+            register.DownGrade_63 = insertDecimal(register.DownGrade_63.toString(), 2);
         } else if (i === 63) { // 东限位
             register.EasternLimit_64 = valueInt16;
             register.qEasternLimit_64 = register.EasternLimit_64.toString();
@@ -603,10 +626,10 @@ function parseZigbeeData(hexString) {
             register.Interval_61 = insertDecimal(register.inter_61.toString(), 2);
         } else if (i === 33) { // 上坡度_两位小数34-33
             register.UpGrade_62 = valueInt16.toString();
-            register.UpGrade_62 = insertDecimal(register.UpGrade_62, 2);
+            register.UpGrade_62 = insertDecimal(register.UpGrade_62.toString(), 2);
         } else if (i === 34) { // 下坡度_两位小数35-34
             register.DownGrade_63 = valueInt16.toString();
-            register.DownGrade_63 = insertDecimal(register.DownGrade_63, 2);
+            register.DownGrade_63 = insertDecimal(register.DownGrade_63.toString(), 2);
         } else if (i === 39) { // 东限位40-39
             register.EasternLimit_64 = valueInt16;
             register.qEasternLimit_64 = register.EasternLimit_64.toString();
@@ -692,7 +715,9 @@ function parseZigbeeData(hexString) {
         qRealAngle_43: '',
          qRealAngle_31: '',
          FaultCode_10:'',
-         FaultCodeDescription: ''
+         FaultCodeDescription: '',
+         oldAddressValue: '',
+
     };
      return register;
 }

+ 7 - 0
utils/modbusConfig.js

@@ -11,6 +11,13 @@ export const MODBUS_TYPES = {
  */
 export const MODBUS_FRAME_CONFIG = {
     Lora: {
+        WRITE_ADDRESS_OLD: { // 自定义指令
+            type: MODBUS_TYPES.WRITE_ADDRESS,
+            slaveAddress: 0x00,
+            functionCode: 0x42,
+            startAddress: 0x0017, // 修改起始地址为0x0017
+            value: [0x0001, 0x09D0], // 修改值为两个16位寄存器值数组
+        },
         WRITE_ADDRESS: { //写地址
             type: MODBUS_TYPES.WRITE_ADDRESS,
             slaveAddress: 0x00,