2016-07-07 126 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)") 
    } 
}