5

I have a KODAK i2600 scanner connected to a network over SX Virtual Link, which on every pc in this network emulates a usb connection to the scanner. I can find the emulated usbs pid and vid easily like this: device manager detects the scanner as if it is connected via usb

or this: registry editor also shows info as it's connected over usb

I tried to detect the signals with LibUsbDotNet, but with their example it just doesn't work. I tried with this example:

public static UsbDevice MyUsbDevice;

#region SET YOUR USB Vendor and Product ID!

public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(int.Parse("040a", System.Globalization.NumberStyles.HexNumber), int.Parse("601d", System.Globalization.NumberStyles.HexNumber));


#endregion

public static void Main(string[] args)
{
    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-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))
        {
            // 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.Ep01);


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

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

            if (bytesRead == 0) throw new Exception(string.Format("{0}:No more bytes!", ec));
            Console.WriteLine("{0} bytes read", bytesRead);

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

        Console.WriteLine("\r\nDone!\r\n");
    }
    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();

        }

        // Wait for user input..
        Console.ReadKey();
    }
}

In this example when i try to open usb device the result is null. So i tried to to detect any signal from any usb device with this example:

public static IDeviceNotifier UsbDeviceNotifier = DeviceNotifier.OpenDeviceNotifier();

    private static void Main(string[] args)
    {
        // Hook the device notifier event
        UsbDeviceNotifier.OnDeviceNotify += OnDeviceNotifyEvent;

        // Exit on and key pressed.
        Console.Clear();            
        Console.WriteLine();
        Console.WriteLine("Waiting for system level device events..");
        Console.Write("[Press any key to exit]");

        while (!Console.KeyAvailable)
            Application.DoEvents();

        UsbDeviceNotifier.Enabled = false;  // Disable the device notifier

        // Unhook the device notifier event
        UsbDeviceNotifier.OnDeviceNotify -= OnDeviceNotifyEvent;
    }

    private static void OnDeviceNotifyEvent(object sender, DeviceNotifyEventArgs e)
    {
        // A Device system-level event has occured

        Console.SetCursorPosition(0,Console.CursorTop);

        Console.WriteLine(e.ToString()); // Dump the event info to output.

        Console.WriteLine();
        Console.Write("[Press any key to exit]");
    }`

With this example i can only detect connect and disconnect signals. So i tried to connect to a usb keyboard/mouse port with LibUsbDotNet, and that too didn't work.

It seems that i severely don't understand what needs to be done here.

Next, i tried to even check if a certain usb device is connected at all with this example from SO: USB Device Connected And even this didn't work.

To sum things up, i need to do this:

  1. Connect to the usb port where the scanner is connected(and listen to the signals that it sends over that port).
  2. Detect a signal from a scan button: button to scan a paper
  3. When a signal from 2. is detected i send a signal to the scanner to scan with a TWAIN or ISIS lib with my own configurations.
Community
  • 1
  • 1
Nikola.Lukovic
  • 1,256
  • 1
  • 16
  • 33
  • if you want to connect to scanner using LibUsbDotNet there are two ways: Install a driver filter or create the driver for device. If you have not documentation about the scanner signals, use UsbLyzer to sniff the scanner connected by USB. The UsbDeviceNotifier is just for detecting plug and unplug of USB devices. – denys-vega Mar 12 '15 at 14:00

1 Answers1

0

I think you can get kodak perfect page SDK from the vendor side. Pinvoke the calls provided by the vendor.

Check developer tools section in the link http://www.kodak.com/eknec/PageQuerier.jhtml?pq-path=2714&pq-locale=en_US&_requestid=3863

Justin CI
  • 2,693
  • 1
  • 16
  • 34