// // SBTDeviceDetaiVCtr.swift // SolarBT // // Created by weclouds on 2019/1/28. // Copyright © 2019 weclouds. All rights reserved. // /* 进入设备信息页面 检测 本地是否保存有该设备的数据 否 || 是 读取一遍所有数据 || 从本地获取 保存到本地 || (在这个页面结束的时候保存就好了) 循环刷新数据 实时数据 统计数据 */ import UIKit import JXCategoryView import PKHUD class SBTDeviceDetaiVCtr: BaseViewController { var checkUartCommandTimerEnd :(()->Void)? var checkHistoryCommandTimerEnd :(()->Void)? var isUartCommandTimerEnd : Bool? = false var isHistoryCommandTimerEnd : Bool? = false var peripheralName :String? var isOld :Bool? var categoryViewTimer : Timer? lazy var historyCommandTimer: Timer? = { // 定时器 历史数据定时器 let historyCommandTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(historyCommandTimerCallback), userInfo: nil, repeats: true) return historyCommandTimer }() lazy var uartCommandTimer: Timer? = { // 定时器 实时数据定时器 let uartCommandTimer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(uartCommandTimerCallback), userInfo: nil, repeats: true) return uartCommandTimer }() var solarPower : CGFloat? var solarPowerValue :String? var isManual:Bool? = false // 是否手动模式 var isRealTime = false // 是否是实时数据 var cumulativeDict : [String: Any] = [String: Any]() var deviceDetailData: [String: Any] = [String: Any]() 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]]() var currentIndex : Int? = 0 var isDemo:Bool? = false var isHistoryTimerFire :Bool? = false // 是否开启历史数据定时器 var isSetAction : Bool? = false // 是否点击了设置 var plist_node:String? // plist的子节点 var deviceName:String? // 设备名称 let titles = ["Real-time_status".da_localizedStr(),"Historical_data".da_localizedStr(),"Basic_information".da_localizedStr()] lazy var device = DeviceData() lazy var categoryView: JXCategoryTitleImageView = { let imageNames = ["no","no","no"] let selectedImageNames = ["标签箭头","标签箭头","标签箭头"] let categoryView = JXCategoryTitleImageView() categoryView.titles = titles categoryView.imageNames = imageNames categoryView.selectedImageNames = selectedImageNames categoryView.isImageZoomEnabled = true categoryView.imageZoomScale = 1.1// 图片放大 categoryView.isAverageCellSpacingEnabled = true return categoryView }() let scrollView = UIScrollView() let shouldHandleScreenEdgeGesture : Bool = true } //MARK:lifeCycle extension SBTDeviceDetaiVCtr{ override func viewDidLoad() { super.viewDidLoad() checkTheBlueToothWasActivity() if self.isDemo == false { self.sbtTitle = "Device_details".da_localizedStr() }else{ self.sbtTitle = "Device_details".da_localizedStr() + "(" + "demo_data".da_localizedStr() + ")" } createUI() if self.isDemo == false { // HUD.flash(.progress, delay: 2) // readDeviceName() if self.isOld == false{ delay(0.5) { BabyBluetoothSwift.shareInstance()?.writeData2222(["FF0300490020"], completionHandler: { (result) in let a = result!["FF0300490020"] as! String self.readdata_0049(a) delay(3, closure: { self.uartCommandTimerStart() }) }) } }else{ delay(3) { self.uartCommandTimerStart() } } } } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if AppShare.reloadDeviceReciveData == true{ } NotificationCenter.default.addObserver(self, selector: #selector(sendHistoryCmd), name: NSNotification.Name(kNotifitionSBTDeviceDetaiVCtrSendHistory), object: nil) NotificationCenter.default.addObserver(self, selector:#selector(uartCommandTimerPause), name: NSNotification.Name(kNotifitionSBTDeviceDetaiVCtrRealTimerStop), object: nil) NotificationCenter.default.addObserver(self, selector:#selector(uartCommandTimerContinue), name: NSNotification.Name(kNotifitionSBTDeviceDetaiVCtrRealTimerStart), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(historyCommandTimerPause) , name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStop), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(historyCommandTimerContinue) , name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStart), object: nil) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if self.isDemo == false { uartCommandTimerPause() historyCommandTimerPause() } } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) if self.isDemo == false { uartCommandTimerPause() historyCommandTimerPause() } } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) //当前事第一个页面的时候 navigationController?.interactivePopGestureRecognizer?.isEnabled = false // navigationController?.interactivePopGestureRecognizer?.isEnabled = (categoryView.selectedIndex == 0) log.debug("viewDidAppear") if self.isSetAction == true && self.isDemo == false{ let index = self.currentIndex self.historyCommandTimerPause() self.uartCommandTimerPause() if index == 0 { delay(2) { self.uartCommandTimerContinue() } }else if index == 1{ //判断历史数据定时器是否已经开启。如果没有开启,则开启 delay(5) { if self.isHistoryTimerFire == false{ self.historyCommandTimerStart() }else{ self.historyCommandTimerContinue() } } } } } } extension SBTDeviceDetaiVCtr{ @objc func refreshAction () { if self.isDemo == true { g_toast("Current_demo_data".da_localizedStr()) return } if self.currentIndex == 0 { uartCommandTimerPauseCheckEnd { () in log.debug("当前下标 -- \(self.currentIndex)") log.debug("检查是否已经结束--- \(self.isUartCommandTimerEnd)") self.aRefreshData() } }else if self.currentIndex == 1 { historyCommandTimerPauseCheckEnd { log.debug("当前下标 -- \(self.currentIndex)") self.aRefreshData() } }else{ // index= 3 historyCommandTimerPause() uartCommandTimerPause() } //循环执行 categoryViewTimer?.invalidate() log.debug("刷新数据") let alert = SBTReadLoadingVCtr(nibName: "SBTReadLoadingVCtr", bundle: nil) let plist = CLDeviceDataPlist() let dataDict1 = plist.findData(deviceDetailPlist, key: self.plist_node!) var productName = "" if self.isOld == true { productName = " " }else{ productName = dataDict1![key.productName] as! String } alert.deviceName = productName alert.message = "Data_refreshing...".da_localizedStr() alert.show() alert.dismiss(10) } func aRefreshData() { if self.isOld == false{ BabyBluetoothSwift.shareInstance()?.writeData2222(["FF0300490020"], completionHandler: { (result) in let a = result!["FF0300490020"] as! String self.readdata_0049(a) }) } delay(3) { self.refreshData() } } // func refreshData() { if self.isOld == true { let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF030100000A","FF0301200003","FF03F000000A","FF03F001000A","FF03F002000A","FF03F003000A","FF03F004000A","FF03F005000A","FF03F006000A","FF03F007000A","FF030115000B"] BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in log.debug("返回数据 --- \(ReceiveData)") //实时数据 self.realdata_000A(result!["FF03000A0001"] as! String) self.realdata_E003(result!["FF03E0030001"] as! String) self.realdata_E008(result!["FF03E0080001"] as!String) self.realdata_0100(result!["FF030100000A"] as! String) self.realdata_0120(result!["FF0301200003"] as! String) NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict) self.historyDataArr.removeAll() //历史数据 self.realdata_F000(result!["FF03F000000A"] as! String) self.realdata_F001(result!["FF03F001000A"] as! String) self.realdata_F002(result!["FF03F002000A"] as! String) self.realdata_F003(result!["FF03F003000A"] as! String) self.realdata_F004(result!["FF03F004000A"] as! String) self.realdata_F005(result!["FF03F005000A"] as! String) self.realdata_F006(result!["FF03F006000A"] as! String) self.realdata_F007(result!["FF03F007000A"] as! String) self.realdata_0115(result!["FF030115000B"] as! String) self.perform(#selector(self.timerStar), with: nil, afterDelay: 1) self.timeChange() log.debug("加载结束 -- old") }) }else{ let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF0300FD000D","FF03F000000A","FF03F001000A","FF03F002000A","FF03F003000A","FF03F004000A","FF03F005000A","FF03F006000A","FF03F007000A","FF030115000B"] BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in log.debug("返回数据 --- \(result)") //实时数据 self.realdata_000A(result!["FF03000A0001"] as! String) self.realdata_00FD(result!["FF0300FD000D"] as! String) self.realdata_E003(result!["FF03E0030001"] as! String) self.realdata_E008(result!["FF03E0080001"] as!String) NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict) //历史数据 self.historyDataArr.removeAll() self.realdata_F000(result!["FF03F000000A"] as! String) self.realdata_F001(result!["FF03F001000A"] as! String) self.realdata_F002(result!["FF03F002000A"] as! String) self.realdata_F003(result!["FF03F003000A"] as! String) self.realdata_F004(result!["FF03F004000A"] as! String) self.realdata_F005(result!["FF03F005000A"] as! String) self.realdata_F006(result!["FF03F006000A"] as! String) self.realdata_F007(result!["FF03F007000A"] as! String) self.realdata_0115(result!["FF030115000B"] as! String) // self.perform(#selector(self.timerStar), with: nil, afterDelay: 1) // self.timeChange() log.debug("加载结束 -- new") }) } } func timeChange() { var time = 5 let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in time = time - 1 log.debug("计时 -- \(time)") //处理事件 NotificationCenter.default.post(name: NSNotification.Name(kNotifitionSBTDeviceDetailVCtrRefreshStatus), object: nil, userInfo: ["countdown":"\(time)"]) if time < 0 { timer.invalidate() } } timer.fire() } @objc func timerStar() { let index = self.currentIndex if index == 0 { uartCommandTimerContinue() }else if index == 1{ historyCommandTimerContinue() } } @objc func setAction () { self.isSetAction = true log.debug("设置") AppShare.reloadDeviceReciveData = true if self.isDemo == true { g_toast("Current_demo_data".da_localizedStr()) } if self.isDemo == false { categoryViewTimer?.invalidate() uartCommandTimerPause() historyCommandTimerPause() } let vc = SBTPramSettingVCtr() vc.bleKey = self.plist_node vc.isDemo = self.isDemo vc.isOld = self.isOld delay(0.25) { self.navigationController?.pushViewController(vc, animated: true) } } func createUI() { setNavgationBar() let refreshbtn = UIBarButtonItem.createBarbuttonItem(image: "刷新", highImage: "刷新", target: self, action: #selector(refreshAction)) let setbtn = UIBarButtonItem.createBarbuttonItem(image: "参数设置", highImage: "参数设置", target: self, action: #selector(setAction)) //设置空白展位bar let spaceItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) spaceItem.width = 20 self.navigationItem.rightBarButtonItems = [setbtn,spaceItem,refreshbtn] //滚动视图 let count = preferredListViewCount() let categoryViewHeight = preferredCategoryViewHeight() let width = KSCREENWIDTH let height = KSCREENHEIGHT - KNavBarHeight - categoryViewHeight scrollView.frame = CGRect(x: 0, y: categoryViewHeight, width: width, height: height) scrollView.showsVerticalScrollIndicator = false scrollView.showsHorizontalScrollIndicator = false scrollView.delegate = self scrollView.isPagingEnabled = true scrollView.contentSize = CGSize(width: width * CGFloat(count), height: height) scrollView.bounces = false // scrollView.isScrollEnabled = false view.addSubview(scrollView) let realtimeVc = SBTRealTimeStatusVCtr() realtimeVc.preVC = self realtimeVc.isOld = self.isOld realtimeVc.bleKey = self.plist_node realtimeVc.isDemo = self.isDemo addChild(realtimeVc) realtimeVc.view.frame = CGRect(x: 0, y: 0, width: width, height: height) scrollView.addSubview(realtimeVc.view) let historyVC = SBTHistoryDataVCtr() historyVC.isOld = self.isOld historyVC.belKey = self.plist_node historyVC.isDemo = self.isDemo addChild(historyVC) historyVC.view.frame = CGRect(x: width, y: 0, width: width, height: height) scrollView.addSubview(historyVC.view) let baseInfoVc = SBTBaseInfoVCtr() baseInfoVc.isOld = self.isOld baseInfoVc.belKey = self.plist_node baseInfoVc.isDemo = self.isDemo addChild(baseInfoVc) baseInfoVc.view.frame = CGRect(x: width * 2, y: 0, width: width, height: height) scrollView.addSubview(baseInfoVc.view) categoryView.frame = CGRect(x: 0, y: 0, width: KSCREENWIDTH, height: categoryViewHeight) categoryView.delegate = self categoryView.contentScrollView = scrollView view.addSubview(categoryView) categoryView.titleColor = UIColor(hexString: "222222") categoryView.titleSelectedColor = UIColor(hexString: "FD8B23") } func preferredListViewCount() -> Int { return 3 } func preferredCategoryViewHeight() -> CGFloat { return 49 } } extension SBTDeviceDetaiVCtr :UIScrollViewDelegate,JXCategoryViewDelegate{ func categoryView(_ categoryView: JXCategoryBaseView!, didScrollSelectedItemAt index: Int) { } func categoryView(_ categoryView: JXCategoryBaseView!, didClickSelectedItemAt index: Int) { } func categoryView(_ categoryView: JXCategoryBaseView!, canClickItemAt index: Int) -> Bool { return true } func categoryView(_ categoryView: JXCategoryBaseView!, scrollingFromLeftIndex leftIndex: Int, toRightIndex rightIndex: Int, ratio: CGFloat) { // log.debug("leftIndex -- \(leftIndex) rightIndext---\(rightIndex) --- ratio - \(ratio)") /* 正在滚动中的回调 @param categoryView categoryView对象 @param leftIndex 正在滚动中,相对位置处于左边的index @param rightIndex 正在滚动中,相对位置处于右边的index @param ratio 从左往右计算的百分比 */ } func categoryView(_ categoryView: JXCategoryBaseView!, didSelectedItemAt index: Int) { if shouldHandleScreenEdgeGesture { // navigationController?.interactivePopGestureRecognizer?.isEnabled = (index == 0) navigationController?.interactivePopGestureRecognizer?.isEnabled = false } self.currentIndex = index log.debug("当前控制器 \(index)") if self.isDemo == false { uartCommandTimerPause() historyCommandTimerPause() } if index != 2 { var flag = 0 // 标记 进来就是0 //创建一个定时器 let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in flag = flag + 1 log.debug("当前计数: index -\(index) - flag-\(flag)") if flag == 5 { self.changeItem(index) timer.invalidate() } } timer.fire() categoryViewTimer = timer } } func changeItem(_ index:Int) { if self.isDemo == false { if index == 0 { self.uartCommandTimerContinue() }else if index == 1{ if self.isHistoryTimerFire == false{ self.historyCommandTimerStart() }else{ self.historyCommandTimerContinue() } }else{ uartCommandTimerPause() historyCommandTimerPause() } } NotificationCenter.default.post(name: NSNotification.Name(rawValue: kCheckCurrenVC), object: nil) } } extension SBTDeviceDetaiVCtr{ //实时数据 func realdata_000A(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //系统支持的最高电压 let num00 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2)) log.debug("额定充电电流: \(num00!)") realDataDict[key.MaxVolt] = "\(num00!)" deviceDetailData[key.MaxVolt] = "\(num00!)" let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2)) log.debug("额定充电电流: \(num0!)") // dataDict[key.IchageRage] = "\(num0!)" realDataDict[key.IchageRage] = "\(num0!)" deviceDetailData[key.IchageRage] = "\(num0!)" } func realdata_E003(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //e003 // FF let FF = str0.subString(start: 7 , length: 2) if FF == "FF"{ // dataDict[key.autoRecognition] = "1" realDataDict[key.autoRecognition] = "1" deviceDetailData[key.autoRecognition] = "1" }else{ // dataDict[key.autoRecognition] = "0" realDataDict[key.autoRecognition] = "0" deviceDetailData[key.autoRecognition] = "0" } // 判断是否自动识别 let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2 , length: 2)) log.debug("系统电压设置 - \(num0!)") deviceDetailData[key.BatRateVolt] = "\(num0!)" realDataDict[key.BatRateVolt] = "\(num0!)" } func realdata_E008(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //e003 //e008 let num5 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4)) log.debug("提升充电电压/过充返回电压\(num5!.floatValue * 0.1)") deviceDetailData[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))" realDataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))" } //读取名称 func readdata_0049(_ reciveData : String){ let str0 = reciveData log.debug("处理真实数据 - \(str0)") var productNameDict : [String:String] = [String:String]() if self.isOld == true { productNameDict[key.productName] = "" deviceDetailData[key.productName] = "" }else{ 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)") //f16d33 575578 e565b 065fd8 0906ed179 if num5 == nil || num5 == "" { let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 7 , length: str0.count - 12)) // ff ff productNameDict[key.productName] = ChineseString deviceDetailData[key.productName] = ChineseString log.debug("设备中文名称 \(ChineseString!)") }else{ productNameDict[key.productName] = num5 deviceDetailData[key.productName] = num5 } } } func real_000B000F(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //1400 //额定放电电流 let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2)) log.debug("额定放电电流:\(num00!)") deviceDetailData[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 = "Controller_household".da_localizedStr() case 1: device_type = "Controller_street_light".da_localizedStr() case 3: device_type = "Inverter".da_localizedStr() case 4: device_type = "All-in-one_inverter".da_localizedStr() default: break } deviceDetailData[key.device_type] = device_type var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32)) num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白 log.debug("产品型号\(num1)") deviceDetailData[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!)") deviceDetailData[key.softWareCersion] = "V\(b!).\(c!).\(d!)" //硬件版本 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!)") // 序列号 deviceDetailData[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))") // 年月(低十六位) deviceDetailData[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))" } func realdata_000B(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //1400 //额定放电电流 let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2)) log.debug("额定放电电流:\(num00!)") deviceDetailData[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 = "Controller_household".da_localizedStr() case 1: device_type = "Controller_street_light".da_localizedStr() case 3: device_type = "Inverter".da_localizedStr() case 4: device_type = "All-in-one_inverter".da_localizedStr() default: break } deviceDetailData[key.device_type] = device_type var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32)) num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白 log.debug("产品型号\(num1)") deviceDetailData[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!)") deviceDetailData[key.softWareCersion] = "V\(b!).\(c!).\(d!)" //硬件版本 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!)") // 序列号 deviceDetailData[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))") // 年月(低十六位) deviceDetailData[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 deviceDetailData[key.productName] = ChineseString log.debug("设备中文名称 \(ChineseString!)") }else{ deviceDetailData[key.productName] = num5 } 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!)") } //温度处理 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 log.debug("处理真实数据 - \(str0)") var num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8)) let num0A_1 = num0A?.subString(start: 0, length: 16) let num0A_2 = num0A?.subString(start: 16, length: 16) let num0A_II = num0A_2! + num0A_1! num0A = num0A_II log.debug("太阳能板状态\(num0A!)") /* 00001101 00011100 00000000 00000000 30 ---- 19 20 21 22 23 24 25 26 27 28 29 30 31 */ 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_overcharge_protection".da_localizedStr() } if B11 == "1" { batteryStatusStr = "Battery_low_temperature_protection,_stop_charging".da_localizedStr() } if B12 == "1" { batteryStatusStr = "Battery_reverse_polarity".da_localizedStr() } if B16 == "1" { batteryStatusStr = "Battery_over_discharge".da_localizedStr() } if B17 == "1" { batteryStatusStr = "Battery_overvoltage".da_localizedStr() } if B18 == "1" { batteryStatusStr = "Undervoltage_warning".da_localizedStr() } if B22 == "1" { batteryStatusStr = "External_ambient_temperature_is_too_high".da_localizedStr() } if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{ batteryStatusStr = "Normal".da_localizedStr() } deviceDetailData[key.batteryStatus] = batteryStatusStr realDataDict[key.batteryStatus] = batteryStatusStr //太阳能状态 if B23 == "1" { solarStatusStr = "PV_input_power_is_too_large".da_localizedStr() } if B24 == "1" { solarStatusStr = "Short_circuit_of_photovoltaic_input".da_localizedStr() } if B25 == "1" { solarStatusStr = "Overvoltage_at_the_photovoltaic_input".da_localizedStr() } if B26 == "1" { solarStatusStr = "Solar_panel_countercurrent".da_localizedStr() } if B27 == "1" { solarStatusStr = "Solar_panel_working_point_overpressure".da_localizedStr() } if B28 == "1" { solarStatusStr = "Solar_panel_reverse_connection".da_localizedStr() } deviceDetailData[key.solarStatus] = solarStatusStr realDataDict[key.solarStatus] = solarStatusStr let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4)) log.debug("00FD \(num0!)") let low_8_bit = UUUtils.numberHexString(str0.subString(start: 9, length: 2)) log.debug("low_8_bit - \(low_8_bit)") //1000000000000000 var changeStatus = "" if low_8_bit == 0 { changeStatus = "Charging_is_not_turned_on".da_localizedStr() }else if low_8_bit == 1 { changeStatus = "Start_charging_mode".da_localizedStr() }else if low_8_bit == 2 { changeStatus = "MPPT_charge_mode".da_localizedStr() }else if low_8_bit == 3 { changeStatus = "Equalizing_charge_mode".da_localizedStr() }else if low_8_bit == 4 { changeStatus = "Floating_charge_mode".da_localizedStr() }else if low_8_bit == 5 { changeStatus = "Boost_charge_mode".da_localizedStr() }else if low_8_bit == 6 { changeStatus = "Current_limiting_(super_power)".da_localizedStr() }else if low_8_bit == 7 { changeStatus = "Fully_charged".da_localizedStr() } // if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" { // dataDict[key.solarStatus] = batteryStatusStr // realDataDict[key.solarStatus] = batteryStatusStr // } // realDataDict[key.solarStatus] = solarStatusStr if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" { dataDict[key.solarStatus] = changeStatus realDataDict[key.solarStatus] = changeStatus } //0000 0000 0000 0000 从后往前数 let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")" var loadStatusStr = "" if B15 == "1" { loadStatusStr = "Open_load".da_localizedStr() } if B19 == "1" { loadStatusStr = "Load_short_circuit".da_localizedStr() } if B20 == "1" { loadStatusStr = "Excessive_load_power_or_overload".da_localizedStr() } if B15 == "0" && B19 == "0" && B20 == "0" { if loadStatus == "0" { loadStatusStr = "Load_is_off".da_localizedStr() }else if loadStatus == "1" { loadStatusStr = "Load_is_on".da_localizedStr() } } log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位 deviceDetailData[key.loadStatus] = loadStatusStr realDataDict[key.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) deviceDetailData[key.solarVoltage] = "\(solarV)" realDataDict[key.solarVoltage] = "\(solarV)" // 太阳能电流 0108 let num2 = UUUtils.numberHexString(str0.subString(start: 47 + 4, length: 4)) print("太阳能电流 \(num2!.floatValue * 0.01)") deviceDetailData[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!)") deviceDetailData[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)") deviceDetailData[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)") deviceDetailData[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!))") deviceDetailData[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)") deviceDetailData[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)") deviceDetailData[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! )") realDataDict[key.loadPower] = "\(num8!)" deviceDetailData[key.loadPower] = "\(num8!)" } //FF030115000B //ff031400000000000000000000000000 0000 0000 0000 0064 0b《》 //13 * 4 //处理历史数据 func hisData(_ reciveData:String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") if str0.count != 13 * 4 { return } 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) } func realdata_F007(_ reciveData : String) { hisData(reciveData) deviceDetailData[key.historydatas] = historyDataArr cumulativeDict[key.historydatas] = historyDataArr } func realdata_0115(_ reciveData :String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") // let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4)) log.debug("总运行天数 - \(num0!)") cumulativeDict[key.runTime] = ("\(num0!)") deviceDetailData[key.runTime] = ("\(num0!)") let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4)) log.debug("蓄电池总过放次数 - \(num1!)") cumulativeDict[key.overTimes] = "\(num1!)" deviceDetailData[key.overTimes] = "\(num1!)" let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 8 , length: 4)) log.debug("蓄电池总充满次数 - \(num2!)") cumulativeDict[key.fullTimes] = "\(num2!)" deviceDetailData[key.fullTimes] = "\(num2!)" let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 12 , length: 8)) log.debug("蓄电池总充电安时数 - \(num3!)") cumulativeDict[key.chargingAmpereHour] = "\(num3!)" deviceDetailData[key.chargingAmpereHour] = "\(num3!)" let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 , length: 8)) log.debug("蓄电池总放电安时数 - \(num4!)") cumulativeDict[key.dischargeAmpereHour] = "\(num4!)" deviceDetailData[key.dischargeAmpereHour] = "\(num4!)" let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 2 , length: 8)) // let num5 = UUUtils.numberHexString("ffffffff") log.debug("累计发电量 - \(num5!)") cumulativeDict[key.generatEnergyTotal] = "\(num5!)" let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 3, length: 8)) log.debug("累计用电量 - \(num6!)") cumulativeDict[key.usedEnergyTotal] = "\(num6!)" deviceDetailData[key.usedEnergyTotal] = "\(num6!)" NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataHistoryDataRecieve), object: nil, userInfo: cumulativeDict) } func realdata_DF0D(_ reciveData : String) { let str0 = reciveData 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() } deviceDetailData[key.BattEqualChgImmediate] = canhandle paramDataDict[key.BattEqualChgImmediate] = canhandle log.debug(" kNotifisionDeviceDatailDataBaseInfoRecieve \(deviceDetailData)") NotificationCenter.default.post(name: NSNotification.Name(kNotifisionDeviceDatailDataBaseInfoRecieve), object: nil, userInfo: deviceDetailData) } func realdata_0100(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //太阳能电压 0107 let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4)) print("太阳能电压 \(num1!.floatValue * 0.1)" ) let solarV = String(format: "%.1f", num1!.floatValue * 0.1) deviceDetailData[key.solarVoltage] = "\(solarV)" realDataDict[key.solarVoltage] = "\(solarV)" // 太阳能电流 0108 let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4)) print("太阳能电流 \(num2!.floatValue * 0.01)") deviceDetailData[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: 7 + 4 * 9, length: 4)) print("太阳能功率 \(num2_1!)") deviceDetailData[key.solarPower] = "\(num2_1!)" realDataDict[key.solarPower] = "\(num2_1!)" //蓄电池 电压 101 let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 1, length: 4)) print("蓄电池电压 \(num3!.floatValue * 0.1)") deviceDetailData[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1) realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1) //蓄电池电流 102 let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4)) print("蓄电池电流\(num4!.floatValue * 0.01)") deviceDetailData[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01) realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01) //蓄电池温度 0103 let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3 , length: 2)) print("温度 \(temp(with: num5!))") deviceDetailData[key.batteryTemp] = "\(temp(with: num5!))" realDataDict[key.batteryTemp] = "\(temp(with: num5!))" //负载电压 0104 let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4)) print("负载电压\(num6!.floatValue * 0.1)") deviceDetailData[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1) realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1) //负载电流 0105 let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4)) print("负载电流\(num7!.floatValue * 0.01)") deviceDetailData[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01) realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01) //负载功率 0106 let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4)) print("功率 \(num8! )") realDataDict[key.loadPower] = "\(num8!)" deviceDetailData[key.loadPower] = "\(num8!)" } func realdata_0120(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") var num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8)) let num0A_1 = num0A?.subString(start: 0, length: 16) let num0A_2 = num0A?.subString(start: 16, length: 16) let num0A_II = num0A_2! + num0A_1! num0A = num0A_II 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_overcharge_protection".da_localizedStr() } if B11 == "1" { batteryStatusStr = "Battery_low_temperature_protection,_stop_charging".da_localizedStr() } if B12 == "1" { batteryStatusStr = "Battery_reverse_polarity".da_localizedStr() } if B16 == "1" { batteryStatusStr = "Battery_over_discharge".da_localizedStr() } if B17 == "1" { batteryStatusStr = "Battery_overvoltage".da_localizedStr() } if B18 == "1" { batteryStatusStr = "Undervoltage_warning".da_localizedStr() } if B22 == "1" { batteryStatusStr = "External_ambient_temperature_is_too_high".da_localizedStr() } if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{ batteryStatusStr = "Normal".da_localizedStr() } deviceDetailData[key.batteryStatus] = batteryStatusStr realDataDict[key.batteryStatus] = batteryStatusStr //太阳能状态 if B23 == "1" { solarStatusStr = "PV_input_power_is_too_large".da_localizedStr() } if B24 == "1" { solarStatusStr = "Short_circuit_of_photovoltaic_input".da_localizedStr() } if B25 == "1" { solarStatusStr = "Overvoltage_at_the_photovoltaic_input".da_localizedStr() } if B26 == "1" { solarStatusStr = "Solar_panel_countercurrent".da_localizedStr() } if B27 == "1" { solarStatusStr = "Solar_panel_working_point_overpressure".da_localizedStr() } if B28 == "1" { solarStatusStr = "Solar_panel_reverse_connection".da_localizedStr() } deviceDetailData[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 // } //0120 let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4)) log.debug("00FD \(num0!)") let low_8_bit = UUUtils.numberHexString(str0.subString(start: 9, length: 2)) log.debug("low_8_bit - \(low_8_bit)") //1000000000000000 var changeStatus = "" if low_8_bit == 0 { changeStatus = "Charging_is_not_turned_on".da_localizedStr() }else if low_8_bit == 1 { changeStatus = "Start_charging_mode".da_localizedStr() }else if low_8_bit == 2 { changeStatus = "MPPT_charge_mode".da_localizedStr() }else if low_8_bit == 3 { changeStatus = "Equalizing_charge_mode".da_localizedStr() }else if low_8_bit == 4 { changeStatus = "Floating_charge_mode".da_localizedStr() }else if low_8_bit == 5 { changeStatus = "Boost_charge_mode".da_localizedStr() }else if low_8_bit == 6 { changeStatus = "Current_limiting_(super_power)".da_localizedStr() }else if low_8_bit == 7 { changeStatus = "Fully_charged".da_localizedStr() } // realDataDict[key.solarStatus] = solarStatusStr if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" { dataDict[key.solarStatus] = changeStatus realDataDict[key.solarStatus] = changeStatus } //0000 0000 0000 0000 从后往前数 let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")" var loadStatusStr = "" if B15 == "1" { loadStatusStr = "Open_load".da_localizedStr() } if B19 == "1" { loadStatusStr = "Load_short_circuit".da_localizedStr() } if B20 == "1" { loadStatusStr = "Excessive_load_power_or_overload".da_localizedStr() } if B15 == "0" && B19 == "0" && B20 == "0" { if loadStatus == "0" { loadStatusStr = "Load_is_off".da_localizedStr() }else if loadStatus == "1" { loadStatusStr = "Load_is_on".da_localizedStr() } } log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位 deviceDetailData[key.loadStatus] = loadStatusStr realDataDict[key.loadStatus] = loadStatusStr } } ///定时器事件 extension SBTDeviceDetaiVCtr{ //定时器开启 @objc func uartCommandTimerStart() { if isDemo == false { self.uartCommandTimer!.fire() } } //暂停计时器(只是暂停,并没有销毁timer) @objc func uartCommandTimerPause() { if isDemo == false { self.uartCommandTimer?.fireDate = Date.distantFuture } } @objc func uartCommandTimerPauseCheckEnd(_ complete: @escaping ()->Void) { if isDemo == false { self.checkUartCommandTimerEnd = complete self.uartCommandTimer?.fireDate = Date.distantFuture } } func switchCmdPause() { self.uartCommandTimerPauseCheckEnd { } } //继续计时 @objc func uartCommandTimerContinue() { if isDemo == false { self.uartCommandTimer?.fireDate = Date.distantPast } } //定时器回调 @objc func uartCommandTimerCallback() { sendRealStatusCMD() } func sendRealStatusCMD() {//0.850956+0800 0.513711+0800 self.isUartCommandTimerEnd = false if self.isOld == true { let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF030100000A","FF0301200003"] BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr, type: "RealStatus", completionHandler: { (result) in log.debug("返回数据 --- \(ReceiveData)") self.realdata_000A(result!["FF03000A0001"] as! String) self.realdata_E003(result!["FF03E0030001"] as! String) self.realdata_E008(result!["FF03E0080001"] as!String) self.realdata_0100(result!["FF030100000A"] as! String) self.realdata_0120(result!["FF0301200003"] as! String) NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict) self.isUartCommandTimerEnd = true if self.checkUartCommandTimerEnd != nil{ self.checkUartCommandTimerEnd!() } }) }else{ let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF0300FD000D"] BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr,type: "RealStatus", completionHandler: { (result) in log.debug("返回数据 --- \(result)") self.realdata_000A(result!["FF03000A0001"] as! String) self.realdata_00FD(result!["FF0300FD000D"] as! String) self.realdata_E003(result!["FF03E0030001"] as! String) self.realdata_E008(result!["FF03E0080001"] as!String) NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil, userInfo: self.realDataDict) self.isUartCommandTimerEnd = true if self.checkUartCommandTimerEnd != nil{ self.checkUartCommandTimerEnd!() } }) } } //定时器关闭 @objc func uartCommandTimerStop() { uartCommandTimer?.invalidate() uartCommandTimer = nil } /*********************************/ @objc func historyCommandTimerStart() { if isDemo == false { self.historyCommandTimer?.fire() self.isHistoryTimerFire = true } } //暂停计时器(只是暂停,并没有销毁timer) @objc func historyCommandTimerPause() { if isDemo == false { self.historyCommandTimer?.fireDate = Date.distantFuture } } //暂停计时器(只是暂停,并没有销毁timer) @objc func historyCommandTimerPauseCheckEnd(_ complete : @escaping ()->Void) { if isDemo == false { self.checkHistoryCommandTimerEnd = complete self.historyCommandTimer?.fireDate = Date.distantFuture } } //继续计时 @objc func historyCommandTimerContinue() { if isDemo == false { self.historyCommandTimer?.fireDate = Date.distantPast } } //定时器回调 @objc func historyCommandTimerCallback() { sendHistoryCmd() } @objc func sendHistoryCmd() { let arr = ["FF03F000000A","FF03F001000A","FF03F002000A","FF03F003000A","FF03F004000A","FF03F005000A","FF03F006000A","FF03F007000A","FF030115000B"] isHistoryCommandTimerEnd = false BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr, type: "History", completionHandler: { (result) in self.isHistoryCommandTimerEnd = true self.historyDataArr.removeAll() self.realdata_F000(result!["FF03F000000A"] as! String) self.realdata_F001(result!["FF03F001000A"] as! String) self.realdata_F002(result!["FF03F002000A"] as! String) self.realdata_F003(result!["FF03F003000A"] as! String) self.realdata_F004(result!["FF03F004000A"] as! String) self.realdata_F005(result!["FF03F005000A"] as! String) self.realdata_F006(result!["FF03F006000A"] as! String) self.realdata_F007(result!["FF03F007000A"] as! String) self.realdata_0115(result!["FF030115000B"] as! String) if self.checkHistoryCommandTimerEnd != nil{ self.checkHistoryCommandTimerEnd!() } }) } //定时器关闭 @objc func historyCommandTimerStop() { historyCommandTimer?.invalidate() historyCommandTimer = nil } } //2019-11-04 16:59:17 //16:59:19