123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437 |
- //
- // 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..<bytes{
- let data = code?.subString(start: i * 2048, length: 2048)
- log.debug("第\(i)包 dataCount \(data!.count)")
- let complementCode = 255 - (i + 1)
- let cmd = "02" + String(format: "%02x", i + 1) + String(format: "%02x", complementCode)
- log.debug("下发指令\(cmd)")
-
- let crcStr = UUUtils.crc16Test(data!)
- let sendCMD = cmd + crcStr!
- self.dataSource?.append(sendCMD)
- log.debug(sendCMD)
- log.debug("每包字节数 \(sendCMD.count / 2)")
- }
-
- //最后一包
- var lastPack = code?.subString(start: 2048 * bytes)
- log.debug("第83包 dataCount \(lastPack!.count)")
- let restCont = 2048 - lastPack!.count
- for _ in 0..<(restCont/2){
- lastPack?.append("1a")
- }
- log.debug("data=== \(lastPack!.count)")
- let complementCode = 255 - (bytes + 1)
- let cmd = "02" + String(format: "%02x", bytes + 1) + String(format: "%02x", complementCode)
- log.debug("下发指令\(cmd)")
-
- let crcStr = UUUtils.crc16Test(lastPack!)
- let sendCMD = cmd + crcStr!
-
- log.debug("每包字节数 \(sendCMD.count / 2)")
- log.debug(sendCMD)
- self.dataSource?.append(sendCMD)
- self.getSmallPack()
- }) { (error) in
-
- }
- }
- //获取小包
- func getSmallPack() {
- }
- }
|