2016-12-07 16 views
0

SERIALまたはHIDデバイス通信を使用しないUSBデバイスがあります。これはDFUモードです。どのように私はそれを最初に検出することができますか?私は多くの記事を読んで例を見ていますが、私のためには役に立たなかった。VIDとPIDを持つUSBデバイスを検出する例

私はこのためにIOKit.usbライブラリを使用する必要があると理解していますか?誰かがどのように私は、このデバイスを検出することができない私が表示されます場合はそれは素晴らしいだろう:(答えを

enter image description here

+0

これはあなたのアイデアを与えることができる、私は推測:。http://pastebin.com/Gj0Hhtihが、これではないヲ:http://stackoverflow.com/a/39026607/2227743 – Moritz

+0

@EricAyaありがとう、私はいくつかのコードを書きましたrking。いくつかの提案をしてください。なぜ私のデバイスが検出されないのですか?( – Arti

+0

IOKit.usbとIOKit.hidの便利な作業のために[USBDeviceSwift](https://github.com/Arti3DPlayer/USBDeviceSwift)ライブラリを作成しました – Arti

答えて

2

おかげで、私は自分のソリューション構築:それを実行するには

class DFUDevice: NSObject { 
    let vendorId = 0x0483 
    let productId = 0xdf11 

    static let sharedInstance = DFUDevice() 

    private func reloadMonitor(iterator:io_iterator_t) { 
     repeat { 
      let nextService = IOIteratorNext(iterator) 
      guard nextService != 0 else { break } 
      IOObjectRelease(nextService) 

     } while (true) 
    } 

    func connected(iterator:io_iterator_t) { 
     self.reloadMonitor(iterator: iterator) 
    } 

    func disconnected(iterator:io_iterator_t) { 
     self.reloadMonitor(iterator: iterator) 
    } 

    func initUsb() { 
     var matchedIterator:io_iterator_t = 0 
     var removalIterator:io_iterator_t = 0 
     let notifyPort:IONotificationPortRef = IONotificationPortCreate(kIOMasterPortDefault) 
     IONotificationPortSetDispatchQueue(notifyPort, DispatchQueue(label: "IODetector")) 

     let matchingDict = IOServiceMatching(kIOUSBDeviceClassName) 
      as NSMutableDictionary 
     matchingDict[kUSBVendorID] = NSNumber(value: self.vendorId) 
     matchingDict[kUSBProductID] = NSNumber(value: self.productId) 

     let matchingCallback:IOServiceMatchingCallback = { (userData, iterator) in 
      let this = Unmanaged<DFUDevice> 
       .fromOpaque(userData!).takeUnretainedValue() 
      this.connected(iterator: iterator) 
     } 

     let removalCallback: IOServiceMatchingCallback = { 
      (userData, iterator) in 
      let this = Unmanaged<DFUDevice> 
       .fromOpaque(userData!).takeUnretainedValue() 
      this.disconnected(iterator: iterator) 
     }; 

     let selfPtr = Unmanaged.passUnretained(self).toOpaque() 

     IOServiceAddMatchingNotification(notifyPort, kIOFirstMatchNotification, matchingDict, matchingCallback, selfPtr, &matchedIterator) 
     IOServiceAddMatchingNotification(notifyPort, kIOTerminatedNotification, matchingDict, removalCallback, selfPtr, &removalIterator) 

     if matchedIterator != 0 { 
      self.connected(iterator: matchedIterator) 
      matchedIterator = 0 
     } 

     if removalIterator != 0 { 
      self.reloadMonitor(iterator: removalIterator) 
      removalIterator = 0 
     } 

     self.reloadMonitor(iterator: matchedIterator) 
     self.reloadMonitor(iterator: removalIterator) 

     RunLoop.current.run(); 
    } 
} 

を:

let DFUDeviceDaemon = Thread(target: DFUDevice.sharedInstance, selector:#selector(DFUDevice.initUsb), object: nil) 
      DFUDeviceDaemon.start() 
+0

興味深いです。私が苦労しているSwift 3でhttp://stackoverflow.com/a/39026607/2227743を取り戻すために、このバージョンを推測することができます:) – Moritz

+0

@EricAyaは今あなたが私にどのように手伝ってくれますか?このデバイスにデータを送信できます:) – Arti

+0

http://stackoverflow.com/questions/41038150/usb-device-send-receive-data – Arti

関連する問題