2015年1月25日

HPLIP bb-soap解析 - 3 - bb_start_scan - 上集

前言:
接續前篇,通過整個flow的拆解和bb_open內容的解析,
我們大致可以知道CM1015的溝通過程。

針對bb_start_scan,我考慮分成上、下2集,
上集可以先po,下集我不確定能不能po得成,因為目前還沒有參透。

因此,po的順序會是:
  • bb_start_scan上集 
  • bb_end_page 
  • bb_end_scan
最後再回頭看能不能po得出bb_start_scan。

bb_start_scan和hpmud動作流程:
  • bb_open
    • hpmud_channel_open()
    • hpmud_channel_write()
    • hpmud_channel_write()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_close()
  • bb_start_scan
    • hpmud_channel_open()
    • hpmud_channel_write()
    • hpmud_channel_write()
    • hpmud_channel_write()
    • hpmud_channel_write()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
  • bb_get_parameters
  • bb_get_parameters
  • bb_end_page
    • hpmud_channel_close()
  • bb_end_scan
    • hpmud_channel_open()
    • hpmud_channel_write()
    • hpmud_channel_write()
    • hpmud_channel_write()
    • hpmud_channel_write()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_read()
    • hpmud_channel_close()
      • bb_close
      • bb_unload
      這裡我們注意到紅字標示的部份,也就是hpmud_channel_open/hpmud_channel_close的部份。

      我們會發現,bb_start_scan和其他幾個bb function的特異之處,
      bb_start_scan只有做hpmud_channel的open,但並沒有close,
      它實際的close動作是到bb_end_page才做。

      bb_start_scan溝通內容:
      照例,我們打印出bb_start_scan的溝通內容,bb_start_scan有4個write,和一堆read,
      上集我們只印出前面3個,
      後面的我還看不懂,而且內容大部分應該是掃描出的圖片內容,
      我就不列了。

      內容:
      write:
      cat hpmud_write_channel_3.dump
      POST / HTTP/1.1
      Host: http:0
      User-Agent: gSOAP/2.7
      Content-Type: application/soap+xml; charset=utf-8
      Transfer-Encoding: chunked
      Connection: close
      
      

      cat hpmud_write_channel_4.dump
      54f

      cat hpmud_write_channel_5.dump
      <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wscn="http://tempuri.org/wscn.xsd"><SOAP-ENV:Body><wscn:InitiateScanRequest><ScanTicket><JobDescription><JobName>scanjob 10153</JobName><JobOriginatingUsername>Eric Cartman</JobOriginatingUsername></JobDescription><DocumentParameters><Format>scanJFIF</Format><InputSource>scanPlaten</InputSource><ContentType>scanAuto</ContentType><DocumentCompression><CompressionType>scanJPEG</CompressionType><JPEGQualityFactor>10</JPEGQualityFactor></DocumentCompression><Contrast>0</Contrast><Brightness>0</Brightness><ScanRegion><ScanRegionXOffset>0</ScanRegionXOffset><ScanRegionYOffset>0</ScanRegionYOffset><ScanRegionWidth>8499</ScanRegionWidth><ScanRegionHeight>11689</ScanRegionHeight></ScanRegion><ColorProcessing>scanGrayScale8</ColorProcessing><Resolution><ResolutionWidth>75</ResolutionWidth><ResolutionHeight>75</ResolutionHeight></Resolution><PadImage>true</PadImage><GammaCorrection>2.2</GammaCorrection></DocumentParameters></ScanTicket><DestinationID>PC</DestinationID><ScanIdentifier>linux-rocks</ScanIdentifier></wscn:InitiateScanRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>

      cat hpmud_write_channel_6.dump
      0
      
      

      read:
      cat hpmud_read_channel_5.dump
      HTTP/1.1 200 OK
      Server: gSOAP/2.7
      Content-Type: application/dime
      Transfer-Encoding: chunked
      Connection: close
      
      

      cat hpmud_read_channel_6.dump
      800
      1.1 200 OK
      Server: gSOAP/2.7
      Content-Type: application/dime
      Transfer-Encoding: chunked
      Connection: close
      
      

      cat hpmud_read_channel_7.dump
       )▒cid:id0http://schemas.xmlsoap.org/soap/envelope/
      
      linux-rocksid1image/jpeg▒▒▒▒JFIF▒▒C
       $.' ",#(7),01444'9=82<.342▒▒
                                  l}▒▒
      
      ...............
      
      HEX表示:

      write解析:
      送給事務機的XML內容訊息很多,原則上就是提供事務機掃描的參數,
      但這邊有幾個訊息是重點,而且有藏彩蛋,哈.....作者還真是幽默啊......

      一堆不好看,我們把這串另存成XML,用瀏覽器打開看看,如下:

      這裡注意到,裡面除了掃描資訊外,有幾個重點:
      • JobName
      • JobOriginatingUsername
      • DestinationID
      • ScanIdentifier
      這幾條看起來並不像是掃描參數,其中JobName是關鍵,會在後面其他function使用到。

      作者的幽默感來自於JobOriginatingUsername的名稱Eric Cartman,這是誰?
      是作者本人嗎?還是描述什麼?Google看看......
      Google找到他......

      read解析:
      read的內容我還沒搞懂,把目前知道的部份po出來。

      我們從SOAP的HTTP Header理解,從Content-Type: application/dime來看,
      我們可以知道這是一個application/dime類型的資料,
      Google後得知,SOAP有2種夾帶附件的資料格式:
      • MIME
      • DIME
      這裡使用了SOAP DIME做為傳遞的資料格式。

      目前我對SOAP DIME還不清楚,還在解譯中,僅把我找到的參考資料列出,
      其他等解譯後,下集再寫。

      SOAP DIME參考:

      JPEG格式參考:
      http://en.wikipedia.org/wiki/JPEG_File_Interchange_Format
      http://bbs.csdn.net/topics/190036200
      上述2個JPEG參考可以知道,JPEG Header的最開頭是
      FF D8 FF E0
      • FF D8
        • 表示圖片開頭
      • FF E0
        • 表示JPEG APP0的開頭

      沒有留言: