2012-05-28 132 views
0

我在iOS和我試圖發送一個HTTP POST請求,通過一臺Mac充當IPP服務器上創建一個打印機上的打印作業。我可以使用airprint正確打印,我現在正在嘗試進入低級別,因爲我需要將原始數據發送到打印機。IPP在HTTP:得到400錯誤的請求的響應

關於我的代碼:

一切都是硬編碼的。我仍然在試圖弄清楚我錯了什麼,所以我只是處於開發/測試階段。 第一部分是關於IPP打印作業請求二進制結構的定義(根據RFC 2910規範,它應該是正確的)。

char data[239] = {0x01, 0x01, // IPP version 
    0x00, 0x04, // Print-job request 
    0x00, 0x00, 0x00, 0x50, // Arbitrary request ID 
    0x01, // Attribute group 
    // ATT 1 
    0x47, // charset value-tag 
    0x00, 0x12, // name-length 
    'a','t','t','r','i','b','u','t','e','s','-','c','h','a','r','s','e','t', // name 
    0x00, 0x05, // value-length 
    'u','t','f','-','8', // value 
    // ATT 2 
    0x48, // natural-language value-tag 
    0x00, 0x1B, // name-length 
    'a','t','t','r','i','b','u','t','e','s','-','n','a','t','u','r','a','l','-','l','a','n','g','u','a','g','e', // name      
    0x00, 0x05, // value-length 
    'e','n','-','u','s', // value 
    // ATT 3 
    0x45, // uri type value-tag 
    0x00, 0x0B, // name-length 
    'p','r','i','n','t','e','r','-','u','r','i', // name 
    0x00, 0x47, // value-length 
    'i','p','p',':','/','/','A','n','d','r','e','a','s','-','M','a','c','B','o','o','k','-','P','r','o','-','2','.','l','o','c','a','l','.',':','6','3','1','/','p','r','i','n','t','e','r','s','/','H','P','_','D','e','s','k','j','e','t','_','F','4','5','0','0','_','s','e','r','i','e','s', // value 
    // ATT 4 
    0x42, // requesting user id value-tag 
    0x00, 0x14, // name-length 
    'r','e','q','u','e','s','t','i','n','g','-','u','s','e','r','-','n','a','m','e', // name 
    0x00, 0x05, // value-length 
    'g','u','e','s','t', // value 
    // ATT 5 
    0x49, // document format value-tag 
    0x00, 0x0f, // document format 
    'd','o','c','u','m','e','n','t','-','f','o','r','m','a','t', 
    0x18, // TODO 
    'a','p','p','l','i','c','a','t','i','o','n','/','o','c','t','e','t','-','s','t','r','e','a','m', 
    0x03, // end of attributes 
    't','e','s','t'}; // data 

NSMutableData *printJob = [NSMutableData data]; 
[printJob appendBytes:data length:sizeof(data)]; 
NSString* requestDataLengthString = [[NSString alloc] initWithFormat:@"%d", [printJob length]]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://192.168.1.23:631/printers/HP_Deskjet_F4500_series"]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:requestDataLengthString forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/ipp" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:@"Andreas-MacBook-Pro-2.local" forHTTPHeaderField:@"Host"]; 
[request setValue:@"CUPS/1.5.0" forHTTPHeaderField:@"User-Agent"]; 
[request setValue:@"100-continue" forHTTPHeaderField:@"Expect"]; 
[request setHTTPBody:printJob]; 

[[NSURLConnection connectionWithRequest:request delegate:self] start]; 

每當我運行這段代碼,10秒鐘後,我得到一個HTTP 400錯誤的請求響應。

奇怪的是HTTP請求似乎完全一樣的一個我可以用數據包分析捕捉每當了AirPrint打印發送打印作業的IPP服務器(和它的作品)。

+0

你是否通過代理運行此任何機會?我正在通過代理運行某個類似的問題。 – MikeIsrael

+0

不,我只有一臺路由器,但流量不會從本地網絡中退出。 –

+0

你有沒有意識到將發生任何機會會發送RequestRequestForAuthenticationChallenge?我發現我的問題是,當由於某種原因調用這個方法後,我的身體被抹去了。 – MikeIsrael

回答

1

你必須使用正確的IPP操作代碼打印作業

  • 不正確:0x00, 0x04, // =Validate-job request
  • 正確:0x00, 0x02, // Print-job request

您應該使用文檔格式text/plain代替octet-stream。同時確保打印機支持數據格式,或者至少確保CUPS配置有適當的轉換器(看起來您可以通過CUPS與HP打印機通話)。

不要擔心user-agent,也沒關係。而應該注意你的http協議處理!通過發送Expect: 100-continue你讓CUPS期待chunked http。不要發送Expect-Header,一切都應該沒問題。

確保IPP-請求加上數據長度的長度被正確地計算,並且放入內容長度報頭。

+0

你有沒有任何示例代碼? –

+0

我們的Java示例代碼僅在請求時可用:請聯繫ipp-software.com - 爲我們實現針對Objective-C/iOS的ipp消息編碼器和解碼器不會太困難。 –