Разработка приложения, похожего на iTunes, на С#

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

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

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

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

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

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, но не могу прочитать ответ с телефона.


person Rajat Saini    schedule 28.10.2013    source источник
comment
Я пытаюсь сделать то же самое. Вам повезло с этим?   -  person brianestey    schedule 04.12.2013


Ответы (3)


Чтобы играть с iPod, вы можете использовать SharePodLib.

person Mauro Sampietro    schedule 24.01.2014

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

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

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

— Дэйв

person Howlium    schedule 23.07.2017

Вы можете использовать imobiledevice-net. Он предоставляет C# API для подключения к устройствам iOS с помощью вашего ПК.

Например, чтобы вывести список всех устройств iOS, подключенных к вашему ПК, вы должны запустить что-то вроде этого:

ReadOnlyCollection<string> udids;
int count = 0;

var idevice = LibiMobileDevice.Instance.iDevice;
var lockdown = LibiMobileDevice.Instance.Lockdown;

var ret = idevice.idevice_get_device_list(out udids, ref count);

if (ret == iDeviceError.NoDevice)
{
    // Not actually an error in our case
    return;
}

ret.ThrowOnError();

// Get the device name
foreach (var udid in udids)
{
    iDeviceHandle deviceHandle;
    idevice.idevice_new(out deviceHandle, udid).ThrowOnError();

    LockdownClientHandle lockdownHandle;
    lockdown.lockdownd_client_new_with_handshake(deviceHandle, out lockdownHandle, "Quamotion").ThrowOnError();

    string deviceName;
    lockdown.lockdownd_get_device_name(lockdownHandle, out deviceName).ThrowOnError();

    deviceHandle.Dispose();
    lockdownHandle.Dispose();
}
person Frederik Carlier    schedule 05.11.2018