2016-07-07 1 views
2

Quoi que je semble essayer Je ne peux pas actuellement récupérer le niveau de la batterie de l'API iOS/SocketScan. J'utilise la version 3.10.36, voici mon code jusqu'à présent:SocketScan Obtenir le niveau de batterie dans 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)") 
    } 

Cependant, les valeurs que je reçois sont de retour:

GetBatteryInfo status:0 

Battery is:1677741312 

Si mon code est correct alors comment puis-je faire de la batterie résultat que je reçois un résultat significatif, comme un pourcentage?
Si je suis loin alors comment puis-je obtenir des informations comme le niveau de la batterie, la version du firmware, etc?

Merci

David

Répondre

2

EDIT:SKTBATTERY_GETCURLEVEL ne sont pas pris en charge par Swift. Cependant, le docs explique que la réponse au niveau de la batterie comprend les niveaux minimum, courant et maximum codés dans les premier, deuxième et troisième octets, respectivement.

Ce qui suit est équivalent à l'utilisation SKTBATTERY_GETCURLEVEL

Swift

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

Merci pour la réponse, c'est exactement ce que je pensais, mais à Swift pour autant que je le vois sait Rien à propos de SKTBATTERY_GETCURLEVEL, vous ne pouvez pas utiliser SKTBATTERY_GETCURLEVEL lorsque vous utilisez un identificateur non résolu. c'est pourquoi je suis bloqué comme d'après la documentation ça devrait aller! – Dave

+1

@Dave J'ai édité la réponse de tymac pour intégrer le code de 'SKTBATTERY_GETCURLEVEL' parce que vous avez raison, c'est une macro' # define' qui n'existe pas dans la version rapide – Enrico

+1

Merci @Enrico. Comme je l'ai noté, je l'ai traduit d'Objective-C. En fait, j'ai un ticket ouvert avec SocketScan moi-même car j'ai besoin de leur demander quelque chose d'autre. Dave si vous voulez utiliser leur méthode de classe native, vous pouvez simplement écrire une extension 'Objective-C'. J'ai ajouté l'incase Objective-C que vous voulez. L'utilisation d'Enrico de masquage bitwise pour obtenir le pourcentage équivalent est incroyable :) – tymac

0

Code est ici que j'utilise. Theres une variable définie dans appDelegate pour le batteryPercentage, et qui est lu lorsque la valeur v est nécessaire. La valeur est mis à jour chaque 120 secondes par une minuterie, ces actions de façon peut se produire que le niveau baisse, etc.

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