无论我试图尝试什么,我目前无法从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
如果我的代码是正确的,那么如何制作电池结果我得到了一个有意义的结果,比如一个百分比?
如果我离开了,那么如何取回电池级别,固件等信息版本等?
由于
大卫
答案 0 :(得分:2)
编辑:Swift不支持SKTBATTERY_GETCURLEVEL
。但是,docs解释了电池电量响应包括分别在第一个,第二个和第三个字节中编码的最小,最大和最大电平。
以下相当于使用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)")
}
}
<强>目标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);
}
}
答案 1 :(得分:0)
我使用的代码。这是在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)")
}
}