Skip to content

zippo34all-lab/air-printer-link

Repository files navigation

Air Printer Link

Лёгкое нативное Windows-приложение, которое делает локальные принтеры, подключённые к ПК, доступными для печати с iPhone/iPad по AirPrint и Android через IPP Everywhere/Mopria по Wi-Fi. Написан с нуля на открытых стандартах — проприетарный код не используется.

  • DNS-SD / Bonjour (RFC 6763) — обнаружение принтера в сети;
  • IPP (RFC 8011) — приём задания печати;
  • рендеринг документа (PDF / Apple Raster URF / PWG Raster / JPEG / PNG) в спулер Windows.

Скриншот

Архитектура

Компонент Что делает
AirPrintLink.Service (Windows-служба) Kestrel IPP-сервер на TCP 631; managed-mDNS (Makaretu) с фолбэком на Apple Bonjour; конвейер рендера PDF/URF/JPEG/PNG → спулер; named-pipe IPC-сервер
AirPrintLink.App (приложение с треем) Безрамочное окно + WebView2; значок и меню в трее; мост JS↔.NET → named-pipe клиент
webui/ HTML/CSS/React-интерфейс (офлайн, локальные React + шрифты)
AirPrintLink.Core IPP-кодек, AirPrint TXT, mDNS, рендер/спул, URF-декодер, конфиг, контракты IPC

Конфиг: %ProgramData%\AirPrintLink\config.json. IPC: \\.\pipe\AirPrintLink.

Анонсируются только физические LAN-интерфейсы (Ethernet/Wi-Fi). Адреса VPN-туннелей (tun/tap/WireGuard/Tailscale) и виртуальных адаптеров (VirtualBox, Hyper-V, vEthernet) исключаются — иначе iPhone резолвит принтер в недостижимый адрес и считает его «отключённым».

Сборка и запуск (разработка)

dotnet build AirPrintLink.sln -c Debug

# 1) Откройте фаервол для dev-порта (один раз, от администратора):
scripts\dev-firewall.ps1 -Port 6310

# 2) Служба на dev-порту (чтобы не конфликтовать с другими AirPrint-серверами на 631)
$env:AIRPRINTLINK_PORT = '6310'
dotnet run --project src/AirPrintLink.Service

# 3) В другом окне — приложение
dotnet run --project src/AirPrintLink.App

Тесты: dotnet test tests/AirPrintLink.Core.Tests

Дистрибутив и установка

scripts\publish.ps1        # ставит штамп сборки + self-contained сборка в .\dist
scripts\build-msi.ps1      # MSI в .\dist (нужен WiX v5, см. шапку скрипта)

# Установка (от администратора): через MSI…
msiexec /i dist\AirPrinterLink-0.2.2.msi
# …или скриптом
scripts\install.ps1        # служба + фаервол (TCP 631 / UDP 5353, все профили) + ярлык
scripts\uninstall.ps1

Требуется среда выполнения Edge WebView2 (есть на всех Windows 11).

Использование

  1. Откройте Air Printer Link → вкладка Принтеры, включите тумблер у нужного принтера.
  2. На iPhone/iPad в той же Wi-Fi: «Поделиться» → «Печать» → выберите принтер.
  3. На Android: включите системную службу печати / Mopria Print Service и выберите принтер в диалоге печати.

Если iPhone видит принтер, но пишет «принтер отключён»

Это значит, что обнаружение (mDNS) работает, а TCP-соединение до IPP-сервера не проходит:

  1. Фаервол: входящий TCP-порт службы должен быть открыт. При установке через MSI/install.ps1 правила создаются автоматически; для dev-запуска выполните scripts\dev-firewall.ps1 -Port <порт> от администратора.
  2. VPN/виртуальные адаптеры: исключаются автоматически. Убедитесь, что ПК и iPhone в одной подсети (в шапке приложения должен показываться адрес вида Wi-Fi · 192.168.x.x, а не tun0 · …).
  3. Порт 631 занят другим AirPrint-сервером (например, Flyingbee): Stop-Service AirPrint.
  4. mDNS не ходит между подсетями/VLAN без рефлектора — тестируйте в одной L2-сети.

Диагностика без iPhone:

dns-sd -B "_ipp._tcp,_universal"      # анонс виден? (именно этот сабтип ищет iOS)
dns-sd -B "_ipp._tcp,_print"          # IPP Everywhere / Android
dns-sd -L "<имя принтера>" _ipp._tcp  # TXT-записи

Замечания

  • Кириллица в именах: managed-mDNS умеет только ASCII — имена транслитерируются (Кабинет → Kabinet). Для полного UTF-8 переключите механизм mDNS на Bonjour в Настройках.
  • Служба видит машинные принтеры; принтеры «только для пользователя» не видны.
  • Смена порта/механизма mDNS применяется после перезапуска службы.

Автор и лицензия

Автор: Denis Kulakov. Распространяется по лицензии MIT (см. LICENSE) — свободное использование, изменение и распространение с сохранением уведомления об авторстве. Программа предоставляется «как есть», без каких-либо гарантий.

Товарные знаки: AirPrint®, iPhone® и iPad® — товарные знаки Apple Inc., зарегистрированные в США и других странах. Air Printer Link — независимый проект: он не аффилирован с Apple Inc., не спонсируется и не одобрен ею; название AirPrint используется исключительно для указания совместимости с этой технологией (номинативное использование). Windows® — товарный знак Microsoft Corporation.

Технологии

.NET 8 (net8.0-windows) · ASP.NET Core / Kestrel · Makaretu.Dns · Windows.Data.Pdf · System.Drawing.Printing · WebView2 · WiX v5.

About

Share local Windows printers to iPhone/iPad (AirPrint) and Android (IPP Everywhere/Mopria) over Wi-Fi

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages