// // SBTBaseInfoVCtr.swift // SolarBT // // Created by weclouds on 2019/1/28. // Copyright © 2019 weclouds. All rights reserved. // import UIKit import SwiftyJSON import Alamofire import PPNetworkHelper import CryptoSwift //设备信息 struct DeviceInfo { var product_type:String? //产品型号 var softWareCersion :String?//软件版本 var hardWareCersion :String? // 硬件版本 var productSN :String?// 产品序列号 var productName :String? //设备名称 } class SBTBaseInfoVCtr: UIViewController { let NEWFIREWARE = "NEWFIREWARE" var mFirmwareInfo : FirmwareinInfo? var status :String? var filePath :String? var newFireware :String? var isNew : Bool? var dataSource :[String]? = [String]() var downloadAlert : SBTDownloadVCtr? var isOld :Bool? var belKey:String? var deviceDetailData: [String: Any] = [String: Any]() var deviceInfo:DeviceInfo? var isDemo:Bool? = false @IBOutlet weak var viewHeight: NSLayoutConstraint! @IBOutlet weak var checkBtn: UIView! @IBOutlet weak var connectPwdBtn: UIButton! @IBOutlet weak var updatePwdBtn: UIButton! @IBOutlet weak var passwordLab: UILabel! @IBOutlet weak var deviceNameLabel: UILabel! @IBOutlet weak var device_name: UILabel! @IBOutlet weak var sn_label: UILabel! @IBOutlet weak var sn: UILabel! @IBOutlet weak var versionLabel: UILabel! @IBOutlet weak var version: UILabel! @IBOutlet weak var restoreBtn: UIButton! @IBOutlet weak var updateDeviceBtn: CLButton! @IBOutlet weak var updatePsdBtn: CLButton! @IBOutlet weak var checkUpdateLabel: UILabel! @IBOutlet weak var firmwareLabel: UILabel! @IBOutlet weak var DeviceNameBox: UIView! @IBOutlet weak var SNBox: UIView! @IBOutlet weak var VersionBox: UIView! @IBAction func updatePasswordAction(_ sender: UIButton) { let vc = SBTUpdatePasswordVCtr() vc.show() } @IBAction func showPasswordAction(_ sender: UIButton) { sender.isSelected = !sender.isSelected let def = UserDefaults.standard if sender.isSelected == true { passwordLab.text = "000000" def.set(false, forKey: "ISSHOWPASSWORD") }else{ //●●●●●●"******" passwordLab.text = "******" def.set(true, forKey: "ISSHOWPASSWORD") } } @IBAction func editDeviceNameAction(_ sender: UIButton) { updateName() } func updateName() { let vc = SBTUpateDeviceNameVCtr() vc.deviceName = self.device_name.text vc.isDemo = self.isDemo vc.show() let peripheralPlist = "Peripheral.plist" var baseInfoPlist :CLDeviceDataPlist? = CLDeviceDataPlist() vc.updateCallback = { (devicename) in // self.readDeviceName() baseInfoPlist?.updatePlist(At: peripheralPlist, key: self.belKey!, deviceName: devicename) } } @IBAction func restoreAction(_ sender: UIButton) { NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrRealTimerStop), object: nil) NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStop), object: nil) let alert = UIAlertController(title: "Are_you_sure_you_want_a_factory_reset?".da_localizedStr(), message: nil , preferredStyle: .alert) let confirmAction = UIAlertAction(title: "Yes".da_localizedStr(), style:.default) { (action) in if self.isDemo == true{ g_showHUD("Current_demo_data".da_localizedStr()) }else{ var arr = [String]() if self.isOld == true { arr = ["FF7800000001"] }else{ arr = ["FF06DF020001"] } BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in g_showHUD("reset_success".da_localizedStr()) }) } } let cancelAction = UIAlertAction(title: "No".da_localizedStr(), style: .cancel, handler: nil) alert.addAction(cancelAction) alert.addAction(confirmAction) self.present(alert, animated: true, completion: nil) } //注册通知、 获取数据 func notificationRegister() { NotificationCenter.default.addObserver(self, selector: #selector(updateChuange(_:)), name: NSNotification.Name(kNotifisionDeviceDatailDataBaseInfoRecieve), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(notifionUpdateName), name: NSNotification.Name(KNotificationUpadateNameChange), object: nil) } //注销通知 func notificationUnRegister() { NotificationCenter.default.removeObserver(self) } @objc func notifionUpdateName(_ notif : Notification){ let userinfo = notif.userInfo let productName = userinfo!["productName"] as! String device_name.text = productName } @objc func updateChuange(_ notif:Notification) { log.debug(notif.userInfo) let dataDict = notif.userInfo log.debug("更新 设备基础数据。") initData(dataDict as! [String : Any]) // loadUIRefresh(dataDict as! [String : Any]) // loadCumulativeUIRefresh(notif.userInfo as! [String : String]) let key = DeviceDictKey() let productName = dataDict![key.productName] as! String device_name.text = productName } } extension SBTBaseInfoVCtr { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) notificationRegister() BabyBluetoothSwift.shareInstance()?.resetBlock = {(dataDict) in g_showHUD("reset_success".da_localizedStr()) } } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) notificationUnRegister() } override func viewDidLoad() { super.viewDidLoad() let user = UserDefaults.standard let isShowPwd = user.value(forKey: "ISSHOWPASSWORD") as? Bool if isShowPwd == false { self.updatePsdBtn.isSelected = true passwordLab.text = "000000" }else{ self.updatePsdBtn.isSelected = false passwordLab.text = "******" } createUI() if self.isDemo == true { initData(SBTData().DemoData) }else{ let plist = CLDeviceDataPlist() let dataDict = plist.findData(deviceDetailPlist, key: self.belKey!) initData(dataDict as! [String : Any]) log.debug("设备名称===\(dataDict!["productName"] ?? "不存在设备名字")") } updateFirmware() } override func updateViewConstraints() { super.updateViewConstraints() self.viewHeight.constant = KSCREENHEIGHT - 100 } } extension SBTBaseInfoVCtr{ func initData(_ dataDict:[String:Any]) { var deviceName:String? // 设备名称 let key = DeviceDictKey() let product_type = dataDict[key.product_type] as! String let softWareCersion = dataDict[key.softWareCersion] as! String let hardWareCersion = dataDict[key.hardWareCersion] as! String let productSN = dataDict[key.productSN] as! String var productName = "" if self.isOld == true { let type = dataDict["device_type"] as! String let product_type = dataDict["product_type"] as! String var typeStr = "" if type == "控制器" || type == "Controller" { typeStr = "Controller_household".da_localizedStr() }else if type == "控制器,路灯" || type == "Controller street light"{ typeStr = "Controller_street_light".da_localizedStr() }else if type == "逆变器" || type == "Inverter" { typeStr = "Inverter".da_localizedStr() }else if type == "逆变一体机" || type == "All-in-one inverter"{ typeStr = "All-in-one_inverter".da_localizedStr() }else if type == "市电路灯" || type == ""{ typeStr = "Mains_powered_street_light".da_localizedStr() } productName = typeStr + "(" + product_type + ")" self.device_name.textColor = UIColor(hexString: "ABABAC") }else{ // 00000302 00010005 00000500 00020306 productName = dataDict[key.productName] as! String self.device_name.textColor = UIColor(hexString: "222222") } deviceInfo = DeviceInfo(product_type: product_type, softWareCersion: softWareCersion, hardWareCersion: hardWareCersion, productSN: productSN, productName: productName) device_name.text = productName sn.text = productSN version.text = hardWareCersion firmwareLabel.text = softWareCersion } func createUI() { connectPwdBtn.setTitle("Connection_password".da_localizedStr(), for: .normal) connectPwdBtn.titleLabel?.numberOfLines = 0 updatePwdBtn.setTitle("Change_password".da_localizedStr(), for: .normal) deviceNameLabel.text = "Device_name".da_localizedStr() sn_label.text = "Serial_number".da_localizedStr() versionLabel.text = "Hardware_version".da_localizedStr() restoreBtn.setTitle("Factory_reset".da_localizedStr(), for: .normal) checkUpdateLabel.text = "Check_for_updates".da_localizedStr() firmwareLabel.text = "Firmware_version".da_localizedStr() + "V7.3.0" checkBtn.layer.masksToBounds = true checkBtn.layer.cornerRadius = 25 self.checkBtn.isUserInteractionEnabled = true let tap = UITapGestureRecognizer(target: self, action: #selector(checkFirmware)) self.checkBtn.addGestureRecognizer(tap) if isOld == true { self.DeviceNameBox.backgroundColor = UIColor(hexString: "F1F1F1") self.DeviceNameBox.isUserInteractionEnabled = false }else{ self.DeviceNameBox.backgroundColor = UIColor(hexString: "FFFFFF") self.DeviceNameBox.isUserInteractionEnabled = true let tap2 = UITapGestureRecognizer(target: self, action: #selector(tapDeviceName)) DeviceNameBox.addGestureRecognizer(tap2) } } @objc func tapDeviceName() { updateName() } @objc func checkFirmware() { log.debug("固件更新") if self.isDemo == true { g_showHUD("Current_demo_data".da_localizedStr()) } if self.isOld == true { g_showHUD("not_support_upgrad".da_localizedStr()) }else{ if self.isNew == true { let alert = SBTCheckUpdateVCtr() alert.message = "当前有新版本\(self.newFireware!)" alert.updateCallBack = { log.debug("开始下载更新") self.downloadAlert = SBTDownloadVCtr() self.downloadAlert?.show() self.encodeFile() } alert.show() }else{ g_showHUD("当前已是最新版本") } } } } extension SBTBaseInfoVCtr { func updateFirmware() { checkFirmware_httprequest() } func checkFirmware_httprequest() { let type = "0" let firmware = "V0.1" g_checkFirmwarenHttpRequest(type, firmware: firmware, success: httpSuccess, fail: httpFail) } func httpSuccess(_ json : JSON) { log.debug(json) mFirmwareInfo = FirmwareinInfo.fromJSON(json) if let filePath = mFirmwareInfo?.result?.filePath,let statues = mFirmwareInfo?.result?.data_status,let newFireware = mFirmwareInfo?.result?.newFirmware { self.filePath = filePath self.status = statues self.newFireware = newFireware // firmwareLabel.text = "Firmware_version".da_localizedStr() + newFireware //查询沙盒里边是否有保存 let def = UserDefaults.standard let user_newfireware = def.value(forKey: NEWFIREWARE) as? String if user_newfireware == newFireware{ self.isNew = false }else{ //保存版本好到沙盒 要在升级成功之后才保存 // let defaults = UserDefaults.standard // defaults.set(newFireware, forKey: NEWFIREWARE) // defaults.synchronize() self.isNew = true } } //encodeFile() } func httpFail() { g_httpFail() } func encodeFile() { PPNetworkHelper.setResponseSerializer(.HTTP) PPNetworkHelper.post(filePath, parameters: nil, success: { (respose) in // log.debug("返回数据 \(respose)") let resposeStr = NSString(data: respose as! Data, encoding: String.Encoding.utf8.rawValue) // log.debug("返回字符串 -- \(resposeStr)") self.dataSource?.removeAll() //先解密一次 解密base64 字符串 //截取字符串 去掉最前面三个字符 //在解密一次 base64 解密 let encode = resposeStr! as String let encode1 = encode.fromBase64() let encode2 = encode1?.subString(start: 3) // print(encode2) let code = encode2?.fromBase64() // log.debug(code) log.debug("字节数 \(code!.count)") let bytes = code!.count / 2048 log.debug("大小\(bytes)") for i in 0..