Creating a Bonjour AirPrint service in iOS device

2019-03-30 07:27发布

问题:

So I figured out that to publish (announce the service) to an iOS device as a printer, I use NSNetService and set the type to _ipp._tcp.

But in order to be recognized as an AirPrint printer the requirements include:

  • AirPrint uses IPP for print management.
  • AirPrint listens to mDNS (Bonjour/Avahi) for printer discovery.
  • AirPrint requires a _universal subtype to be present in the _ipp announcement before it will consider listing the printer.
  • AirPrint requires an additional TXT record, "URF", to be present and non-empty before it will consider listing the printer.
  • While this URF format (see below) appears to be a future option for Apple, all current AirPrint-enabled apps seem to send print data as PDF.
  • When a printer is protected by a username/password, the iTunes/AirPrint daemon will send a TXT record "air=username,password".

Source

So I am trying to figure out how to publish the subtype and publish the TXT record under NSNetService which I haven't been able to do. Anyone have any ideas?

回答1:

This link tells you how to configure avahi to allow access to your printer.



回答2:

Try this article, it is easy to follow and the author responds to blog posts: http://sybaspot.com/configuring-dns-to-share-bonjour-printers-across-subnets-and-vlans-including-airprint-for-ios/



回答3:

Since you do not even show a starting point or stub of your code so far, here is a different hint: you can simulate a valid, working AirPrint service announcement in your local LAN/WLAN, which will allow your iOS clients to successfully print to an existing printer (AirPrint or not).

Requirements: a Mac with OS X.

Once you got this working, you can now use something like Wireshark or tcpdump to capture the packages on the wire or from the air and save and analyse them.

Then start coding your own application and make it so that it emits the same packages as the simulation.


The following is known to work on OS X Yosemite (10.10.x).

Assuming,...

  • you have a Mac(Book) running OS X,
  • this Mac's hostname is mymac,
  • its IP address is 192.168.111.111,
  • it has a shared printer installed named abcd (does NOT need to be AirPrint-capable!), and
  • the printer share requires no authentication (put DefaultAuthType none into /etc/cups/cupsd.conf),

...then you can make the abcd queue available to iOS clients.

To test this, just execute the following command in a Terminal.app window (attention, the command will not return -- if you close the Terminal.app window, the effect of the command will be gone!):

 dns-sd                 \
   -P AirPrint-abcd     \
   _ipp._tcp,_universal \
   local.               \
   631                  \
   mymac.local.         \
   192.168.111.111      \
         pdl="application/pdf,image/urf"    \
         kind="document"                    \
         priority="1"                       \
         product="Model Name of my Printer" \
         rp="printers/abcd"                 \
         URF="DM3"                          \
         Duplex="T"                         \
         Color="T"                          \
         note="Testing AirPrint via MacBook"\
         txtvers="1"                        \
         qtotal="1"                         \
         printer-type="0x0480FFFC"          \
         printer-state="3"                  \
         air="none"                         \
         UUID="54321abc-1234-1234-abcd-1238e4babcd8"

If this works (as it should), you can easily come up with a script or cron job which executes this command (and lets it run in the background) every time the Mac is booted up. This is left as an exercise to the reader.

(You could run this very same command unchanged even from a second, completely different Mac, if the first Mac is providing the shared print queue and all the details above match the first Mac's settings...)


Background info:

The dns-sd command line utility is meant as a testing and development tool for everybody poking into Bonjour, mDNS (multicast DNS) and DNS-SD (DNS-based Service Discovery). It is part of every OS X system since Bonjour came to life.

The -P parameter to dns-sd will make a Bonjour "proxy announcement" to your local LAN/WLAN. The announcement will tell potential AirPrint clients the following info:

  • There is an AirPrint device available in your .local. domain.
  • Its name is Airprint-abcd.
  • It can be reached via IP address 192.168.111.111 and port 631.
  • Use the print queue name of printers/abcd to print to it.
  • It can consume PDF and URF raster documents.
  • It does not need authentication.
  • It can output duplex and color documents.

For details about this utility see man dns-sd. For more background, see dns-sd.org and these other answers.