使用 IOKit 获取罗技 Lightspeed 设备的电池电压?

问题描述 投票:0回答:0

我想用 Swift 编写一个简单的工具来读取鼠标(Logitech G Pro Wireless)的电池状态。由于这是我第一次深入研究 IOKit 和管理 HID 设备,我正在努力完成它。

这是我目前的做法:

  1. 我用这个库来跳过现在搞乱 Obj-C https://github.com/Arti3DPlayer/USBDeviceSwift
  2. 启动应用程序时,我使用硬编码 ID 创建 HID 设备并开始监听它的存在:
struct MyApp: App {
   let rfDeviceMonitor = HIDDeviceMonitor([
       HIDMonitorData(vendorId: 0x046d, productId: 0xC539)//0xc088)
       ], reportSize: 64)

   var body: some Scene {
       Window()
           .onAppear {
                  let rfDeviceDaemon = Thread(target: self.rfDeviceMonitor, selector:#selector(self.rfDeviceMonitor.start), object: nil)
                  rfDeviceDaemon.start()
           }
   }

}
  1. 另一个类正在监听连接和设备的数据。
    func configure() {
        NotificationCenter.default.addObserver(self, selector: #selector(self.usbConnected), name: .HIDDeviceConnected, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.hidReadData), name: .HIDDeviceDataReceived, object: nil)
    }
    
    @objc func usbConnected(notification: NSNotification) {
        guard let nobj = notification.object as? NSDictionary else {
            return
        }
        
        guard let deviceInfo: HIDDevice = nobj["device"] as? HIDDevice else {
            return
        }
        
        self.deviceInfo = deviceInfo
        write()
    }
    
    @objc func hidReadData(notification: Notification) {
        let obj = notification.object as! NSDictionary
        let data = obj["data"] as! Data
        print([UInt8](data))
    }
    
    func write() {
        let payload: [UInt8] = [
            0x10, // short message
            0xff, // receiver's index
            0x06, // feature index - battery voltage for g pro wireless
            0x00,
            0x00,
            0x00
        ]
        
        var correctData = Data(payload)
        var count = correctData.count
        
        let ret: Int32 = IOHIDDeviceGetReport(
            self.deviceInfo.device,
            kIOHIDReportTypeFeature,
            CFIndex(0x10),
            &correctData,
            &count
        )
        
        print(ret) // 0xe0005000
        print([UInt8](correctData)) // [16, 255, 6, 0, 0, 0]
    }

问题是 IOKit 在调用 IOHIDDeviceGetReport 不成功后总是返回一个值 (0xe0005000)。我不知道这是什么意思,因为 kIOReturn 标头根本没有提到这个值。

我发现有用的链接:

swift macos hid iokit logitech
© www.soinside.com 2019 - 2024. All rights reserved.