diff --git a/model/weather_data.go b/model/weather_data.go index 5279803..7d9f965 100644 --- a/model/weather_data.go +++ b/model/weather_data.go @@ -250,48 +250,35 @@ func ParseWH65LPData(data []byte) (*WH65LPData, error) { } // 2. 设备ID (第2字节 + 第22-23字节) - idLSB := uint32(data[1]) // bits 8-15 - idMSB := uint32(data[22]) | uint32(data[21])<<8 // bits 168-183 - wd.StationID = fmt.Sprintf("%06X", (idMSB<<8)|idLSB) + id := (uint32(data[22])<<8|uint32(data[21]))<<8 | uint32(data[1]) + wd.StationID = fmt.Sprintf("%06X", id) // 3. 风向 (bits 16-24) - // 取第3字节的8位 + 第4字节的第1位 - windDirLow := uint16(data[2]) // bits 16-23 - windDirHigh := uint16(data[3] & 0x01) // bit 24 - windDir := windDirLow | (windDirHigh << 8) + windDir := uint16(data[2]) | ((uint16(data[3]) & 0x01) << 8) wd.WindDirection = int(windDir) % 360 // 4. WSP_FLAG (bit 25) wd.WSPFlag = (data[3]>>1)&0x01 == 1 - // 5. WSP_9 和 WSP_8 (bits 26-27) - wspHigh := uint16((data[3] >> 2) & 0x03) + // 5. 风速高2位 (bits 26-27) + wspHigh := (data[3] >> 2) & 0x03 // 6. 低电量标志 (bit 28) wd.LowBattery = (data[3]>>4)&0x01 == 1 // 7. 温度 (bits 29-39) - 11位数据 - // 协议说明:温度数据实际上是从第4字节的低4位开始 + 第5字节的低3位 - // 但根据示例数据分析,应该是:第4字节完整8位 + 第5字节低3位 - tempLow := uint16(data[4]) // 第4字节的8位 - tempHigh := uint16(data[5] & 0x07) // 第5字节的低3位 - tempRaw := tempLow | (tempHigh << 8) + tempRaw := (uint16((data[3]>>5)&0x07) << 8) | uint16(data[4]) wd.Temperature = float64(tempRaw-400) / 10.0 // 8. 湿度 (bits 40-47) - // 湿度应该是第5字节的高5位 - wd.Humidity = int(data[5] >> 3) + wd.Humidity = int(data[5]) // 9. 风速 (bits 48-55 + WSP_9,WSP_8) - windSpeedLow := uint16(data[6]) // bits 48-55 - if wd.WSPFlag { - // 9位风速 - wd.WindSpeed = float64(windSpeedLow) / 8.0 * 0.51 - } else { - // 10位风速,加上bits 26-27的WSP_9和WSP_8 - windSpeedRaw := windSpeedLow | (wspHigh << 8) - wd.WindSpeed = float64(windSpeedRaw) / 8.0 * 0.51 + windSpeedRaw := uint16(data[6]) + if !wd.WSPFlag { + windSpeedRaw |= uint16(wspHigh) << 8 } + wd.WindSpeed = float64(windSpeedRaw) / 8.0 * 0.51 // 10. 阵风 (bits 56-63) wd.WindGust = float64(data[7]) * 0.51 @@ -308,9 +295,9 @@ func ParseWH65LPData(data []byte) (*WH65LPData, error) { lightRaw := uint32(data[12]) | uint32(data[13])<<8 | uint32(data[14])<<16 wd.Light = float64(lightRaw) / 10.0 - // 14. 气压 (bits 136-159) - 从第18-20字节 (索引17-19) + // 14. 气压 (bits 136-159) pressureRaw := uint32(data[17]) | uint32(data[18])<<8 | uint32(data[19])<<16 - pressureRaw &= 0x1FFFF // 只取17位 + pressureRaw &= 0x1FFFF if pressureRaw == 0x1FFFF { wd.Pressure = 0 // 无效值 } else {