BluetoothTracker/Sources/battery_probe/main.swift

35 lines
1.2 KiB
Swift

import Foundation
import IOBluetooth
func runProbe() {
guard let paired = IOBluetoothDevice.pairedDevices() as? [IOBluetoothDevice] else { return }
for dev in paired where dev.isConnected() {
let addr = dev.addressString ?? ""
let sel = Selector(("batteryPercentSingle"))
if dev.responds(to: sel) {
let imp = dev.method(for: sel)
typealias IntFn = @convention(c) (AnyObject, Selector) -> Int
let fn = unsafeBitCast(imp, to: IntFn.self)
let val = fn(dev, sel)
if val > 0 && val <= 100 {
print("\(addr):\(val)")
continue
}
}
let selPeer = Selector(("peer"))
if dev.responds(to: selPeer),
let peer = dev.perform(selPeer)?.takeUnretainedValue() as? NSObject,
peer.responds(to: sel) {
let imp = peer.method(for: sel)
typealias IntFn = @convention(c) (AnyObject, Selector) -> Int
let fn = unsafeBitCast(imp, to: IntFn.self)
let val = fn(peer, sel)
if val > 0 && val <= 100 {
print("\(addr):\(val)")
}
}
}
}
runProbe()