// // DeviceData.swift // SolarBT // // Created by weclouds on 2019/4/28. // Copyright © 2019 weclouds. All rights reserved. // /* 类型 + 序列号 + 名称 1 8 7 序列号: 实时状态1s刷新一次 字体大小 固定 不跟随系统 电压电流单位 小数 0 */ /* 功能 1、数据保存 2、数据读取 3、数据刷新 1、分4个 1、设备信息 (存储 - 读取- 更新) 3、历史数据 (存储 - 读取 - 更新) 2、实时数据 (存储-读取-更新) 4、数据设置 (存储 读取 更新) */ import Foundation class DeviceData: NSObject { var dataDict : [String: Any] = [String: Any]() var paramDataDict : [String: Any] = [String: Any]() var realDataDict : [String:Any] = [String:Any]() var cumulativeDataDict : [String :Any] = [String: Any]() /// 累计数据 let key: DeviceDictKey = DeviceDictKey() var historyDataArr: [[String: String]] = [[String: String]]() override init() { super.init() } //真实数据 func realdata(_ reciveData : String) { let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") } //实时数据 func realdata_000A(_ reciveData : String) { let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") //系统支持的最高电压 let num00 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2)) log.debug("额定充电电流: \(num00!)") dataDict[key.MaxVolt] = "\(num00!)" paramDataDict[key.MaxVolt] = "\(num00!)" let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2)) log.debug("额定充电电流: \(num0!)") dataDict[key.IchageRage] = "\(num0!)" paramDataDict[key.IchageRage] = "\(num0!)" } //读取名称 func readdata_0049(_ reciveData : String){ let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") var num5 = UUUtils.string(fromHexString: str0.subString(start: 7 , length: str0.count - 12)) log.debug("要解析的十六进制 \( str0.subString(start: 7 , length: str0.count - 12))") num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白 log.debug("设备名称 \(num5)") if num5 == nil || num5 == ""{ let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 7 , length: str0.count - 12)) log.debug("设备中文名称 \(ChineseString!)") } } func realdata_000B(_ reciveData : String) { let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") //1400 //额定放电电流 let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2)) log.debug("额定放电电流:\(num00!)") dataDict[key.idischagRate] = "\(num00!)" //产品类型 let num0 = UUUtils.numberHexString(str0.subString(start: 9, length: 2)) log.debug("产品类型:\(num0)") var device_type = "" switch num0?.intValue { case 0: device_type = "控制器,家用" case 1: device_type = "控制器,路灯" case 3: device_type = "逆变器" case 4: device_type = "控逆一体机" default: break } dataDict[key.device_type] = device_type var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32)) num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白 log.debug("产品型号\(num1)") dataDict[key.product_type] = num1! //软件版本 // let num2 = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 8)) let a = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 2)) let b = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2, length: 2)) let c = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2, length: 2)) let d = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2 + 2, length: 2)) log.debug("软件版本 : V \(b!).\(c!).\(d!)") dataDict[key.softWareCersion] = "V\(b!).\(c!).\(d!)" //硬件版本 // let num3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 8)) let m1 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 2)) let m2 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2, length: 2)) let m3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2, length: 2)) let m4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2 + 2, length: 2)) log.debug("硬件版本 : V\(m2!).\(m3!).\(m4!)") // 序列号 dataDict[key.hardWareCersion] = "V \(m2!).\(m3!).\(m4!)" // let num4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 8)) let num41 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 2)) let num42 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 2 , length: 2)) let num43 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 , length: 4)) //补足5位 log.debug("\( String(format: "%05d", num43!.intValue))") // 年月(低十六位) dataDict[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))" // var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 32)) // 最大32字节 12568哦哦哦泈色系儿子儿媳妇 var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 64)) log.debug("要解析的十六进制 \( str0.subString(start: 255 , length: 64))") num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白 log.debug("设备名称 \(num5)") //f16d33 575578 e565b 065fd8 0906ed179 if num5 == nil || num5 == "" { let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 255 , length: 64)) // ff ff dataDict[key.productName] = ChineseString log.debug("设备中文名称 \(ChineseString!)") }else{ dataDict[key.productName] = num5 } // dataDict[key.productName] = "测试名称" //生产日期 // let num6 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 * 4, length: 8)) let year = UUUtils.numberHexString(str0.subString(start: 75, length: 2)) let mouth = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2)) let day = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2)) log.debug("生产日期 : \(year!)-\(mouth!)-\(day!)") //mac地址 // let num7 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 8 , length: 4)) // log.debug("设备地址 \(num7)") //生产批次 // var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 64)) // num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白 // log.debug("设备名称 \(num5)") } //温度处理 func temp(with num:NSNumber)-> String{ let numInt = num.intValue // let q1 = UUUtils.numberHexString(q)?.intValue let q2 = numInt & 128 print("判断正负\(q2)") if q2 != 128 { log.debug("温度\(num.floatValue )") return "\(num.intValue )" }else{ log.debug("温度: -\(numInt & 127 )") return "-\(numInt & 127 )" } } //1s刷新一次 //实时数据 func realdata_00FD(_ reciveData : String) { let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") //太阳能板状态 0 000 0000 0000 0000 0000 0000 0000 0010 // 31 let num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8)) log.debug("太阳能板状态\(num0A!)") var solarStatusStr = "" let B30 = num0A?.subString(start: 1, length: 1) let B29 = num0A?.subString(start: 2, length: 1) let B28 = num0A?.subString(start: 3, length: 1) let B27 = num0A?.subString(start: 4, length: 1) let B26 = num0A?.subString(start: 5, length: 1) let B25 = num0A?.subString(start: 6, length: 1) let B24 = num0A?.subString(start: 7, length: 1) let B23 = num0A?.subString(start: 8, length: 1) //负载 let B20 = num0A?.subString(start: 11, length: 1) let B19 = num0A?.subString(start: 12, length: 1) let B15 = num0A?.subString(start: 16, length: 1) //系统 let B21 = num0A?.subString(start: 10, length: 1) let B14 = num0A?.subString(start: 17, length: 1) let B13 = num0A?.subString(start: 18, length: 1) //蓄电池状态 let B22 = num0A?.subString(start: 9, length: 1) let B18 = num0A?.subString(start: 13, length: 1) let B17 = num0A?.subString(start: 14, length: 1) let B16 = num0A?.subString(start: 15, length: 1) let B12 = num0A?.subString(start: 19, length: 1) let B11 = num0A?.subString(start: 20, length: 1) let B10 = num0A?.subString(start: 21, length: 1) var batteryStatusStr = "" if B10 == "1" { batteryStatusStr = "BMS过充保护" } if B11 == "1" { batteryStatusStr = "电池低温保护,停止充电" } if B12 == "1" { batteryStatusStr = "电池反接" } if B16 == "1" { batteryStatusStr = "蓄电池过放" } if B17 == "1" { batteryStatusStr = "蓄电池超压" } if B18 == "1" { batteryStatusStr = "欠压警告" } if B22 == "1" { batteryStatusStr = "外部坏境温度过高" } if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{ batteryStatusStr = "正常" } dataDict[key.batteryStatus] = batteryStatusStr realDataDict[key.batteryStatus] = batteryStatusStr //太阳能状态 if B23 == "1" { solarStatusStr = "光伏输入功率过大" } if B24 == "1" { solarStatusStr = "光伏输入端短路" } if B25 == "1" { solarStatusStr = "光伏输入端超压" } if B26 == "1" { solarStatusStr = "太阳板逆流" } if B27 == "1" { solarStatusStr = "太阳板工作点超压" } if B28 == "1" { solarStatusStr = "太阳板反接" } dataDict[key.solarStatus] = solarStatusStr realDataDict[key.solarStatus] = solarStatusStr if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" { dataDict[key.solarStatus] = batteryStatusStr realDataDict[key.solarStatus] = batteryStatusStr } let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4)) log.debug("00FD \(num0!)") //0000 0000 0000 0000 从后往前数 let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")" var loadStatusStr = "" if B15 == "1" { loadStatusStr = "负载开路" } if B19 == "1" { loadStatusStr = "负载短路" } if B20 == "1" { loadStatusStr = "负载功率过大或负载过流" } if B15 == "0" && B19 == "0" && B20 == "0" { if loadStatus == "0" { loadStatusStr = "负载已关" }else if loadStatus == "1" { loadStatusStr = "负载已开" } } log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位 dataDict[key.loadStatus] = loadStatusStr realDataDict[key.loadStatus] = loadStatusStr //蓄电池状态 // let batteryStatus = "\(num0?.subString(start: 8, length: 8) ?? "")" //太阳能电压 0107 let num1 = UUUtils.numberHexString(str0.subString(start: 47, length: 4)) print("太阳能电压 \(num1!.floatValue * 0.1)" ) let solarV = String(format: "%.1f", num1!.floatValue * 0.1) dataDict[key.solarVoltage] = "\(solarV)" realDataDict[key.solarVoltage] = "\(solarV)" // 太阳能电流 0108 let num2 = UUUtils.numberHexString(str0.subString(start: 47 + 4, length: 4)) print("太阳能电流 \(num2!.floatValue * 0.01)") dataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01) realDataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01) // 太阳能功率 0109 let num2_1 = UUUtils.numberHexString(str0.subString(start: 47 + 4 + 4, length: 4)) print("太阳能功率 \(num2_1!)") dataDict[key.solarPower] = "\(num2_1!)" realDataDict[key.solarPower] = "\(num2_1!)" //蓄电池 电压 let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4)) print("蓄电池电压 \(num3!.floatValue * 0.1)") dataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1) realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1) let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4)) print("蓄电池电流\(num4!.floatValue * 0.01)") dataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01) realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01) let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6 + 2 , length: 2)) print("温度 \(temp(with: num5!))") dataDict[key.batteryTemp] = "\(temp(with: num5!))" realDataDict[key.batteryTemp] = "\(temp(with: num5!))" //负载 let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4)) print("负载电压\(num6!.floatValue * 0.1)") dataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1) realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1) let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4)) print("负载电流\(num7!.floatValue * 0.01)") dataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01) realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01) let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4)) print("功率 \(num8! )") dataDict[key.loadPower] = "\(num8!)" realDataDict[key.loadPower] = "\(num8!)" // // log.debug("实时数据 === \(dataDict)") //log.debug("返回数据实时数据-- \(self.realDataDict)") } //处理历史数据 func hisData(_ reciveData:String) { let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") var F000Dict = [String: String]() //蓄电池当天最低电压 let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4)) log.debug("蓄电池当天最低电压: \( String(format: "%.1f", num0!.floatValue * 0.1))") F000Dict[key.his_batteryVoltageMin] = String(format: "%.1f", num0!.floatValue * 0.1) //蓄电池当天最高电压 let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4, length: 4)) log.debug("蓄电池当天最高电压\(String(format: "%.1f", num1!.floatValue * 0.1))") F000Dict[key.his_batteryVoltageMax] = String(format: "%.1f", num1!.floatValue * 0.1) let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4)) log.debug("当天充电最大电流\(String(format: "%.2f", num2!.floatValue * 0.01))") F000Dict[key.his_chargingCurrentMax] = String(format: "%.2f", num2!.floatValue * 0.01) let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3, length: 4)) log.debug("当天放电最大电流\(String(format: "%.2f", num3!.floatValue * 0.01))") F000Dict[key.his_dischargeCurrentmax] = String(format: "%.2f", num3!.floatValue * 0.01) let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4)) log.debug("当天充电最大功率\(num4!)" ) F000Dict[key.his_chargingPowerMax] = "\(num4!)" let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5 , length: 4)) log.debug("当天放电最大功率\(num5!)") F000Dict[key.his_dischargePowerMax] = "\(num5!)" let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4)) log.debug("充电安时数 \(num6!)") F000Dict[key.his_chargingAmpereHour] = "\(num6!)" let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7 , length: 4)) log.debug("放电安时数 \(num7!)") F000Dict[key.his_dischargeAmpereHour] = "\(num7!)" let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4)) log.debug("当天发电量 \(num8!)") F000Dict[key.his_generationCapacity] = "\(num8!)" let num9 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4)) log.debug("充电量 \(num9!)") F000Dict[key.his_dischargeCapacity] = "\(num9!)" historyDataArr.append(F000Dict) } func realdata_F000(_ reciveData : String) { hisData(reciveData) } func realdata_F001(_ reciveData : String) { hisData(reciveData) } func realdata_F002(_ reciveData : String) { hisData(reciveData) } func realdata_F003(_ reciveData : String) { hisData(reciveData) } func realdata_F004(_ reciveData : String) { hisData(reciveData) } func realdata_F005(_ reciveData : String) { hisData(reciveData) } func realdata_F006(_ reciveData : String) { hisData(reciveData) dataDict[key.historydatas] = historyDataArr } // func realdata_F007(_ reciveData : String) { // hisData(reciveData) // // dataDict[key.historydatas] = historyDataArr // } // func realdata_0115(_ reciveData :String) { let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") // let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4)) log.debug("总运行天数 - \(num0!)") dataDict[key.runTime] = ("\(num0!)") // cumulativeDataDict[key.runTime] = ("\(num0!)") let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4)) log.debug("蓄电池总过放次数 - \(num1!)") dataDict[key.overTimes] = "\(num1!)" // cumulativeDataDict[key.overTimes] = "\(num1!)" let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 8 , length: 4)) log.debug("蓄电池总充满次数 - \(num2!)") dataDict[key.fullTimes] = "\(num2!)" // cumulativeDataDict[key.fullTimes] = "\(num2!)" let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 12 , length: 8)) log.debug("蓄电池总充电安时数 - \(num3!)") dataDict[key.chargingAmpereHour] = "\(num3!)" // cumulativeDataDict[key.chargingAmpereHour] = "\(num3!)" let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 , length: 8)) log.debug("蓄电池总放电安时数 - \(num4!)") dataDict[key.dischargeAmpereHour] = "\(num4!)" // cumulativeDataDict[key.dischargeAmpereHour] = "\(num4!)" let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 2 , length: 8)) log.debug("累计发电量 - \(num5!)") dataDict[key.generatEnergyTotal] = "\(num5!)" // cumulativeDataDict[key.generatEnergyTotal] = "\(num5!)" let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 3, length: 8)) log.debug("累计用电量 - \(num6!)") dataDict[key.usedEnergyTotal] = "\(num6!)" // cumulativeDataDict[key.usedEnergyTotal] = "\(num6!)" // log.debug("、统计数据 == \(cumulativeDataDict)") // AppShare.cumulativeDataDict = cumulativeDataDict // NotificationCenter.default.post(name: NSNotification.Name(kBabyBluetoothNotificationCumulativeDataRecieve), object: nil) } func realdata_E003(_ reciveData : String) { let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") //e003 // FF let FF = str0.subString(start: 7 , length: 2) if FF == "FF"{ dataDict[key.autoRecognition] = "1" paramDataDict[key.autoRecognition] = "1" }else{ dataDict[key.autoRecognition] = "0" paramDataDict[key.autoRecognition] = "0" } // 判断是否自动识别 let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2 , length: 2)) log.debug("系统电压设置 - \(num0!)") dataDict[key.BatRateVolt] = "\(num0!)" paramDataDict[key.BatRateVolt] = "\(num0!)" //e004 let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4)) var batterytype = "" switch num1?.intValue { case 0: batterytype = "自定义" case 1: batterytype = "开口铅酸FLD" case 2: batterytype = "密封铅酸SLD" case 3: batterytype = "胶体铅酸GEL" case 4: batterytype = "锂LI" case 5: batterytype = "三元锂电池" case 6: batterytype = "磷酸铁锂LI" case 7: batterytype = "超级电容" case 10: batterytype = "自定义(铅酸专用)" default: break } log.debug("电池类型: \(batterytype)") dataDict[key.BatTypeSet] = "\(batterytype)" paramDataDict[key.BatTypeSet] = "\(batterytype)" //e005 let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2 , length: 4)) log.debug("超压电压: \(num2!.floatValue * 0.1)") dataDict[key.BatOverVolt] = "\(num2!.floatValue * 0.1)" paramDataDict[key.BatOverVolt] = "\(num2!.floatValue * 0.1)" //e006 let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3, length: 4)) //BatChgLimitVolt log.debug("充电限制电压:\(num3!.floatValue * 0.1)") dataDict[key.BatChgLimitVolt] = "\(num3!.floatValue * 0.1)" paramDataDict[key.BatChgLimitVolt] = "\(num3!.floatValue * 0.1)" //e007 let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4)) log.debug("均衡充电电压\(num4!.floatValue * 0.1)") dataDict[key.BatConstChgVolt] = String(format: "%.1f", num4!.floatValue * 0.1) paramDataDict[key.BatConstChgVolt] = String(format: "%.1f", num4!.floatValue * 0.1) //e008 let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4)) log.debug("提升充电电压/过充返回电压\(num5!.floatValue * 0.1)") dataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))" paramDataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))" //e009 let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4)) log.debug("浮充充电电压/过充返回电压\(num6!.floatValue * 0.1)") dataDict[key.BatFloatChgVolt] = "\(num6!.floatValue * 0.1)" paramDataDict[key.BatFloatChgVolt] = "\(num6!.floatValue * 0.1)" //e00a let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4)) log.debug("提升充电返回电压\(num7!.floatValue * 0.1)") dataDict[key.BatImprovChgBackVolt] = String(format: "%.1f", num7!.floatValue * 0.1) paramDataDict[key.BatImprovChgBackVolt] = String(format: "%.1f", num7!.floatValue * 0.1) //e00b let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4)) log.debug("过放返回电压\(num8!.floatValue * 0.1)") dataDict[key.BatOverDischgBackVolt] = "\(num8!.floatValue * 0.1)" paramDataDict[key.BatOverDischgBackVolt] = "\(num8!.floatValue * 0.1)" //e00c let num9 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4)) log.debug("欠压警告电压\(num9!.floatValue * 0.1)") dataDict[key.BatUnderVolt] = "\(num9!.floatValue * 0.1)" paramDataDict[key.BatUnderVolt] = "\(num9!.floatValue * 0.1)" //e00d let num10 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 10, length: 4)) log.debug("过放电压\(num10!.floatValue * 0.1)") dataDict[key.BatOverDischgVolt] = "\(num10!.floatValue * 0.1)" paramDataDict[key.BatOverDischgVolt] = "\(num10!.floatValue * 0.1)" //e00e let num11 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 11, length: 4)) log.debug("放电限制电压\(num11!.floatValue * 0.1)") dataDict[key.BatDischgLimitVolt] = "\(num11!.floatValue * 0.1)" paramDataDict[key.BatDischgLimitVolt] = "\(num11!.floatValue * 0.1)" // //e00f // let num12 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 12, length: 4)) // log.debug("充电截止SOC,放点截止SOC\(num12!)") //e010 let num13 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 13, length: 4)) log.debug("过放延时时间\(num13!)") dataDict[key.BatOverDischgDelayTime] = "\(num13!)" paramDataDict[key.BatOverDischgDelayTime] = "\(num13!)" //e011 let num14 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 14, length: 4)) log.debug("均衡充电时间\(num14!)") dataDict[key.BatConstChgTime] = "\(num14!)" paramDataDict[key.BatConstChgTime] = "\(num14!)" //e012 let num15 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 15, length: 4)) log.debug("提升充电时间 \(num15!)") dataDict[key.BatImprovChgTime] = "\(num15!)" paramDataDict[key.BatImprovChgTime] = "\(num15!)" //e013 let num16 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 16, length: 4)) log.debug("均衡充电间隔\(num16!)") dataDict[key.BatConstChgGapTime] = "\(num16!)" paramDataDict[key.BatConstChgGapTime] = "\(num16!)" //e014 let num17 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 17, length: 4)) log.debug("温度补偿系数\(num17!)") dataDict[key.CoeffTemperCompen] = "\(num17!)" paramDataDict[key.CoeffTemperCompen] = "\(num17!)" //e015 let num18 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 18, length: 4)) log.debug("充电上限温度\(temp(with: num18!))") dataDict[key.ChgMaxTemper] = "\(temp(with: num18!))" paramDataDict[key.ChgMaxTemper] = "\(temp(with: num18!))" //e016 let num19 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 19, length: 4)) log.debug("充电下限温度\(temp(with: num19!))") dataDict[key.ChgMinTemper] = "\(temp(with: num19!))" paramDataDict[key.ChgMinTemper] = "\(temp(with: num19!))" //e017 let num20 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 20, length: 4)) log.debug("放电上限温度\(temp(with: num20!))") dataDict[key.DisChagMaxTemper] = "\(temp(with: num20!))" paramDataDict[key.DisChagMaxTemper] = "\(temp(with: num20!))" //e018 let num21 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 21, length: 4)) log.debug("放电下限温度\(temp(with: num21!))") dataDict[key.DisChaMinTemper] = "\(temp(with: num21!))" paramDataDict[key.DisChaMinTemper] = "\(temp(with: num21!))" //e01d let num26 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 26, length: 4)) var loadwordmode = "" switch num26?.intValue { case 0: loadwordmode = "Light_control".da_localizedStr() case 1: loadwordmode = "Light_control,_delay_1_hour".da_localizedStr() case 2: loadwordmode = "Light_control,_delay_2_hours".da_localizedStr() case 3: loadwordmode = "Light_control,_delay_3_hours".da_localizedStr() case 4: loadwordmode = "Light_control,_delay_4_hours".da_localizedStr() case 5: loadwordmode = "Light_control,_delay_5_hours".da_localizedStr() case 6: loadwordmode = "Light_control,_delay_6_hours".da_localizedStr() case 7: loadwordmode = "Light_control,_delay_7_hours".da_localizedStr() case 8: loadwordmode = "Light_control,_delay_8_hours".da_localizedStr() case 9: loadwordmode = "Light_control,_delay_9_hours".da_localizedStr() case 10: loadwordmode = "Light_control,_delay_10_hours".da_localizedStr() case 11: loadwordmode = "Light_control,_delay_11_hours".da_localizedStr() case 12: loadwordmode = "Light_control,_delay_12_hours".da_localizedStr() case 13: loadwordmode = "Light_control,_delay_13_hours".da_localizedStr() case 14: loadwordmode = "Light_control,_delay_14_hours".da_localizedStr() case 15: loadwordmode = "Manual_mode".da_localizedStr() case 16: loadwordmode = "Debug_mode".da_localizedStr() case 17: loadwordmode = "Normal-on_mode".da_localizedStr() case 18: loadwordmode = "Timed_mode".da_localizedStr() default: break } log.debug("直流负载工作模式\(loadwordmode)") dataDict[key.DcLoadMode] = "\(loadwordmode)" paramDataDict[key.DcLoadMode] = "\(loadwordmode)" //e01e let num27 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 27, length: 4)) log.debug("光控延时时间\(num27!)") dataDict[key.LightCtrlDelayTime] = "\(num27!)" paramDataDict[key.LightCtrlDelayTime] = "\(num27!)" //d01f let num28 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 28, length: 4)) log.debug("光控电压\(num28!)") dataDict[key.LightCtrlVolt] = "\(num28!)" paramDataDict[key.LightCtrlVolt] = "\(num28!)" } func realdata_DF00(_ reciveData : String) { let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") // let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4)) log.debug("开关控制 —— \(num0)") var cmd = "" if num0?.intValue == 0 { cmd = "Off".da_localizedStr() }else if num0?.intValue == 1{ cmd = "On".da_localizedStr() } dataDict[key.CmdPowerOnOff] = cmd paramDataDict[key.CmdPowerOnOff] = cmd } func realdata_DF0D(_ reciveData : String) { let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") // let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4)) log.debug("手动均衡 —— \(num0)") var canhandle = "" if num0?.intValue == 0 { canhandle = "Prohibited".da_localizedStr() }else if num0?.intValue == 1{ canhandle = "Enable".da_localizedStr() } dataDict[key.BattEqualChgImmediate] = canhandle paramDataDict[key.BattEqualChgImmediate] = canhandle // let year = UUUtils.numberHexString(str0.subString(start: 7, length: 2)) // let mouth = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2)) // let day = UUUtils.numberHexString(str0.subString(start: 7 + 2 + 2, length: 2)) // log.debug("生产日期 : \(year!)-\(mouth!)-\(day!)") } func realdata_E021(_ reciveData : String) { let str0 = reciveData.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") // str0.subString(start: 7, length: 4) let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4)) //("0000000100000000") //00 000 001 00000000 log.debug("E021 —— \(num0)") //RX let rx = num0?.subString(start: 2, length: 3) var rx_function = "" if rx == "000"{ rx_function = "Normal_communication".da_localizedStr() } // else if rx == "001"{ // rx_function = "远程开关" // // }else if rx == "010"{ // rx_function = "负载输出设置" // // }else if rx == "011"{ // rx_function = "负载输出开/关 反相" // // }else if rx == "100"{ // rx_function = "负载输出开/关 正常" // } log.debug("Rx端口 \(rx_function)") dataDict[key.rx] = "\(rx_function)" paramDataDict[key.rx] = "\(rx_function)" let tx = num0?.subString(start: 5, length: 3) log.debug("") var tx_function = "" if tx == "000" { tx_function = "Normal_communication".da_localizedStr() } // else if tx == "001"{ // tx_function = "虚拟负载输出" // }else if tx == "010"{ // tx_function = "每0.01kwh脉冲" // }else if tx == "011"{ // tx_function = "灯光调暗(pwm正常)" // }else if tx == "100"{ // tx_function = "灯光调暗(pwm反相)" // } log.debug("tx端口 \(tx_function)") dataDict[key.tx] = "\(tx_function)" paramDataDict[key.tx] = "\(tx_function)" log.debug("返回数据paramDataDict-- \(self.paramDataDict)") AppShare.paramDataDict = self.paramDataDict NotificationCenter.default.post(name: NSNotification.Name(kNotifionCationBatParam), object: nil) } //获取设备数据 func getDevieData(){ BabyBluetoothSwift.shareInstance()?.testBlock2 = {[weak self](deviceData) in let a = deviceData?.value(forKey: ReceiveData) as! String let str0 = a.subString(start: 0, length: 6) log.debug("返回的数据 -- \(a)") if str0.subString(start: 1, length: 4) == "ff03" { let dataTagValue : String = deviceData?.value(forKey: DataTag) as! String if dataTagValue == "FF03000A0001"{ self!.realdata_000A(a) } if dataTagValue == "FF03000B004E" { self!.realdata_000B(a) } if dataTagValue == "FF0300FD000D" { self!.realdata_00FD(a) } if dataTagValue == "FF03F000000A" { self!.historyDataArr.removeAll() self!.realdata_F000(a) } if dataTagValue == "FF03F001000A" { self!.realdata_F001(a) } if dataTagValue == "FF03F002000A" { self!.realdata_F002(a) } if dataTagValue == "FF03F003000A" { self!.realdata_F003(a) } if dataTagValue == "FF03F004000A" { self!.realdata_F004(a); } if dataTagValue == "FF03F005000A" { self!.realdata_F005(a); } if dataTagValue == "FF03F006000A" { self!.realdata_F006(a); } // if dataTagValue == "FF03F007000A" { // self!.realdata_F007(a); // } if dataTagValue == "FF030115000B"{ self!.realdata_0115(a) } if dataTagValue == "FF03E003001E" { self!.realdata_E003(a); } if dataTagValue == "FF03DF000001" { self!.realdata_DF00(a); } if dataTagValue == "FF03DF0D0001" { self!.realdata_DF0D(a) } if dataTagValue == "FF03E0210001"{ self!.realdata_E021(a) } if dataTagValue == "FF0300490020"{ self!.readdata_0049(a) } } // log.debug("返回数据dataDict-- \(self!.dataDict)") AppShare.dataDict = self!.dataDict //kBabyBluetoothNotificationAllDataRecieve if AppShare.isRefresh == true { NotificationCenter.default.post(name: NSNotification.Name(kBabyBluetoothNotificationAllDataRecieve), object: nil) } } } //获取设备数据 func getParamData(){ // ["FF03000A0001","FF03E003001E","FF03DF000001","FF03DF0D0001","FF03E0210001"] BabyBluetoothSwift.shareInstance()?.testBlock2 = {[weak self](deviceData) in let a = deviceData?.value(forKey: ReceiveData) as! String let str0 = a.subString(start: 0, length: 6) log.debug("返回的数据 -- \(a)") if str0.subString(start: 1, length: 4) == "ff03" { let dataTagValue : String = deviceData?.value(forKey: DataTag) as! String if dataTagValue == "FF03000A0001"{ self!.realdata_000A(a) } if dataTagValue == "FF03E003001E" { self!.realdata_E003(a); } if dataTagValue == "FF03DF000001" { self!.realdata_DF00(a); } if dataTagValue == "FF03DF0D0001" { self!.realdata_DF0D(a) } if dataTagValue == "FF03E0210001"{ self!.realdata_E021(a) } } } } //获取实时数据 func getRealData(){ BabyBluetoothSwift.shareInstance()?.testBlock2 = {[weak self](deviceData) in let a = deviceData?.value(forKey: ReceiveData) as! String let str0 = a.subString(start: 0, length: 6) log.debug(" ------------ ======== ----返回的数据 -- \(a)") if str0.subString(start: 1, length: 4) == "ff03" { let dataTagValue : String = deviceData?.value(forKey: DataTag) as! String if dataTagValue == "FF0300FD000D" { let str0 = a.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") var realDataDict2 : [String:Any] = [String:Any]() let key2: DeviceDictKey = DeviceDictKey() //太阳能板状态 0 000 0000 0000 0000 0000 0000 0000 0010 // 31 let num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8)) log.debug("太阳能板状态\(num0A!)") var solarStatusStr = "" let B28 = num0A?.subString(start: 3, length: 1) let B27 = num0A?.subString(start: 4, length: 1) let B26 = num0A?.subString(start: 5, length: 1) let B25 = num0A?.subString(start: 6, length: 1) let B24 = num0A?.subString(start: 7, length: 1) let B23 = num0A?.subString(start: 8, length: 1) //负载 let B20 = num0A?.subString(start: 11, length: 1) let B19 = num0A?.subString(start: 12, length: 1) let B15 = num0A?.subString(start: 16, length: 1) //系统 //蓄电池状态 let B22 = num0A?.subString(start: 9, length: 1) let B18 = num0A?.subString(start: 13, length: 1) let B17 = num0A?.subString(start: 14, length: 1) let B16 = num0A?.subString(start: 15, length: 1) let B12 = num0A?.subString(start: 19, length: 1) let B11 = num0A?.subString(start: 20, length: 1) let B10 = num0A?.subString(start: 21, length: 1) var batteryStatusStr = "" if B10 == "1" { batteryStatusStr = "BMS过充保护" } if B11 == "1" { batteryStatusStr = "电池低温保护,停止充电" } if B12 == "1" { batteryStatusStr = "电池反接" } if B16 == "1" { batteryStatusStr = "蓄电池过放" } if B17 == "1" { batteryStatusStr = "蓄电池超压" } if B18 == "1" { batteryStatusStr = "欠压警告" } if B22 == "1" { batteryStatusStr = "外部坏境温度过高" } if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{ batteryStatusStr = "正常" } realDataDict2[key2.batteryStatus] = batteryStatusStr //太阳能状态 if B23 == "1" { solarStatusStr = "光伏输入功率过大" } if B24 == "1" { solarStatusStr = "光伏输入端短路" } if B25 == "1" { solarStatusStr = "光伏输入端超压" } if B26 == "1" { solarStatusStr = "太阳板逆流" } if B27 == "1" { solarStatusStr = "太阳板工作点超压" } if B28 == "1" { solarStatusStr = "太阳板反接" } realDataDict2[key2.solarStatus] = solarStatusStr if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" { realDataDict2[key2.solarStatus] = batteryStatusStr } let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4)) log.debug("00FD \(num0!)") //0000 0000 0000 0000 从后往前数 let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")" var loadStatusStr = "" if B15 == "1" { loadStatusStr = "负载开路" } if B19 == "1" { loadStatusStr = "负载短路" } if B20 == "1" { loadStatusStr = "负载功率过大或负载过流" } if B15 == "0" && B19 == "0" && B20 == "0" { if loadStatus == "0" { loadStatusStr = "负载已关" }else if loadStatus == "1" { loadStatusStr = "负载已开" } } log.debug("负载状态 :\(num0?.subString(start: 7, length: 1) ?? "")") // 低八位 realDataDict2[key2.loadStatus] = loadStatusStr //蓄电池状态 //太阳能电压 0107 let num1 = UUUtils.numberHexString(str0.subString(start: 47, length: 4)) print("太阳能电压 \(num1!.floatValue * 0.1)" ) let solarV = String(format: "%.1f", num1!.floatValue * 0.1) realDataDict2[key2.solarVoltage] = "\(solarV)" // 太阳能电流 0108 let num2 = UUUtils.numberHexString(str0.subString(start: 47 + 4, length: 4)) log.debug("太阳能电流 \(num2!.floatValue * 0.01)") realDataDict2[key2.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01) // 太阳能功率 0109 let num2_1 = UUUtils.numberHexString(str0.subString(start: 47 + 4 + 4, length: 4)) log.debug("太阳能功率 \(num2_1!)") realDataDict2[key2.solarPower] = "\(num2_1!)" //蓄电池 电压 let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4)) log.debug("蓄电池电压 \(num3!.floatValue * 0.1)") realDataDict2[key2.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1) let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4)) log.debug("蓄电池电流\(num4!.floatValue * 0.01)") realDataDict2[key2.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01) let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6 + 2 , length: 2)) log.debug("温度、 \(num5!)") let numInt = num5!.intValue let q2 = numInt & 128 var temp = "" print("判断正负\(q2)") if q2 != 128 { log.debug("温度\(num5!.intValue )") temp = "\(num5!.intValue )" }else{ log.debug("温度: -\(numInt & 127 )") temp = "-\(numInt & 127 )" } //log.debug("温度 \(self!.temp(with: num5!))") realDataDict2[key2.batteryTemp] = temp //负载 let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4)) log.debug("负载电压\(num6!.floatValue * 0.1)") realDataDict2[key2.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1) let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4)) log.debug("负载电流\(num7!.floatValue * 0.01)") realDataDict2[key2.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01) let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4)) log.debug("功率 \(num8! )") realDataDict2[key2.loadPower] = "\(num8!)" AppShare.realDataDict = realDataDict2 log.debug("返回数据实时数据-- \(AppShare.realDataDict)") NotificationCenter.default.post(name: NSNotification.Name(kBabyBluetoothNotificationUartDataRecieve), object: nil) } } } } //统计数据 func getCumulativeData(){ BabyBluetoothSwift.shareInstance()?.testBlock2 = {[weak self](deviceData) in let a = deviceData?.value(forKey: ReceiveData) as! String let str0 = a.subString(start: 0, length: 6) log.debug(" ------------ ======== ----返回的数据 -- \(a)") if str0.subString(start: 1, length: 4) == "ff03" { let dataTagValue : String = deviceData?.value(forKey: DataTag) as! String if dataTagValue == "FF030115000B" { let str0 = a.replacingOccurrences(of: " ", with: "") log.debug("处理真实数据 - \(str0)") // var cumulativeDataDict2 : [String :Any] = [String: Any]() /// 累计数据 let key2: DeviceDictKey = DeviceDictKey() let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4)) log.debug("总运行天数 - \(num0!)") cumulativeDataDict2[key2.runTime] = ("\(num0!)") let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4)) log.debug("蓄电池总过放次数 - \(num1!)") cumulativeDataDict2[key2.overTimes] = "\(num1!)" let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 8 , length: 4)) log.debug("蓄电池总充满次数 - \(num2!)") cumulativeDataDict2[key2.fullTimes] = "\(num2!)" let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 12 , length: 8)) log.debug("蓄电池总充电安时数 - \(num3!)") cumulativeDataDict2[key2.chargingAmpereHour] = "\(num3!)" let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 , length: 8)) log.debug("蓄电池总放电安时数 - \(num4!)") cumulativeDataDict2[key2.dischargeAmpereHour] = "\(num4!)" let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 2 , length: 8)) log.debug("累计发电量 - \(num5!)") cumulativeDataDict2[key2.generatEnergyTotal] = "\(num5!)" let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 3, length: 8)) log.debug("累计用电量 - \(num6!)") cumulativeDataDict2[key2.usedEnergyTotal] = "\(num6!)" log.debug("、统计数据 == \(cumulativeDataDict2)") AppShare.cumulativeDataDict = cumulativeDataDict2 NotificationCenter.default.post(name: NSNotification.Name(kBabyBluetoothNotificationCumulativeDataRecieve), object: nil) } } } } }