# ipp-server **Repository Path**: FEIGE/ipp-server ## Basic Information - **Project Name**: ipp-server - **Description**: php ipp server - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-19 - **Last Updated**: 2026-06-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IPP Server - 基于Workerman的IPP打印服务器 支持58mm和80mm热敏打印机的IPP (Internet Printing Protocol) 服务器,基于PHP Workerman构建。 **IPP协议基于HTTP**:IPP请求通过HTTP POST发送,Content-Type为`application/ipp`。 ## 功能特性 - **IPP协议支持**:完整的IPP 1.1/2.0协议实现(基于HTTP) - **ESC/POS转换**:自动将打印数据转换为ESC/POS指令 - **双纸张支持**:支持58mm和80mm热敏打印机 - **二维码/条形码**:支持打印二维码和多种条形码 - **多格式支持**:支持JSON、纯文本、PDF、图片等格式 - **Web界面**:浏览器访问可查看打印机信息和使用指南 - **高性能**:基于Workerman,支持高并发 - **异步处理**:非阻塞IO,处理效率高 ## 环境要求 - PHP >= 7.2 - PHP扩展:pcntl, posix, mbstring - Workerman >= 4.1 - Composer ## 安装 ### 1. 安装依赖 ```bash composer install ``` ### 2. 启动服务器 ```bash # 前台启动(调试模式) php start.php start # 后台守护进程启动 php start.php start -d # 停止服务器 php start.php stop # 重启服务器 php start.php restart # 查看状态 php start.php status ``` 启动后会显示: ``` IPP Server started on http://0.0.0.0:631 IPP URLs: - http://localhost:631/ipp/print (default 80mm) - http://localhost:631/ipp/print/58mm - http://localhost:631/ipp/print/80mm ``` ### 3. 浏览器访问 在浏览器中打开 `http://localhost:631` 或 `http://服务器IP:631`,可查看: - 可用打印机列表 - Windows添加打印机指南 - 支持的操作和格式 ### 4. 配置 服务器默认配置: - 监听地址:`0.0.0.0:631` - 默认纸张:`80mm` - 工作进程:4个 可在 `start.php` 中修改配置: ```php $worker = new Worker('tcp://0.0.0.0:631'); $worker->count = 4; // 工作进程数 ``` ## 使用方法 ### IPP协议操作 服务器支持以下IPP操作: | 操作码 | 操作名称 | 说明 | |-------|---------|------| | 0x0002 | Get Printer Attributes | 获取打印机属性 | | 0x0004 | Print Job | 提交打印任务 | | 0x0005 | Get Job Attributes | 获取任务属性 | | 0x0006 | Cancel Job | 取消打印任务 | | 0x0007 | Get Jobs | 获取任务列表 | | 0x0008 | Pause Printer | 暂停打印机 | | 0x0009 | Resume Printer | 恢复打印机 | | 0x000B | Validate Job | 验证任务 | ### 打印数据格式 #### 方式一:JSON格式(推荐) ```json [ {"type": "title", "content": "收据", "bold": true, "double": true}, {"type": "divider", "char": "-"}, {"type": "columns", "cols": ["商品", "数量", "价格"]}, {"type": "divider", "char": "-"}, {"type": "columns", "cols": ["可乐", "1", "¥3.00"]}, {"type": "columns", "cols": ["薯片", "2", "¥10.00"]}, {"type": "divider", "char": "-"}, {"type": "text", "content": "合计: ¥13.00", "align": "right", "bold": true}, {"type": "newline", "count": 1}, {"type": "qrcode", "data": "https://example.com/order/123", "size": 6}, {"type": "cut"} ] ``` #### 方式二:纯文本格式 ``` ===收据标题=== --- 商品名称::价格 可乐::¥3.00 薯片::¥5.00 --- **总计:¥8.00** --- 谢谢惠顾! ``` 支持的标记: - `===标题===` - 居中粗体标题 - `---` - 分割线 - `**文本**` - 粗体文本 - `左::右` - 双列布局 ### 代码示例 #### 直接使用ESCPOS类 ```php require_once __DIR__ . '/vendor/autoload.php'; use IPP\Server\ESCPOS; $escpos = new ESCPOS(); // 设置纸张大小 (58 或 80) $escpos->setPaperSize(ESCPOS::PAPER_80MM); // 生成指令 $cmd = $escpos->init(); $cmd .= $escpos->title('收据', true, true); $cmd .= $escpos->divider('-'); $cmd .= $escpos->twoColumns('商品', '¥10.00'); $cmd .= $escpos->twoColumns('数量', '1'); $cmd .= $escpos->divider('='); $cmd .= $escpos->qrCode('https://example.com', 8); $cmd .= $escpos->cut(); // 发送至打印机 // file_put_contents('/dev/usb/lp0', $cmd); ``` #### 使用IPPServer处理IPP请求 ```php require_once __DIR__ . '/vendor/autoload.php'; use IPP\Server\IPPServer; use IPP\Server\ESCPOS; $server = new IPPServer(); // 处理打印请求 $ippRequest = $ippData; // IPP协议数据 $response = $server->handleRequest($ippRequest); // 获取转换后的ESC/POS指令 $escposData = $server->getESCPOSOutput(); ``` ## ESC/POS指令参考 ### 基础方法 | 方法 | 说明 | |-----|------| | `init()` | 初始化打印机 | | `text($str)` | 打印文本 | | `textLine($str)` | 打印文本并换行 | | `lineFeed($n)` | 换行n次 | | `cut($partial)` | 切纸(可选半切) | ### 格式控制 | 方法 | 说明 | |-----|------| | `setAlign(0/1/2)` | 设置对齐:0=左, 1=中, 2=右 | | `setBold(true/false)` | 设置粗体 | | `setUnderline(true/false)` | 设置下划线 | | `setReverse(true/false)` | 设置反转打印 | | `setFontSize($size)` | 设置字体大小 (0-3) | ### 布局方法 | 方法 | 说明 | |-----|------| | `title($text, $bold, $double)` | 居中标题 | | `divider($char)` | 分割线 | | `twoColumns($left, $right)` | 双列布局 | | `threeColumns($c1, $c2, $c3)` | 三列布局 | ### 特殊功能 | 方法 | 说明 | |-----|------| | `qrCode($data, $size)` | 打印二维码 | | `barcode($data, $type, $w, $h)` | 打印条形码 | | `openCashDrawer()` | 打开钱箱 | | `beep($times, $duration)` | 蜂鸣提示 | | `image($imageData)` | 打印图片 | ### 条形码类型 | 类型 | 格式 | |-----|------| | 73 | CODE39 | | 69 | EAN13 | | 67 | EAN8 | | 65 | CODE128 | | 72 | QR Code | ## 打印机配置 ### 58mm热敏打印机 - 纸张宽度:58mm - 每行字符数:约32字符 - 适合:小票、收据、标签 ### 80mm热敏打印机 - 纸张宽度:80mm - 每行字符数:约48字符 - 适合:发票、详细收据、多列清单 ## 示例文件 - [examples/print_example.php](examples/print_example.php) - 完整的ESCPOS使用示例 运行示例: ```bash php examples/print_example.php ``` ## 测试IPP请求 使用 `curl` 测试IPP服务器: ```bash # 获取打印机属性 curl -X POST http://localhost:631/ipp/printer \ -H "Content-Type: application/ipp" \ -d @request.bin # 提交打印任务 curl -X POST http://localhost:631/ipp/print \ -H "Content-Type: application/ipp" \ -d @print_request.bin ``` ## 项目结构 ``` ipp-server/ ├── composer.json # Composer配置 ├── start.php # 服务启动入口 ├── src/ │ └── Server/ │ ├── IPPServer.php # IPP服务器核心 │ └── ESCPOS.php # ESC/POS指令生成器 └── examples/ └── print_example.php # 使用示例 ``` ## 常见问题 ### Q: 服务器无法启动? 检查PHP版本和扩展: ```bash php -v php -m | grep -E "pcntl|posix|mbstring" ``` ### Q: 打印数据乱码? 确保数据编码为UTF-8,ESC/POS类会自动处理编码转换。 ### Q: 二维码/条形码无法扫描? - 确保数据量在打印机支持范围内 - 调整二维码大小 (`size` 参数) - 调整条形码宽度和高度 ### Q: 打印机无响应? 检查: 1. 打印机连接(USB/网络/蓝牙) 2. 打印机驱动 3. 端口权限 ## License MIT License ## 作者 IPP Server Team ## 版本 v1.0.0