2016-06-07 3 views
1

J'essaie d'utiliser mon téléphone Android comme une imprimante. J'utilise ServerSocket pour recevoir le document à imprimer. Si j'ajoute mon téléphone en tant qu'imprimante IP en fournissant l'adresse IP et le port et que je sélectionne Imprimante PostScript générique, je peux recevoir le fichier au format ps correctement. Je ne veux pas ajouter mon téléphone comme imprimante comme imprimante IP. Alors maintenant, j'utilise NsdManager pour enregistrer mon appareil en tant qu'imprimante. Il est automatiquement reconnu comme imprimante Bonjour et je peux ajouter avec succès en tant qu'imprimante. Mais maintenant, chaque fois que j'imprime un document à partir d'un ordinateur, je reçois ces données dans le flux d'entrée du socket.Bonjour (IPP) vs Jetdirect-Socket Imprimante

POST/HTTP/1.1 Content-Length: 673 Content-Type: application/ipp Host: 
Android-2.local:9200 User-Agent: CUPS/2.1.0 (Darwin 15.2.0; x86_64) 
IPP/2.0 Expect: 100-continue Gattributes-charsetutf-8Hattributes- 
natural-languageen-usEprinter-uriipp://Android- 
2.local.:9200/Drequested-attributescompression-supportedDcopies- 
supportedDcups-versionDdocument-format-supportedD marker-colorsDmarker- 
high-levelsD marker-levelsDmarker-low-levelsDmarker-messageDmarker- 
namesDmarker-typesDmedia-col-supportedD$multiple-document-handling- 
supportedDoperations-supportedDprint-color-mode-supportedD printer- 
alertDprinter-alert-descriptionDprinter-is-accepting-jobsD printer- 
mandatory-job-attributesD printer-stateDprinter-state-messageDprinter- 
state-reasons 

J'ai lu la documentation IPP et je vous envoie 100 Continuer dans la réponse et tous les params nécessaires comme celui-ci

clientSocket.setTcpNoDelay(true); 
BufferedOutputStream out = new BufferedOutputStream(clientSocket.getOutputStream()); 
out.write("HTTP/1.1 100\r\n".getBytes("UTF-8")); 
out.write("\r\n".getBytes("UTF-8")); 
out.write("compression-supported: \"none\"\r\n".getBytes("UTF-8")); 
out.write("printer-is-accepting-jobs: \"true\"\r\n".getBytes("UTF-8")); 
..... 
.... 
out.flush(); 

Après que si je tente de lire le flux d'entrée pour le document, il donne null et sur mon ordinateur je reçois le message "Impression: Connecté à l'imprimante" mais si out.close(); pour fermer le flux de sortie pour le socket Je reçois le message "impossible d'obtenir le statut de l'imprimante" sur mon ordinateur. S'il vous plaît aidez-moi. Est-il possible que je reçoive simplement le document et pas cette demande de poste ou moyen d'envoyer une réponse correcte et obtenir le document? Je suis coincé avec cela depuis assez longtemps maintenant. Toute aide est grandement appréciée.

+0

Quelle est votre utilisation? Qu'essayez-vous d'accomplir? Que va-t-il se passer avec le post-scriptum une fois que votre application l'aura reçu? –

+0

@PeterKandinsky J'essaie d'utiliser mon android pour garder tous les documents que j'imprime pendant la journée. J'annonce mon périphérique en utilisant NSDManager en utilisant le type de service "_ipp._tcp". . Je cherche la compréhension d'IPP. J'ai regardé la documentation officielle, ça n'a pas beaucoup aidé. Si vous pouviez m'aider à comprendre la communication entre l'imprimante et mon ordinateur, ce serait génial. – Zartha

+0

suggestion pour votre utilisation "conserver les documents sur le téléphone": il suffit de copier les documents (par exemple en format pdf ou n'importe quel format de votre application mobile) sur votre téléphone. Vous pouvez utiliser un lecteur de cloud comme Dropbox ou une application qui prend en charge le partage de fichiers via FTP, SMB ou WEBDAV si vous n'aimez pas copier via USB. –

Répondre

1

J'ai finalement pu l'implémenter. Voici une excellente implémentation pour l'imprimante réseau utilisant Node.js. Il explique les détails de IPP https://github.com/watson/ipp-printer

également cette vidéo est bonne démonstration https://www.youtube.com/watch?v=58Ti8w1yX2w

Et je me sers https://github.com/NanoHttpd/nanohttpd pour gérer les demandes d'impression sur mon téléphone Android.

+1

***/Part1: *** J'ai voté votre (propre) réponse à la question - même si à mon humble avis vous utilisez "le mauvais outil pour le travail". IPP fournit une communication bidirectionnelle entre le client d'impression et le service d'impression (en interrogeant les capacités spécifiques du service en matière d'impression couleur ou recto-verso ou d'agrafage/perforation sur la surveillance de l'avancement des travaux lors de l'impression ou des requêtes d'historique d'impression. arrêt/pause/reprise/création/suppression de files d'attente spécifiques). –

+0

***/Part2: *** Mais votre cas d'utilisation ne nécessite même pas de telles capacités. Pour ce que vous voulez, un type de service de '_pdl-datastream._tcp' serait assez bon: *" tirer (données au port 9100) et oublier "*. Beaucoup plus simple, beaucoup plus facile à développer et à entretenir .... –

+0

@KurtPfeifle Merci – Zartha

1

Votre ordinateur/CUPS (Mac avec El Capitain je suppose) essaie d'imprimer via IPP, mais votre téléphone-imprimante-périphérique n'implémente pas IPP. Évidemment, ça ne va pas marcher.

Solution 1:

ajouter l'imprimante à CUPS avec la configuration correcte. pour les imprimantes réseau CUPS offre:

  • IPP - http
  • IPP - https
  • IPP - ipp
  • IPP - RRI
  • DPL/LPR-hôte
  • imprimante Windows via spoolss
  • AppSocket/HP JetDirect

la sélection dépend du procotol que vous avez implémenté ou que vous envisagez de prendre en charge dans votre application. IPP n'est pas une option pour vous, sauf ...

Solution 2:

Mettre en oeuvre IPP dans votre "Print-serveur App". Ça va être dur!

Il y a beaucoup de choses à mettre en œuvre ... voir https://www.pwg.org/ipp/

Solution 3:

correctement votre service annoncer via Bonjour Printing 1.2

_pdl-datastream._tcp devrait être le type de service correct. (voir également chapitre 7.6, Nommer Flagship)