Webusb to scan documents
Asked Answered
F

4

6

Anybody had successfully configured webusb to scan a document ? I am able to connect to the usb scanner but wasn't able to find any documentation on commands to scan documents :

$lsusb -v

Bus 001 Device 007: ID 1083:163e Canon Electronics, Inc. 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         1 
  bMaxPacketSize0        64
  idVendor           0x1083 Canon Electronics, Inc.
  idProduct          0x163e 
  bcdDevice            2.02
  iManufacturer           1 CANON   
  iProduct                2 CANON   DR-M160         
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           39
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xc0
      Self Powered
    MaxPower               98mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass         0 (Defined at Interface level)
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               6
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         1 
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0001
  Self Powered

The code below test a low level transfer, however even the PromiseStatus is marked as resolved, status is stall and device.transferIn status remain pending. I wasn't able to go further as I didn't find any documentation for my scanner or any other scanner.

navigator.usb.requestDevice({ filters: [{ vendorId: 0x1083 }] })
.then(selectedDevice => {
   device = selectedDevice;
   return device.open(); // Begin a session.
 })
.then(() => device.selectConfiguration(1)) 
.then(() => device.claimInterface(0)) 
.then(() => device.controlTransferOut({
    requestType: 'vendor',
    recipient: 'device',
    request: 0x22,
    value: 0x01,
    index: 0x01})) 
.then(() => device.transferIn(1, 64)) // Waiting for 64 bytes of data from endpoint #1.
.then(result => {
  let decoder = new TextDecoder();
  console.log('Received: ' + decoder.decode(result.data));
})
.catch(error => { console.log(error); });

Thank you !

Fusil answered 7/1, 2018 at 10:53 Comment(2)
I used kernel usbmon to monitor usb and here is what happen when xsane fire scan command, just removed URBtag and timestamp from the beginning of each line. Overall after lots of Interrupt intput (Ii) xsane fire Bulk output command (Bo) C Ii:1:004:1 0:8 4 = 00000000 S Ii:1:004:1 -115:8 4 < S Bo:1:113:2 -115 24 = 00000014 00019000 00000000 31000000 00000000 00000000 C Bo:1:113:2 0 24 > S Bi:1:113:1 -115 8 < C Bi:1:113:1 0 8 = 00000000 00000000 S Bi:1:113:1 -115 8 < C Bi:1:113:1 0 8 = 00000000 00000000Fusil
didn't find the solution yet, but anybody looking to do similar thing here is where you should start from for my case it's canon dr-m160 ... and If you are familiar with emscripten it could save your life :)Fusil
R
0

I doubt that you managed to connect with the device. Reading the specification for security, you can see that the device should make some changes to be accessed via webusb, and your scanner doesn't have anything like that.

My attempts to use WebUSB, led me to buy an arduino microcontroller for a simple test. For more information, you can read this article about WebUSB on the Google Developer website. The purpose of this microcontroller is to use it as a proxy/intermediate between the PC and the scanner, since I have full control over the microcontroller and can instrument it properly for use with WebUSB.

Reflex answered 29/1, 2018 at 11:14 Comment(4)
If you cannot do it with a PC, you cannot do it with an arduino. I am able to connect to my device correctly, however it seems there is an issue with chrome webusb implementation that I am still investigating on it.Fusil
I did connect via WebUSB to the arduino and did communicate with it without any problems. What I am arguing is that you can't do the same with the scanner because you don't have permissions. Did you read anything simple from your connected scanner via webusb? The model for example. That would proove that you did connect and communicated with it properly.Reflex
Yes I am able to connect and get configuration and even sending some commands (Co, Bo) and read response from scanner (Bi)... etc. I don't think it's a permission issue since Sane can do it without any problems, so normally it could be done with webusb.Fusil
It's wanderful that you managed to connect properly via WebUSB to your scanner. Even sending some commands!I didn't succeed to do even that.Reflex
G
0

I am trying to get scanning over WebUSB working with a CanoScan LiDE 25. It uses a plustek chip.

// http://www.linux-usb.org/usb.ids
// 04a9 Canon, Inc.
// 2200  CanoScan LiDE 25
navigator.usb.requestDevice({ filters: [{ vendorId: 0x04a9 }] })
.then(device => {
    console.log(device.productName);      // "CanonScan"
    console.log(device.manufacturerName); // "Canon"
})
.catch(error => { console.log(error); });

I currently try to reverse engineer the protocol with wireshark and USBMon. The guys from sane already did that (https://gitlab.com/sane-project/backends/blob/master/backend/plustek.c)

Wireshark USBMon trace session

In the picture above you can see a trace with Wireshark and the command:

export SANE_DEBUG_DLL=255 # enabled debug logging for sane
scanimage -p --resolution 150 --mode Gray -x 210 -y 297 > image.pnm

This does not answer your question. Nevertheless it shows the way to go.

I would expect that the most innovate thing would be to compile sane with emscripten (https://github.com/kripken/emscripten) into javascript and then directly use it.

Here is some more debugging output, when enabling the debugging log of the plustek driver:

$ export SANE_DEBUG_PLUSTEK=12
$ scanimage -L
[sanei_debug] Setting debug level of dll to 0.
[sanei_debug] Setting debug level of plustek to 12.
[plustek] Plustek backend V0.52-12, part of sane-backends 1.0.25git
[plustek] Retrieving all supported and conntected devices
[plustek] Available and supported devices:
[plustek] Device: >libusb:001:008< - 0x04a9x0x2220
[plustek] ># Plustek-SANE Backend configuration file<
[plustek] ># For use with LM9831/2/3 based USB scanners<
[plustek] >#<
[plustek] ><
[plustek] ># each device needs at least two lines:<
[plustek] ># - [usb] vendor-ID and product-ID<
[plustek] ># - device devicename<
[plustek] ># i.e. for Plustek (0x07B3) UT12/16/24 (0x0017)<
[plustek] ># [usb] 0x07B3 0x0017<
[plustek] ># device /dev/usbscanner<
[plustek] ># or<
[plustek] ># device libusb:bbb:ddd<
[plustek] ># where bbb is the busnumber and ddd the device number<
[plustek] ># make sure that your user has access to /proc/bus/usb/bbb/ddd<
[plustek] >#<
[plustek] ># additionally you can specify some options<
[plustek] ># warmup, lOffOnEnd, lampOff<
[plustek] >#<
[plustek] ># For autodetection use<
[plustek] ># [usb]<
[plustek] ># device /dev/usbscanner<
[plustek] >#<
[plustek] ># or simply<
[plustek] ># [usb]<
[plustek] >#<
[plustek] ># or if you want a specific device but you have no idea about the<
[plustek] ># device node or you use libusb, simply set vendor- and product-ID<
[plustek] ># [usb] 0x07B3 0x0017<
[plustek] ># device auto<
[plustek] >#<
[plustek] ># NOTE: autodetection is safe, as it uses the info it got<
[plustek] >#       from the USB subsystem. If you're not using the<
[plustek] >#       autodetection, you MUST have attached that device<
[plustek] >#       at your USB-port, that you have specified...<
[plustek] >#<
[plustek] ><
[plustek] >[usb]<
[plustek] next device uses autodetection
[plustek] ... next device
[plustek] ><
[plustek] >#<
[plustek] ># options for the previous USB entry<
[plustek] >#<
[plustek] ># switch lamp off after xxx secs, 0 disables the feature<
[plustek] ># (can also be set via frontend)<
[plustek] >option lampOff 300<
[plustek] Decoding option >lampOff<
[plustek] ><
[plustek] ># warmup period in seconds, 0 means no warmup, -1 means auto-warmup<
[plustek] ># (can also be set via frontend)<
[plustek] >option warmup -1<
[plustek] Decoding option >warmup<
[plustek] ><
[plustek] ># 0 means leave lamp-status untouched, not 0 means switch off<
[plustek] ># on sane_close<
[plustek] ># (can also be set via frontend)<
[plustek] >option lOffOnEnd 1<
[plustek] Decoding option >lOffOnEnd<
[plustek] ><
[plustek] >#<
[plustek] ># options to tweak the image start-position<
[plustek] ># (WARNING: there's no internal range check!!!)<
[plustek] >#<
[plustek] ># for the normal scan area<
[plustek] >#<
[plustek] >option posOffX 0<
[plustek] Decoding option >posOffX<
[plustek] >option posOffY 0<
[plustek] Decoding option >posOffY<
[plustek] ><
[plustek] ># for transparencies<
[plustek] >option tpaOffX 0<
[plustek] Decoding option >tpaOffX<
[plustek] >option tpaOffY 0<
[plustek] Decoding option >tpaOffY<
[plustek] ><
[plustek] ># for negatives<
[plustek] >option negOffX 0<
[plustek] Decoding option >negOffX<
[plustek] >option negOffY 0<
[plustek] Decoding option >negOffY<
[plustek] ><
[plustek] >#<
[plustek] ># for setting the calibration strip position<
[plustek] ># (WARNING: there's no internal range check!!!)<
[plustek] ># -1 means use built in<
[plustek] ># (can also be set via frontend)<
[plustek] >option posShadingY -1<
[plustek] Decoding option >posShadingY<
[plustek] >option tpaShadingY -1<
[plustek] Decoding option >tpaShadingY<
[plustek] >option negShadingY -1<
[plustek] Decoding option >negShadingY<
[plustek] ><
[plustek] >#<
[plustek] ># to invert the negatives, 0 disables the feature<
[plustek] >#<
[plustek] >option invertNegatives 0<
[plustek] Decoding option >invertNegatives<
[plustek] ><
[plustek] >#<
[plustek] ># to disable the internal sensor speedup function,<
[plustek] ># 1 disables the feature<
[plustek] >#<
[plustek] >option disableSpeedup 0<
[plustek] Decoding option >disableSpeedup<
[plustek] ><
[plustek] >#<
[plustek] ># to save/restore coarse calibration data<
[plustek] ># (can also be set via frontend)<
[plustek] >option cacheCalData 0<
[plustek] Decoding option >cacheCalData<
[plustek] ><
[plustek] >#<
[plustek] ># use alternate calibration routines<
[plustek] >#<
[plustek] >option altCalibration 0<
[plustek] Decoding option >altCalibration<
[plustek] ><
[plustek] >#<
[plustek] ># for skipping whole calibration step<
[plustek] >#<
[plustek] >option skipCalibration 0<
[plustek] Decoding option >skipCalibration<
[plustek] ><
[plustek] >#<
[plustek] ># for skipping entire fine calibration step<
[plustek] ># coarse calibration is done<
[plustek] >#<
[plustek] >option skipFine 0<
[plustek] Decoding option >skipFine<
[plustek] ><
[plustek] >#<
[plustek] ># discard the result of the fine white calibration<
[plustek] >#<
[plustek] >option skipFineWhite 0<
[plustek] Decoding option >skipFineWhite<
[plustek] ><
[plustek] >#<
[plustek] ># some scanners have a dark calibration strip, in<
[plustek] ># general this one should be used for calibration.<
[plustek] ># As this could cause some trouble, this option<
[plustek] ># overrides that and the dark calibration will be<
[plustek] ># done by switching the lamp off<
[plustek] >#<
[plustek] >option skipDarkStrip 0<
[plustek] Decoding option >skipDarkStrip<
[plustek] ><
[plustek] ># for replacing the gain values found during coarse<
[plustek] ># calibration<
[plustek] ># (can also be set via frontend)<
[plustek] >option red_gain   -1<
[plustek] Decoding option >red_gain<
[plustek] >option green_gain -1<
[plustek] Decoding option >green_gain<
[plustek] >option blue_gain  -1<
[plustek] Decoding option >blue_gain<
[plustek] ><
[plustek] ># for replacing the offset values found during coarse<
[plustek] ># calibration<
[plustek] ># (can also be set via frontend)<
[plustek] >option red_offset   -1<
[plustek] Decoding option >red_offset<
[plustek] >option green_offset -1<
[plustek] Decoding option >green_offset<
[plustek] >option blue_offset  -1<
[plustek] Decoding option >blue_offset<
[plustek] ><
[plustek] >#<
[plustek] ># for replacing the default lampoff settings, this<
[plustek] ># works only for CIS devices like CanoScan LiDE20<
[plustek] ># (can also be set via frontend)<
[plustek] >option red_lampoff   -1<
[plustek] Decoding option >red_lampoff<
[plustek] >option green_lampoff -1<
[plustek] Decoding option >green_lampoff<
[plustek] >option blue_lampoff  -1<
[plustek] Decoding option >blue_lampoff<
[plustek] ><
[plustek] >#<
[plustek] ># for adjusting the default gamma values<
[plustek] ># (can also be set via frontend)<
[plustek] >option redGamma         1.0<
[plustek] Decoding option >redGamma<
[plustek] >option greenGamma       1.0<
[plustek] Decoding option >greenGamma<
[plustek] >option blueGamma        1.0<
[plustek] Decoding option >blueGamma<
[plustek] >option grayGamma        1.0<
[plustek] Decoding option >grayGamma<
[plustek] ><
[plustek] >#<
[plustek] ># to enable TPA (EPSON or UMAX, if autodetection fails)<
[plustek] ># 0 means default behaviour as specified in the internal tables<
[plustek] ># 1 means enable (needed for UMAX 3450)<
[plustek] >option enableTPA 0<
[plustek] Decoding option >enableTPA<
[plustek] ><
[plustek] >#<
[plustek] ># model override functionality, currently only available for<
[plustek] ># Mustek devices, using NSCs' vendor ID: 0x0400 and<
[plustek] ># also their product ID: 0x1000 (LM9831) 0x1001 (LM9832)<
[plustek] >#<
[plustek] ># mov/PID    |    0x1000   |   0x1001<
[plustek] ># ---------------------------------------<
[plustek] ># 0 (default)| BearPaw1200 | BearPaw 2400<
[plustek] ># 1          |   ignored   | BearPaw 1200<
[plustek] >#<
[plustek] >option mov 0<
[plustek] Decoding option >mov<
[plustek] ><
[plustek] >#<
[plustek] ># and of course the device-name<
[plustek] >#<
[plustek] ># device /dev/usbscanner<
[plustek] >device auto<
[plustek] Decoding device name >auto<
[plustek] ><
[plustek] >#<
[plustek] ># to define a new device, start with a new section:<
[plustek] ># [usb]<
[plustek] >#<
[plustek] attach (auto, 0x7ffdc9adc760, (nil))
[plustek] Device configuration:
[plustek] device name  : >auto<
[plustek] USB-ID       : ><
[plustek] model ovr.   : 0
[plustek] warmup       : -1s
[plustek] lampOff      : 300
[plustek] lampOffOnEnd : yes
[plustek] cacheCalData : no
[plustek] altCalibrate : no
[plustek] skipCalibr.  : no
[plustek] skipFine     : no
[plustek] skipFineWhite: no
[plustek] skipDarkStrip: no
[plustek] incDarkTarget: yes
[plustek] invertNegs.  : no
[plustek] dis.Speedup  : no
[plustek] pos_x        : 0
[plustek] pos_y        : 0
[plustek] pos_shading_y: -1
[plustek] neg_x        : 0
[plustek] neg_y        : 0
[plustek] neg_shading_y: -1
[plustek] tpa_x        : 0
[plustek] tpa_y        : 0
[plustek] tpa_shading_y: -1
[plustek] red gain     : -1
[plustek] green gain   : -1
[plustek] blue gain    : -1
[plustek] red offset   : -1
[plustek] green offset : -1
[plustek] blue offset  : -1
[plustek] red lampoff  : -1
[plustek] green lampoff: -1
[plustek] blue lampoff : -1
[plustek] red Gamma    : 1.00
[plustek] green Gamma  : 1.00
[plustek] blue Gamma   : 1.00
[plustek] gray Gamma   : 1.00
[plustek] ---------------------
[plustek] usbDev_open(auto,) - 0x5555ca4dbe90
[plustek] Vendor ID=0x04A9, Product ID=0x2220
[plustek] usbio_DetectLM983x
[plustek] usbio_DetectLM983x: found LM9832/3
[plustek]  * setting device to idle state!
[plustek] Detected vendor & product ID: 0x04A9-0x2220
[plustek] Device description for >0x04A9-0x2220< found.
[plustek] usb_initDev(43,0x04a9,-1)
[plustek] Device WAF  : 0x00004002
[plustek] Transferrate: 1000000 Bytes/s
[plustek] Device Flags: 0x00000000
[plustek] Vendor adjusted to: >Canon<
[plustek] LAMP-STATUS: 0x00000000 (off)
[plustek] RESETTING REGISTERS(-1) - 0x80
[plustek] MISC I/O after RESET: 0x66, 0x16, 0x91
[plustek] Calibration file-names set to:
[plustek] >/home/manuel/.sane/Canon_CanoScan_LiDE25-coarse.cal<
[plustek] >/home/manuel/.sane/Canon_CanoScan_LiDE25-fine.cal<
[plustek] usb_SetScanParameters()
[plustek] usb_GetMCLKDivider()
[plustek] usb_GetMCLKDiv()
[plustek] * PhyBytes   = 6
[plustek] * PhyLines   = 4
[plustek] * TotalBytes = 24
[plustek] * Scansteps=72 (9*1200/150)
[plustek] usb_SetScanParameters() done.
[plustek] usbDev_getCaps()
[plustek] Scanner information:
[plustek] Vendor : Canon
[plustek] Model  : CanoScan LiDE25
[plustek] Flags  : 0x00000000
[plustek] drvclose()
[plustek] usbDev_stopScan()
[plustek] usbDev_ScanEnd(), start=0, park=0
[plustek] usbDev_close()
[plustek] attach: model = >CanoScan LiDE25<
[plustek] sane_get_devices (0x7ffdc9ade8e0, 0)
device `plustek:libusb:001:008' is a Canon CanoScan LiDE25 flatbed scanner
[plustek] sane_exit
[plustek] Shutdown called (dev->fd=-1, libusb:001:008)
[plustek] Waiting for scanner-ready...
[plustek] Switching lamp off...
[plustek] LAMP-STATUS: 0x00000000 (off)
[plustek] LAMP-STATUS: 0x00000000 (off)
[plustek] Lamp-Timer stopped

Here is the output when scanning

scanimage -p --resolution 150 --mode Gray -x 210 -y 297 > image.pnm
[sanei_debug] Setting debug level of dll to 0.
[sanei_debug] Setting debug level of plustek to 12.
[plustek] Plustek backend V0.52-12, part of sane-backends 1.0.25git
[plustek] Retrieving all supported and conntected devices
[plustek] Available and supported devices:
[plustek] Device: >libusb:001:008< - 0x04a9x0x2220
[plustek] ># Plustek-SANE Backend configuration file<
[plustek] ># For use with LM9831/2/3 based USB scanners<
[plustek] >#<
[plustek] ><
[plustek] ># each device needs at least two lines:<
[plustek] ># - [usb] vendor-ID and product-ID<
[plustek] ># - device devicename<
[plustek] ># i.e. for Plustek (0x07B3) UT12/16/24 (0x0017)<
[plustek] ># [usb] 0x07B3 0x0017<
[plustek] ># device /dev/usbscanner<
[plustek] ># or<
[plustek] ># device libusb:bbb:ddd<
[plustek] ># where bbb is the busnumber and ddd the device number<
[plustek] ># make sure that your user has access to /proc/bus/usb/bbb/ddd<
[plustek] >#<
[plustek] ># additionally you can specify some options<
[plustek] ># warmup, lOffOnEnd, lampOff<
[plustek] >#<
[plustek] ># For autodetection use<
[plustek] ># [usb]<
[plustek] ># device /dev/usbscanner<
[plustek] >#<
[plustek] ># or simply<
[plustek] ># [usb]<
[plustek] >#<
[plustek] ># or if you want a specific device but you have no idea about the<
[plustek] ># device node or you use libusb, simply set vendor- and product-ID<
[plustek] ># [usb] 0x07B3 0x0017<
[plustek] ># device auto<
[plustek] >#<
[plustek] ># NOTE: autodetection is safe, as it uses the info it got<
[plustek] >#       from the USB subsystem. If you're not using the<
[plustek] >#       autodetection, you MUST have attached that device<
[plustek] >#       at your USB-port, that you have specified...<
[plustek] >#<
[plustek] ><
[plustek] >[usb]<
[plustek] next device uses autodetection
[plustek] ... next device
[plustek] ><
[plustek] >#<
[plustek] ># options for the previous USB entry<
[plustek] >#<
[plustek] ># switch lamp off after xxx secs, 0 disables the feature<
[plustek] ># (can also be set via frontend)<
[plustek] >option lampOff 300<
[plustek] Decoding option >lampOff<
[plustek] ><
[plustek] ># warmup period in seconds, 0 means no warmup, -1 means auto-warmup<
[plustek] ># (can also be set via frontend)<
[plustek] >option warmup -1<
[plustek] Decoding option >warmup<
[plustek] ><
[plustek] ># 0 means leave lamp-status untouched, not 0 means switch off<
[plustek] ># on sane_close<
[plustek] ># (can also be set via frontend)<
[plustek] >option lOffOnEnd 1<
[plustek] Decoding option >lOffOnEnd<
[plustek] ><
[plustek] >#<
[plustek] ># options to tweak the image start-position<
[plustek] ># (WARNING: there's no internal range check!!!)<
[plustek] >#<
[plustek] ># for the normal scan area<
[plustek] >#<
[plustek] >option posOffX 0<
[plustek] Decoding option >posOffX<
[plustek] >option posOffY 0<
[plustek] Decoding option >posOffY<
[plustek] ><
[plustek] ># for transparencies<
[plustek] >option tpaOffX 0<
[plustek] Decoding option >tpaOffX<
[plustek] >option tpaOffY 0<
[plustek] Decoding option >tpaOffY<
[plustek] ><
[plustek] ># for negatives<
[plustek] >option negOffX 0<
[plustek] Decoding option >negOffX<
[plustek] >option negOffY 0<
[plustek] Decoding option >negOffY<
[plustek] ><
[plustek] >#<
[plustek] ># for setting the calibration strip position<
[plustek] ># (WARNING: there's no internal range check!!!)<
[plustek] ># -1 means use built in<
[plustek] ># (can also be set via frontend)<
[plustek] >option posShadingY -1<
[plustek] Decoding option >posShadingY<
[plustek] >option tpaShadingY -1<
[plustek] Decoding option >tpaShadingY<
[plustek] >option negShadingY -1<
[plustek] Decoding option >negShadingY<
[plustek] ><
[plustek] >#<
[plustek] ># to invert the negatives, 0 disables the feature<
[plustek] >#<
[plustek] >option invertNegatives 0<
[plustek] Decoding option >invertNegatives<
[plustek] ><
[plustek] >#<
[plustek] ># to disable the internal sensor speedup function,<
[plustek] ># 1 disables the feature<
[plustek] >#<
[plustek] >option disableSpeedup 0<
[plustek] Decoding option >disableSpeedup<
[plustek] ><
[plustek] >#<
[plustek] ># to save/restore coarse calibration data<
[plustek] ># (can also be set via frontend)<
[plustek] >option cacheCalData 0<
[plustek] Decoding option >cacheCalData<
[plustek] ><
[plustek] >#<
[plustek] ># use alternate calibration routines<
[plustek] >#<
[plustek] >option altCalibration 0<
[plustek] Decoding option >altCalibration<
[plustek] ><
[plustek] >#<
[plustek] ># for skipping whole calibration step<
[plustek] >#<
[plustek] >option skipCalibration 0<
[plustek] Decoding option >skipCalibration<
[plustek] ><
[plustek] >#<
[plustek] ># for skipping entire fine calibration step<
[plustek] ># coarse calibration is done<
[plustek] >#<
[plustek] >option skipFine 0<
[plustek] Decoding option >skipFine<
[plustek] ><
[plustek] >#<
[plustek] ># discard the result of the fine white calibration<
[plustek] >#<
[plustek] >option skipFineWhite 0<
[plustek] Decoding option >skipFineWhite<
[plustek] ><
[plustek] >#<
[plustek] ># some scanners have a dark calibration strip, in<
[plustek] ># general this one should be used for calibration.<
[plustek] ># As this could cause some trouble, this option<
[plustek] ># overrides that and the dark calibration will be<
[plustek] ># done by switching the lamp off<
[plustek] >#<
[plustek] >option skipDarkStrip 0<
[plustek] Decoding option >skipDarkStrip<
[plustek] ><
[plustek] ># for replacing the gain values found during coarse<
[plustek] ># calibration<
[plustek] ># (can also be set via frontend)<
[plustek] >option red_gain   -1<
[plustek] Decoding option >red_gain<
[plustek] >option green_gain -1<
[plustek] Decoding option >green_gain<
[plustek] >option blue_gain  -1<
[plustek] Decoding option >blue_gain<
[plustek] ><
[plustek] ># for replacing the offset values found during coarse<
[plustek] ># calibration<
[plustek] ># (can also be set via frontend)<
[plustek] >option red_offset   -1<
[plustek] Decoding option >red_offset<
[plustek] >option green_offset -1<
[plustek] Decoding option >green_offset<
[plustek] >option blue_offset  -1<
[plustek] Decoding option >blue_offset<
[plustek] ><
[plustek] >#<
[plustek] ># for replacing the default lampoff settings, this<
[plustek] ># works only for CIS devices like CanoScan LiDE20<
[plustek] ># (can also be set via frontend)<
[plustek] >option red_lampoff   -1<
[plustek] Decoding option >red_lampoff<
[plustek] >option green_lampoff -1<
[plustek] Decoding option >green_lampoff<
[plustek] >option blue_lampoff  -1<
[plustek] Decoding option >blue_lampoff<
[plustek] ><
[plustek] >#<
[plustek] ># for adjusting the default gamma values<
[plustek] ># (can also be set via frontend)<
[plustek] >option redGamma         1.0<
[plustek] Decoding option >redGamma<
[plustek] >option greenGamma       1.0<
[plustek] Decoding option >greenGamma<
[plustek] >option blueGamma        1.0<
[plustek] Decoding option >blueGamma<
[plustek] >option grayGamma        1.0<
[plustek] Decoding option >grayGamma<
[plustek] ><
[plustek] >#<
[plustek] ># to enable TPA (EPSON or UMAX, if autodetection fails)<
[plustek] ># 0 means default behaviour as specified in the internal tables<
[plustek] ># 1 means enable (needed for UMAX 3450)<
[plustek] >option enableTPA 0<
[plustek] Decoding option >enableTPA<
[plustek] ><
[plustek] >#<
[plustek] ># model override functionality, currently only available for<
[plustek] ># Mustek devices, using NSCs' vendor ID: 0x0400 and<
[plustek] ># also their product ID: 0x1000 (LM9831) 0x1001 (LM9832)<
[plustek] >#<
[plustek] ># mov/PID    |    0x1000   |   0x1001<
[plustek] ># ---------------------------------------<
[plustek] ># 0 (default)| BearPaw1200 | BearPaw 2400<
[plustek] ># 1          |   ignored   | BearPaw 1200<
[plustek] >#<
[plustek] >option mov 0<
[plustek] Decoding option >mov<
[plustek] ><
[plustek] >#<
[plustek] ># and of course the device-name<
[plustek] >#<
[plustek] ># device /dev/usbscanner<
[plustek] >device auto<
[plustek] Decoding device name >auto<
[plustek] ><
[plustek] >#<
[plustek] ># to define a new device, start with a new section:<
[plustek] ># [usb]<
[plustek] >#<
[plustek] attach (auto, 0x7ffeffed9fa0, (nil))
[plustek] Device configuration:
[plustek] device name  : >auto<
[plustek] USB-ID       : ><
[plustek] model ovr.   : 0
[plustek] warmup       : -1s
[plustek] lampOff      : 300
[plustek] lampOffOnEnd : yes
[plustek] cacheCalData : no
[plustek] altCalibrate : no
[plustek] skipCalibr.  : no
[plustek] skipFine     : no
[plustek] skipFineWhite: no
[plustek] skipDarkStrip: no
[plustek] incDarkTarget: yes
[plustek] invertNegs.  : no
[plustek] dis.Speedup  : no
[plustek] pos_x        : 0
[plustek] pos_y        : 0
[plustek] pos_shading_y: -1
[plustek] neg_x        : 0
[plustek] neg_y        : 0
[plustek] neg_shading_y: -1
[plustek] tpa_x        : 0
[plustek] tpa_y        : 0
[plustek] tpa_shading_y: -1
[plustek] red gain     : -1
[plustek] green gain   : -1
[plustek] blue gain    : -1
[plustek] red offset   : -1
[plustek] green offset : -1
[plustek] blue offset  : -1
[plustek] red lampoff  : -1
[plustek] green lampoff: -1
[plustek] blue lampoff : -1
[plustek] red Gamma    : 1.00
[plustek] green Gamma  : 1.00
[plustek] blue Gamma   : 1.00
[plustek] gray Gamma   : 1.00
[plustek] ---------------------
[plustek] usbDev_open(auto,) - 0x55e6fbc6e5a0
[plustek] Vendor ID=0x04A9, Product ID=0x2220
[plustek] usbio_DetectLM983x
[plustek] usbio_DetectLM983x: found LM9832/3
[plustek]  * setting device to idle state!
[plustek] Detected vendor & product ID: 0x04A9-0x2220
[plustek] Device description for >0x04A9-0x2220< found.
[plustek] usb_initDev(43,0x04a9,-1)
[plustek] Device WAF  : 0x00004002
[plustek] Transferrate: 1000000 Bytes/s
[plustek] Device Flags: 0x00000000
[plustek] Vendor adjusted to: >Canon<
[plustek] LAMP-STATUS: 0x00000000 (off)
[plustek] RESETTING REGISTERS(-1) - 0x80
[plustek] MISC I/O after RESET: 0x66, 0x16, 0x91
[plustek] Calibration file-names set to:
[plustek] >/home/manuel/.sane/Canon_CanoScan_LiDE25-coarse.cal<
[plustek] >/home/manuel/.sane/Canon_CanoScan_LiDE25-fine.cal<
[plustek] usb_SetScanParameters()
[plustek] usb_GetMCLKDivider()
[plustek] usb_GetMCLKDiv()
[plustek] * PhyBytes   = 6
[plustek] * PhyLines   = 4
[plustek] * TotalBytes = 24
[plustek] * Scansteps=72 (9*1200/150)
[plustek] usb_SetScanParameters() done.
[plustek] usbDev_getCaps()
[plustek] Scanner information:
[plustek] Vendor : Canon
[plustek] Model  : CanoScan LiDE25
[plustek] Flags  : 0x00000000
[plustek] drvclose()
[plustek] usbDev_stopScan()
[plustek] usbDev_ScanEnd(), start=0, park=0
[plustek] usbDev_close()
[plustek] attach: model = >CanoScan LiDE25<
[plustek] sane_get_devices (0x7ffeffedc120, 0)
[plustek] sane_open - libusb:001:008
[plustek] Presetting Gamma tables (len=4096)
[plustek] * Channel[0], gamma 2.000
[plustek] * Channel[1], gamma 2.000
[plustek] * Channel[2], gamma 2.000
[plustek] * Channel[3], gamma 2.000
[plustek] ----------------------------------
[plustek] sane_start
[plustek] usbDev_open(libusb:001:008,) - (nil)
[plustek] Vendor ID=0x04A9, Product ID=0x2220
[plustek] usbio_DetectLM983x
[plustek] usbio_DetectLM983x: found LM9832/3
[plustek] Detected vendor & product ID: 0x04A9-0x2220
[plustek] Device description for >0x04A9-0x2220< found.
[plustek] usb_initDev(43,0x04a9,43)
[plustek] Device WAF  : 0x00004002
[plustek] Transferrate: 1000000 Bytes/s
[plustek] Device Flags: 0x00000006
[plustek] Vendor adjusted to: >Canon<
[plustek] LAMP-STATUS: 0x00000000 (off)
[plustek] RESETTING REGISTERS(43) - 0x80
[plustek] MISC I/O after RESET: 0x66, 0x16, 0x91
[plustek] usbDev_getCaps()
[plustek] scanmode = 1
[plustek] usbDev_getCropInfo()
[plustek] usb_GetImageInfo()
[plustek] PPL = 1240
[plustek] LPA = 1753
[plustek] BPL = 1240
[plustek] brightness 0, contrast 0
[plustek] usbDev_setScanEnv()
[plustek] usb_SaveImageInfo()
[plustek] * dwFlag = 0x00000400
[plustek] usb_GetImageInfo()
[plustek] * Preview Mode NOT set!
[plustek] Setting map[3] at 0x55e6fbcf7254
[plustek] usbDev_startScan()
[plustek] LAMP-STATUS: 0x00000000 (off)
[plustek] Switching Lamp on
[plustek] Warmup-Timer started
[plustek] LAMP-STATUS: 0x00000001 (on)
[plustek] Lamp-Timer stopped
[plustek] dwflag = 0x40000400 dwBytesLine = 1240
[plustek] Lines          = 1753
[plustek] Bytes per Line = 1240
[plustek] Bitdepth       = 8
[plustek] TIME START
[plustek] local_sane_start done
[plustek] reader_process started (as thread)
[plustek] reader_process:starting to READ data (2173720 bytes)
[plustek] buf = 0x7f1864447010
[plustek] usbDev_PrepareScan()
[plustek] sane_start done
[plustek] cano_DoCalibration()
[plustek] #########################
[plustek] usb_SpeedTest(43,1000000)
[plustek] GETMCLK[10/1], using entry 8: 12.000, 1200
[plustek] SETMCLK[10/1]: 12.000
[plustek] usb_SetScanParameters()
[plustek] usb_GetMCLKDivider()
[plustek] usb_GetMCLKDiv()
[plustek] * PhyBytes   = 30606
[plustek] * PhyLines   = 1
[plustek] * TotalBytes = 30606
[plustek] usb_SetScanParameters() done.
[plustek] usb_ScanBegin()
[plustek] usb_DownloadShadingData(1)
[plustek] usb_ScanBegin() done.
[plustek] usb_IsDataAvailableInDRAM()
[plustek] Data is available
[plustek] usbDev_ScanEnd(), start=1, park=0
[plustek] usb_SetScanParameters()
[plustek] usb_GetMCLKDivider()
[plustek] usb_GetMCLKDiv()
[plustek] * PhyBytes   = 30606
[plustek] * PhyLines   = 1
[plustek] * TotalBytes = 30606
[plustek] usb_SetScanParameters() done.
[plustek] usb_ScanBegin()
[plustek] usb_DownloadShadingData(1)
[plustek] usb_ScanBegin() done.
[plustek] usb_IsDataAvailableInDRAM()
[plustek] Data is available
[plustek] usbDev_ScanEnd(), start=1, park=0
[plustek] usb_SetScanParameters()
[plustek] usb_GetMCLKDivider()
[plustek] usb_GetMCLKDiv()...

Hope that helps a little bit Manuel

Gelb answered 10/2, 2018 at 20:11 Comment(2)
Already did all that and I will publish soon on github my reverse engineering code generator, even tried to compile Sane with emscripten and that's the hard part since I hit the limitations of emscripten. So actually the issue seems to be with webusb chrome implementation itself so still looking.Fusil
@Fusil I tried the compilation with emscripten aswell with the same results: github.com/ManuelB/sane-backend-emscripten did not work as expected :-(Gelb
C
-1

I'm hoping this will be helpful, though it's not a direct answer to the question.

After spending a lot of time trying to get WebUSB to work try researching other options, I found a solution that works well for my web app. Simply use scanimage to scan to the server. The client sends and AJAX request, the server builds a command string to run with shell_exec in PHP, then use file_get_contents or whatever with the scanned image. In my situation, there's no reason for the scanner to talk to the client, since the image is going to end up in a database on the server anyway.

See also: Browser based document scanning

Cigar answered 31/7, 2020 at 20:5 Comment(2)
Sorry this could be an option only if the scanner is attached to the server, which is not always the case. Usually the scanner is attached to the client, and that's why I was trying WebUSB...Fusil
Okay. It is still sometimes the case. Especially if you have a networked scanner, you could have the scanner on the client's desk but still have the server connect to it.Cigar
M
-1

I am sorry I didn't see this question earlier. I have built the scanner (actually dual scanner) and it works VIA web interface: https://www.codemacs.com/other/anything/sane-on-freebsd-connecting-two-scanners-control-via-html.2314971.htm Single scanner is even easier.

Marleah answered 13/2, 2021 at 4:5 Comment(3)
Thanks Chris, as you mentioned your solution require Sane installed on the client side, which is not what we are looking for here.Fusil
Nope, sane is on a server side. Client could be anyone with browser and JS enabled (which is almost 100% of clients) .Marleah
I have a case of multiple clients having each one a scanner on the client side, so a server side solution could not help.Fusil

© 2022 - 2024 — McMap. All rights reserved.