2013-10-28 1 views
6

Мне нужно разработать приложение в C#, которое может автоматически определять iPhone, когда оно подключено к системе, и прочитать конкретный файл для файловой системы iPhone. Я в основном хочу, чтобы этот файл загружался автоматически с устройства на ПК. Я использовал инструмент USBpcap, который предполагает, что iTunes подключается к телефону с использованием некоторого формата XML. Любая помощь или понимание сильно оценили. Есть ли какая-либо документация сторонних API, которые могут помочь мне начать? Есть некоторые приложения, которые могут реплицировать функциональность iTunes, например CopytransРазработка iTunes как приложения в C#

Есть ли какой-либо протокол или API, предоставляемые Apple?

Я прокопал интернет и нашел эту ссылку Layered communication for iPhone. Также я использую библиотеки LibUsbDotNet для связи с устройством USB (Example). Может ли кто-нибудь предположить, какие конечные точки следует использовать.

Мне кажется, что я должен реализовать usbmuxd в приложении Windows. Это многоуровневый протокол. Должны быть некоторые библиотеки, которые реализуют usbmuxd (я не думаю, что мне нужно реализовать весь протокол самостоятельно)

У меня нет большой идеи об обмене информацией через iTunes, а также о USB-связи. Я добавляю столько информации, сколько могу (конечно, с вещами, которые я придумал в своем R & D). Любая помощь высоко ценится.

public static DateTime LastDataEventDate = DateTime.Now; 
    public static UsbDevice MyUsbDevice; 

    #region SET YOUR USB Vendor and Product ID! 

    public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(1452, 4768); 

    #endregion 

    private void LibUSB() 
    { 
     ErrorCode ec = ErrorCode.None; 

     try 
     { 
      // Find and open the usb device. 
      MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder); 

      // If the device is open and ready 
      if (MyUsbDevice == null) 
       throw new Exception("Device Not Found."); 

      // If this is a "whole" usb device (libusb-win32, linux libusb) 
      // it will have an IUsbDevice interface. If not (WinUSB) the 
      // variable will be null indicating this is an interface of a 
      // device. 
      IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice; 
      if (!ReferenceEquals(wholeUsbDevice, null)) 
      { 
       // This is a "whole" USB device. Before it can be used, 
       // the desired configuration and interface must be selected. 

       // Select config #1 
       wholeUsbDevice.SetConfiguration(1); 

       // Claim interface #0. 
       wholeUsbDevice.ClaimInterface(0); 
      } 

      // open read endpoint 1. 
      UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep03); 

      // open write endpoint 1. 
      UsbEndpointWriter writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep02); 


       int bytesWritten; 
       ec = writer.Write(usbmux_header.GetBytes(), 2000, out bytesWritten); 
       if (ec != ErrorCode.None) 
        throw new Exception(UsbDevice.LastErrorString); 

       byte[] readBuffer = new byte[1024]; 
       while (ec == ErrorCode.None) 
       { 
        int bytesRead; 

        // If the device hasn't sent data in the last 100 milliseconds, 
        // a timeout error (ec = IoTimedOut) will occur. 
        ec = reader.Read(readBuffer, 10000, out bytesRead); 

        if (ec == ErrorCode.Win32Error) 
         throw new Exception("port not open"); 
        if (bytesRead == 0) 
         throw new Exception("No more bytes!"); 

        // Write that output to the console. 
        Console.Write(Encoding.Default.GetString(readBuffer, 0, bytesRead)); 
       } 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(); 
      Console.WriteLine((ec != ErrorCode.None ? ec + ":" : String.Empty) + ex.Message); 
     } 
     finally 
     { 
      if (MyUsbDevice != null) 
      { 
       if (MyUsbDevice.IsOpen) 
       { 
        // If this is a "whole" usb device (libusb-win32, linux libusb-1.0) 
        // it exposes an IUsbDevice interface. If not (WinUSB) the 
        // 'wholeUsbDevice' variable will be null indicating this is 
        // an interface of a device; it does not require or support 
        // configuration and interface selection. 
        IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice; 
        if (!ReferenceEquals(wholeUsbDevice, null)) 
        { 
         // Release interface #0. 
         wholeUsbDevice.ReleaseInterface(0); 
        } 

        MyUsbDevice.Close(); 
       } 
       MyUsbDevice = null; 

       // Free usb resources 
       UsbDevice.Exit(); 

      } 
     } 
    } 

class usbmux_header 
{ 
    public static UInt32 length = 10; // length of message, including header 
    public static UInt32 reserved = 0; // always zero 
    public static UInt32 type = 3;  // message type 
    public static UInt32 tag = 2; // responses to this query will echo back this tag 

    public static byte[] GetBytes() 
    { 
     byte[] lgth = BitConverter.GetBytes(length); 
     byte[] res = BitConverter.GetBytes(reserved); 
     byte[] tpe = BitConverter.GetBytes(type); 
     byte[] tg = BitConverter.GetBytes(tag); 

     byte[] retArray = new byte[16]; 
     lgth.CopyTo(retArray, 0); 
     res.CopyTo(retArray, 4); 
     tpe.CopyTo(retArray, 8); 
     tg.CopyTo(retArray, 12); 

     return retArray; 
    } 
}; 

Я пытался отправить приветствие байтам пакета на iPhone, но я не могу прочитать ответ с телефона.

+0

Я пытаюсь сделать то же самое. Вам повезло с этим? – brianestey

ответ

0

Как я понимаю, только один клиент может использовать подключение USB к прошивке в одно времени. Как в macOS, так и в Windows, этот клиент является usbmux. Эта библиотека мультиплексирует TCP-соединения с клиентами более высокого уровня, включая iTunes, Photos и (на macOS) библиотеку peertalk с открытым исходным кодом.

Итак, в Windows вы не захотите реализовать свой собственный usbmux, а скорее клиент, который находится поверх этого, аналогичный peertalk. Я не видел ничего открытого источника, который делает это, но ряд разработчиков выполнили это с помощью собственного проприетарного программного обеспечения.

Если у кого-нибудь еще есть указатели на использование usbmux на Windows, я бы хотел услышать об этом.

-Dave

 Смежные вопросы

  • Нет связанных вопросов^_^