2016-07-07 124 views
2

无论我看起来如何尝试,我目前都无法从iOS/SocketScan API取回电池电量。我使用的版本,36年3月10日,这是我到目前为止的代码:SocketScan在Swift中获取电池电量

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 

如果我的代码是正确的,那么如何让我的电池结果我得到一个有意义的结果,就像一个百分比?
如果我走了,那我该如何找回像电池电量,固件版本等信息?

感谢

大卫

回答

2

编辑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)") 
    } 
} 

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); 
} 
} 
+0

感谢您的回答,这正是我想,但在斯威夫特据我可以看到它知道没有关于SKTBATTERY_GETCURLEVEL的内容,因为您使用了未解析的标识符,因此无法使用SKTBATTERY_GETCURLEVEL。这就是为什么我被卡住,因为根据文件,它应该很好! – Dave

+1

@Dave我编辑了tymac的回答,内嵌了“SKTBATTERY_GETCURLEVEL”的代码,因为你是对的,这是一个'#define'宏,它不存在于swift版本 – Enrico

+1

谢谢@Enrico。如前所述,我从Objective-C翻译了它。实际上我自己有一个打开的SocketScan门票,因为我需要向他们询问其他的东西。戴夫如果你想使用他们的本地类方法,你可以写一个Objective-C'扩展'。我添加了Objective-C以满足您的需要。 Enrico使用按位掩码来获得相当的百分比是惊人的:) – tymac

0

这里的代码,我使用。 Theres是一个在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)") 
    } 
}