SocketScan在Swift中获得电池电量

无论我试图尝试什么,我目前无法从iOS / SocketScan API获取电池级别。 我使用的是版本10.3.36,这是我的代码到目前为止:

func onDeviceArrival(result: SKTRESULT, device deviceInfo: DeviceInfo!) { print("onDeviceArrival:\(deviceInfo.getName())") scanApiHelper.postGetBattery(deviceInfo, target: self, response: #selector(onGetBatteryInfo)) } func onGetBatteryInfo(scanObj: ISktScanObject) { let result:SKTRESULT = scanObj.Msg().Result() print("GetBatteryInfo status:\(result)") if (result == ESKT_NOERROR) { let batterylevel = scanObj.Property().getUlong() print("Battery is:\(batterylevel)") } else { print("Error GetBatteryInfo status:\(result)") } 

但是,我得到的价值是:

 GetBatteryInfo status:0 Battery is:1677741312 

如果我的代码是正确的,那么我如何制作电池结果我得到一个有意义的结果,如百分比?
如果我离开了,那么如何获取电池电量,固件版本等信息?

谢谢

大卫

编辑 :Swift不支持SKTBATTERY_GETCURLEVEL 。 但是, 文档解释了电池电量响应包括分别在第一,第二和第三字节中编码的最小,最大和最大电平。

以下相当于使用SKTBATTERY_GETCURLEVEL

迅速

 func onGetBatteryInfo(scanObj: ISktScanObject) { let result:SKTRESULT = scanObj.Msg().Result() if(SKTSUCCESS(result)){ let batteryInfo = scanObj.Property().getUlong(); let batteryMin = ((batteryInfo >> 4) & 0xff); let batteryCurrent = ((batteryInfo >> 8) & 0xff); let batteryMax = ((batteryInfo >> 12) & 0xff); let batteryPercentage = batteryCurrent / (batteryMax - batteryMin); print("Battery is:\(batteryPercentage)") self.setBatteryLevel = batteryPercentage self.tableView.reloadData } else { print("Error GetBatteryInfo status:\(result)") } } 

Objective-C的

 -(void) onGetBatteryInfo:(ISktScanObject*)scanObj { SKTRESULT result=[[scanObj Msg]Result]; if(SKTSUCCESS(result)){ long batteryLevel = SKTBATTERY_GETCURLEVEL([[scanObj Property] getUlong]); NSLog(@"BatteryInfo %ld", batteryLevel); [self setBatteryLevel:batteryLevel]; [self.tableView reloadData]; } else { NSLog(@"Error GetBatteryInfo status: %ld",result); } } 

这是我使用的代码。 这是在appDelegate中为batteryPercentage定义的变量,并且在需要v值时读取。 该值由计时器每120秒更新一次,这样可以在级别下降等情况下发生操作。

  func onBatteryLevel (scanObj: ISktScanObject) { let result: SKTRESULT = scanObj.Msg().Result() if (SKTRESULT(result) > -1) { let property: ISktScanProperty = scanObj.Property() var batteryLevel = property.getUlong() #if arch(x86_64) || arch(arm64) batteryLevel = (batteryLevel<<(48))>>(56) #else batteryLevel = (batteryLevel<<(48-32))>>(56-32) #endif batteryPercentage = Int(batteryLevel) } else { debug ("data error \(result)") } } 

对于Swift 4,我刚刚遇到了这个问题并提出了以下解决方案。

 var lastDeviceConnected : CaptureHelperDevice? { didSet { guard let lastDevice = self.lastDeviceConnected else { return } lastDevice.getBatteryLevelWithCompletionHandler { result, batteryLevel in guard result == SKTResult.E_NOERROR, let batteryLevel = batteryLevel else { return } let minimum = SKTHelper.getMinimumLevel(fromBatteryLevel: Int(batteryLevel)) let maximum = SKTHelper.getMaximumLevel(fromBatteryLevel: Int(batteryLevel)) let current = SKTHelper.getCurrentLevel(fromBatteryLevel: Int(batteryLevel)) print("minimum: \(minimum)") print("maximum: \(maximum)") print("current: \(current)") // current is out battery level in % // minimum and maximum could for example be used for // for a slider or something that visually presents // the battery status } } } 

在我的例子中,我正在处理可能没有设备或可能没有按预期检索电池状态的情况。 我只是guard / return 。 在您的示例中,您可能希望处理该问题。