SBTBaseInfoVCtr.swift 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. //
  2. // SBTBaseInfoVCtr.swift
  3. // SolarBT
  4. //
  5. // Created by weclouds on 2019/1/28.
  6. // Copyright © 2019 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. import SwiftyJSON
  10. import Alamofire
  11. import PPNetworkHelper
  12. import CryptoSwift
  13. //设备信息
  14. struct DeviceInfo {
  15. var product_type:String? //产品型号
  16. var softWareCersion :String?//软件版本
  17. var hardWareCersion :String? // 硬件版本
  18. var productSN :String?// 产品序列号
  19. var productName :String? //设备名称
  20. }
  21. class SBTBaseInfoVCtr: UIViewController {
  22. let NEWFIREWARE = "NEWFIREWARE"
  23. var mFirmwareInfo : FirmwareinInfo?
  24. var status :String?
  25. var filePath :String?
  26. var newFireware :String?
  27. var isNew : Bool?
  28. var dataSource :[String]? = [String]()
  29. var downloadAlert : SBTDownloadVCtr?
  30. var isOld :Bool?
  31. var belKey:String?
  32. var deviceDetailData: [String: Any] = [String: Any]()
  33. var deviceInfo:DeviceInfo?
  34. var isDemo:Bool? = false
  35. @IBOutlet weak var viewHeight: NSLayoutConstraint!
  36. @IBOutlet weak var checkBtn: UIView!
  37. @IBOutlet weak var connectPwdBtn: UIButton!
  38. @IBOutlet weak var updatePwdBtn: UIButton!
  39. @IBOutlet weak var passwordLab: UILabel!
  40. @IBOutlet weak var deviceNameLabel: UILabel!
  41. @IBOutlet weak var device_name: UILabel!
  42. @IBOutlet weak var sn_label: UILabel!
  43. @IBOutlet weak var sn: UILabel!
  44. @IBOutlet weak var versionLabel: UILabel!
  45. @IBOutlet weak var version: UILabel!
  46. @IBOutlet weak var restoreBtn: UIButton!
  47. @IBOutlet weak var updateDeviceBtn: CLButton!
  48. @IBOutlet weak var updatePsdBtn: CLButton!
  49. @IBOutlet weak var checkUpdateLabel: UILabel!
  50. @IBOutlet weak var firmwareLabel: UILabel!
  51. @IBOutlet weak var DeviceNameBox: UIView!
  52. @IBOutlet weak var SNBox: UIView!
  53. @IBOutlet weak var VersionBox: UIView!
  54. @IBAction func updatePasswordAction(_ sender: UIButton) {
  55. let vc = SBTUpdatePasswordVCtr()
  56. vc.show()
  57. }
  58. @IBAction func showPasswordAction(_ sender: UIButton) {
  59. sender.isSelected = !sender.isSelected
  60. let def = UserDefaults.standard
  61. if sender.isSelected == true {
  62. passwordLab.text = "000000"
  63. def.set(false, forKey: "ISSHOWPASSWORD")
  64. }else{
  65. //●●●●●●"******"
  66. passwordLab.text = "******"
  67. def.set(true, forKey: "ISSHOWPASSWORD")
  68. }
  69. }
  70. @IBAction func editDeviceNameAction(_ sender: UIButton) {
  71. updateName()
  72. }
  73. func updateName() {
  74. let vc = SBTUpateDeviceNameVCtr()
  75. vc.deviceName = self.device_name.text
  76. vc.isDemo = self.isDemo
  77. vc.show()
  78. let peripheralPlist = "Peripheral.plist"
  79. var baseInfoPlist :CLDeviceDataPlist? = CLDeviceDataPlist()
  80. vc.updateCallback = { (devicename) in
  81. // self.readDeviceName()
  82. baseInfoPlist?.updatePlist(At: peripheralPlist, key: self.belKey!, deviceName: devicename)
  83. }
  84. }
  85. @IBAction func restoreAction(_ sender: UIButton) {
  86. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrRealTimerStop), object: nil)
  87. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStop), object: nil)
  88. let alert = UIAlertController(title: "Are_you_sure_you_want_a_factory_reset?".da_localizedStr(), message: nil
  89. , preferredStyle: .alert)
  90. let confirmAction = UIAlertAction(title: "Yes".da_localizedStr(), style:.default) { (action) in
  91. if self.isDemo == true{
  92. g_showHUD("Current_demo_data".da_localizedStr())
  93. }else{
  94. var arr = [String]()
  95. if self.isOld == true {
  96. arr = ["FF7800000001"]
  97. }else{
  98. arr = ["FF06DF020001"]
  99. }
  100. BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in
  101. g_showHUD("reset_success".da_localizedStr())
  102. })
  103. }
  104. }
  105. let cancelAction = UIAlertAction(title: "No".da_localizedStr(), style: .cancel, handler: nil)
  106. alert.addAction(cancelAction)
  107. alert.addAction(confirmAction)
  108. self.present(alert, animated: true, completion: nil)
  109. }
  110. //注册通知、 获取数据
  111. func notificationRegister() {
  112. NotificationCenter.default.addObserver(self, selector: #selector(updateChuange(_:)), name: NSNotification.Name(kNotifisionDeviceDatailDataBaseInfoRecieve), object: nil)
  113. NotificationCenter.default.addObserver(self, selector: #selector(notifionUpdateName), name: NSNotification.Name(KNotificationUpadateNameChange), object: nil)
  114. }
  115. //注销通知
  116. func notificationUnRegister() {
  117. NotificationCenter.default.removeObserver(self)
  118. }
  119. @objc func notifionUpdateName(_ notif : Notification){
  120. let userinfo = notif.userInfo
  121. let productName = userinfo!["productName"] as! String
  122. device_name.text = productName
  123. }
  124. @objc func updateChuange(_ notif:Notification) {
  125. log.debug(notif.userInfo)
  126. let dataDict = notif.userInfo
  127. log.debug("更新 设备基础数据。")
  128. initData(dataDict as! [String : Any])
  129. // loadUIRefresh(dataDict as! [String : Any])
  130. // loadCumulativeUIRefresh(notif.userInfo as! [String : String])
  131. let key = DeviceDictKey()
  132. let productName = dataDict![key.productName] as! String
  133. device_name.text = productName
  134. }
  135. }
  136. extension SBTBaseInfoVCtr {
  137. override func viewWillAppear(_ animated: Bool) {
  138. super.viewWillAppear(animated)
  139. notificationRegister()
  140. BabyBluetoothSwift.shareInstance()?.resetBlock = {(dataDict) in
  141. g_showHUD("reset_success".da_localizedStr())
  142. }
  143. }
  144. override func viewDidDisappear(_ animated: Bool) {
  145. super.viewDidDisappear(animated)
  146. notificationUnRegister()
  147. }
  148. override func viewDidLoad() {
  149. super.viewDidLoad()
  150. let user = UserDefaults.standard
  151. let isShowPwd = user.value(forKey: "ISSHOWPASSWORD") as? Bool
  152. if isShowPwd == false {
  153. self.updatePsdBtn.isSelected = true
  154. passwordLab.text = "000000"
  155. }else{
  156. self.updatePsdBtn.isSelected = false
  157. passwordLab.text = "******"
  158. }
  159. createUI()
  160. if self.isDemo == true {
  161. initData(SBTData().DemoData)
  162. }else{
  163. let plist = CLDeviceDataPlist()
  164. let dataDict = plist.findData(deviceDetailPlist, key: self.belKey!)
  165. initData(dataDict as! [String : Any])
  166. log.debug("设备名称===\(dataDict!["productName"] ?? "不存在设备名字")")
  167. }
  168. updateFirmware()
  169. }
  170. override func updateViewConstraints() {
  171. super.updateViewConstraints()
  172. self.viewHeight.constant = KSCREENHEIGHT - 100
  173. }
  174. }
  175. extension SBTBaseInfoVCtr{
  176. func initData(_ dataDict:[String:Any]) {
  177. var deviceName:String? // 设备名称
  178. let key = DeviceDictKey()
  179. let product_type = dataDict[key.product_type] as! String
  180. let softWareCersion = dataDict[key.softWareCersion] as! String
  181. let hardWareCersion = dataDict[key.hardWareCersion] as! String
  182. let productSN = dataDict[key.productSN] as! String
  183. var productName = ""
  184. if self.isOld == true {
  185. let type = dataDict["device_type"] as! String
  186. let product_type = dataDict["product_type"] as! String
  187. var typeStr = ""
  188. if type == "控制器" || type == "Controller" {
  189. typeStr = "Controller_household".da_localizedStr()
  190. }else if type == "控制器,路灯" || type == "Controller street light"{
  191. typeStr = "Controller_street_light".da_localizedStr()
  192. }else if type == "逆变器" || type == "Inverter" {
  193. typeStr = "Inverter".da_localizedStr()
  194. }else if type == "逆变一体机" || type == "All-in-one inverter"{
  195. typeStr = "All-in-one_inverter".da_localizedStr()
  196. }else if type == "市电路灯" || type == ""{
  197. typeStr = "Mains_powered_street_light".da_localizedStr()
  198. }
  199. productName = typeStr + "(" + product_type + ")"
  200. self.device_name.textColor = UIColor(hexString: "ABABAC")
  201. }else{ // 00000302 00010005 00000500 00020306
  202. productName = dataDict[key.productName] as! String
  203. self.device_name.textColor = UIColor(hexString: "222222")
  204. }
  205. deviceInfo = DeviceInfo(product_type: product_type, softWareCersion: softWareCersion, hardWareCersion: hardWareCersion, productSN: productSN, productName: productName)
  206. device_name.text = productName
  207. sn.text = productSN
  208. version.text = hardWareCersion
  209. firmwareLabel.text = softWareCersion
  210. }
  211. func createUI() {
  212. connectPwdBtn.setTitle("Connection_password".da_localizedStr(), for: .normal)
  213. connectPwdBtn.titleLabel?.numberOfLines = 0
  214. updatePwdBtn.setTitle("Change_password".da_localizedStr(), for: .normal)
  215. deviceNameLabel.text = "Device_name".da_localizedStr()
  216. sn_label.text = "Serial_number".da_localizedStr()
  217. versionLabel.text = "Hardware_version".da_localizedStr()
  218. restoreBtn.setTitle("Factory_reset".da_localizedStr(), for: .normal)
  219. checkUpdateLabel.text = "Check_for_updates".da_localizedStr()
  220. firmwareLabel.text = "Firmware_version".da_localizedStr() + "V7.3.0"
  221. checkBtn.layer.masksToBounds = true
  222. checkBtn.layer.cornerRadius = 25
  223. self.checkBtn.isUserInteractionEnabled = true
  224. let tap = UITapGestureRecognizer(target: self, action: #selector(checkFirmware))
  225. self.checkBtn.addGestureRecognizer(tap)
  226. if isOld == true {
  227. self.DeviceNameBox.backgroundColor = UIColor(hexString: "F1F1F1")
  228. self.DeviceNameBox.isUserInteractionEnabled = false
  229. }else{
  230. self.DeviceNameBox.backgroundColor = UIColor(hexString: "FFFFFF")
  231. self.DeviceNameBox.isUserInteractionEnabled = true
  232. let tap2 = UITapGestureRecognizer(target: self, action: #selector(tapDeviceName))
  233. DeviceNameBox.addGestureRecognizer(tap2)
  234. }
  235. }
  236. @objc func tapDeviceName() {
  237. updateName()
  238. }
  239. @objc func checkFirmware() {
  240. log.debug("固件更新")
  241. if self.isDemo == true {
  242. g_showHUD("Current_demo_data".da_localizedStr())
  243. }
  244. if self.isOld == true {
  245. g_showHUD("not_support_upgrad".da_localizedStr())
  246. }else{
  247. if self.isNew == true {
  248. let alert = SBTCheckUpdateVCtr()
  249. alert.message = "当前有新版本\(self.newFireware!)"
  250. alert.updateCallBack = {
  251. log.debug("开始下载更新")
  252. self.downloadAlert = SBTDownloadVCtr()
  253. self.downloadAlert?.show()
  254. self.encodeFile()
  255. }
  256. alert.show()
  257. }else{
  258. g_showHUD("当前已是最新版本")
  259. }
  260. }
  261. }
  262. }
  263. extension SBTBaseInfoVCtr {
  264. func updateFirmware() {
  265. checkFirmware_httprequest()
  266. }
  267. func checkFirmware_httprequest() {
  268. let type = "0"
  269. let firmware = "V0.1"
  270. g_checkFirmwarenHttpRequest(type, firmware: firmware, success: httpSuccess, fail: httpFail)
  271. }
  272. func httpSuccess(_ json : JSON) {
  273. log.debug(json)
  274. mFirmwareInfo = FirmwareinInfo.fromJSON(json)
  275. if let filePath = mFirmwareInfo?.result?.filePath,let statues = mFirmwareInfo?.result?.data_status,let newFireware = mFirmwareInfo?.result?.newFirmware {
  276. self.filePath = filePath
  277. self.status = statues
  278. self.newFireware = newFireware
  279. // firmwareLabel.text = "Firmware_version".da_localizedStr() + newFireware
  280. //查询沙盒里边是否有保存
  281. let def = UserDefaults.standard
  282. let user_newfireware = def.value(forKey: NEWFIREWARE) as? String
  283. if user_newfireware == newFireware{
  284. self.isNew = false
  285. }else{
  286. //保存版本好到沙盒 要在升级成功之后才保存
  287. // let defaults = UserDefaults.standard
  288. // defaults.set(newFireware, forKey: NEWFIREWARE)
  289. // defaults.synchronize()
  290. self.isNew = true
  291. }
  292. }
  293. //encodeFile()
  294. }
  295. func httpFail() {
  296. g_httpFail()
  297. }
  298. func encodeFile() {
  299. PPNetworkHelper.setResponseSerializer(.HTTP)
  300. PPNetworkHelper.post(filePath, parameters: nil, success: { (respose) in
  301. // log.debug("返回数据 \(respose)")
  302. let resposeStr = NSString(data: respose as! Data, encoding: String.Encoding.utf8.rawValue)
  303. // log.debug("返回字符串 -- \(resposeStr)")
  304. self.dataSource?.removeAll()
  305. //先解密一次 解密base64 字符串
  306. //截取字符串 去掉最前面三个字符
  307. //在解密一次 base64 解密
  308. let encode = resposeStr! as String
  309. let encode1 = encode.fromBase64()
  310. let encode2 = encode1?.subString(start: 3)
  311. // print(encode2)
  312. let code = encode2?.fromBase64()
  313. // log.debug(code)
  314. log.debug("字节数 \(code!.count)")
  315. let bytes = code!.count / 2048
  316. log.debug("大小\(bytes)")
  317. for i in 0..<bytes{
  318. let data = code?.subString(start: i * 2048, length: 2048)
  319. log.debug("第\(i)包 dataCount \(data!.count)")
  320. let complementCode = 255 - (i + 1)
  321. let cmd = "02" + String(format: "%02x", i + 1) + String(format: "%02x", complementCode)
  322. log.debug("下发指令\(cmd)")
  323. let crcStr = UUUtils.crc16Test(data!)
  324. let sendCMD = cmd + crcStr!
  325. self.dataSource?.append(sendCMD)
  326. log.debug(sendCMD)
  327. log.debug("每包字节数 \(sendCMD.count / 2)")
  328. }
  329. //最后一包
  330. var lastPack = code?.subString(start: 2048 * bytes)
  331. log.debug("第83包 dataCount \(lastPack!.count)")
  332. let restCont = 2048 - lastPack!.count
  333. for _ in 0..<(restCont/2){
  334. lastPack?.append("1a")
  335. }
  336. log.debug("data=== \(lastPack!.count)")
  337. let complementCode = 255 - (bytes + 1)
  338. let cmd = "02" + String(format: "%02x", bytes + 1) + String(format: "%02x", complementCode)
  339. log.debug("下发指令\(cmd)")
  340. let crcStr = UUUtils.crc16Test(lastPack!)
  341. let sendCMD = cmd + crcStr!
  342. log.debug("每包字节数 \(sendCMD.count / 2)")
  343. log.debug(sendCMD)
  344. self.dataSource?.append(sendCMD)
  345. self.getSmallPack()
  346. }) { (error) in
  347. }
  348. }
  349. //获取小包
  350. func getSmallPack() {
  351. }
  352. }