我在 iOS 上,我正在尝试发送 HTTP POST 请求以通过充当 IPP 服务器的 Mac 在打印机上创建打印作业。我可以使用 airprint 正确打印,我现在正在尝试低级打印,因为我需要将原始数据发送到打印机。
关于我的代码的一些事情:
一切都是硬编码的。我仍在试图找出我哪里出错了,所以我只是处于开发/测试阶段。第一部分是关于 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 错误请求响应。
奇怪的是,每当 airprint 打印向 ipp 服务器发送打印作业时,HTTP 请求似乎与我可以使用数据包分析器捕获的请求完全相同(并且它可以工作)。