{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2019/10/13/privet-cloud-print-developpeurs-google-bien-choisir-son-serveur-d-impression/","llm_html_url":"https://tutos-gameserver.fr/2019/10/13/privet-cloud-print-developpeurs-google-bien-choisir-son-serveur-d-impression/llm","llm_json_url":"https://tutos-gameserver.fr/2019/10/13/privet-cloud-print-developpeurs-google-bien-choisir-son-serveur-d-impression/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"Privet | Cloud Print | Développeurs Google\n\n &#8211; Bien choisir son serveur d impression","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2019-10-13T20:57:02+00:00","modified_at":"2019-10-13T20:57:02+00:00","word_count":10666,"reading_time_seconds":3200,"summary":"Privet est une API de découverte locale d&#39;appareils de nuage utilisée par les services de nuage. Ce document est organisé   dans les sections suivantes: Introduction: introduction à Privet Découverte: mécanismes de découverte locaux Annonces: annonces de découverte locale API: API Privet pour les périphériques cloud généraux API d&#39;imprimante: API Privet utilisées par les imprimantes Annexe: [&hellip;]","summary_points":["Privet est une API de découverte locale d&#39;appareils de nuage utilisée par les services de nuage.","Ce document est organisé\n  dans les sections suivantes:\n\nIntroduction: introduction à Privet\nDécouverte: mécanismes de découverte locaux\nAnnonces: annonces de découverte locale\nAPI: API Privet pour les périphériques cloud généraux\nAPI d&#39;imprimante: API Privet utilisées par les imprimantes\nAnnexe: schémas supplémentaires\n\n1.","Introduction\nLes appareils connectés au cloud présentent de nombreux avantages.","Ils peuvent utiliser les services de conversion en ligne, le travail hôte\n  file d&#39;attente lorsque l&#39;appareil est hors ligne et accessible de partout dans le monde."],"topics":["Serveur d'impression"],"entities":[],"entities_metadata":[{"id":10,"name":"Serveur d'impression","slug":"serveur-dimpression","taxonomy":"category","count":3907,"url":"https://tutos-gameserver.fr/category/serveur-dimpression/"}],"tags":["Serveur d'impression"],"content_hash":"26d94f7324b28e255bbe7a425a9efffc","plain_text":"Privet est une API de découverte locale d&#39;appareils de nuage utilisée par les services de nuage. Ce document est organisé\n  dans les sections suivantes:\n\nIntroduction: introduction à Privet\nDécouverte: mécanismes de découverte locaux\nAnnonces: annonces de découverte locale\nAPI: API Privet pour les périphériques cloud généraux\nAPI d&#39;imprimante: API Privet utilisées par les imprimantes\nAnnexe: schémas supplémentaires\n\n1. Introduction\nLes appareils connectés au cloud présentent de nombreux avantages. Ils peuvent utiliser les services de conversion en ligne, le travail hôte\n  file d&#39;attente lorsque l&#39;appareil est hors ligne et accessible de partout dans le monde. Cependant, avec\n  nombreux périphériques accessibles par un utilisateur donné dans le cloud, nous devons fournir une méthode permettant de\n  appareil le plus proche en fonction de l&#39;emplacement. Le protocole Privet a pour objectif de lier la flexibilité des\n  périphériques cloud avec un mécanisme de découverte local approprié, de sorte que les périphériques soient facilement découverts\n  nouveaux environnements.\nLes objectifs de ce protocole sont:\n\nrendre les périphériques cloud détectables localement\nenregistrer des périphériques cloud avec un service cloud\nassocier les appareils enregistrés à leur représentation dans le nuage\nactiver la fonctionnalité hors ligne\nsimplifier la mise en œuvre pour que les petits appareils puissent l&#39;utiliser\n\nLe protocole Privet comprend 2 parties principales: découverte et API. La découverte est utilisée pour trouver le\n  périphérique sur le réseau local, et l’API permet d’obtenir des informations sur le périphérique et\n  effectuer des actions. Tout au long de ce document, l&#39;appareil désigne un appareil connecté au cloud\n  implémenter le protocole Privet.\n2. découverte\nDiscovery est un protocole basé sur zeroconf (mDNS + DNS-SD). Le périphérique DOIT implémenter IPv4 Link-Local\n  Adresser. L&#39;appareil DOIT être conforme aux spécifications mDNS et DNS-SD.\nLe dispositif DOIT effectuer la résolution des conflits de noms conformément aux spécifications ci-dessus.\n2.1. type de service\nLa découverte de service DNS utilise le format suivant pour les types de service:\n  _applicationprotocol._transportprotocol. Dans le cas du protocole Privet, le service\n  type pour DNS-SD devrait être: _privet._tcp\nL&#39;appareil peut également implémenter d&#39;autres types de services. Il est conseillé d&#39;utiliser le même service\n  nom d&#39;instance pour tous les types de services implémentés par le périphérique. Par exemple: une imprimante peut\n  implémentez les services &quot;Imprimante XYZ._privet._tcp&quot; et &quot;Imprimante XYZ._printer._tcp&quot;. Ça va simplifier\n  configuration pour l&#39;utilisateur. Cependant, les clients Privet rechercheront uniquement &quot;_privet._tcp&quot;.\nEn plus du type de service principal, l’appareil DOIT annoncer les enregistrements PTR pour ses\n  sous-type (s) correspondant (voir spéc. DNS-SD: &quot;7.1. Énumération d&#39;instances sélective (sous-types)&quot;).\n  Le format devrait être le suivant:\n  _._sub.privet._tcp\nActuellement, le seul sous-type de périphérique pris en charge est imprimante. Donc, toutes les imprimantes DOIVENT annoncer\n  deux enregistrements PTR:\n\n_privet._tcp.local.\n_printer._sub._privet._tcp.local.\n\n2.2. Enregistrement TXT\nle Découverte du service DNS définit des champs pour ajouter des informations facultatives sur un service dans\n  les enregistrements TXT. Un enregistrement TXT est constitué de paires clé / valeur. Chaque paire clé / valeur commence à partir du\n  longueur octet suivi de 255 octets de texte au maximum. La clé est le texte avant le premier\n  Le caractère &quot;=&quot; et la valeur correspond au texte après le premier caractère &quot;=&quot;\n  jusqu&#39;à la fin. La spécification ne permet aucune valeur dans l&#39;enregistrement, dans ce cas, il n&#39;y aura aucune\n  Caractère &quot;=&quot; OU pas de texte après le caractère &quot;=&quot;. (Voir spéc. DNS-SD:\n  &quot;6.1. Règles générales de format pour les enregistrements DNS TXT&quot; pour le format d&#39;enregistrement DNS TXT et &quot;6.2. DNS-SD TXT\n  Taille d&#39;enregistrement &quot;pour la longueur recommandée).\nPrivet exige que le périphérique envoie les paires clé / valeur suivantes dans l&#39;enregistrement TXT. Valeur clé\n  les chaînes ne respectent pas la casse, par exemple &quot;CS = online&quot; et &quot;cs = ONLINE&quot; sont\n  le même. Les informations contenues dans l&#39;enregistrement TXT DOIVENT être identiques à celles accessibles via l&#39;API / info (voir 4.1.\n  Section API).\nIl est recommandé de conserver une taille d’enregistrement TXT inférieure à 512 octets.\n2.2.1. txtvers\nVersion de la structure TXT. txtvers DOIT être le premier enregistrement de la structure TXT. Actuellement\n  la seule version supportée est 1.\ntxtvers = 1\n2.2.2. ty\nFournit un nom lisible par l&#39;utilisateur du périphérique. Par exemple:\nty = Modèle d&#39;imprimante Google Cloud Ready XYZ\n2.2.3. note (optionnel)\nFournit un nom lisible par l&#39;utilisateur du périphérique. Par exemple:\nnote = Imprimeur de lobby au 1er étage\nRemarque: Ceci est une clé optionnelle et peut être ignorée. Cependant, si présent, l&#39;utilisateur\n  DEVRAIT pouvoir modifier cette valeur. La même description DOIT être utilisée lors de l&#39;enregistrement d&#39;un appareil.\n2.2.4. url\nURL du serveur auquel cet appareil est connecté (protocole compris). Par exemple:\nurl = https: //www.google.com/cloudprint\n2.2.5. type\nListe de sous-types de périphérique pris en charge par ce périphérique, séparés par des virgules. Le format est:\n  &quot;type = _subtype1, _subtype2&quot;. Actuellement, le seul sous-type de périphérique pris en charge est\n  imprimante.\ntype = imprimante\nChaque sous-type répertorié doit être annoncé à l&#39;aide d&#39;un enregistrement PTR correspondant. Pour chaque supporté\n  service, il doit y avoir un élément correspondant. Nom du sous-type de service\n  (._sub.privet._tcp) devrait être égal au type de périphérique ici.\n2.2.6. identifiant\nReference de l&#39;appareil. Si le périphérique n&#39;a pas encore été enregistré, cette clé doit être présente, mais la valeur\n  devrait être vide. Par exemple:\n\n  \n  \n  \n  id = 11111111-2222-3333-4444-555555555555\n  id =\n\n2.2.7. cs\nIndique l’état actuel de la connexion du périphérique. Quatre valeurs possibles sont définies dans cette\n  spec.\n\n&quot;online&quot; indique que l&#39;appareil est actuellement connecté au cloud.\n&quot;hors ligne&quot; indique que le périphérique est disponible sur le réseau local, mais\n    ne peux pas parler au serveur.\n&quot;connexion&quot; indique que le périphérique effectue sa séquence de démarrage et est en train de\n    pas encore complètement en ligne.\n&quot;non configuré&quot; indique que l&#39;accès Internet de l&#39;appareil n&#39;a pas été\n    configuré pour le moment. Cette valeur n’est pas utilisée actuellement, mais peut être utile dans les futures versions du logiciel.\n    spécification.\n\nPar exemple:\n\ncs = en ligne\ncs = hors ligne\ncs = connexion\n\nSi le périphérique a été enregistré dans un nuage, il doit vérifier au démarrage la connectivité avec\n  serveur pour détecter son état de connexion (par exemple, appeler une API cloud pour obtenir les paramètres du périphérique). le\n  L’équipement peut utiliser l’état de la connexion de son canal de notification (XMPP, par exemple) pour signaler cette valeur.\n  Les périphériques non enregistrés au démarrage peuvent envoyer un ping à un domaine afin de détecter leur état de connexion (par exemple,\n  exemple, effectuez un ping sur www.google.com pour les périphériques d’impression dans le cloud\n3. Annonces\nAu démarrage, à l&#39;arrêt ou au changement d&#39;état du périphérique, le périphérique DOIT exécuter l&#39;étape de l&#39;annonce\n  décrit dans la spécification mDNS. Il\n  DEVRAIT envoyer l&#39;annonce correspondante au moins deux fois avec un intervalle d&#39;au moins une seconde\n  entre eux.\n3.1. Commencez\nAu démarrage de l&#39;appareil, il DOIT exécuter les étapes de vérification et d&#39;annonce décrites dans le manuel mDNS.\n  spécification. Les enregistrements SRV, PTR et TXT doivent être envoyés dans ce cas. Il est recommandé de grouper\n  tous les enregistrements dans une réponse DNS si possible. Si non, l&#39;ordre suivant est recommandé: SRV,\n  PTR, enregistrements TXT.\n3.2. Fermer\nLors de l’arrêt de l’appareil, il DEVRAIT essayer d’en informer toutes les parties intéressées en envoyant un message.\n  &quot;Au revoir paquet&quot; avec TTL = 0 (comme décrit dans la documentation de mDNS).\n3.3. Mise à jour\nSi l’une des informations décrites dans TXT a changé, le périphérique DOIT envoyer une mise à jour.\n  annonce. Dans ce cas, il suffit d’envoyer le nouvel enregistrement TXT. Par exemple, après un\n  appareil est enregistré, il DOIT envoyer une annonce de mise à jour incluant le nouvel identifiant d&#39;appareil.\n4. API\nUne fois qu&#39;un périphérique cloud a été découvert, la communication client est activée avec le périphérique.\n  directement sur le réseau local. Toutes les API sont basées sur HTTP 1.1. Les formats de données sont basés sur JSON. API\n  les requêtes peuvent être des requêtes GET ou POST.\nChaque demande DOIT contenir un &quot;X-Privet-Token&quot;en-tête. La SEULE demande\n  autorisé à avoir un en-tête &quot;X-Privet-Token&quot; vide est la requête / privet / info (note\n  l&#39;en-tête DOIT toujours être présent). Si l&#39;en-tête &quot;X-Privet-Token&quot; est manquant, le\n  le périphérique DOIT répondre avec l&#39;erreur HTTP 400 suivante:\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\nSi l&#39;en-tête &quot;X-Privet-Token&quot; est vide ou invalide, le périphérique DOIT répondre avec\n  &quot;erreur X-Privet-Token non valide&quot; (invalid_x_privet_token, voir la section Erreurs pour plus de détails).\n  détails). La seule exception est l&#39;API / info. Pour voir plus d&#39;informations sur pourquoi cela est fait et comment les jetons\n  voir Annexe A: Attaques XSSI et XSRF et prévention.\nSi une API demandée n&#39;existe pas ou n&#39;est pas prise en charge, le périphérique DOIT renvoyer une erreur HTTP 404.\n4.1. Disponibilité de l&#39;API\nAvant TOUTE API ne soit exposée (y compris l’API / info), le périphérique DOIT contacter le serveur pour vérifier\n  paramètres locaux. Les paramètres locaux DOIVENT être préservés entre\n  redémarre. Si le serveur n&#39;est pas disponible, les derniers paramètres locaux connus doivent être utilisés. Si la\n  L&#39;appareil n&#39;a pas encore été enregistré, il devrait suivre les paramètres par défaut.\nLes périphériques Cloud Print DOIVENT suivre les étapes ci-dessous pour enregistrer, recevoir et mettre à jour les paramètres locaux.\n4.1.1. enregistrement\nLorsque le périphérique s&#39;inscrit, il DOIT spécifier le paramètre &quot;local_settings&quot;, comme suit:\n\n\n\n\n\n       &quot;actuel&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: true,\n                &quot;printer / conversion_printing_enabled&quot;: true,\n                &quot;xmpp_timeout_value&quot;: 300\n        \n\n\nLes paramètres suivants peuvent être définis:\n\n\nNom de la valeur\nType de valeur\nLa description\n\n\ndécouverte_locale\nbooléen\nIndique si la fonctionnalité de découverte locale est\n    permis. Si &quot;false&quot;, toutes les découvertes d&#39;API locale (y compris / info) et DNS-SD doivent être désactivées. Par\n    Par défaut, les périphériques nouvellement enregistrés doivent passer &quot;true&quot;.\n\n\naccess_token_enabled\nbooléen (optionnel)\nIndique si / accesstoken API\n    devrait être exposé sur le réseau local. Par défaut devrait être &quot;true&quot;.\n\n\nprinter / local_printing_enabled\nbooléen (optionnel)\nIndique si local\n    la fonctionnalité d’impression (/ printer / createjob, / printer / submitdoc, / printer / jobstate) devrait être\n    exposés sur le réseau local. Par défaut devrait être &quot;true&quot;.\n\n\nprinter / conversion_printing_enabled\nbooléen (optionnel)\nIndique si local\n    l&#39;impression peut envoyer le travail au serveur pour la conversion. Cela n’a de sens que lorsque l’impression locale est activée.\n    \n\n\nxmpp_timeout_value\nint (facultatif)\nIndique le nombre de secondes entre\n    Pingles de canal XMPP. Par défaut, DOIT être 300 (5 minutes) ou plus.\n\n\nImportant: L’absence de valeur optionnelle indique que le\n  la fonctionnalité correspondante est complètement non prise en charge par le périphérique.\n4.1.2. Commencez\nAu démarrage du périphérique, le serveur doit contacter le serveur pour vérifier quelles API sont disponibles pour être exposées dans\n  le réseau local. Pour les imprimantes connectées à Cloud Print, elles doivent appeler:\n/ cloudprint / printer? printerid =\nou\n/ cloudprint / list\n/ cloudprint / printer est préférable à / cloudprint / list, mais les deux fonctionneront.\nCette API renvoie les paramètres actuels du périphérique, y compris les paramètres de l&#39;API locale. La réponse du\n  Le serveur aura le format suivant:\n\n\n\n\n&quot;paramètres locaux&quot;: \n        &quot;actuel&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: true,\n                &quot;printer / conversion_printing_enabled&quot;: true,\n                &quot;xmpp_timeout_value&quot;: 300\n         ,\n         &quot;en attente&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: false,\n                &quot;printer / conversion_printing_enabled&quot;: false,\n                &quot;xmpp_timeout_value&quot;: 500\n         \n\n\nL&#39;objet &quot;en cours&quot; indique les paramètres en vigueur pour le moment.\nL&#39;objet &quot;en attente&quot; indique les paramètres à appliquer au périphérique (cet objet\n  peut être manquant).\nUne fois que le périphérique voit les paramètres &quot;en attente&quot;, il DOIT mettre à jour son état (voir ci-dessous).\n4.1.3. Mise à jour\nSi une mise à jour des paramètres est nécessaire, une notification XMPP sera envoyée au périphérique. La notification\n  sera dans le format suivant:\n/mettre à jour les paramètres\nÀ la réception d&#39;une telle notification, le périphérique DOIT interroger le serveur pour obtenir les derniers paramètres.\n  Les périphériques Cloud Print DOIVENT utiliser:\n/ cloudprint / printer? printerid =\nUne fois que le périphérique voit la section &quot;en attente&quot; suite à l’API / cloudprint / printer (à\n  démarrage ou en raison de la notification), il DOIT mettre à jour son état interne pour se souvenir du nouveau\n  paramètres. Il DOIT appeler l&#39;API du serveur pour confirmer les nouveaux paramètres. Pour les imprimantes en nuage, le périphérique\n  DOIT appeler / cloudprint / update API et utiliser le paramètre &quot;local_settings&quot; comme pendant\n  enregistrement.\nLors de la reconnexion au canal XMPP, le périphérique DOIT appeler / cloudprint / API pour vérifier si\n  les paramètres locaux ont été modifiés depuis la dernière fois.\n4.1.3.1. Paramètres locaux en attente\nLe paramètre &quot;local_settings&quot; utilisé par le périphérique pour appeler l&#39;API du serveur NE DOIT JAMAIS contenir\n  section &quot;en attente&quot;.\n4.1.3.2. Paramètres locaux actuels\nUNIQUEMENT l’appareil peut changer la section &quot;actuelle&quot; des &quot;paramètres locaux&quot;.\n  Tout le monde changera la section &quot;en attente&quot; et attendra que les modifications soient apportées.\n  propagé à la section &quot;en cours&quot; par le périphérique.\n4.1.4. Hors ligne\nLorsqu&#39;il est impossible de contacter le serveur au démarrage, après notification, le périphérique DOIT utiliser le dernier\n  paramètres locaux.\n4.1.5. Suppression de l&#39;appareil du service\nSi le périphérique a été supprimé du service (GCP par exemple), une notification XMPP sera envoyée.\n  envoyé à l&#39;appareil. La notification sera au format suivant:\n/effacer\nÀ la réception d&#39;une telle notification, le périphérique DOIT se rendre sur le serveur pour vérifier son état. Nuage\n  Les périphériques d’impression DOIVENT utiliser:\n/ cloudprint / printer? printerid =\nLe périphérique DOIT recevoir une réponse HTTP réussie avec success = false et aucun périphérique / imprimante.\n  la description. Cela signifie que le périphérique a été retiré du serveur et que le périphérique DOIT effacer ses\n  informations d’authentification et passer en mode de paramètres d’usine par défaut.\nTOUTE heure à laquelle le périphérique reçoit une réponse indiquant qu&#39;il a été supprimé à la suite de la\n  / cloudprint / API (démarrage, notification des paramètres de mise à jour, ping quotidien), elle DOIT supprimer ses\n  informations d&#39;identification et aller en mode par défaut.\n4.2. API / privet / info\nL&#39;info API est OBLIGATOIRE et DOIT être implémentée par tous les appareils. C&#39;est une requête HTTP GET pour\n  &quot;/ privet / info&quot; url: GET / privet / info HTTP / 1.1\nL&#39;API info renvoie des informations de base sur un périphérique et les fonctionnalités qu&#39;il prend en charge. Cette API\n  NE DOIT jamais changer l’état du dispositif ni effectuer aucune action, car il est vulnérable aux attaques XSRF.\n  C&#39;est la SEULE API autorisée à avoir un en-tête &quot;X-Privet-Token&quot; vide. Les clients devraient\n  API call / privet / info avec en-tête &quot;X-Privet-Token&quot; définie sur X-Privet-Token:\n  &quot;&quot;\nL&#39;API info DOIT renvoyer des données cohérentes avec les données disponibles dans l&#39;enregistrement TXT lors de la découverte.\n4.2.1. Contribution\n/ privet / info L&#39;API n&#39;a pas de paramètre d&#39;entrée.\n4.2.2. Revenir\nL&#39;API / privet / info renvoie des informations de base sur le périphérique et les fonctionnalités prises en charge.\nLa colonne TXT indique le champ correspondant dans l’enregistrement DNS-SD TXT.\n\n\nNom de la valeur\nType de valeur\nLa description\nSMS\n\n\nversion\nchaîne\nVersion la plus récente (major.minor) de l&#39;API prise en charge, actuellement\n    1,0\n\n\nNom\nchaîne\nNom lisible par l&#39;homme du périphérique.\nty\n\n\nla description\nchaîne\n(facultatif) Description de l&#39;appareil. DEVRAIT être modifiable par\n    utilisateur.\nRemarque\n\n\nurl\nchaîne\nURL du serveur avec lequel cet appareil parle. L&#39;URL DOIT inclure\n    spécification du protocole, par exemple: https://www.google.com/cloudprint.\nurl\n\n\ntype\nliste de chaînes\nListe des types d&#39;appareils pris en charge.\ntype\n\n\nidentifiant\nchaîne\nIdentifiant de périphérique, vide si le périphérique n&#39;a pas encore été enregistré.\nidentifiant\n\n\nétat_périphérique\nchaîne\nEtat de l&#39;appareil.tourner au ralenti signifie que l&#39;appareil est\n    prêtEn traitement signifie que le périphérique est occupé et que les fonctionnalités peuvent être limitées pendant un certain temps\n    arrêté signifie que l&#39;appareil ne fonctionne pas et que l&#39;intervention de l&#39;utilisateur est requise\n\n\nétat_connexion\nchaîne\nEtat de la connexion au serveur (base_url)\n    en ligne &#8211; connexion disponible\n    hors ligne &#8211; pas de connection\n    de liaison &#8211; effectuer les étapes de démarrage\n    pas configuré &#8211; la connexion n&#39;a pas encore été configurée\n    Un périphérique enregistré peut signaler son état de connexion en fonction de l&#39;état de la notification.\n    canal (par exemple, l&#39;état de la connexion XMPP).\ncs\n\n\nfabricant\nchaîne\nNom du fabricant de l&#39;appareil\n\n\nmodèle\nchaîne\nModèle de l&#39;appareil\n\n\nnuméro de série\nchaîne\nIdentifiant unique de l&#39;appareil. Dans cette spécification, cela DOIT être\n    un UUID. (Spec GCP 1.1)\n    (facultatif) Nous vous recommandons vivement d’utiliser le même identifiant de numéro de série partout, donc différent.\n    les clients peuvent identifier le même appareil. Par exemple, les imprimeurs implémentant IPP peuvent utiliser cette interface série.\n    numéro d&#39;identification dans le champ &quot;printer-device-id&quot;.\n\n\nfirmware\nchaîne\nVersion du firmware de l&#39;appareil\n\n\nla disponibilité\nint\nNombre de secondes à partir du démarrage du périphérique.\n\n\nsetup_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    instructions d&#39;installation\n\n\nsupport_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    support, informations FAQ\n\n\nupdate_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    mettre à jour les instructions du firmware\n\n\nx-privet-token\nchaîne\nValeur de la X-Privet-Token en-tête qui a\n    à transmettre à toutes les API pour empêcher les attaques XSSI et XSRF. Voir 6.1. pour plus de détails.\n\n\napi\ndescription des API\nListe des API prises en charge (décrites ci-dessous)\n\n\nétat sémantique\nJSON\n(facultatif) Etat sémantique de l&#39;appareil en\n    Format CloudDeviceState.\n\n\napi &#8211; est une liste JSON contenant la liste des API disponibles via le réseau local. Remarque\n  toutes les API ne sont peut-être pas disponibles simultanément sur le réseau local. Par exemple, un nouveau\n  L&#39;appareil connecté ne doit supporter que l&#39;API / Register:\n\n\n\n\n&quot;api&quot;: [\n        \"/privet/register\",\n]\n\nUne fois l&#39;enregistrement de l&#39;appareil terminé, l&#39;appareil DEVRAIT cesser de prendre en charge l&#39;API / register. le\nLe périphérique doit également vérifier auprès du service afin de déterminer quelles API peuvent être exposées sur le serveur local.\nréseau. Par exemple:\n\n&quot;api&quot;: [\n        \"/privet/accesstoken\",\n        \"/privet/capabilities\",\n        \"/privet/printer/submitdoc\",\n]\n\nLes API suivantes sont disponibles à ce moment:\n\n/ privet / register &#8211; API pour l&#39;enregistrement de périphérique sur le réseau local. (voir\n    / privet / register API pour plus de détails). Cette API DOIT être cachée une fois le périphérique réussi.\n    enregistré dans le nuage.\n/ privet / accesstoken &#8211; API permettant de demander un jeton d’accès à l’appareil (voir\n    / privet / accesstoken API pour plus de détails).\n/ privet / capacités &#8211; API permettant de récupérer les capacités du périphérique (voir / privet / capacités\n    API pour plus de détails).\n/ privet / printer / * &#8211; API spécifique au type de périphérique &quot;imprimante&quot;, voir imprimante\n    API spécifiques pour plus de détails.\n\nVoici un exemple de réponse / privet / info. (Notez le manque de l’API / privet / register, car\nce périphérique est déjà enregistré):\n\n\n        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;name&quot;: &quot;l’imprimante de Gene&quot;,\n        &quot;description&quot;: &quot;Imprimante connectée via un connecteur Chrome&quot;,\n        &quot;url&quot;: &quot;https://www.google.com/cloudprint&quot;,\n        &quot;type&quot;: [\n                \"printer\"\n        ],\n        &quot;id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n        &quot;device_state&quot;: &quot;inactif&quot;,\n        &quot;connection_state&quot;: &quot;en ligne&quot;,\n        &quot;fabricant&quot;: &quot;Google&quot;,\n        &quot;modèle&quot;: &quot;Google Chrome&quot;,\n        &quot;numéro de série&quot;: &quot;1111-22222-33333-4444&quot;,\n        &quot;firmware&quot;: &quot;24.0.1312.52&quot;,\n        &quot;disponibilité&quot;: 600,\n        &quot;setup_url&quot;: &quot;http://support.google.com/cloudprint/answer/1686197/?hl=fr&quot;,\n        &quot;support_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;update_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;x-privet-token&quot;: &quot;AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659&quot;,\n        &quot;api&quot;: [\n                \"/privet/accesstoken\",\n                \"/privet/capabilities\",\n                \"/privet/printer/submitdoc\",\n        ]\n\n\nVoici un exemple de réponse / privet / info pour une imprimante à court d’encre (avis\n  état de sémantique):\n\n{\n        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;name&quot;: &quot;l’imprimante de Gene&quot;,\n        &quot;description&quot;: &quot;Imprimante connectée via un connecteur Chrome&quot;,\n        &quot;url&quot;: &quot;https://www.google.com/cloudprint&quot;,\n        &quot;type&quot;: [\n                \"printer\"\n        ],\n        &quot;id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n        &quot;device_state&quot;: &quot;stoppé&quot;,\n        &quot;connection_state&quot;: &quot;en ligne&quot;,\n        &quot;fabricant&quot;: &quot;Google&quot;,\n        &quot;modèle&quot;: &quot;Google Chrome&quot;,\n        &quot;numéro de série&quot;: &quot;1111-22222-33333-4444&quot;,\n        &quot;firmware&quot;: &quot;24.0.1312.52&quot;,\n        &quot;disponibilité&quot;: 600,\n        &quot;setup_url&quot;: &quot;http://support.google.com/cloudprint/answer/1686197/?hl=fr&quot;,\n        &quot;support_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;update_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;x-privet-token&quot;: &quot;AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659&quot;,\n        &quot;api&quot;: [\n                \"/privet/accesstoken\",\n                \"/privet/capabilities\",\n                \"/privet/printer/submitdoc\",\n        ],\n        &quot;état sémantique&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;imprimante&quot;: \n                        &quot;state&quot;: &quot;STOPPED&quot;,\n                        &quot;marker_state&quot;: \n                                &quot;article&quot;: [\n                                        \n                                                \"vendor_id\": \"ink\",\n                                                \"state\": \"EXHAUSTED\",\n                                                \"level_percent\": 0\n                                        \n                                ]\n                        \n                \n        \n}\n\n4.2.3. les erreurs\n/ privet / info API devrait SEULEMENT renvoyer une erreur si X-Privet-Token l&#39;en-tête est manquant. Il\n  DOIT être une erreur HTTP 400:\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\n4.3. / privet / register API\n/ privet / register est facultative. C&#39;est une requête HTTP POST. / privet / register API DOIT vérifier\n  pour une validité X-Privet-Token entête. Le périphérique DOIT implémenter cette API sur\n  &quot;/ privet / register&quot; url:\n\n\n\n\nPOST /privet/register?action=start&amp;user=user@domain.com HTTP / 1.1\nPOST /privet/register?action=complete&amp;user=user@domain.com HTTP / 1.1\n\nL’appareil doit exposer l’API / privet / register UNIQUEMENT lorsqu’il autorise l’enregistrement anonyme à la\n  moment. Par exemple:\n\nLorsque le périphérique est allumé (ou après avoir cliqué sur un bouton spécial du périphérique) et n’a pas\n    été enregistré, il devrait exposer l’API / privet / register pour permettre à un utilisateur du répertoire local\n    réseau pour réclamer l’imprimante.\nUne fois l’enregistrement terminé, le périphérique doit cesser d’exposer l’API / privet / register à\n    empêcher un autre utilisateur du réseau local de récupérer le périphérique.\nCertains appareils peuvent avoir différentes façons d’enregistrer des appareils et ne doivent pas exposer le\n    / privet / register à tous (par exemple, le connecteur Chrome Cloud Print).\n\nLe processus d’enregistrement se déroule en 3 étapes (voir Enregistrement anonyme pour Cloud Print).\n\nLancer le processus d&#39;inscription anonyme.\nUn client initie ce processus en appelant l&#39;API / privet / register. L&#39;appareil peut attendre\n    confirmation de l&#39;utilisateur à ce moment.\nObtenez le jeton de réclamation.\n\nLe client interroge pour savoir quand l&#39;appareil est prêt à continuer. Une fois que l&#39;appareil est prêt, il\n  envoie une demande au serveur pour récupérer le jeton d&#39;enregistrement et l&#39;URL d&#39;inscription. Jeton reçu\n  et URL DEVRAIT être retourné au client. Au cours de cette étape, si le périphérique reçoit un autre appel pour\n  initialiser l&#39;enregistrement, il devrait:\n\nSi c’est le même utilisateur qui a commencé l’enregistrement, supprimez toutes les données précédentes (le cas échéant) et démarrez le système.\n    un nouveau processus d&#39;inscription.\nS&#39;il s&#39;agit d&#39;un utilisateur différent, retourne une erreur device_busy et un délai d&#39;attente de 30 secondes.\n\nProcessus d&#39;inscription complet.\nUne fois que le client a réclamé le périphérique, il doit lui notifier son achèvement.\n  enregistrement. Une fois le processus d&#39;enregistrement terminé, l&#39;appareil doit envoyer une mise à jour.\n  annonce, y compris l&#39;ID de périphérique nouvellement acquis.\nRemarque: lorsque le périphérique traite un appel d&#39;API / privet / register, aucune autre API / privet / register\n  les appels peuvent être traités simultanément. Le périphérique DOIT retourner l&#39;erreur device_busy et 30 secondes\n  temps libre.\nLa confirmation de l&#39;utilisateur pour l&#39;enregistrement sur l&#39;appareil est fortement recommandée. Si mis en œuvre, le\n  le périphérique DOIT attendre la confirmation de l&#39;utilisateur APRÈS qu&#39;il reçoive un / privet / register? action = start API\n  appel. Le client appellera / privet / register? Action = getClaimToken pour savoir quand\n  la confirmation de l&#39;utilisateur est terminée et le jeton de réclamation est disponible. Si l&#39;utilisateur annule son inscription le\n  l&#39;appareil (par exemple, appuie sur le bouton Annuler), l&#39;erreur user_cancel DOIT être renvoyée. Si l&#39;utilisateur\n  l’enregistrement n’a pas été confirmé dans un certain délai, l’erreur confirmation_timeout DOIT être\n  revenu. Voir la section des valeurs par défaut pour plus de détails.\n4.3.1. Contribution\nL&#39;API / privet / register a les paramètres d&#39;entrée suivants:\n\n\nNom\nValeur\n\n\naction\nPeut être l&#39;un des suivants:\n    début &#8211; pour commencer le processus d&#39;inscription\n    getClaimToken &#8211; récupérer le jeton de réclamation pour le périphérique\n    Annuler &#8211; annuler le processus d&#39;inscription\n    Achevée &#8211; terminer le processus d&#39;inscription\n\n\nutilisateur\nEmail de l&#39;utilisateur qui réclamera cet appareil.\n\n\nLe périphérique DOIT vérifier que l’adresse électronique de toutes les actions (start, getClaimToken, annuler,\n  complète) correspond.\n4.3.2. Revenir\nL&#39;API / privet / register renvoie les données suivantes:\n\n\nNom de la valeur\nType de valeur\nLa description\n\n\naction\nchaîne\nMême action que dans le paramètre d&#39;entrée.\n\n\nutilisateur\nchaîne (optionnel)\nMême utilisateur que dans le paramètre d&#39;entrée (peut être manquant, si\n    omis dans l&#39;entrée).\n\n\njeton\nchaîne (optionnel)\nJeton d&#39;inscription (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;).\n\n\nclaim_url\nchaîne (optionnel)\nURL d&#39;enregistrement (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;). Pour les imprimantes en nuage, il faut\n    être &quot;complete_invite_url&quot; reçu du serveur.\n\n\nautomation_claim_url\nchaîne (optionnel)\nURL d&#39;enregistrement (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;). Pour les imprimantes en nuage, il faut\n    être &quot;automatic_invite_url&quot; reçu du serveur.\n\n\nReference de l&#39;appareil\nchaîne (optionnel)\nNouvel identifiant d&#39;appareil (omis pour la réponse &quot;start&quot;,\n    obligatoire pour &quot;complet&quot;).\n\n\nLe périphérique DOIT retourner son identifiant de périphérique dans la réponse de l&#39;API / privet / info UNIQUEMENT après l&#39;enregistrement.\n  Achevée.\nExemple 1:\n\n\n\n\n\n        &quot;action&quot;: &quot;start&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n\n\nExemple 2:\n\n\n\n\n\n        &quot;action&quot;: &quot;getClaimToken&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;claim_url&quot;: &quot;https://domain.com/SoMeUrL&quot;,\n\n\nExemple 3:\n\n\n\n\n\n        &quot;action&quot;: &quot;complet&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;device_id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n\n\n4.3.3. les erreurs\nL&#39;API / privet / register peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):\n\n\nErreur\nLa description\n\n\ndevice_busy\nLe périphérique est occupé et ne peut pas effectuer l’action demandée. Recommencez\n    après timeout.\n\n\nwaiting_user_action\nEn réponse à &quot;getClaimToken&quot;, cette erreur indique que le\n    le périphérique est toujours en attente de confirmation de l&#39;utilisateur, et la requête &quot;getClaimToken&quot; doit être réessayée après\n    temps libre.\n\n\nuser_cancel\nL&#39;utilisateur a explicitement annulé le processus d&#39;inscription depuis l&#39;appareil.\n\n\nconfirmation_timeout\nLa confirmation de l&#39;utilisateur expire.\n\n\ninvalide_action\nUne action invalide est appelée. Par exemple, si le client appelé\n    action = terminé avant d&#39;appeler action = start et action = getClaimToken.\n\n\nparent_invalide\nParamètres non valides spécifiés dans la demande. (Paramètres inconnus\n    doit être ignoré pour une compatibilité future). Par exemple, renvoyez ceci si le client\n    appelé action = inconnu ou utilisateur =.\n\n\ndevice_config_error\nLa date / heure (ou certains autres paramètres) est incorrecte sur l&#39;appareil\n    côté. L&#39;utilisateur doit aller (sur le site Web interne du périphérique) et configurer les paramètres du périphérique.\n\n\nhors ligne\nL’appareil est actuellement hors ligne et ne peut pas communiquer avec le serveur.\n\n\nerreur du serveur\nErreur du serveur pendant le processus d&#39;inscription.\n\n\ninvalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la requête.\n\n\nLe périphérique DOIT cesser d’exposer l’API / privet / register une fois l’enregistrement effectué avec succès.\n  terminé. Si le périphérique n&#39;expose pas l&#39;API / privet / register, il DOIT renvoyer l&#39;erreur HTTP 404.\n  Par conséquent, si un périphérique est déjà enregistré, l&#39;appel de cette API DOIT renvoyer 404. Si le\n  L&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l&#39;erreur HTTP 400.\n4.4. / privet / accesstoken API\n/ privet / accesstoken API est FACULTATIF. C&#39;est une requête HTTP GET. / privet / accesstoken API DOIT vérifier\npour un en-tête &quot;X-Privet-Token&quot; valide. Le périphérique DOIT implémenter cette API sur le\n&quot;/ privet / accesstoken&quot; url:\nGET / privet / accesstoken HTTP / 1.1\nLorsque le périphérique reçoit l&#39;appel de l&#39;API / accesstoken, il doit appeler le serveur pour récupérer le\n  jeton d&#39;accès pour l&#39;utilisateur donné et renvoyer le jeton au client. Le client utilisera ensuite le\n  jeton d&#39;accès pour accéder à cet appareil via le cloud.\nLes périphériques Cloud Print DOIVENT appeler l&#39;API suivante:\n/ cloudprint / proximitétoken\net passez les paramètres &quot;printerid =&quot; et &quot;user&quot; du local\nAPI. En cas de succès, la réponse du serveur contiendra l&#39;objet suivant:\n\n&quot;proximité_token&quot;: \n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;expires_in&quot;: 600\n\n\nLes périphériques Cloud Print DOIVENT transmettre la valeur de l’objet &quot;proximité_token&quot; dans la réponse.\naux appels d’API locaux / privet / accesstoken. Il est plus avantageux (à l’avenir) que l’appareil puisse\npasse TOUS les paramètres (y compris ceux qui ne sont pas décrits dans cette spécification).\n4.4.1. Contribution\nL&#39;API / privet / accesstoken a les paramètres d&#39;entrée suivants:\n\n\nNom\nValeur\n\n\nutilisateur\nEmail de l&#39;utilisateur qui a eu l&#39;intention d&#39;utiliser ce jeton d&#39;accès. Peut être vide dans le\n    demande.\n\n\n4.4.2. Revenir\n/ privet / accesstoken L&#39;API renvoie les données suivantes:\n\n\nNom de la valeur\nType de valeur\nLa description\n\n\njeton\nchaîne\nJeton d&#39;accès renvoyé par le serveur\n\n\nutilisateur\nchaîne\nMême utilisateur que dans le paramètre d&#39;entrée.\n\n\nexpire dans\nint\nNombre de secondes jusqu&#39;à l&#39;expiration de ce jeton. Reçu de\n    le serveur et passé dans cette réponse.\n\n\nExemple:\n\n\n\n\n\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;expires_in&quot;: 600\n\n\n4.4.3. les erreurs\nL&#39;API / privet / accesstoken peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):\n\n\nErreur\nLa description\n\n\nhors ligne\nL&#39;appareil est actuellement hors ligne et ne peut pas parler au serveur.\n\n\naccès refusé\nDroits insuffisants. Accès refusé. L&#39;appareil doit renvoyer cette\n    erreur lorsque la demande a été explicitement refusée par le serveur.\n\n\nparent_invalide\nParamètres non valides spécifiés dans la demande. (Paramètres inconnus\n    doit être ignoré pour une compatibilité future). Par exemple, si le client appelé\n    / accesstoken? user = ou / accesstoken.\n\n\nerreur du serveur\nErreur du serveur.\n\n\ninvalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la demande.\n\n\nSi le périphérique n&#39;expose pas l&#39;API / privet / accesstoken, il DOIT renvoyer l&#39;erreur HTTP 404. Si la\n  L&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l&#39;erreur HTTP 400.\n4.5 / privet / API de capacités\n/ privet / features est facultatif. C&#39;est une requête HTTP GET. / privet / functions API DOIT vérifier\npour un en-tête &quot;X-Privet-Token&quot; valide. Le périphérique DOIT implémenter cette API sur\nURL &quot;/ privet / capacités&quot;:\nGET / privet / capacités HTTP / 1.1\nLorsque le périphérique reçoit / appel de l&#39;API de fonctionnalités, si le périphérique est capable, il DEVRAIT contacter\nle serveur pour obtenir des capacités mises à jour. Par exemple, si une imprimante prend en charge la publication d&#39;un travail d&#39;impression\n(reçu localement) à travers le service Cloud Print, il devrait renvoyer les fonctionnalités que le\nLe service d&#39;impression en nuage reviendrait. Cloud Print dans ce cas peut altérer l&#39;imprimante d&#39;origine\nfonctions en ajoutant de nouvelles fonctionnalités avant d’envoyer le travail à l’imprimante. Le plus\nLe cas courant est une liste de types de documents pris en charge. Si l&#39;imprimante est hors ligne, elle devrait renvoyer\ntypes de documents qu&#39;il prend en charge. Cependant, si l&#39;imprimante est en ligne et enregistrée auprès de Cloud Print it\nDOIT retourner &quot;* / *&quot; parmi les types pris en charge. Le service Cloud Print sera exécuté\nla conversion nécessaire dans ce cas. Pour l’impression hors ligne, l’imprimante DOIT prendre en charge au moins la\nformat &quot;image / pwg-raster&quot;.\n4.5.1. Contribution\nL&#39;API / privet / functions a les paramètres d&#39;entrée suivants:\n\n\nNom\nValeur\n\n\nhors ligne\n(facultatif) Ne peut être que &quot;hors ligne = 1&quot;. Dans ce cas, l&#39;appareil doit retourner\n    capacités pour une utilisation hors connexion (si elles sont différentes des capacités &quot;en ligne&quot;).\n\n\n4.5.2. Revenir\nL&#39;API / privet / features renvoie les fonctionnalités de périphérique dans le fichier JSON CDD (Cloud Device Description)\nformat (voir le document CDD pour plus de détails). Les imprimantes au minimum DOIVENT renvoyer une liste des types pris en charge\nici. Par exemple, une imprimante Cloud Ready actuellement en ligne peut renvoyer quelque chose comme ceci (à\nle minimum):\n\n\n        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;imprimante&quot;: \n                &quot;supported_content_type&quot;: [\n                        \n                                \"content_type\": \"application/pdf\",\n                                \"min_version\": \"1.4\"\n                        ,\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" ,\n                         \"content_type\": \"*/*\" \n                ]\n        \n\n\net quand il est déconnecté du serveur, il peut retourner:\n\n\n        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;imprimante&quot;: \n                &quot;supported_content_type&quot;: [\n                        \n                                \"content_type\": \"application/pdf\",\n                                \"min_version\": \"1.4\"\n                        ,\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" \n                ]\n        \n\n\nRemarque: Les imprimantes expriment la priorité du type de contenu pris en charge en utilisant la commande. Pour\n  Par exemple, dans les exemples ci-dessus, l’imprimante indique qu’elle préfère les données &quot;application / pdf&quot; à\n  &quot;image / pwg-raster&quot; et &quot;image / jpeg&quot;. Les clients doivent respecter les priorités des imprimantes si possible\n  (voir le document CDD pour plus de détails).\n4.5.3. les erreurs\nL&#39;API / privet / features peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):\n\n\nErreur\nLa description\n\n\ninvalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la requête.\n\n\nSi le périphérique n&#39;expose pas l&#39;API / privet / features, il DOIT renvoyer HTTP 404.\n  Erreur. Si l&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer une erreur HTTP 400.\n4.6. les erreurs\nLes erreurs sont renvoyées par les API ci-dessus au format suivant:\n\n\nNom de la valeur\nType de valeur\nLa description\n\n\nErreur\nchaîne\nType d&#39;erreur (défini par API)\n\n\nla description\nchaîne (optionnel)\nDescription lisible par l&#39;homme de l&#39;erreur.\n\n\nserver_api\nchaîne (optionnel)\nEn cas d&#39;erreur de serveur, ce champ contient\n    l&#39;API du serveur qui a échoué.\n\n\ncode_serveur\nint (facultatif)\nEn cas d&#39;erreur de serveur, ce champ contient\n    ce code d&#39;erreur que le serveur a renvoyé.\n\n\ncode_http_serveur\nint (facultatif)\nEn cas d&#39;erreur HTTP du serveur, ce champ\n    contient le code d&#39;erreur HTTP serveur renvoyé.\n\n\ntemps libre\nint (facultatif)\nNombre de secondes que le client attend avant\n    nouvelle tentative (pour les erreurs récupérables uniquement). Le client DOIT randomiser le délai d’expiration réel de cette valeur sur\n    une valeur de + 20%.\n\n\nToutes les API DOIVENT renvoyer une erreur HTTP 400 si l&#39;en-tête X-Privet-Token est manquant.\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\nExemple 1:\n\n\n\n\n\n        &quot;erreur&quot;: &quot;erreur_serveur&quot;,\n        &quot;description&quot;: &quot;Service indisponible&quot;,\n        &quot;server_api&quot;: &quot;/ submit&quot;,\n        &quot;code_http_serveur&quot;: 503\n\n\nExemple 2:\n\n\n\n\n\n        &quot;error&quot;: &quot;printer_busy&quot;,\n        &quot;description&quot;: &quot;L&#39;imprimante est en train d&#39;imprimer un autre travail&quot;,\n        &quot;timeout&quot;: 15\n\n\n5. API d&#39;imprimante\nL&#39;un des types de périphérique pris en charge par ce protocole est le type imprimante. Les appareils supportant ce type PEUVENT\n  implémenter certaines fonctionnalités spécifiques aux imprimantes. Idéalement, l’impression sur des imprimantes prêtes au cloud\n  passer par un serveur Cloud Print:\n\nDans certains cas, un client peut avoir besoin d’envoyer un document localement. Cela peut être nécessaire lorsque le client ne le fait pas\n  avoir un identifiant Google ou est incapable de parler au serveur Cloud Print. Dans ce cas, le travail d&#39;impression sera\n  être soumis localement à l&#39;imprimante. L’imprimante utilisera à son tour le service Cloud Print pour\n  mise en file d&#39;attente et conversion. L’imprimante republiera le travail soumis localement sur le Cloud. Print\n  service, puis demandez-le, car il a été envoyé via le cloud. Ce processus fournira une\n  expérience utilisateur flexible en termes de service (conversion) et de gestion / suivi des travaux d&#39;impression.\n\nSince the Cloud Print service implements conversion, the printer SHOULD advertise supporting all\n  input formats (&quot;*/*&quot;) among the list of the supported content types:\n\n\n\n\n\n        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;printer&quot;: \n                &quot;supported_content_type&quot;: [\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"*/*\" \n                ]\n        \n\n\nIn some cases a completely offline solution is desired. Since printers support a limited number\n  of input formats, a client will need to convert documents to a few natively supported printer\n  formats.\n\nThis spec REQUIRES all printers to support at least the PWG Raster (&quot;image/pwg-raster&quot;) format\n  for the offline printing case. A printer may support other formats (for example JPEG) and if a\n  client supports it, it may send documents in that format. The printer MUST expose supported types\n  through the /capabilities API, for example:\n\n\n\n\n\n        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;printer&quot;: \n                &quot;supported_content_type&quot;: [\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" \n                ]\n        \n\n\nThere are two ways a client may initiate printing over the local network.\nSimple printing &#8211; client sends the document over the local network to /submitdoc API\n  (without specifying the job_id parameter). The submitted document will be printed using default\n  print ticket settings and no print job statuses are needed. If the printer ONLY supports this type\n  of printing, it MUST advertise ONLY /submitdoc API in the /privet/info API response.\n\n\n\n\n&quot;api&quot;: [\n        \"/privet/accesstoken\",\n        \"/privet/capabilities\",\n        \"/privet/printer/submitdoc\",\n]\n\nAdvanced printing &#8211; client should first create a print job on the printer by calling the\n  /privet/printer/createjob API with a valid CJT job ticket in the request. The printer\n  MUST store the print ticket in memory and return a job_id back to the client. Then the client will\n  call the /printer/submitdoc API and specify the previously received job_id. At that time\n  the printer will start printing. The client will poll the printer for print job status by calling\n  le /privet/printer/jobstate API.\nIn a multi-client environment, there is no guarantee how this API is called. It is possible for\n  one client to call /createjob between another client’s /createjob-&gt;/submitdoc\n  calls. To eliminate possible deadlocks and improve usability, we recommended having a small queue\n  of pending print jobs on the printer (at least 3-5):\n\n /createjob takes the first available spot in the queue.\nJob lifetime (in the queue) is at least 5 minutes.\nIf all spots in the queue are taken, then the oldest, non-printing job shall be removed and a\n    new one will be placed there.\nIf there is a print job currently printing on the device (simple or advanced printing),\n    /submitdoc should return status busy and propose a timeout to retry this print job.\nSi /submitdoc refers to a job that has been removed from the queue (due to\n    replacement or timeout), the printer should return an error invalid_print_job et le\n    client will retry the process from the /createjob step. The client MUST wait for a\n    random timeout period of up to 5 seconds before retrying.\n\nIf memory constraints prevent storing multiple pending jobs on the device, it is possible to have\n  a queue of 1 print job long. It should still follow the same protocol as above. After a job has\n  completed or failed with an error, the printer should store information about the job’s\n  status for at least 5 minutes. The queue size for storing completed job statuses should be at\n  least 10. If there are more job statuses that need to be stored, the oldest one may be removed\n  from the queue before the 5 minute timeout.\nRemarque: For now clients will poll for job status. In the future, we may require\n  the printer to send TXT DNS notification when ANY print job status has changed.\n5.1. /privet/printer/createjob API\n/privet/printer/createjob API is OPTIONAL (see Simple Printing above). It is an HTTP POST\n  request. /privet/printer/createjob API MUST check for a valid &quot;X-Privet-Token&quot; header.\n  The device MUST implement this API on &quot;/privet/printer/createjob&quot; url:\nPOST /privet/printer/createjob HTTP/1.1\nWhen receiving /privet/printer/createjob API call, the printer MUST create a new print job ID, store\nthe received print ticket in the CJT format, and return print job id back to the client.\n5.1.1. Input\n/privet/printer/createjob API has no input parameters in URL. The request body should contain the\nprint job ticket data in CJT format.\n5.1.2. Return\n/privet/printer/createjob API returns the following data:\n\n\nValue name\nValue type\nLa description\n\n\njob_id\nchaîne\nID of the newly created print job.\n\n\nexpires_in\nint\nNumber of seconds this print job is valid.\n\n\nExemple:\n\n\n\n\n\n        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;expires_in&quot;: 600\n\n\n5.1.3. les erreurs\n/privet/printer/createjob API may return the following errors (see Errors section for details):\n\n\nErreur\nLa description\n\n\ninvalid_ticket\nSubmitted print ticket is invalid.\n\n\nprinter_busy\nPrinter is busy and can’t currently process /createjob. Recommencez\n    after timeout.\n\n\nprinter_error\nPrinter is in error state and requires user interaction to fix it.\n    Description should contain more detailed explanation (e.g. &quot;Paper jam in Tray 1&quot;).\n    \n\n\ninvalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.\n\n\nIf device is not exposing /privet/printer/createjob it MUST return HTTP 404 error. Si\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\n5.2. /privet/printer/submitdoc API\n/privet/printer/submitdoc API is REQUIRED to implement printing over a local network (offline or\nrepost to Cloud Print). It is an HTTP  POST request. /privet/printer/submitdoc API MUST check for a\nvalid &quot;X-Privet-Token&quot; header. The device MUST implement this API on\n&quot;/privet/printer/submitdoc&quot; url:\nPOST /privet/printer/submitdoc HTTP/1.1\nWhen receiving the /privet/printer/submitdoc API call, the printer should start printing. If it is\nunable to begin printing, it MUST return the error printer_busy and a recommended timeout period for\nthe client to wait before trying again.\nIf the printer is not able to hold all of the data in its internal buffer, it SHOULD use TCP\n  mechanisms to slow down data transfer until it prints a portion of the document, making part of\n  the buffer available again. (For example, the printer may set windowsize=0 on TCP layers, which\n  will make the client wait.)\nSubmitting a document to the printer may take a significant amount of time. The client should be\n  able to check the state of the printer and job (advanced printing) while printing is in progress.\n  In order to do that, the printer MUST allow the client to call the /privet/info and\n  /privet/printer/jobstate APIs while processing /privet/printer/submitdoc API calls. Il est\n  recommended for all clients to start a new thread to execute the /privet/printer/submitdoc API\n  call, so that the main thread can use the /privet/info and /privet/printer/jobstate APIs to check\n  printer and job states.\nRemarque: Upon completion or abortion of the local print job, it is strongly\n  recommended (and will be required in a future version of this spec) to report the final state of\n  the job to the /cloudprint/submit interface for accounting and user experience purposes. le\n  parameters &quot;printerid&quot;, &quot;title&quot;, &quot;contentType&quot; and &quot;final_semantic_state&quot; (in\n  PrintJobState format) are required, and the parameters &quot;tag&quot; (repeated\n  parameter) and &quot;ticket&quot; (the ticket of the job in CloudJobTicket format).\n  Note that the provided PrintJobState must actually be final, i.e. its type must be DONE or\n  ABORTED, and a cause must be provided in the case that it is ABORTED (see\n  JobState for details). Also note that this use of the\n  /cloudprint/submit interface to report local print jobs is not mentioned in\n  its specification because that section is intended to describe\n  the interface&#39;s primary use: submitting a print job with the document to print provided in the\n  &quot;content&quot; parameter.\n5.2.1. Input\n/privet/printer/submitdoc API has the following input parameters:\n\n\nName\nValeur\n\n\njob_id\n(optional) Print job id. May be omitted for simple printing case\n    (voir au dessus). Must match the one returned by the printer.\n\n\nuser_name\n(optional) Human readable user name. This is not definitive, and should\n    only be used for print job annotations. If job is re-posted to the Cloud Print service this\n    string should be attached to the Cloud Print job.\n\n\nclient_name\n(optional) Name of the client application making this request. Pour\n    display purposes only. If job is re-posted to the Cloud Print service this string should be\n    attached to the Cloud Print job.\n\n\njob_name\n(optional) Name of the print job to be recorded. If job is re-posted to\n    the Cloud Print service this string should be attached to the Cloud Print job.\n\n\noffline\n(optional) Could only be &quot;offline=1&quot;. In this case printer should\n    only try printing offline (no re-post to Cloud Print server).\n\n\nRequest body should contain a valid document for printing. &quot;Content-Length&quot; should\n  include the correct length of the request. &quot;Content-Type&quot; header should be set to\n  document MIME type and match one of the types in the CDD (unless CDD specifies &quot;*/*&quot;). \nClients are HIGHLY recommended to provide a valid user name (or email), a client name and a job\n  name with this request. Those fields are only used in UIs to improve user experience.\n5.2.2. Return\n/privet/printer/submitdoc API returns following data:\n\n\nValue name\nValue type\nLa description\n\n\njob_id\nchaîne\nID of the newly created print job (simple printing) or\n    job_id specified in the request (advanced printing).\n\n\nexpires_in\nint\nNumber of seconds this print job is valid.\n\n\njob_type\nchaîne\nContent-type of the submitted document.\n\n\njob_size\nint 64 bit\nSize of the print data in bytes.\n\n\njob_name\nchaîne\n(optional) Same job name as in input (if any).\n\n\nExemple:\n\n\n\n\n\n        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;expires_in&quot;: 500,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;\n\n\n5.2.3. les erreurs\n/privet/printer/submitdoc API may return the following errors (see Errors section for details):\n\n\nErreur\nLa description\n\n\ninvalid_print_job\nInvalid/expired job id is specified in the request. Retry after\n    timeout.\n\n\ninvalid_document_type\nDocument MIME-type is not supported by the printer.\n\n\ninvalid_document\nSubmitted document is invalid.\n\n\ndocument_too_large\nDocument exceeds maximum size allowed.\n\n\nprinter_busy\nPrinter is busy and can’t currently process document. Recommencez\n    after timeout.\n\n\nprinter_error\nPrinter is in error state and requires user interaction to fix it.\n    Description should contain more detailed explanation (e.g. &quot;Paper jam in Tray 1&quot;).\n    \n\n\ninvalid_params\nInvalid parameters specified in the request. (Unknown parameters\n    should be safely ignored for future compatibility)\n\n\nuser_cancel\nUser explicitly cancelled printing process from the device.\n\n\nserver_error\nPosting document to Cloud Print has failed.\n\n\ninvalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.\n\n\nIf the device is not exposing /privet/printer/submitdoc, it MUST return HTTP 404 error. Si la\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\nRemarque: /privet/printer/submitdoc API may require special handling on printer\n  side (because of the large payload attached). In some cases (depends on the printer HTTP server\n  implementation and platform), printer may close socket BEFORE returning HTTP error. In other,\n  printer may return 503 error (instead of Privet error). Printers SHOULD try as much as possible to\n  return Privet. However, every client implementing Privet specification SHOULD be able to handle\n  socket close (no HTTP error) and 503 HTTP error cases for /privet/printer/submitdoc API. Dans ce\n  case, client SHOULD handle it as a Privet &quot;printer_busy&quot; error with\n  &quot;timeout&quot; set to 15 seconds. To avoid infinite retries, client may stop retrying after\n  a reasonable number of attempts (for example, 3).\n5.3. /privet/printer/jobstate API\n/privet/printer/jobstate API is OPTIONAL (see Simple Printing above). It is an HTTP GET request.\n/privet/printer/jobstate API MUST check for a valid &quot;X-Privet-Token&quot; header. The device\nMUST implement this API on &quot;/privet/printer/jobstate&quot; url:\nGET /privet/printer/jobstate HTTP/1.1\nWhen receiving a /privet/printer/jobstate API call, a printer should return the status of the\nrequested print job or invalid_print_job error.\n5.3.1. Input\n/privet/printer/jobstate API has following input parameters:\n\n\nName\nValeur\n\n\njob_id\nPrint job ID to return status for.\n\n\n5.3.2. Return\n/privet/printer/jobstate API returns the following data:\n\n\nValue name\nValue type\nLa description\n\n\njob_id\nchaîne\nPrint job id there status information is for.\n\n\nstate\nchaîne\ndraft &#8211; print job has been created on the device (no\n    /privet/printer/submitdoc calls have been received yet).\n    queued &#8211; print job has been received and queued, but printing has not started yet.\n    in_progress &#8211; print job is in the progress of printing.\n    stopped &#8211; print job has been paused, but can be restarted manually or automatically.\n    terminé &#8211; print job is done.\n    aborted &#8211; print job failed.\n\n\nla description\nchaîne\n(optional) Human readable description of the print job\n    status. Should include additional information if statestopped or\n    aborted. le semantic_state field usually provides better and more meaningful\n    description to the client.\n\n\nexpires_in\nint\nNumber of seconds this print job is valid.\n\n\njob_type\nchaîne\n(optional) Content-type of the submitted document.\n\n\njob_size\nint 64 bit\n(optional) Size of the print data in bytes.\n\n\njob_name\nchaîne\n(optional) Same job name as in input (if any).\n\n\nserver_job_id\nchaîne\n(optional) ID of the job returned from the server (if\n    job has been posted to Cloud Print service). Omitted for offline printing.\n\n\nsemantic_state\nJSON\n(optional) Semantic state of the job in\n    PrintJobState format.\n\n\nExample (printing by reporting through Cloud Print):\n\n\n\n\n\n        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;in_progress&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;server_job_id&quot;: &quot;1111-2222-3333-4444&quot;\n\n\nExample (offline printing error):\n\n\n\n\n\n        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;stopped&quot;,\n        &quot;description&quot;: &quot;Out of paper&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;\n\n\nExample (print job aborted by the user):\n\n\n\n\n\n        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;aborted&quot;,\n        &quot;description&quot;: &quot;User action&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;semantic_state&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;state&quot;: \n                        &quot;type&quot;: &quot;ABORTED&quot;,\n                        &quot;user_action_cause&quot;: &quot;action_code&quot;: &quot;CANCELLED&quot;\n                ,\n                &quot;pages_printed&quot;: 7\n        \n\n\nExample (print job stopped due to out of paper). Notice the reference to the device state. le\nclient will need to call the /privet/info API to get more details about the device state:\n\n\n\n\n\n        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;stopped&quot;,\n        &quot;description&quot;: &quot;Out of paper&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: &quot;123456&quot;,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;semantic_state&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;state&quot;: \n                        &quot;type&quot;: &quot;STOPPED&quot;,\n                        &quot;device_state_cause&quot;: &quot;error_code&quot;: &quot;INPUT_TRAY&quot;\n                ,\n                &quot;pages_printed&quot;: 7\n        \n\n\n5.3.3. les erreurs\n/privet/printer/jobstate API may return the following errors (see Errors section for details):\n\n\nErreur\nLa description\n\n\ninvalid_print_job\nInvalid/expired job ID is specified in the request.\n\n\nserver_error\nGetting print job status (for print jobs posted to Cloud Print) has\n    failed.\n\n\ninvalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.\n\n\nIf device is not exposing /privet/printer/jobstate, it MUST return HTTP 404 error. Si la\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\n6. Appendix\n6.1. Default behavior and settings\nThis section will explain the default behavior we expect from ALL Privet-compatible devices.\n\nOut-of-the-box devices should support only /privet/info et\n    /privet/register APIs. All other APIs (e.g. /privet/accesstoken, local printing) should\n    be disabled.\nRegistration requires physical interaction with a device.\n\nUser MUST take a physical action on the device (e.g., pressing a button) to confirm their\n      access to the device. \nAfter the user takes the action noted above, the printer should send the\n      /cloudprint/register request. It should not send this request until after the action is taken\n      (see Sequence Diagram 1).\nIf the device is processing a /privet/register request (for instance, waiting on the action\n      above), it must reject all other /privet/register requests. The device MUST return the\n      device_busy error in this case.\nThe device should timeout any /register request that does not receive the physical action\n      mentioned above within 60 seconds. The device MUST return the confirmation_timeout error in\n      this case.\nOptional: Recommended but not required, the following may improve user experience:\n\nThe printer might flash a light or its screen to indicate that the user needs to take an\n        action to confirm registration.\nThe printer might state on its screen that ‘it is being registered to Google Cloud\n        Print for user ‘abc@def.com’ &#8211; press OK to\n        continue’, where abc@def.com  is the user\n        parameter from the /register API call. This would make it clearer to a user that:\n\nit is their registration request that s/he is confirming\nwhat is happening if s/he didn’t trigger the request.\n\nIn addition to a physical action to confirm from the printer (e.g., ‘Press the OK\n        button’), a printer may also offer the user a button to cancel the request (e.g.,\n        ‘Press Cancel to reject’). This would allow users who did not trigger the\n        registration request to cancel it before the 60 second timeout. The device MUST return the\n        user_cancel error in this case.\n\n\nOwnership transfers:\n\nThe device may be deleted explicitly from the Cloud service.\n\nIf the device receives success, but no device description as a result of\n        /cloudprint/printer (for GCP) call, it MUST revert to default (out-of-the-box) mode. \nIf the device’s credentials no longer work (explicitly because of &quot;invalid\n        credentials&quot; response from the server), it MUST revert to default (out-of-the-box)\n        mode.\n\nLocal factory reset MUST clear device’s credentials and set it to default state.\nOptional: The device may provide a menu item to clear credentials and put it into default\n      mode.\n\nDevices supporting XMPP notifications MUST include the ability to ping the server. The ping\n    timeout MUST be controllable from the server through &quot;local_settings&quot;.\nThe device may explicitly ping the server (/cloudprint/printer API for GCP, in addition to\n    XMPP pings)  no more often than once a day (24 hours) to make sure they are in sync. Il est\n    recommended to randomize the check window within 24-32 hour window.\nOptional: For Cloud Print devices, it is recommended but not required to have a manual way\n    (button) to allow the user to initiate a check for new print jobs from the device. Some printers\n    already have this.\nOptional. Enterprise printers may have an option to disable local discovery completely. Dans\n    such case, the device MUST update these local settings on the server. New local settings MUST be\n    empty (setting &quot;local_discovery&quot; to &quot;false&quot;, means that it can be\n    re-enabled from the GCP Service).\n\n\n6.1.2 Default Registration Diagram\n\n6.2. XSSI and XSRF attacks and prevention\nThis section will explain the possibility of XSSI and XSRF attacks on the device and how to protect\nfrom them (including token generation techniques).\nMore details are here:\n\n  http://googleonlinesecurity.blogspot.com/2011/05/website-security-for-webmasters.html\nNormally, XSSI and XSRF attacks are possible when a site is using cookie authentication\nmechanisms. While Google doesn’t use cookies with their Cloud Print Service, such attacks are\nstill possible. Local network access, by design, implicitly trusts requests.\n6.2.1. XSSI\nIt is possible for a malicious website to guess the IP address and port number of a\nPrivet-compatible device and to try to call the Privet API using &quot;src=&quot;http://developers.google.com/inside of a  tag:\n\n\n\nWithout protection, malicious websites would be able to execute API calls and access results.\nTo prevent this type of attack, ALL Privet API calls MUST require the\n&quot;X-Privet-Token&quot; header in the request. &quot;src=&quot;http://developers.google.com/script tags are\nnot able to add headers, effectively guarding against this type of attack.\n6.2.2. XSRF\n\n  http://en.wikipedia.org/wiki/Cross-site_request_forgery\nIt is possible for a malicious website to guess the IP address and port number of a\nPrivet-compatible device and try to call Privet API using an , forms, or some other\ncross-website loading mechanism. Attackers would not be able to access the results of the request,\nbut if the request would perform an action (e.g. printing), they could trigger it.\nTo prevent this attack, we require the following protection:\n\nLeave /privet/info API open to XSRF\n/privet/info API MUST NOT perform any actions on the device\nUse /privet/info API to receive x-privet-token\nAll other APIs MUST check for a valid x-privet-token in &quot;X-Privet-Token&quot; header.\nx-privet-token SHOULD be valid for only 24 hours.\n\nEven if an attacker is able to execute the /privet/info API, they would not be able to\nread x-privet-token from the response and therefore would not be able to call any other API.\nIt is strongly recommended to generate the XSRF token using the following algorithm:\nXSRF_token = base64( SHA1(device_secret + DELIMITER + issue_timecounter) + DELIMITER + issue_timecounter )\nXSRF Token Generation Elements:\n\nDELIMITER is a special character, usually ‘:’\nissue_timecounter is a number of seconds since some event (epoch for timestamp) or\n    device boot time (for CPU counters). issue_timecounter is constantly increasing when\n    the device is up and running (see token verification below).\nSHA1 &#8211; hash function using SHA1 algorithm\nbase64 &#8211; base64 encoding\ndevice_secret &#8211; secret specific to the device. Device secret MUST be updated on every\n    restart.\n\nRecommended ways to generate device secret:\n\nGenerate a new UUID on every restart\nGenerate a 64 bit random number on every restart\n\nThe device is not required to store all of the XSRF tokens it has issued. When the device needs\n  to verify a XSRF token for validity, it should base64-decode the token. Get the\n  issue_timecounter from the second half (cleartext), and try to produce SHA1 hash of\n  device_secret + DELIMITER + issue_timecounter où issue_timecounter is from\n  the token. If the newly generated SHA1 matches the one in the token, device must now check if the\n  issue_timecounter is within the validity period from (24 hours) of the current time\n  counter. To do so, device takes the current time counter (CPU counter for example) and subtracts\n  issue_timecounter à partir de cela. The result MUST be the number of seconds since token\n  issue.\nImportant: This is the recommended way to implement XSRF\n  protection. Clients of the Privet specification shall not try to understand XSRF token, instead\n  they shall treat is as a blackbox. Figure 6.2.3 illustrates a recommended way to implement the\n  X-Privet-Token and verification of a typical request.\n6.2.3 X-Privet Token Generation and Verification Sequence Diagram\n\n6.3. Workflow diagrams\nThis section will illustrate a workflow in different cases.\n6.3.1. Printer out of the box workflow\n\n6.3.2. Registered printer startup\n\n6.3.3 XMPP notifications handling workflow\n\n6.3.4. Check printer settings workflow\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["Privet est une API de découverte locale d&#39;appareils de nuage utilisée par les services de nuage. Ce document est organisé\n  dans les sections suivantes:","Introduction: introduction à Privet\nDécouverte: mécanismes de découverte locaux\nAnnonces: annonces de découverte locale\nAPI: API Privet pour les périphériques cloud généraux\nAPI d&#39;imprimante: API Privet utilisées par les imprimantes\nAnnexe: schémas supplémentaires","1. Introduction\nLes appareils connectés au cloud présentent de nombreux avantages. Ils peuvent utiliser les services de conversion en ligne, le travail hôte\n  file d&#39;attente lorsque l&#39;appareil est hors ligne et accessible de partout dans le monde. Cependant, avec\n  nombreux périphériques accessibles par un utilisateur donné dans le cloud, nous devons fournir une méthode permettant de\n  appareil le plus proche en fonction de l&#39;emplacement. Le protocole Privet a pour objectif de lier la flexibilité des\n  périphériques cloud avec un mécanisme de découverte local approprié, de sorte que les périphériques soient facilement découverts\n  nouveaux environnements.\nLes objectifs de ce protocole sont:","rendre les périphériques cloud détectables localement\nenregistrer des périphériques cloud avec un service cloud\nassocier les appareils enregistrés à leur représentation dans le nuage\nactiver la fonctionnalité hors ligne\nsimplifier la mise en œuvre pour que les petits appareils puissent l&#39;utiliser","Le protocole Privet comprend 2 parties principales: découverte et API. La découverte est utilisée pour trouver le\n  périphérique sur le réseau local, et l’API permet d’obtenir des informations sur le périphérique et\n  effectuer des actions. Tout au long de ce document, l&#39;appareil désigne un appareil connecté au cloud\n  implémenter le protocole Privet.\n2. découverte\nDiscovery est un protocole basé sur zeroconf (mDNS + DNS-SD). Le périphérique DOIT implémenter IPv4 Link-Local\n  Adresser. L&#39;appareil DOIT être conforme aux spécifications mDNS et DNS-SD.\nLe dispositif DOIT effectuer la résolution des conflits de noms conformément aux spécifications ci-dessus.\n2.1. type de service\nLa découverte de service DNS utilise le format suivant pour les types de service:\n  _applicationprotocol._transportprotocol. Dans le cas du protocole Privet, le service\n  type pour DNS-SD devrait être: _privet._tcp\nL&#39;appareil peut également implémenter d&#39;autres types de services. Il est conseillé d&#39;utiliser le même service\n  nom d&#39;instance pour tous les types de services implémentés par le périphérique. Par exemple: une imprimante peut\n  implémentez les services &quot;Imprimante XYZ._privet._tcp&quot; et &quot;Imprimante XYZ._printer._tcp&quot;. Ça va simplifier\n  configuration pour l&#39;utilisateur. Cependant, les clients Privet rechercheront uniquement &quot;_privet._tcp&quot;.\nEn plus du type de service principal, l’appareil DOIT annoncer les enregistrements PTR pour ses\n  sous-type (s) correspondant (voir spéc. DNS-SD: &quot;7.1. Énumération d&#39;instances sélective (sous-types)&quot;).\n  Le format devrait être le suivant:\n  _._sub.privet._tcp\nActuellement, le seul sous-type de périphérique pris en charge est imprimante. Donc, toutes les imprimantes DOIVENT annoncer\n  deux enregistrements PTR:","_privet._tcp.local.\n_printer._sub._privet._tcp.local.","2.2. Enregistrement TXT\nle Découverte du service DNS définit des champs pour ajouter des informations facultatives sur un service dans\n  les enregistrements TXT. Un enregistrement TXT est constitué de paires clé / valeur. Chaque paire clé / valeur commence à partir du\n  longueur octet suivi de 255 octets de texte au maximum. La clé est le texte avant le premier\n  Le caractère &quot;=&quot; et la valeur correspond au texte après le premier caractère &quot;=&quot;\n  jusqu&#39;à la fin. La spécification ne permet aucune valeur dans l&#39;enregistrement, dans ce cas, il n&#39;y aura aucune\n  Caractère &quot;=&quot; OU pas de texte après le caractère &quot;=&quot;. (Voir spéc. DNS-SD:\n  &quot;6.1. Règles générales de format pour les enregistrements DNS TXT&quot; pour le format d&#39;enregistrement DNS TXT et &quot;6.2. DNS-SD TXT\n  Taille d&#39;enregistrement &quot;pour la longueur recommandée).\nPrivet exige que le périphérique envoie les paires clé / valeur suivantes dans l&#39;enregistrement TXT. Valeur clé\n  les chaînes ne respectent pas la casse, par exemple &quot;CS = online&quot; et &quot;cs = ONLINE&quot; sont\n  le même. Les informations contenues dans l&#39;enregistrement TXT DOIVENT être identiques à celles accessibles via l&#39;API / info (voir 4.1.\n  Section API).\nIl est recommandé de conserver une taille d’enregistrement TXT inférieure à 512 octets.\n2.2.1. txtvers\nVersion de la structure TXT. txtvers DOIT être le premier enregistrement de la structure TXT. Actuellement\n  la seule version supportée est 1.\ntxtvers = 1\n2.2.2. ty\nFournit un nom lisible par l&#39;utilisateur du périphérique. Par exemple:\nty = Modèle d&#39;imprimante Google Cloud Ready XYZ\n2.2.3. note (optionnel)\nFournit un nom lisible par l&#39;utilisateur du périphérique. Par exemple:\nnote = Imprimeur de lobby au 1er étage\nRemarque: Ceci est une clé optionnelle et peut être ignorée. Cependant, si présent, l&#39;utilisateur\n  DEVRAIT pouvoir modifier cette valeur. La même description DOIT être utilisée lors de l&#39;enregistrement d&#39;un appareil.\n2.2.4. url\nURL du serveur auquel cet appareil est connecté (protocole compris). Par exemple:\nurl = https: //www.google.com/cloudprint\n2.2.5. type\nListe de sous-types de périphérique pris en charge par ce périphérique, séparés par des virgules. Le format est:\n  &quot;type = _subtype1, _subtype2&quot;. Actuellement, le seul sous-type de périphérique pris en charge est\n  imprimante.\ntype = imprimante\nChaque sous-type répertorié doit être annoncé à l&#39;aide d&#39;un enregistrement PTR correspondant. Pour chaque supporté\n  service, il doit y avoir un élément correspondant. Nom du sous-type de service\n  (._sub.privet._tcp) devrait être égal au type de périphérique ici.\n2.2.6. identifiant\nReference de l&#39;appareil. Si le périphérique n&#39;a pas encore été enregistré, cette clé doit être présente, mais la valeur\n  devrait être vide. Par exemple:","id = 11111111-2222-3333-4444-555555555555\n  id =","2.2.7. cs\nIndique l’état actuel de la connexion du périphérique. Quatre valeurs possibles sont définies dans cette\n  spec.","&quot;online&quot; indique que l&#39;appareil est actuellement connecté au cloud.\n&quot;hors ligne&quot; indique que le périphérique est disponible sur le réseau local, mais\n    ne peux pas parler au serveur.\n&quot;connexion&quot; indique que le périphérique effectue sa séquence de démarrage et est en train de\n    pas encore complètement en ligne.\n&quot;non configuré&quot; indique que l&#39;accès Internet de l&#39;appareil n&#39;a pas été\n    configuré pour le moment. Cette valeur n’est pas utilisée actuellement, mais peut être utile dans les futures versions du logiciel.\n    spécification.","Par exemple:","cs = en ligne\ncs = hors ligne\ncs = connexion","Si le périphérique a été enregistré dans un nuage, il doit vérifier au démarrage la connectivité avec\n  serveur pour détecter son état de connexion (par exemple, appeler une API cloud pour obtenir les paramètres du périphérique). le\n  L’équipement peut utiliser l’état de la connexion de son canal de notification (XMPP, par exemple) pour signaler cette valeur.\n  Les périphériques non enregistrés au démarrage peuvent envoyer un ping à un domaine afin de détecter leur état de connexion (par exemple,\n  exemple, effectuez un ping sur www.google.com pour les périphériques d’impression dans le cloud\n3. Annonces\nAu démarrage, à l&#39;arrêt ou au changement d&#39;état du périphérique, le périphérique DOIT exécuter l&#39;étape de l&#39;annonce\n  décrit dans la spécification mDNS. Il\n  DEVRAIT envoyer l&#39;annonce correspondante au moins deux fois avec un intervalle d&#39;au moins une seconde\n  entre eux.\n3.1. Commencez\nAu démarrage de l&#39;appareil, il DOIT exécuter les étapes de vérification et d&#39;annonce décrites dans le manuel mDNS.\n  spécification. Les enregistrements SRV, PTR et TXT doivent être envoyés dans ce cas. Il est recommandé de grouper\n  tous les enregistrements dans une réponse DNS si possible. Si non, l&#39;ordre suivant est recommandé: SRV,\n  PTR, enregistrements TXT.\n3.2. Fermer\nLors de l’arrêt de l’appareil, il DEVRAIT essayer d’en informer toutes les parties intéressées en envoyant un message.\n  &quot;Au revoir paquet&quot; avec TTL = 0 (comme décrit dans la documentation de mDNS).\n3.3. Mise à jour\nSi l’une des informations décrites dans TXT a changé, le périphérique DOIT envoyer une mise à jour.\n  annonce. Dans ce cas, il suffit d’envoyer le nouvel enregistrement TXT. Par exemple, après un\n  appareil est enregistré, il DOIT envoyer une annonce de mise à jour incluant le nouvel identifiant d&#39;appareil.\n4. API\nUne fois qu&#39;un périphérique cloud a été découvert, la communication client est activée avec le périphérique.\n  directement sur le réseau local. Toutes les API sont basées sur HTTP 1.1. Les formats de données sont basés sur JSON. API\n  les requêtes peuvent être des requêtes GET ou POST.\nChaque demande DOIT contenir un &quot;X-Privet-Token&quot;en-tête. La SEULE demande\n  autorisé à avoir un en-tête &quot;X-Privet-Token&quot; vide est la requête / privet / info (note\n  l&#39;en-tête DOIT toujours être présent). Si l&#39;en-tête &quot;X-Privet-Token&quot; est manquant, le\n  le périphérique DOIT répondre avec l&#39;erreur HTTP 400 suivante:\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\nSi l&#39;en-tête &quot;X-Privet-Token&quot; est vide ou invalide, le périphérique DOIT répondre avec\n  &quot;erreur X-Privet-Token non valide&quot; (invalid_x_privet_token, voir la section Erreurs pour plus de détails).\n  détails). La seule exception est l&#39;API / info. Pour voir plus d&#39;informations sur pourquoi cela est fait et comment les jetons\n  voir Annexe A: Attaques XSSI et XSRF et prévention.\nSi une API demandée n&#39;existe pas ou n&#39;est pas prise en charge, le périphérique DOIT renvoyer une erreur HTTP 404.\n4.1. Disponibilité de l&#39;API\nAvant TOUTE API ne soit exposée (y compris l’API / info), le périphérique DOIT contacter le serveur pour vérifier\n  paramètres locaux. Les paramètres locaux DOIVENT être préservés entre\n  redémarre. Si le serveur n&#39;est pas disponible, les derniers paramètres locaux connus doivent être utilisés. Si la\n  L&#39;appareil n&#39;a pas encore été enregistré, il devrait suivre les paramètres par défaut.\nLes périphériques Cloud Print DOIVENT suivre les étapes ci-dessous pour enregistrer, recevoir et mettre à jour les paramètres locaux.\n4.1.1. enregistrement\nLorsque le périphérique s&#39;inscrit, il DOIT spécifier le paramètre &quot;local_settings&quot;, comme suit:","       &quot;actuel&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: true,\n                &quot;printer / conversion_printing_enabled&quot;: true,\n                &quot;xmpp_timeout_value&quot;: 300\n        ","Les paramètres suivants peuvent être définis:","Nom de la valeur\nType de valeur\nLa description","découverte_locale\nbooléen\nIndique si la fonctionnalité de découverte locale est\n    permis. Si &quot;false&quot;, toutes les découvertes d&#39;API locale (y compris / info) et DNS-SD doivent être désactivées. Par\n    Par défaut, les périphériques nouvellement enregistrés doivent passer &quot;true&quot;.","access_token_enabled\nbooléen (optionnel)\nIndique si / accesstoken API\n    devrait être exposé sur le réseau local. Par défaut devrait être &quot;true&quot;.","printer / local_printing_enabled\nbooléen (optionnel)\nIndique si local\n    la fonctionnalité d’impression (/ printer / createjob, / printer / submitdoc, / printer / jobstate) devrait être\n    exposés sur le réseau local. Par défaut devrait être &quot;true&quot;.","printer / conversion_printing_enabled\nbooléen (optionnel)\nIndique si local\n    l&#39;impression peut envoyer le travail au serveur pour la conversion. Cela n’a de sens que lorsque l’impression locale est activée.","xmpp_timeout_value\nint (facultatif)\nIndique le nombre de secondes entre\n    Pingles de canal XMPP. Par défaut, DOIT être 300 (5 minutes) ou plus.","Important: L’absence de valeur optionnelle indique que le\n  la fonctionnalité correspondante est complètement non prise en charge par le périphérique.\n4.1.2. Commencez\nAu démarrage du périphérique, le serveur doit contacter le serveur pour vérifier quelles API sont disponibles pour être exposées dans\n  le réseau local. Pour les imprimantes connectées à Cloud Print, elles doivent appeler:\n/ cloudprint / printer? printerid =\nou\n/ cloudprint / list\n/ cloudprint / printer est préférable à / cloudprint / list, mais les deux fonctionneront.\nCette API renvoie les paramètres actuels du périphérique, y compris les paramètres de l&#39;API locale. La réponse du\n  Le serveur aura le format suivant:","&quot;paramètres locaux&quot;: \n        &quot;actuel&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: true,\n                &quot;printer / conversion_printing_enabled&quot;: true,\n                &quot;xmpp_timeout_value&quot;: 300\n         ,\n         &quot;en attente&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: false,\n                &quot;printer / conversion_printing_enabled&quot;: false,\n                &quot;xmpp_timeout_value&quot;: 500\n         ","L&#39;objet &quot;en cours&quot; indique les paramètres en vigueur pour le moment.\nL&#39;objet &quot;en attente&quot; indique les paramètres à appliquer au périphérique (cet objet\n  peut être manquant).\nUne fois que le périphérique voit les paramètres &quot;en attente&quot;, il DOIT mettre à jour son état (voir ci-dessous).\n4.1.3. Mise à jour\nSi une mise à jour des paramètres est nécessaire, une notification XMPP sera envoyée au périphérique. La notification\n  sera dans le format suivant:\n/mettre à jour les paramètres\nÀ la réception d&#39;une telle notification, le périphérique DOIT interroger le serveur pour obtenir les derniers paramètres.\n  Les périphériques Cloud Print DOIVENT utiliser:\n/ cloudprint / printer? printerid =\nUne fois que le périphérique voit la section &quot;en attente&quot; suite à l’API / cloudprint / printer (à\n  démarrage ou en raison de la notification), il DOIT mettre à jour son état interne pour se souvenir du nouveau\n  paramètres. Il DOIT appeler l&#39;API du serveur pour confirmer les nouveaux paramètres. Pour les imprimantes en nuage, le périphérique\n  DOIT appeler / cloudprint / update API et utiliser le paramètre &quot;local_settings&quot; comme pendant\n  enregistrement.\nLors de la reconnexion au canal XMPP, le périphérique DOIT appeler / cloudprint / API pour vérifier si\n  les paramètres locaux ont été modifiés depuis la dernière fois.\n4.1.3.1. Paramètres locaux en attente\nLe paramètre &quot;local_settings&quot; utilisé par le périphérique pour appeler l&#39;API du serveur NE DOIT JAMAIS contenir\n  section &quot;en attente&quot;.\n4.1.3.2. Paramètres locaux actuels\nUNIQUEMENT l’appareil peut changer la section &quot;actuelle&quot; des &quot;paramètres locaux&quot;.\n  Tout le monde changera la section &quot;en attente&quot; et attendra que les modifications soient apportées.\n  propagé à la section &quot;en cours&quot; par le périphérique.\n4.1.4. Hors ligne\nLorsqu&#39;il est impossible de contacter le serveur au démarrage, après notification, le périphérique DOIT utiliser le dernier\n  paramètres locaux.\n4.1.5. Suppression de l&#39;appareil du service\nSi le périphérique a été supprimé du service (GCP par exemple), une notification XMPP sera envoyée.\n  envoyé à l&#39;appareil. La notification sera au format suivant:\n/effacer\nÀ la réception d&#39;une telle notification, le périphérique DOIT se rendre sur le serveur pour vérifier son état. Nuage\n  Les périphériques d’impression DOIVENT utiliser:\n/ cloudprint / printer? printerid =\nLe périphérique DOIT recevoir une réponse HTTP réussie avec success = false et aucun périphérique / imprimante.\n  la description. Cela signifie que le périphérique a été retiré du serveur et que le périphérique DOIT effacer ses\n  informations d’authentification et passer en mode de paramètres d’usine par défaut.\nTOUTE heure à laquelle le périphérique reçoit une réponse indiquant qu&#39;il a été supprimé à la suite de la\n  / cloudprint / API (démarrage, notification des paramètres de mise à jour, ping quotidien), elle DOIT supprimer ses\n  informations d&#39;identification et aller en mode par défaut.\n4.2. API / privet / info\nL&#39;info API est OBLIGATOIRE et DOIT être implémentée par tous les appareils. C&#39;est une requête HTTP GET pour\n  &quot;/ privet / info&quot; url: GET / privet / info HTTP / 1.1\nL&#39;API info renvoie des informations de base sur un périphérique et les fonctionnalités qu&#39;il prend en charge. Cette API\n  NE DOIT jamais changer l’état du dispositif ni effectuer aucune action, car il est vulnérable aux attaques XSRF.\n  C&#39;est la SEULE API autorisée à avoir un en-tête &quot;X-Privet-Token&quot; vide. Les clients devraient\n  API call / privet / info avec en-tête &quot;X-Privet-Token&quot; définie sur X-Privet-Token:\n  &quot;&quot;\nL&#39;API info DOIT renvoyer des données cohérentes avec les données disponibles dans l&#39;enregistrement TXT lors de la découverte.\n4.2.1. Contribution\n/ privet / info L&#39;API n&#39;a pas de paramètre d&#39;entrée.\n4.2.2. Revenir\nL&#39;API / privet / info renvoie des informations de base sur le périphérique et les fonctionnalités prises en charge.\nLa colonne TXT indique le champ correspondant dans l’enregistrement DNS-SD TXT.","Nom de la valeur\nType de valeur\nLa description\nSMS","version\nchaîne\nVersion la plus récente (major.minor) de l&#39;API prise en charge, actuellement\n    1,0","Nom\nchaîne\nNom lisible par l&#39;homme du périphérique.\nty","la description\nchaîne\n(facultatif) Description de l&#39;appareil. DEVRAIT être modifiable par\n    utilisateur.\nRemarque","url\nchaîne\nURL du serveur avec lequel cet appareil parle. L&#39;URL DOIT inclure\n    spécification du protocole, par exemple: https://www.google.com/cloudprint.\nurl","type\nliste de chaînes\nListe des types d&#39;appareils pris en charge.\ntype","identifiant\nchaîne\nIdentifiant de périphérique, vide si le périphérique n&#39;a pas encore été enregistré.\nidentifiant","état_périphérique\nchaîne\nEtat de l&#39;appareil.tourner au ralenti signifie que l&#39;appareil est\n    prêtEn traitement signifie que le périphérique est occupé et que les fonctionnalités peuvent être limitées pendant un certain temps\n    arrêté signifie que l&#39;appareil ne fonctionne pas et que l&#39;intervention de l&#39;utilisateur est requise","état_connexion\nchaîne\nEtat de la connexion au serveur (base_url)\n    en ligne &#8211; connexion disponible\n    hors ligne &#8211; pas de connection\n    de liaison &#8211; effectuer les étapes de démarrage\n    pas configuré &#8211; la connexion n&#39;a pas encore été configurée\n    Un périphérique enregistré peut signaler son état de connexion en fonction de l&#39;état de la notification.\n    canal (par exemple, l&#39;état de la connexion XMPP).\ncs","fabricant\nchaîne\nNom du fabricant de l&#39;appareil","modèle\nchaîne\nModèle de l&#39;appareil","numéro de série\nchaîne\nIdentifiant unique de l&#39;appareil. Dans cette spécification, cela DOIT être\n    un UUID. (Spec GCP 1.1)\n    (facultatif) Nous vous recommandons vivement d’utiliser le même identifiant de numéro de série partout, donc différent.\n    les clients peuvent identifier le même appareil. Par exemple, les imprimeurs implémentant IPP peuvent utiliser cette interface série.\n    numéro d&#39;identification dans le champ &quot;printer-device-id&quot;.","firmware\nchaîne\nVersion du firmware de l&#39;appareil","la disponibilité\nint\nNombre de secondes à partir du démarrage du périphérique.","setup_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    instructions d&#39;installation","support_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    support, informations FAQ","update_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    mettre à jour les instructions du firmware","x-privet-token\nchaîne\nValeur de la X-Privet-Token en-tête qui a\n    à transmettre à toutes les API pour empêcher les attaques XSSI et XSRF. Voir 6.1. pour plus de détails.","api\ndescription des API\nListe des API prises en charge (décrites ci-dessous)","état sémantique\nJSON\n(facultatif) Etat sémantique de l&#39;appareil en\n    Format CloudDeviceState.","api &#8211; est une liste JSON contenant la liste des API disponibles via le réseau local. Remarque\n  toutes les API ne sont peut-être pas disponibles simultanément sur le réseau local. Par exemple, un nouveau\n  L&#39;appareil connecté ne doit supporter que l&#39;API / Register:","&quot;api&quot;: [\n        \"/privet/register\",\n]","Une fois l&#39;enregistrement de l&#39;appareil terminé, l&#39;appareil DEVRAIT cesser de prendre en charge l&#39;API / register. le\nLe périphérique doit également vérifier auprès du service afin de déterminer quelles API peuvent être exposées sur le serveur local.\nréseau. Par exemple:","&quot;api&quot;: [\n        \"/privet/accesstoken\",\n        \"/privet/capabilities\",\n        \"/privet/printer/submitdoc\",\n]","Les API suivantes sont disponibles à ce moment:","/ privet / register &#8211; API pour l&#39;enregistrement de périphérique sur le réseau local. (voir\n    / privet / register API pour plus de détails). Cette API DOIT être cachée une fois le périphérique réussi.\n    enregistré dans le nuage.\n/ privet / accesstoken &#8211; API permettant de demander un jeton d’accès à l’appareil (voir\n    / privet / accesstoken API pour plus de détails).\n/ privet / capacités &#8211; API permettant de récupérer les capacités du périphérique (voir / privet / capacités\n    API pour plus de détails).\n/ privet / printer / * &#8211; API spécifique au type de périphérique &quot;imprimante&quot;, voir imprimante\n    API spécifiques pour plus de détails.","Voici un exemple de réponse / privet / info. (Notez le manque de l’API / privet / register, car\nce périphérique est déjà enregistré):","        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;name&quot;: &quot;l’imprimante de Gene&quot;,\n        &quot;description&quot;: &quot;Imprimante connectée via un connecteur Chrome&quot;,\n        &quot;url&quot;: &quot;https://www.google.com/cloudprint&quot;,\n        &quot;type&quot;: [\n                \"printer\"\n        ],\n        &quot;id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n        &quot;device_state&quot;: &quot;inactif&quot;,\n        &quot;connection_state&quot;: &quot;en ligne&quot;,\n        &quot;fabricant&quot;: &quot;Google&quot;,\n        &quot;modèle&quot;: &quot;Google Chrome&quot;,\n        &quot;numéro de série&quot;: &quot;1111-22222-33333-4444&quot;,\n        &quot;firmware&quot;: &quot;24.0.1312.52&quot;,\n        &quot;disponibilité&quot;: 600,\n        &quot;setup_url&quot;: &quot;http://support.google.com/cloudprint/answer/1686197/?hl=fr&quot;,\n        &quot;support_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;update_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;x-privet-token&quot;: &quot;AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659&quot;,\n        &quot;api&quot;: [\n                \"/privet/accesstoken\",\n                \"/privet/capabilities\",\n                \"/privet/printer/submitdoc\",\n        ]","Voici un exemple de réponse / privet / info pour une imprimante à court d’encre (avis\n  état de sémantique):","{\n        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;name&quot;: &quot;l’imprimante de Gene&quot;,\n        &quot;description&quot;: &quot;Imprimante connectée via un connecteur Chrome&quot;,\n        &quot;url&quot;: &quot;https://www.google.com/cloudprint&quot;,\n        &quot;type&quot;: [\n                \"printer\"\n        ],\n        &quot;id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n        &quot;device_state&quot;: &quot;stoppé&quot;,\n        &quot;connection_state&quot;: &quot;en ligne&quot;,\n        &quot;fabricant&quot;: &quot;Google&quot;,\n        &quot;modèle&quot;: &quot;Google Chrome&quot;,\n        &quot;numéro de série&quot;: &quot;1111-22222-33333-4444&quot;,\n        &quot;firmware&quot;: &quot;24.0.1312.52&quot;,\n        &quot;disponibilité&quot;: 600,\n        &quot;setup_url&quot;: &quot;http://support.google.com/cloudprint/answer/1686197/?hl=fr&quot;,\n        &quot;support_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;update_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;x-privet-token&quot;: &quot;AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659&quot;,\n        &quot;api&quot;: [\n                \"/privet/accesstoken\",\n                \"/privet/capabilities\",\n                \"/privet/printer/submitdoc\",\n        ],\n        &quot;état sémantique&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;imprimante&quot;: \n                        &quot;state&quot;: &quot;STOPPED&quot;,\n                        &quot;marker_state&quot;: \n                                &quot;article&quot;: [\n                                        \n                                                \"vendor_id\": \"ink\",\n                                                \"state\": \"EXHAUSTED\",\n                                                \"level_percent\": 0\n                                        \n                                ]\n                        \n                \n        \n}","4.2.3. les erreurs\n/ privet / info API devrait SEULEMENT renvoyer une erreur si X-Privet-Token l&#39;en-tête est manquant. Il\n  DOIT être une erreur HTTP 400:\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\n4.3. / privet / register API\n/ privet / register est facultative. C&#39;est une requête HTTP POST. / privet / register API DOIT vérifier\n  pour une validité X-Privet-Token entête. Le périphérique DOIT implémenter cette API sur\n  &quot;/ privet / register&quot; url:","POST /privet/register?action=start&amp;user=user@domain.com HTTP / 1.1\nPOST /privet/register?action=complete&amp;user=user@domain.com HTTP / 1.1","L’appareil doit exposer l’API / privet / register UNIQUEMENT lorsqu’il autorise l’enregistrement anonyme à la\n  moment. Par exemple:","Lorsque le périphérique est allumé (ou après avoir cliqué sur un bouton spécial du périphérique) et n’a pas\n    été enregistré, il devrait exposer l’API / privet / register pour permettre à un utilisateur du répertoire local\n    réseau pour réclamer l’imprimante.\nUne fois l’enregistrement terminé, le périphérique doit cesser d’exposer l’API / privet / register à\n    empêcher un autre utilisateur du réseau local de récupérer le périphérique.\nCertains appareils peuvent avoir différentes façons d’enregistrer des appareils et ne doivent pas exposer le\n    / privet / register à tous (par exemple, le connecteur Chrome Cloud Print).","Le processus d’enregistrement se déroule en 3 étapes (voir Enregistrement anonyme pour Cloud Print).","Lancer le processus d&#39;inscription anonyme.\nUn client initie ce processus en appelant l&#39;API / privet / register. L&#39;appareil peut attendre\n    confirmation de l&#39;utilisateur à ce moment.\nObtenez le jeton de réclamation.","Le client interroge pour savoir quand l&#39;appareil est prêt à continuer. Une fois que l&#39;appareil est prêt, il\n  envoie une demande au serveur pour récupérer le jeton d&#39;enregistrement et l&#39;URL d&#39;inscription. Jeton reçu\n  et URL DEVRAIT être retourné au client. Au cours de cette étape, si le périphérique reçoit un autre appel pour\n  initialiser l&#39;enregistrement, il devrait:","Si c’est le même utilisateur qui a commencé l’enregistrement, supprimez toutes les données précédentes (le cas échéant) et démarrez le système.\n    un nouveau processus d&#39;inscription.\nS&#39;il s&#39;agit d&#39;un utilisateur différent, retourne une erreur device_busy et un délai d&#39;attente de 30 secondes.","Processus d&#39;inscription complet.\nUne fois que le client a réclamé le périphérique, il doit lui notifier son achèvement.\n  enregistrement. Une fois le processus d&#39;enregistrement terminé, l&#39;appareil doit envoyer une mise à jour.\n  annonce, y compris l&#39;ID de périphérique nouvellement acquis.\nRemarque: lorsque le périphérique traite un appel d&#39;API / privet / register, aucune autre API / privet / register\n  les appels peuvent être traités simultanément. Le périphérique DOIT retourner l&#39;erreur device_busy et 30 secondes\n  temps libre.\nLa confirmation de l&#39;utilisateur pour l&#39;enregistrement sur l&#39;appareil est fortement recommandée. Si mis en œuvre, le\n  le périphérique DOIT attendre la confirmation de l&#39;utilisateur APRÈS qu&#39;il reçoive un / privet / register? action = start API\n  appel. Le client appellera / privet / register? Action = getClaimToken pour savoir quand\n  la confirmation de l&#39;utilisateur est terminée et le jeton de réclamation est disponible. Si l&#39;utilisateur annule son inscription le\n  l&#39;appareil (par exemple, appuie sur le bouton Annuler), l&#39;erreur user_cancel DOIT être renvoyée. Si l&#39;utilisateur\n  l’enregistrement n’a pas été confirmé dans un certain délai, l’erreur confirmation_timeout DOIT être\n  revenu. Voir la section des valeurs par défaut pour plus de détails.\n4.3.1. Contribution\nL&#39;API / privet / register a les paramètres d&#39;entrée suivants:","Nom\nValeur","action\nPeut être l&#39;un des suivants:\n    début &#8211; pour commencer le processus d&#39;inscription\n    getClaimToken &#8211; récupérer le jeton de réclamation pour le périphérique\n    Annuler &#8211; annuler le processus d&#39;inscription\n    Achevée &#8211; terminer le processus d&#39;inscription","utilisateur\nEmail de l&#39;utilisateur qui réclamera cet appareil.","Le périphérique DOIT vérifier que l’adresse électronique de toutes les actions (start, getClaimToken, annuler,\n  complète) correspond.\n4.3.2. Revenir\nL&#39;API / privet / register renvoie les données suivantes:","Nom de la valeur\nType de valeur\nLa description","action\nchaîne\nMême action que dans le paramètre d&#39;entrée.","utilisateur\nchaîne (optionnel)\nMême utilisateur que dans le paramètre d&#39;entrée (peut être manquant, si\n    omis dans l&#39;entrée).","jeton\nchaîne (optionnel)\nJeton d&#39;inscription (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;).","claim_url\nchaîne (optionnel)\nURL d&#39;enregistrement (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;). Pour les imprimantes en nuage, il faut\n    être &quot;complete_invite_url&quot; reçu du serveur.","automation_claim_url\nchaîne (optionnel)\nURL d&#39;enregistrement (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;). Pour les imprimantes en nuage, il faut\n    être &quot;automatic_invite_url&quot; reçu du serveur.","Reference de l&#39;appareil\nchaîne (optionnel)\nNouvel identifiant d&#39;appareil (omis pour la réponse &quot;start&quot;,\n    obligatoire pour &quot;complet&quot;).","Le périphérique DOIT retourner son identifiant de périphérique dans la réponse de l&#39;API / privet / info UNIQUEMENT après l&#39;enregistrement.\n  Achevée.\nExemple 1:","        &quot;action&quot;: &quot;start&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,","Exemple 2:","        &quot;action&quot;: &quot;getClaimToken&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;claim_url&quot;: &quot;https://domain.com/SoMeUrL&quot;,","Exemple 3:","        &quot;action&quot;: &quot;complet&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;device_id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,","4.3.3. les erreurs\nL&#39;API / privet / register peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):","Erreur\nLa description","device_busy\nLe périphérique est occupé et ne peut pas effectuer l’action demandée. Recommencez\n    après timeout.","waiting_user_action\nEn réponse à &quot;getClaimToken&quot;, cette erreur indique que le\n    le périphérique est toujours en attente de confirmation de l&#39;utilisateur, et la requête &quot;getClaimToken&quot; doit être réessayée après\n    temps libre.","user_cancel\nL&#39;utilisateur a explicitement annulé le processus d&#39;inscription depuis l&#39;appareil.","confirmation_timeout\nLa confirmation de l&#39;utilisateur expire.","invalide_action\nUne action invalide est appelée. Par exemple, si le client appelé\n    action = terminé avant d&#39;appeler action = start et action = getClaimToken.","parent_invalide\nParamètres non valides spécifiés dans la demande. (Paramètres inconnus\n    doit être ignoré pour une compatibilité future). Par exemple, renvoyez ceci si le client\n    appelé action = inconnu ou utilisateur =.","device_config_error\nLa date / heure (ou certains autres paramètres) est incorrecte sur l&#39;appareil\n    côté. L&#39;utilisateur doit aller (sur le site Web interne du périphérique) et configurer les paramètres du périphérique.","hors ligne\nL’appareil est actuellement hors ligne et ne peut pas communiquer avec le serveur.","erreur du serveur\nErreur du serveur pendant le processus d&#39;inscription.","invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la requête.","Le périphérique DOIT cesser d’exposer l’API / privet / register une fois l’enregistrement effectué avec succès.\n  terminé. Si le périphérique n&#39;expose pas l&#39;API / privet / register, il DOIT renvoyer l&#39;erreur HTTP 404.\n  Par conséquent, si un périphérique est déjà enregistré, l&#39;appel de cette API DOIT renvoyer 404. Si le\n  L&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l&#39;erreur HTTP 400.\n4.4. / privet / accesstoken API\n/ privet / accesstoken API est FACULTATIF. C&#39;est une requête HTTP GET. / privet / accesstoken API DOIT vérifier\npour un en-tête &quot;X-Privet-Token&quot; valide. Le périphérique DOIT implémenter cette API sur le\n&quot;/ privet / accesstoken&quot; url:\nGET / privet / accesstoken HTTP / 1.1\nLorsque le périphérique reçoit l&#39;appel de l&#39;API / accesstoken, il doit appeler le serveur pour récupérer le\n  jeton d&#39;accès pour l&#39;utilisateur donné et renvoyer le jeton au client. Le client utilisera ensuite le\n  jeton d&#39;accès pour accéder à cet appareil via le cloud.\nLes périphériques Cloud Print DOIVENT appeler l&#39;API suivante:\n/ cloudprint / proximitétoken\net passez les paramètres &quot;printerid =&quot; et &quot;user&quot; du local\nAPI. En cas de succès, la réponse du serveur contiendra l&#39;objet suivant:","&quot;proximité_token&quot;: \n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;expires_in&quot;: 600","Les périphériques Cloud Print DOIVENT transmettre la valeur de l’objet &quot;proximité_token&quot; dans la réponse.\naux appels d’API locaux / privet / accesstoken. Il est plus avantageux (à l’avenir) que l’appareil puisse\npasse TOUS les paramètres (y compris ceux qui ne sont pas décrits dans cette spécification).\n4.4.1. Contribution\nL&#39;API / privet / accesstoken a les paramètres d&#39;entrée suivants:","Nom\nValeur","utilisateur\nEmail de l&#39;utilisateur qui a eu l&#39;intention d&#39;utiliser ce jeton d&#39;accès. Peut être vide dans le\n    demande.","4.4.2. Revenir\n/ privet / accesstoken L&#39;API renvoie les données suivantes:","Nom de la valeur\nType de valeur\nLa description","jeton\nchaîne\nJeton d&#39;accès renvoyé par le serveur","utilisateur\nchaîne\nMême utilisateur que dans le paramètre d&#39;entrée.","expire dans\nint\nNombre de secondes jusqu&#39;à l&#39;expiration de ce jeton. Reçu de\n    le serveur et passé dans cette réponse.","Exemple:","        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;expires_in&quot;: 600","4.4.3. les erreurs\nL&#39;API / privet / accesstoken peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):","Erreur\nLa description","hors ligne\nL&#39;appareil est actuellement hors ligne et ne peut pas parler au serveur.","accès refusé\nDroits insuffisants. Accès refusé. L&#39;appareil doit renvoyer cette\n    erreur lorsque la demande a été explicitement refusée par le serveur.","parent_invalide\nParamètres non valides spécifiés dans la demande. (Paramètres inconnus\n    doit être ignoré pour une compatibilité future). Par exemple, si le client appelé\n    / accesstoken? user = ou / accesstoken.","erreur du serveur\nErreur du serveur.","invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la demande.","Si le périphérique n&#39;expose pas l&#39;API / privet / accesstoken, il DOIT renvoyer l&#39;erreur HTTP 404. Si la\n  L&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l&#39;erreur HTTP 400.\n4.5 / privet / API de capacités\n/ privet / features est facultatif. C&#39;est une requête HTTP GET. / privet / functions API DOIT vérifier\npour un en-tête &quot;X-Privet-Token&quot; valide. Le périphérique DOIT implémenter cette API sur\nURL &quot;/ privet / capacités&quot;:\nGET / privet / capacités HTTP / 1.1\nLorsque le périphérique reçoit / appel de l&#39;API de fonctionnalités, si le périphérique est capable, il DEVRAIT contacter\nle serveur pour obtenir des capacités mises à jour. Par exemple, si une imprimante prend en charge la publication d&#39;un travail d&#39;impression\n(reçu localement) à travers le service Cloud Print, il devrait renvoyer les fonctionnalités que le\nLe service d&#39;impression en nuage reviendrait. Cloud Print dans ce cas peut altérer l&#39;imprimante d&#39;origine\nfonctions en ajoutant de nouvelles fonctionnalités avant d’envoyer le travail à l’imprimante. Le plus\nLe cas courant est une liste de types de documents pris en charge. Si l&#39;imprimante est hors ligne, elle devrait renvoyer\ntypes de documents qu&#39;il prend en charge. Cependant, si l&#39;imprimante est en ligne et enregistrée auprès de Cloud Print it\nDOIT retourner &quot;* / *&quot; parmi les types pris en charge. Le service Cloud Print sera exécuté\nla conversion nécessaire dans ce cas. Pour l’impression hors ligne, l’imprimante DOIT prendre en charge au moins la\nformat &quot;image / pwg-raster&quot;.\n4.5.1. Contribution\nL&#39;API / privet / functions a les paramètres d&#39;entrée suivants:","Nom\nValeur","hors ligne\n(facultatif) Ne peut être que &quot;hors ligne = 1&quot;. Dans ce cas, l&#39;appareil doit retourner\n    capacités pour une utilisation hors connexion (si elles sont différentes des capacités &quot;en ligne&quot;).","4.5.2. Revenir\nL&#39;API / privet / features renvoie les fonctionnalités de périphérique dans le fichier JSON CDD (Cloud Device Description)\nformat (voir le document CDD pour plus de détails). Les imprimantes au minimum DOIVENT renvoyer une liste des types pris en charge\nici. Par exemple, une imprimante Cloud Ready actuellement en ligne peut renvoyer quelque chose comme ceci (à\nle minimum):","        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;imprimante&quot;: \n                &quot;supported_content_type&quot;: [\n                        \n                                \"content_type\": \"application/pdf\",\n                                \"min_version\": \"1.4\"\n                        ,\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" ,\n                         \"content_type\": \"*/*\" \n                ]","et quand il est déconnecté du serveur, il peut retourner:","        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;imprimante&quot;: \n                &quot;supported_content_type&quot;: [\n                        \n                                \"content_type\": \"application/pdf\",\n                                \"min_version\": \"1.4\"\n                        ,\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" \n                ]","Remarque: Les imprimantes expriment la priorité du type de contenu pris en charge en utilisant la commande. Pour\n  Par exemple, dans les exemples ci-dessus, l’imprimante indique qu’elle préfère les données &quot;application / pdf&quot; à\n  &quot;image / pwg-raster&quot; et &quot;image / jpeg&quot;. Les clients doivent respecter les priorités des imprimantes si possible\n  (voir le document CDD pour plus de détails).\n4.5.3. les erreurs\nL&#39;API / privet / features peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):","Erreur\nLa description","invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la requête.","Si le périphérique n&#39;expose pas l&#39;API / privet / features, il DOIT renvoyer HTTP 404.\n  Erreur. Si l&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer une erreur HTTP 400.\n4.6. les erreurs\nLes erreurs sont renvoyées par les API ci-dessus au format suivant:","Nom de la valeur\nType de valeur\nLa description","Erreur\nchaîne\nType d&#39;erreur (défini par API)","la description\nchaîne (optionnel)\nDescription lisible par l&#39;homme de l&#39;erreur.","server_api\nchaîne (optionnel)\nEn cas d&#39;erreur de serveur, ce champ contient\n    l&#39;API du serveur qui a échoué.","code_serveur\nint (facultatif)\nEn cas d&#39;erreur de serveur, ce champ contient\n    ce code d&#39;erreur que le serveur a renvoyé.","code_http_serveur\nint (facultatif)\nEn cas d&#39;erreur HTTP du serveur, ce champ\n    contient le code d&#39;erreur HTTP serveur renvoyé.","temps libre\nint (facultatif)\nNombre de secondes que le client attend avant\n    nouvelle tentative (pour les erreurs récupérables uniquement). Le client DOIT randomiser le délai d’expiration réel de cette valeur sur\n    une valeur de + 20%.","Toutes les API DOIVENT renvoyer une erreur HTTP 400 si l&#39;en-tête X-Privet-Token est manquant.\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\nExemple 1:","        &quot;erreur&quot;: &quot;erreur_serveur&quot;,\n        &quot;description&quot;: &quot;Service indisponible&quot;,\n        &quot;server_api&quot;: &quot;/ submit&quot;,\n        &quot;code_http_serveur&quot;: 503","Exemple 2:","        &quot;error&quot;: &quot;printer_busy&quot;,\n        &quot;description&quot;: &quot;L&#39;imprimante est en train d&#39;imprimer un autre travail&quot;,\n        &quot;timeout&quot;: 15","5. API d&#39;imprimante\nL&#39;un des types de périphérique pris en charge par ce protocole est le type imprimante. Les appareils supportant ce type PEUVENT\n  implémenter certaines fonctionnalités spécifiques aux imprimantes. Idéalement, l’impression sur des imprimantes prêtes au cloud\n  passer par un serveur Cloud Print:","Dans certains cas, un client peut avoir besoin d’envoyer un document localement. Cela peut être nécessaire lorsque le client ne le fait pas\n  avoir un identifiant Google ou est incapable de parler au serveur Cloud Print. Dans ce cas, le travail d&#39;impression sera\n  être soumis localement à l&#39;imprimante. L’imprimante utilisera à son tour le service Cloud Print pour\n  mise en file d&#39;attente et conversion. L’imprimante republiera le travail soumis localement sur le Cloud. Print\n  service, puis demandez-le, car il a été envoyé via le cloud. Ce processus fournira une\n  expérience utilisateur flexible en termes de service (conversion) et de gestion / suivi des travaux d&#39;impression.","Since the Cloud Print service implements conversion, the printer SHOULD advertise supporting all\n  input formats (&quot;*/*&quot;) among the list of the supported content types:","        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;printer&quot;: \n                &quot;supported_content_type&quot;: [\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"*/*\" \n                ]","In some cases a completely offline solution is desired. Since printers support a limited number\n  of input formats, a client will need to convert documents to a few natively supported printer\n  formats.","This spec REQUIRES all printers to support at least the PWG Raster (&quot;image/pwg-raster&quot;) format\n  for the offline printing case. A printer may support other formats (for example JPEG) and if a\n  client supports it, it may send documents in that format. The printer MUST expose supported types\n  through the /capabilities API, for example:","        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;printer&quot;: \n                &quot;supported_content_type&quot;: [\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" \n                ]","There are two ways a client may initiate printing over the local network.\nSimple printing &#8211; client sends the document over the local network to /submitdoc API\n  (without specifying the job_id parameter). The submitted document will be printed using default\n  print ticket settings and no print job statuses are needed. If the printer ONLY supports this type\n  of printing, it MUST advertise ONLY /submitdoc API in the /privet/info API response.","&quot;api&quot;: [\n        \"/privet/accesstoken\",\n        \"/privet/capabilities\",\n        \"/privet/printer/submitdoc\",\n]","Advanced printing &#8211; client should first create a print job on the printer by calling the\n  /privet/printer/createjob API with a valid CJT job ticket in the request. The printer\n  MUST store the print ticket in memory and return a job_id back to the client. Then the client will\n  call the /printer/submitdoc API and specify the previously received job_id. At that time\n  the printer will start printing. The client will poll the printer for print job status by calling\n  le /privet/printer/jobstate API.\nIn a multi-client environment, there is no guarantee how this API is called. It is possible for\n  one client to call /createjob between another client’s /createjob-&gt;/submitdoc\n  calls. To eliminate possible deadlocks and improve usability, we recommended having a small queue\n  of pending print jobs on the printer (at least 3-5):","/createjob takes the first available spot in the queue.\nJob lifetime (in the queue) is at least 5 minutes.\nIf all spots in the queue are taken, then the oldest, non-printing job shall be removed and a\n    new one will be placed there.\nIf there is a print job currently printing on the device (simple or advanced printing),\n    /submitdoc should return status busy and propose a timeout to retry this print job.\nSi /submitdoc refers to a job that has been removed from the queue (due to\n    replacement or timeout), the printer should return an error invalid_print_job et le\n    client will retry the process from the /createjob step. The client MUST wait for a\n    random timeout period of up to 5 seconds before retrying.","If memory constraints prevent storing multiple pending jobs on the device, it is possible to have\n  a queue of 1 print job long. It should still follow the same protocol as above. After a job has\n  completed or failed with an error, the printer should store information about the job’s\n  status for at least 5 minutes. The queue size for storing completed job statuses should be at\n  least 10. If there are more job statuses that need to be stored, the oldest one may be removed\n  from the queue before the 5 minute timeout.\nRemarque: For now clients will poll for job status. In the future, we may require\n  the printer to send TXT DNS notification when ANY print job status has changed.\n5.1. /privet/printer/createjob API\n/privet/printer/createjob API is OPTIONAL (see Simple Printing above). It is an HTTP POST\n  request. /privet/printer/createjob API MUST check for a valid &quot;X-Privet-Token&quot; header.\n  The device MUST implement this API on &quot;/privet/printer/createjob&quot; url:\nPOST /privet/printer/createjob HTTP/1.1\nWhen receiving /privet/printer/createjob API call, the printer MUST create a new print job ID, store\nthe received print ticket in the CJT format, and return print job id back to the client.\n5.1.1. Input\n/privet/printer/createjob API has no input parameters in URL. The request body should contain the\nprint job ticket data in CJT format.\n5.1.2. Return\n/privet/printer/createjob API returns the following data:","Value name\nValue type\nLa description","job_id\nchaîne\nID of the newly created print job.","expires_in\nint\nNumber of seconds this print job is valid.","Exemple:","        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;expires_in&quot;: 600","5.1.3. les erreurs\n/privet/printer/createjob API may return the following errors (see Errors section for details):","Erreur\nLa description","invalid_ticket\nSubmitted print ticket is invalid.","printer_busy\nPrinter is busy and can’t currently process /createjob. Recommencez\n    after timeout.","printer_error\nPrinter is in error state and requires user interaction to fix it.\n    Description should contain more detailed explanation (e.g. &quot;Paper jam in Tray 1&quot;).","invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.","If device is not exposing /privet/printer/createjob it MUST return HTTP 404 error. Si\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\n5.2. /privet/printer/submitdoc API\n/privet/printer/submitdoc API is REQUIRED to implement printing over a local network (offline or\nrepost to Cloud Print). It is an HTTP  POST request. /privet/printer/submitdoc API MUST check for a\nvalid &quot;X-Privet-Token&quot; header. The device MUST implement this API on\n&quot;/privet/printer/submitdoc&quot; url:\nPOST /privet/printer/submitdoc HTTP/1.1\nWhen receiving the /privet/printer/submitdoc API call, the printer should start printing. If it is\nunable to begin printing, it MUST return the error printer_busy and a recommended timeout period for\nthe client to wait before trying again.\nIf the printer is not able to hold all of the data in its internal buffer, it SHOULD use TCP\n  mechanisms to slow down data transfer until it prints a portion of the document, making part of\n  the buffer available again. (For example, the printer may set windowsize=0 on TCP layers, which\n  will make the client wait.)\nSubmitting a document to the printer may take a significant amount of time. The client should be\n  able to check the state of the printer and job (advanced printing) while printing is in progress.\n  In order to do that, the printer MUST allow the client to call the /privet/info and\n  /privet/printer/jobstate APIs while processing /privet/printer/submitdoc API calls. Il est\n  recommended for all clients to start a new thread to execute the /privet/printer/submitdoc API\n  call, so that the main thread can use the /privet/info and /privet/printer/jobstate APIs to check\n  printer and job states.\nRemarque: Upon completion or abortion of the local print job, it is strongly\n  recommended (and will be required in a future version of this spec) to report the final state of\n  the job to the /cloudprint/submit interface for accounting and user experience purposes. le\n  parameters &quot;printerid&quot;, &quot;title&quot;, &quot;contentType&quot; and &quot;final_semantic_state&quot; (in\n  PrintJobState format) are required, and the parameters &quot;tag&quot; (repeated\n  parameter) and &quot;ticket&quot; (the ticket of the job in CloudJobTicket format).\n  Note that the provided PrintJobState must actually be final, i.e. its type must be DONE or\n  ABORTED, and a cause must be provided in the case that it is ABORTED (see\n  JobState for details). Also note that this use of the\n  /cloudprint/submit interface to report local print jobs is not mentioned in\n  its specification because that section is intended to describe\n  the interface&#39;s primary use: submitting a print job with the document to print provided in the\n  &quot;content&quot; parameter.\n5.2.1. Input\n/privet/printer/submitdoc API has the following input parameters:","Name\nValeur","job_id\n(optional) Print job id. May be omitted for simple printing case\n    (voir au dessus). Must match the one returned by the printer.","user_name\n(optional) Human readable user name. This is not definitive, and should\n    only be used for print job annotations. If job is re-posted to the Cloud Print service this\n    string should be attached to the Cloud Print job.","client_name\n(optional) Name of the client application making this request. Pour\n    display purposes only. If job is re-posted to the Cloud Print service this string should be\n    attached to the Cloud Print job.","job_name\n(optional) Name of the print job to be recorded. If job is re-posted to\n    the Cloud Print service this string should be attached to the Cloud Print job.","offline\n(optional) Could only be &quot;offline=1&quot;. In this case printer should\n    only try printing offline (no re-post to Cloud Print server).","Request body should contain a valid document for printing. &quot;Content-Length&quot; should\n  include the correct length of the request. &quot;Content-Type&quot; header should be set to\n  document MIME type and match one of the types in the CDD (unless CDD specifies &quot;*/*&quot;). \nClients are HIGHLY recommended to provide a valid user name (or email), a client name and a job\n  name with this request. Those fields are only used in UIs to improve user experience.\n5.2.2. Return\n/privet/printer/submitdoc API returns following data:","Value name\nValue type\nLa description","job_id\nchaîne\nID of the newly created print job (simple printing) or\n    job_id specified in the request (advanced printing).","expires_in\nint\nNumber of seconds this print job is valid.","job_type\nchaîne\nContent-type of the submitted document.","job_size\nint 64 bit\nSize of the print data in bytes.","job_name\nchaîne\n(optional) Same job name as in input (if any).","Exemple:","        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;expires_in&quot;: 500,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;","5.2.3. les erreurs\n/privet/printer/submitdoc API may return the following errors (see Errors section for details):","Erreur\nLa description","invalid_print_job\nInvalid/expired job id is specified in the request. Retry after\n    timeout.","invalid_document_type\nDocument MIME-type is not supported by the printer.","invalid_document\nSubmitted document is invalid.","document_too_large\nDocument exceeds maximum size allowed.","printer_busy\nPrinter is busy and can’t currently process document. Recommencez\n    after timeout.","printer_error\nPrinter is in error state and requires user interaction to fix it.\n    Description should contain more detailed explanation (e.g. &quot;Paper jam in Tray 1&quot;).","invalid_params\nInvalid parameters specified in the request. (Unknown parameters\n    should be safely ignored for future compatibility)","user_cancel\nUser explicitly cancelled printing process from the device.","server_error\nPosting document to Cloud Print has failed.","invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.","If the device is not exposing /privet/printer/submitdoc, it MUST return HTTP 404 error. Si la\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\nRemarque: /privet/printer/submitdoc API may require special handling on printer\n  side (because of the large payload attached). In some cases (depends on the printer HTTP server\n  implementation and platform), printer may close socket BEFORE returning HTTP error. In other,\n  printer may return 503 error (instead of Privet error). Printers SHOULD try as much as possible to\n  return Privet. However, every client implementing Privet specification SHOULD be able to handle\n  socket close (no HTTP error) and 503 HTTP error cases for /privet/printer/submitdoc API. Dans ce\n  case, client SHOULD handle it as a Privet &quot;printer_busy&quot; error with\n  &quot;timeout&quot; set to 15 seconds. To avoid infinite retries, client may stop retrying after\n  a reasonable number of attempts (for example, 3).\n5.3. /privet/printer/jobstate API\n/privet/printer/jobstate API is OPTIONAL (see Simple Printing above). It is an HTTP GET request.\n/privet/printer/jobstate API MUST check for a valid &quot;X-Privet-Token&quot; header. The device\nMUST implement this API on &quot;/privet/printer/jobstate&quot; url:\nGET /privet/printer/jobstate HTTP/1.1\nWhen receiving a /privet/printer/jobstate API call, a printer should return the status of the\nrequested print job or invalid_print_job error.\n5.3.1. Input\n/privet/printer/jobstate API has following input parameters:","Name\nValeur","job_id\nPrint job ID to return status for.","5.3.2. Return\n/privet/printer/jobstate API returns the following data:","Value name\nValue type\nLa description","job_id\nchaîne\nPrint job id there status information is for.","state\nchaîne\ndraft &#8211; print job has been created on the device (no\n    /privet/printer/submitdoc calls have been received yet).\n    queued &#8211; print job has been received and queued, but printing has not started yet.\n    in_progress &#8211; print job is in the progress of printing.\n    stopped &#8211; print job has been paused, but can be restarted manually or automatically.\n    terminé &#8211; print job is done.\n    aborted &#8211; print job failed.","la description\nchaîne\n(optional) Human readable description of the print job\n    status. Should include additional information if statestopped or\n    aborted. le semantic_state field usually provides better and more meaningful\n    description to the client.","expires_in\nint\nNumber of seconds this print job is valid.","job_type\nchaîne\n(optional) Content-type of the submitted document.","job_size\nint 64 bit\n(optional) Size of the print data in bytes.","job_name\nchaîne\n(optional) Same job name as in input (if any).","server_job_id\nchaîne\n(optional) ID of the job returned from the server (if\n    job has been posted to Cloud Print service). Omitted for offline printing.","semantic_state\nJSON\n(optional) Semantic state of the job in\n    PrintJobState format.","Example (printing by reporting through Cloud Print):","        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;in_progress&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;server_job_id&quot;: &quot;1111-2222-3333-4444&quot;","Example (offline printing error):","        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;stopped&quot;,\n        &quot;description&quot;: &quot;Out of paper&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;","Example (print job aborted by the user):","        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;aborted&quot;,\n        &quot;description&quot;: &quot;User action&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;semantic_state&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;state&quot;: \n                        &quot;type&quot;: &quot;ABORTED&quot;,\n                        &quot;user_action_cause&quot;: &quot;action_code&quot;: &quot;CANCELLED&quot;\n                ,\n                &quot;pages_printed&quot;: 7\n        ","Example (print job stopped due to out of paper). Notice the reference to the device state. le\nclient will need to call the /privet/info API to get more details about the device state:","        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;stopped&quot;,\n        &quot;description&quot;: &quot;Out of paper&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: &quot;123456&quot;,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;semantic_state&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;state&quot;: \n                        &quot;type&quot;: &quot;STOPPED&quot;,\n                        &quot;device_state_cause&quot;: &quot;error_code&quot;: &quot;INPUT_TRAY&quot;\n                ,\n                &quot;pages_printed&quot;: 7\n        ","5.3.3. les erreurs\n/privet/printer/jobstate API may return the following errors (see Errors section for details):","Erreur\nLa description","invalid_print_job\nInvalid/expired job ID is specified in the request.","server_error\nGetting print job status (for print jobs posted to Cloud Print) has\n    failed.","invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.","If device is not exposing /privet/printer/jobstate, it MUST return HTTP 404 error. Si la\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\n6. Appendix\n6.1. Default behavior and settings\nThis section will explain the default behavior we expect from ALL Privet-compatible devices.","Out-of-the-box devices should support only /privet/info et\n    /privet/register APIs. All other APIs (e.g. /privet/accesstoken, local printing) should\n    be disabled.\nRegistration requires physical interaction with a device.","User MUST take a physical action on the device (e.g., pressing a button) to confirm their\n      access to the device. \nAfter the user takes the action noted above, the printer should send the\n      /cloudprint/register request. It should not send this request until after the action is taken\n      (see Sequence Diagram 1).\nIf the device is processing a /privet/register request (for instance, waiting on the action\n      above), it must reject all other /privet/register requests. The device MUST return the\n      device_busy error in this case.\nThe device should timeout any /register request that does not receive the physical action\n      mentioned above within 60 seconds. The device MUST return the confirmation_timeout error in\n      this case.\nOptional: Recommended but not required, the following may improve user experience:","The printer might flash a light or its screen to indicate that the user needs to take an\n        action to confirm registration.\nThe printer might state on its screen that ‘it is being registered to Google Cloud\n        Print for user ‘abc@def.com’ &#8211; press OK to\n        continue’, where abc@def.com  is the user\n        parameter from the /register API call. This would make it clearer to a user that:","it is their registration request that s/he is confirming\nwhat is happening if s/he didn’t trigger the request.","In addition to a physical action to confirm from the printer (e.g., ‘Press the OK\n        button’), a printer may also offer the user a button to cancel the request (e.g.,\n        ‘Press Cancel to reject’). This would allow users who did not trigger the\n        registration request to cancel it before the 60 second timeout. The device MUST return the\n        user_cancel error in this case.","Ownership transfers:","The device may be deleted explicitly from the Cloud service.","If the device receives success, but no device description as a result of\n        /cloudprint/printer (for GCP) call, it MUST revert to default (out-of-the-box) mode. \nIf the device’s credentials no longer work (explicitly because of &quot;invalid\n        credentials&quot; response from the server), it MUST revert to default (out-of-the-box)\n        mode.","Local factory reset MUST clear device’s credentials and set it to default state.\nOptional: The device may provide a menu item to clear credentials and put it into default\n      mode.","Devices supporting XMPP notifications MUST include the ability to ping the server. The ping\n    timeout MUST be controllable from the server through &quot;local_settings&quot;.\nThe device may explicitly ping the server (/cloudprint/printer API for GCP, in addition to\n    XMPP pings)  no more often than once a day (24 hours) to make sure they are in sync. Il est\n    recommended to randomize the check window within 24-32 hour window.\nOptional: For Cloud Print devices, it is recommended but not required to have a manual way\n    (button) to allow the user to initiate a check for new print jobs from the device. Some printers\n    already have this.\nOptional. Enterprise printers may have an option to disable local discovery completely. Dans\n    such case, the device MUST update these local settings on the server. New local settings MUST be\n    empty (setting &quot;local_discovery&quot; to &quot;false&quot;, means that it can be\n    re-enabled from the GCP Service).","6.1.2 Default Registration Diagram","6.2. XSSI and XSRF attacks and prevention\nThis section will explain the possibility of XSSI and XSRF attacks on the device and how to protect\nfrom them (including token generation techniques).\nMore details are here:","http://googleonlinesecurity.blogspot.com/2011/05/website-security-for-webmasters.html\nNormally, XSSI and XSRF attacks are possible when a site is using cookie authentication\nmechanisms. While Google doesn’t use cookies with their Cloud Print Service, such attacks are\nstill possible. Local network access, by design, implicitly trusts requests.\n6.2.1. XSSI\nIt is possible for a malicious website to guess the IP address and port number of a\nPrivet-compatible device and to try to call the Privet API using &quot;src=&quot;http://developers.google.com/inside of a  tag:","Without protection, malicious websites would be able to execute API calls and access results.\nTo prevent this type of attack, ALL Privet API calls MUST require the\n&quot;X-Privet-Token&quot; header in the request. &quot;src=&quot;http://developers.google.com/script tags are\nnot able to add headers, effectively guarding against this type of attack.\n6.2.2. XSRF","http://en.wikipedia.org/wiki/Cross-site_request_forgery\nIt is possible for a malicious website to guess the IP address and port number of a\nPrivet-compatible device and try to call Privet API using an , forms, or some other\ncross-website loading mechanism. Attackers would not be able to access the results of the request,\nbut if the request would perform an action (e.g. printing), they could trigger it.\nTo prevent this attack, we require the following protection:","Leave /privet/info API open to XSRF\n/privet/info API MUST NOT perform any actions on the device\nUse /privet/info API to receive x-privet-token\nAll other APIs MUST check for a valid x-privet-token in &quot;X-Privet-Token&quot; header.\nx-privet-token SHOULD be valid for only 24 hours.","Even if an attacker is able to execute the /privet/info API, they would not be able to\nread x-privet-token from the response and therefore would not be able to call any other API.\nIt is strongly recommended to generate the XSRF token using the following algorithm:\nXSRF_token = base64( SHA1(device_secret + DELIMITER + issue_timecounter) + DELIMITER + issue_timecounter )\nXSRF Token Generation Elements:","DELIMITER is a special character, usually ‘:’\nissue_timecounter is a number of seconds since some event (epoch for timestamp) or\n    device boot time (for CPU counters). issue_timecounter is constantly increasing when\n    the device is up and running (see token verification below).\nSHA1 &#8211; hash function using SHA1 algorithm\nbase64 &#8211; base64 encoding\ndevice_secret &#8211; secret specific to the device. Device secret MUST be updated on every\n    restart.","Recommended ways to generate device secret:","Generate a new UUID on every restart\nGenerate a 64 bit random number on every restart","The device is not required to store all of the XSRF tokens it has issued. When the device needs\n  to verify a XSRF token for validity, it should base64-decode the token. Get the\n  issue_timecounter from the second half (cleartext), and try to produce SHA1 hash of\n  device_secret + DELIMITER + issue_timecounter où issue_timecounter is from\n  the token. If the newly generated SHA1 matches the one in the token, device must now check if the\n  issue_timecounter is within the validity period from (24 hours) of the current time\n  counter. To do so, device takes the current time counter (CPU counter for example) and subtracts\n  issue_timecounter à partir de cela. The result MUST be the number of seconds since token\n  issue.\nImportant: This is the recommended way to implement XSRF\n  protection. Clients of the Privet specification shall not try to understand XSRF token, instead\n  they shall treat is as a blackbox. Figure 6.2.3 illustrates a recommended way to implement the\n  X-Privet-Token and verification of a typical request.\n6.2.3 X-Privet Token Generation and Verification Sequence Diagram","6.3. Workflow diagrams\nThis section will illustrate a workflow in different cases.\n6.3.1. Printer out of the box workflow","6.3.2. Registered printer startup","6.3.3 XMPP notifications handling workflow","6.3.4. Check printer settings workflow","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"Privet est une API de découverte locale d&#39;appareils de nuage utilisée par les services de nuage. Ce document est organisé\n  dans les sections suivantes:","html":"<p>Privet est une API de découverte locale d&#039;appareils de nuage utilisée par les services de nuage. Ce document est organisé\n  dans les sections suivantes:</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"Introduction: introduction à Privet\nDécouverte: mécanismes de découverte locaux\nAnnonces: annonces de découverte locale\nAPI: API Privet pour les périphériques cloud généraux\nAPI d&#39;imprimante: API Privet utilisées par les imprimantes\nAnnexe: schémas supplémentaires","html":"<p>Introduction: introduction à Privet\nDécouverte: mécanismes de découverte locaux\nAnnonces: annonces de découverte locale\nAPI: API Privet pour les périphériques cloud généraux\nAPI d&#039;imprimante: API Privet utilisées par les imprimantes\nAnnexe: schémas supplémentaires</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"1. Introduction\nLes appareils connectés au cloud présentent de nombreux avantages. Ils peuvent utiliser les services de conversion en ligne, le travail hôte\n  file d&#39;attente lorsque l&#39;appareil est hors ligne et accessible de partout dans le monde. Cependant, avec\n  nombreux périphériques accessibles par un utilisateur donné dans le cloud, nous devons fournir une méthode permettant de\n  appareil le plus proche en fonction de l&#39;emplacement. Le protocole Privet a pour objectif de lier la flexibilité des\n  périphériques cloud avec un mécanisme de découverte local approprié, de sorte que les périphériques soient facilement découverts\n  nouveaux environnements.\nLes objectifs de ce protocole sont:","html":"<p>1. Introduction\nLes appareils connectés au cloud présentent de nombreux avantages. Ils peuvent utiliser les services de conversion en ligne, le travail hôte\n  file d&#039;attente lorsque l&#039;appareil est hors ligne et accessible de partout dans le monde. Cependant, avec\n  nombreux périphériques accessibles par un utilisateur donné dans le cloud, nous devons fournir une méthode permettant de\n  appareil le plus proche en fonction de l&#039;emplacement. Le protocole Privet a pour objectif de lier la flexibilité des\n  périphériques cloud avec un mécanisme de découverte local approprié, de sorte que les périphériques soient facilement découverts\n  nouveaux environnements.\nLes objectifs de ce protocole sont:</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"rendre les périphériques cloud détectables localement\nenregistrer des périphériques cloud avec un service cloud\nassocier les appareils enregistrés à leur représentation dans le nuage\nactiver la fonctionnalité hors ligne\nsimplifier la mise en œuvre pour que les petits appareils puissent l&#39;utiliser","html":"<p>rendre les périphériques cloud détectables localement\nenregistrer des périphériques cloud avec un service cloud\nassocier les appareils enregistrés à leur représentation dans le nuage\nactiver la fonctionnalité hors ligne\nsimplifier la mise en œuvre pour que les petits appareils puissent l&#039;utiliser</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"Le protocole Privet comprend 2 parties principales: découverte et API. La découverte est utilisée pour trouver le\n  périphérique sur le réseau local, et l’API permet d’obtenir des informations sur le périphérique et\n  effectuer des actions. Tout au long de ce document, l&#39;appareil désigne un appareil connecté au cloud\n  implémenter le protocole Privet.\n2. découverte\nDiscovery est un protocole basé sur zeroconf (mDNS + DNS-SD). Le périphérique DOIT implémenter IPv4 Link-Local\n  Adresser. L&#39;appareil DOIT être conforme aux spécifications mDNS et DNS-SD.\nLe dispositif DOIT effectuer la résolution des conflits de noms conformément aux spécifications ci-dessus.\n2.1. type de service\nLa découverte de service DNS utilise le format suivant pour les types de service:\n  _applicationprotocol._transportprotocol. Dans le cas du protocole Privet, le service\n  type pour DNS-SD devrait être: _privet._tcp\nL&#39;appareil peut également implémenter d&#39;autres types de services. Il est conseillé d&#39;utiliser le même service\n  nom d&#39;instance pour tous les types de services implémentés par le périphérique. Par exemple: une imprimante peut\n  implémentez les services &quot;Imprimante XYZ._privet._tcp&quot; et &quot;Imprimante XYZ._printer._tcp&quot;. Ça va simplifier\n  configuration pour l&#39;utilisateur. Cependant, les clients Privet rechercheront uniquement &quot;_privet._tcp&quot;.\nEn plus du type de service principal, l’appareil DOIT annoncer les enregistrements PTR pour ses\n  sous-type (s) correspondant (voir spéc. DNS-SD: &quot;7.1. Énumération d&#39;instances sélective (sous-types)&quot;).\n  Le format devrait être le suivant:\n  _._sub.privet._tcp\nActuellement, le seul sous-type de périphérique pris en charge est imprimante. Donc, toutes les imprimantes DOIVENT annoncer\n  deux enregistrements PTR:","html":"<p>Le protocole Privet comprend 2 parties principales: découverte et API. La découverte est utilisée pour trouver le\n  périphérique sur le réseau local, et l’API permet d’obtenir des informations sur le périphérique et\n  effectuer des actions. Tout au long de ce document, l&#039;appareil désigne un appareil connecté au cloud\n  implémenter le protocole Privet.\n2. découverte\nDiscovery est un protocole basé sur zeroconf (mDNS + DNS-SD). Le périphérique DOIT implémenter IPv4 Link-Local\n  Adresser. L&#039;appareil DOIT être conforme aux spécifications mDNS et DNS-SD.\nLe dispositif DOIT effectuer la résolution des conflits de noms conformément aux spécifications ci-dessus.\n2.1. type de service\nLa découverte de service DNS utilise le format suivant pour les types de service:\n  _applicationprotocol._transportprotocol. Dans le cas du protocole Privet, le service\n  type pour DNS-SD devrait être: _privet._tcp\nL&#039;appareil peut également implémenter d&#039;autres types de services. Il est conseillé d&#039;utiliser le même service\n  nom d&#039;instance pour tous les types de services implémentés par le périphérique. Par exemple: une imprimante peut\n  implémentez les services &quot;Imprimante XYZ._privet._tcp&quot; et &quot;Imprimante XYZ._printer._tcp&quot;. Ça va simplifier\n  configuration pour l&#039;utilisateur. Cependant, les clients Privet rechercheront uniquement &quot;_privet._tcp&quot;.\nEn plus du type de service principal, l’appareil DOIT annoncer les enregistrements PTR pour ses\n  sous-type (s) correspondant (voir spéc. DNS-SD: &quot;7.1. Énumération d&#039;instances sélective (sous-types)&quot;).\n  Le format devrait être le suivant:\n  _._sub.privet._tcp\nActuellement, le seul sous-type de périphérique pris en charge est imprimante. Donc, toutes les imprimantes DOIVENT annoncer\n  deux enregistrements PTR:</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"_privet._tcp.local.\n_printer._sub._privet._tcp.local.","html":"<p>_privet._tcp.local.\n_printer._sub._privet._tcp.local.</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"2.2. Enregistrement TXT\nle Découverte du service DNS définit des champs pour ajouter des informations facultatives sur un service dans\n  les enregistrements TXT. Un enregistrement TXT est constitué de paires clé / valeur. Chaque paire clé / valeur commence à partir du\n  longueur octet suivi de 255 octets de texte au maximum. La clé est le texte avant le premier\n  Le caractère &quot;=&quot; et la valeur correspond au texte après le premier caractère &quot;=&quot;\n  jusqu&#39;à la fin. La spécification ne permet aucune valeur dans l&#39;enregistrement, dans ce cas, il n&#39;y aura aucune\n  Caractère &quot;=&quot; OU pas de texte après le caractère &quot;=&quot;. (Voir spéc. DNS-SD:\n  &quot;6.1. Règles générales de format pour les enregistrements DNS TXT&quot; pour le format d&#39;enregistrement DNS TXT et &quot;6.2. DNS-SD TXT\n  Taille d&#39;enregistrement &quot;pour la longueur recommandée).\nPrivet exige que le périphérique envoie les paires clé / valeur suivantes dans l&#39;enregistrement TXT. Valeur clé\n  les chaînes ne respectent pas la casse, par exemple &quot;CS = online&quot; et &quot;cs = ONLINE&quot; sont\n  le même. Les informations contenues dans l&#39;enregistrement TXT DOIVENT être identiques à celles accessibles via l&#39;API / info (voir 4.1.\n  Section API).\nIl est recommandé de conserver une taille d’enregistrement TXT inférieure à 512 octets.\n2.2.1. txtvers\nVersion de la structure TXT. txtvers DOIT être le premier enregistrement de la structure TXT. Actuellement\n  la seule version supportée est 1.\ntxtvers = 1\n2.2.2. ty\nFournit un nom lisible par l&#39;utilisateur du périphérique. Par exemple:\nty = Modèle d&#39;imprimante Google Cloud Ready XYZ\n2.2.3. note (optionnel)\nFournit un nom lisible par l&#39;utilisateur du périphérique. Par exemple:\nnote = Imprimeur de lobby au 1er étage\nRemarque: Ceci est une clé optionnelle et peut être ignorée. Cependant, si présent, l&#39;utilisateur\n  DEVRAIT pouvoir modifier cette valeur. La même description DOIT être utilisée lors de l&#39;enregistrement d&#39;un appareil.\n2.2.4. url\nURL du serveur auquel cet appareil est connecté (protocole compris). Par exemple:\nurl = https: //www.google.com/cloudprint\n2.2.5. type\nListe de sous-types de périphérique pris en charge par ce périphérique, séparés par des virgules. Le format est:\n  &quot;type = _subtype1, _subtype2&quot;. Actuellement, le seul sous-type de périphérique pris en charge est\n  imprimante.\ntype = imprimante\nChaque sous-type répertorié doit être annoncé à l&#39;aide d&#39;un enregistrement PTR correspondant. Pour chaque supporté\n  service, il doit y avoir un élément correspondant. Nom du sous-type de service\n  (._sub.privet._tcp) devrait être égal au type de périphérique ici.\n2.2.6. identifiant\nReference de l&#39;appareil. Si le périphérique n&#39;a pas encore été enregistré, cette clé doit être présente, mais la valeur\n  devrait être vide. Par exemple:","html":"<p>2.2. Enregistrement TXT\nle Découverte du service DNS définit des champs pour ajouter des informations facultatives sur un service dans\n  les enregistrements TXT. Un enregistrement TXT est constitué de paires clé / valeur. Chaque paire clé / valeur commence à partir du\n  longueur octet suivi de 255 octets de texte au maximum. La clé est le texte avant le premier\n  Le caractère &quot;=&quot; et la valeur correspond au texte après le premier caractère &quot;=&quot;\n  jusqu&#039;à la fin. La spécification ne permet aucune valeur dans l&#039;enregistrement, dans ce cas, il n&#039;y aura aucune\n  Caractère &quot;=&quot; OU pas de texte après le caractère &quot;=&quot;. (Voir spéc. DNS-SD:\n  &quot;6.1. Règles générales de format pour les enregistrements DNS TXT&quot; pour le format d&#039;enregistrement DNS TXT et &quot;6.2. DNS-SD TXT\n  Taille d&#039;enregistrement &quot;pour la longueur recommandée).\nPrivet exige que le périphérique envoie les paires clé / valeur suivantes dans l&#039;enregistrement TXT. Valeur clé\n  les chaînes ne respectent pas la casse, par exemple &quot;CS = online&quot; et &quot;cs = ONLINE&quot; sont\n  le même. Les informations contenues dans l&#039;enregistrement TXT DOIVENT être identiques à celles accessibles via l&#039;API / info (voir 4.1.\n  Section API).\nIl est recommandé de conserver une taille d’enregistrement TXT inférieure à 512 octets.\n2.2.1. txtvers\nVersion de la structure TXT. txtvers DOIT être le premier enregistrement de la structure TXT. Actuellement\n  la seule version supportée est 1.\ntxtvers = 1\n2.2.2. ty\nFournit un nom lisible par l&#039;utilisateur du périphérique. Par exemple:\nty = Modèle d&#039;imprimante Google Cloud Ready XYZ\n2.2.3. note (optionnel)\nFournit un nom lisible par l&#039;utilisateur du périphérique. Par exemple:\nnote = Imprimeur de lobby au 1er étage\nRemarque: Ceci est une clé optionnelle et peut être ignorée. Cependant, si présent, l&#039;utilisateur\n  DEVRAIT pouvoir modifier cette valeur. La même description DOIT être utilisée lors de l&#039;enregistrement d&#039;un appareil.\n2.2.4. url\nURL du serveur auquel cet appareil est connecté (protocole compris). Par exemple:\nurl = https: //www.google.com/cloudprint\n2.2.5. type\nListe de sous-types de périphérique pris en charge par ce périphérique, séparés par des virgules. Le format est:\n  &quot;type = _subtype1, _subtype2&quot;. Actuellement, le seul sous-type de périphérique pris en charge est\n  imprimante.\ntype = imprimante\nChaque sous-type répertorié doit être annoncé à l&#039;aide d&#039;un enregistrement PTR correspondant. Pour chaque supporté\n  service, il doit y avoir un élément correspondant. Nom du sous-type de service\n  (._sub.privet._tcp) devrait être égal au type de périphérique ici.\n2.2.6. identifiant\nReference de l&#039;appareil. Si le périphérique n&#039;a pas encore été enregistré, cette clé doit être présente, mais la valeur\n  devrait être vide. Par exemple:</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"id = 11111111-2222-3333-4444-555555555555\n  id =","html":"<p>id = 11111111-2222-3333-4444-555555555555\n  id =</p>"},{"id":"text-9","type":"text","heading":"","plain_text":"2.2.7. cs\nIndique l’état actuel de la connexion du périphérique. Quatre valeurs possibles sont définies dans cette\n  spec.","html":"<p>2.2.7. cs\nIndique l’état actuel de la connexion du périphérique. Quatre valeurs possibles sont définies dans cette\n  spec.</p>"},{"id":"text-10","type":"text","heading":"","plain_text":"&quot;online&quot; indique que l&#39;appareil est actuellement connecté au cloud.\n&quot;hors ligne&quot; indique que le périphérique est disponible sur le réseau local, mais\n    ne peux pas parler au serveur.\n&quot;connexion&quot; indique que le périphérique effectue sa séquence de démarrage et est en train de\n    pas encore complètement en ligne.\n&quot;non configuré&quot; indique que l&#39;accès Internet de l&#39;appareil n&#39;a pas été\n    configuré pour le moment. Cette valeur n’est pas utilisée actuellement, mais peut être utile dans les futures versions du logiciel.\n    spécification.","html":"<p>&quot;online&quot; indique que l&#039;appareil est actuellement connecté au cloud.\n&quot;hors ligne&quot; indique que le périphérique est disponible sur le réseau local, mais\n    ne peux pas parler au serveur.\n&quot;connexion&quot; indique que le périphérique effectue sa séquence de démarrage et est en train de\n    pas encore complètement en ligne.\n&quot;non configuré&quot; indique que l&#039;accès Internet de l&#039;appareil n&#039;a pas été\n    configuré pour le moment. Cette valeur n’est pas utilisée actuellement, mais peut être utile dans les futures versions du logiciel.\n    spécification.</p>"},{"id":"text-11","type":"text","heading":"","plain_text":"Par exemple:","html":"<p>Par exemple:</p>"},{"id":"text-12","type":"text","heading":"","plain_text":"cs = en ligne\ncs = hors ligne\ncs = connexion","html":"<p>cs = en ligne\ncs = hors ligne\ncs = connexion</p>"},{"id":"text-13","type":"text","heading":"","plain_text":"Si le périphérique a été enregistré dans un nuage, il doit vérifier au démarrage la connectivité avec\n  serveur pour détecter son état de connexion (par exemple, appeler une API cloud pour obtenir les paramètres du périphérique). le\n  L’équipement peut utiliser l’état de la connexion de son canal de notification (XMPP, par exemple) pour signaler cette valeur.\n  Les périphériques non enregistrés au démarrage peuvent envoyer un ping à un domaine afin de détecter leur état de connexion (par exemple,\n  exemple, effectuez un ping sur www.google.com pour les périphériques d’impression dans le cloud\n3. Annonces\nAu démarrage, à l&#39;arrêt ou au changement d&#39;état du périphérique, le périphérique DOIT exécuter l&#39;étape de l&#39;annonce\n  décrit dans la spécification mDNS. Il\n  DEVRAIT envoyer l&#39;annonce correspondante au moins deux fois avec un intervalle d&#39;au moins une seconde\n  entre eux.\n3.1. Commencez\nAu démarrage de l&#39;appareil, il DOIT exécuter les étapes de vérification et d&#39;annonce décrites dans le manuel mDNS.\n  spécification. Les enregistrements SRV, PTR et TXT doivent être envoyés dans ce cas. Il est recommandé de grouper\n  tous les enregistrements dans une réponse DNS si possible. Si non, l&#39;ordre suivant est recommandé: SRV,\n  PTR, enregistrements TXT.\n3.2. Fermer\nLors de l’arrêt de l’appareil, il DEVRAIT essayer d’en informer toutes les parties intéressées en envoyant un message.\n  &quot;Au revoir paquet&quot; avec TTL = 0 (comme décrit dans la documentation de mDNS).\n3.3. Mise à jour\nSi l’une des informations décrites dans TXT a changé, le périphérique DOIT envoyer une mise à jour.\n  annonce. Dans ce cas, il suffit d’envoyer le nouvel enregistrement TXT. Par exemple, après un\n  appareil est enregistré, il DOIT envoyer une annonce de mise à jour incluant le nouvel identifiant d&#39;appareil.\n4. API\nUne fois qu&#39;un périphérique cloud a été découvert, la communication client est activée avec le périphérique.\n  directement sur le réseau local. Toutes les API sont basées sur HTTP 1.1. Les formats de données sont basés sur JSON. API\n  les requêtes peuvent être des requêtes GET ou POST.\nChaque demande DOIT contenir un &quot;X-Privet-Token&quot;en-tête. La SEULE demande\n  autorisé à avoir un en-tête &quot;X-Privet-Token&quot; vide est la requête / privet / info (note\n  l&#39;en-tête DOIT toujours être présent). Si l&#39;en-tête &quot;X-Privet-Token&quot; est manquant, le\n  le périphérique DOIT répondre avec l&#39;erreur HTTP 400 suivante:\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\nSi l&#39;en-tête &quot;X-Privet-Token&quot; est vide ou invalide, le périphérique DOIT répondre avec\n  &quot;erreur X-Privet-Token non valide&quot; (invalid_x_privet_token, voir la section Erreurs pour plus de détails).\n  détails). La seule exception est l&#39;API / info. Pour voir plus d&#39;informations sur pourquoi cela est fait et comment les jetons\n  voir Annexe A: Attaques XSSI et XSRF et prévention.\nSi une API demandée n&#39;existe pas ou n&#39;est pas prise en charge, le périphérique DOIT renvoyer une erreur HTTP 404.\n4.1. Disponibilité de l&#39;API\nAvant TOUTE API ne soit exposée (y compris l’API / info), le périphérique DOIT contacter le serveur pour vérifier\n  paramètres locaux. Les paramètres locaux DOIVENT être préservés entre\n  redémarre. Si le serveur n&#39;est pas disponible, les derniers paramètres locaux connus doivent être utilisés. Si la\n  L&#39;appareil n&#39;a pas encore été enregistré, il devrait suivre les paramètres par défaut.\nLes périphériques Cloud Print DOIVENT suivre les étapes ci-dessous pour enregistrer, recevoir et mettre à jour les paramètres locaux.\n4.1.1. enregistrement\nLorsque le périphérique s&#39;inscrit, il DOIT spécifier le paramètre &quot;local_settings&quot;, comme suit:","html":"<p>Si le périphérique a été enregistré dans un nuage, il doit vérifier au démarrage la connectivité avec\n  serveur pour détecter son état de connexion (par exemple, appeler une API cloud pour obtenir les paramètres du périphérique). le\n  L’équipement peut utiliser l’état de la connexion de son canal de notification (XMPP, par exemple) pour signaler cette valeur.\n  Les périphériques non enregistrés au démarrage peuvent envoyer un ping à un domaine afin de détecter leur état de connexion (par exemple,\n  exemple, effectuez un ping sur www.google.com pour les périphériques d’impression dans le cloud\n3. Annonces\nAu démarrage, à l&#039;arrêt ou au changement d&#039;état du périphérique, le périphérique DOIT exécuter l&#039;étape de l&#039;annonce\n  décrit dans la spécification mDNS. Il\n  DEVRAIT envoyer l&#039;annonce correspondante au moins deux fois avec un intervalle d&#039;au moins une seconde\n  entre eux.\n3.1. Commencez\nAu démarrage de l&#039;appareil, il DOIT exécuter les étapes de vérification et d&#039;annonce décrites dans le manuel mDNS.\n  spécification. Les enregistrements SRV, PTR et TXT doivent être envoyés dans ce cas. Il est recommandé de grouper\n  tous les enregistrements dans une réponse DNS si possible. Si non, l&#039;ordre suivant est recommandé: SRV,\n  PTR, enregistrements TXT.\n3.2. Fermer\nLors de l’arrêt de l’appareil, il DEVRAIT essayer d’en informer toutes les parties intéressées en envoyant un message.\n  &quot;Au revoir paquet&quot; avec TTL = 0 (comme décrit dans la documentation de mDNS).\n3.3. Mise à jour\nSi l’une des informations décrites dans TXT a changé, le périphérique DOIT envoyer une mise à jour.\n  annonce. Dans ce cas, il suffit d’envoyer le nouvel enregistrement TXT. Par exemple, après un\n  appareil est enregistré, il DOIT envoyer une annonce de mise à jour incluant le nouvel identifiant d&#039;appareil.\n4. API\nUne fois qu&#039;un périphérique cloud a été découvert, la communication client est activée avec le périphérique.\n  directement sur le réseau local. Toutes les API sont basées sur HTTP 1.1. Les formats de données sont basés sur JSON. API\n  les requêtes peuvent être des requêtes GET ou POST.\nChaque demande DOIT contenir un &quot;X-Privet-Token&quot;en-tête. La SEULE demande\n  autorisé à avoir un en-tête &quot;X-Privet-Token&quot; vide est la requête / privet / info (note\n  l&#039;en-tête DOIT toujours être présent). Si l&#039;en-tête &quot;X-Privet-Token&quot; est manquant, le\n  le périphérique DOIT répondre avec l&#039;erreur HTTP 400 suivante:\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\nSi l&#039;en-tête &quot;X-Privet-Token&quot; est vide ou invalide, le périphérique DOIT répondre avec\n  &quot;erreur X-Privet-Token non valide&quot; (invalid_x_privet_token, voir la section Erreurs pour plus de détails).\n  détails). La seule exception est l&#039;API / info. Pour voir plus d&#039;informations sur pourquoi cela est fait et comment les jetons\n  voir Annexe A: Attaques XSSI et XSRF et prévention.\nSi une API demandée n&#039;existe pas ou n&#039;est pas prise en charge, le périphérique DOIT renvoyer une erreur HTTP 404.\n4.1. Disponibilité de l&#039;API\nAvant TOUTE API ne soit exposée (y compris l’API / info), le périphérique DOIT contacter le serveur pour vérifier\n  paramètres locaux. Les paramètres locaux DOIVENT être préservés entre\n  redémarre. Si le serveur n&#039;est pas disponible, les derniers paramètres locaux connus doivent être utilisés. Si la\n  L&#039;appareil n&#039;a pas encore été enregistré, il devrait suivre les paramètres par défaut.\nLes périphériques Cloud Print DOIVENT suivre les étapes ci-dessous pour enregistrer, recevoir et mettre à jour les paramètres locaux.\n4.1.1. enregistrement\nLorsque le périphérique s&#039;inscrit, il DOIT spécifier le paramètre &quot;local_settings&quot;, comme suit:</p>"},{"id":"text-14","type":"text","heading":"","plain_text":"       &quot;actuel&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: true,\n                &quot;printer / conversion_printing_enabled&quot;: true,\n                &quot;xmpp_timeout_value&quot;: 300\n        ","html":"<p>       &quot;actuel&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: true,\n                &quot;printer / conversion_printing_enabled&quot;: true,\n                &quot;xmpp_timeout_value&quot;: 300\n        </p>"},{"id":"text-15","type":"text","heading":"","plain_text":"Les paramètres suivants peuvent être définis:","html":"<p>Les paramètres suivants peuvent être définis:</p>"},{"id":"text-16","type":"text","heading":"","plain_text":"Nom de la valeur\nType de valeur\nLa description","html":"<p>Nom de la valeur\nType de valeur\nLa description</p>"},{"id":"text-17","type":"text","heading":"","plain_text":"découverte_locale\nbooléen\nIndique si la fonctionnalité de découverte locale est\n    permis. Si &quot;false&quot;, toutes les découvertes d&#39;API locale (y compris / info) et DNS-SD doivent être désactivées. Par\n    Par défaut, les périphériques nouvellement enregistrés doivent passer &quot;true&quot;.","html":"<p>découverte_locale\nbooléen\nIndique si la fonctionnalité de découverte locale est\n    permis. Si &quot;false&quot;, toutes les découvertes d&#039;API locale (y compris / info) et DNS-SD doivent être désactivées. Par\n    Par défaut, les périphériques nouvellement enregistrés doivent passer &quot;true&quot;.</p>"},{"id":"text-18","type":"text","heading":"","plain_text":"access_token_enabled\nbooléen (optionnel)\nIndique si / accesstoken API\n    devrait être exposé sur le réseau local. Par défaut devrait être &quot;true&quot;.","html":"<p>access_token_enabled\nbooléen (optionnel)\nIndique si / accesstoken API\n    devrait être exposé sur le réseau local. Par défaut devrait être &quot;true&quot;.</p>"},{"id":"text-19","type":"text","heading":"","plain_text":"printer / local_printing_enabled\nbooléen (optionnel)\nIndique si local\n    la fonctionnalité d’impression (/ printer / createjob, / printer / submitdoc, / printer / jobstate) devrait être\n    exposés sur le réseau local. Par défaut devrait être &quot;true&quot;.","html":"<p>printer / local_printing_enabled\nbooléen (optionnel)\nIndique si local\n    la fonctionnalité d’impression (/ printer / createjob, / printer / submitdoc, / printer / jobstate) devrait être\n    exposés sur le réseau local. Par défaut devrait être &quot;true&quot;.</p>"},{"id":"text-20","type":"text","heading":"","plain_text":"printer / conversion_printing_enabled\nbooléen (optionnel)\nIndique si local\n    l&#39;impression peut envoyer le travail au serveur pour la conversion. Cela n’a de sens que lorsque l’impression locale est activée.","html":"<p>printer / conversion_printing_enabled\nbooléen (optionnel)\nIndique si local\n    l&#039;impression peut envoyer le travail au serveur pour la conversion. Cela n’a de sens que lorsque l’impression locale est activée.</p>"},{"id":"text-21","type":"text","heading":"","plain_text":"xmpp_timeout_value\nint (facultatif)\nIndique le nombre de secondes entre\n    Pingles de canal XMPP. Par défaut, DOIT être 300 (5 minutes) ou plus.","html":"<p>xmpp_timeout_value\nint (facultatif)\nIndique le nombre de secondes entre\n    Pingles de canal XMPP. Par défaut, DOIT être 300 (5 minutes) ou plus.</p>"},{"id":"text-22","type":"text","heading":"","plain_text":"Important: L’absence de valeur optionnelle indique que le\n  la fonctionnalité correspondante est complètement non prise en charge par le périphérique.\n4.1.2. Commencez\nAu démarrage du périphérique, le serveur doit contacter le serveur pour vérifier quelles API sont disponibles pour être exposées dans\n  le réseau local. Pour les imprimantes connectées à Cloud Print, elles doivent appeler:\n/ cloudprint / printer? printerid =\nou\n/ cloudprint / list\n/ cloudprint / printer est préférable à / cloudprint / list, mais les deux fonctionneront.\nCette API renvoie les paramètres actuels du périphérique, y compris les paramètres de l&#39;API locale. La réponse du\n  Le serveur aura le format suivant:","html":"<p>Important: L’absence de valeur optionnelle indique que le\n  la fonctionnalité correspondante est complètement non prise en charge par le périphérique.\n4.1.2. Commencez\nAu démarrage du périphérique, le serveur doit contacter le serveur pour vérifier quelles API sont disponibles pour être exposées dans\n  le réseau local. Pour les imprimantes connectées à Cloud Print, elles doivent appeler:\n/ cloudprint / printer? printerid =\nou\n/ cloudprint / list\n/ cloudprint / printer est préférable à / cloudprint / list, mais les deux fonctionneront.\nCette API renvoie les paramètres actuels du périphérique, y compris les paramètres de l&#039;API locale. La réponse du\n  Le serveur aura le format suivant:</p>"},{"id":"text-23","type":"text","heading":"","plain_text":"&quot;paramètres locaux&quot;: \n        &quot;actuel&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: true,\n                &quot;printer / conversion_printing_enabled&quot;: true,\n                &quot;xmpp_timeout_value&quot;: 300\n         ,\n         &quot;en attente&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: false,\n                &quot;printer / conversion_printing_enabled&quot;: false,\n                &quot;xmpp_timeout_value&quot;: 500\n         ","html":"<p>&quot;paramètres locaux&quot;: \n        &quot;actuel&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: true,\n                &quot;printer / conversion_printing_enabled&quot;: true,\n                &quot;xmpp_timeout_value&quot;: 300\n         ,\n         &quot;en attente&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: false,\n                &quot;printer / conversion_printing_enabled&quot;: false,\n                &quot;xmpp_timeout_value&quot;: 500\n         </p>"},{"id":"text-24","type":"text","heading":"","plain_text":"L&#39;objet &quot;en cours&quot; indique les paramètres en vigueur pour le moment.\nL&#39;objet &quot;en attente&quot; indique les paramètres à appliquer au périphérique (cet objet\n  peut être manquant).\nUne fois que le périphérique voit les paramètres &quot;en attente&quot;, il DOIT mettre à jour son état (voir ci-dessous).\n4.1.3. Mise à jour\nSi une mise à jour des paramètres est nécessaire, une notification XMPP sera envoyée au périphérique. La notification\n  sera dans le format suivant:\n/mettre à jour les paramètres\nÀ la réception d&#39;une telle notification, le périphérique DOIT interroger le serveur pour obtenir les derniers paramètres.\n  Les périphériques Cloud Print DOIVENT utiliser:\n/ cloudprint / printer? printerid =\nUne fois que le périphérique voit la section &quot;en attente&quot; suite à l’API / cloudprint / printer (à\n  démarrage ou en raison de la notification), il DOIT mettre à jour son état interne pour se souvenir du nouveau\n  paramètres. Il DOIT appeler l&#39;API du serveur pour confirmer les nouveaux paramètres. Pour les imprimantes en nuage, le périphérique\n  DOIT appeler / cloudprint / update API et utiliser le paramètre &quot;local_settings&quot; comme pendant\n  enregistrement.\nLors de la reconnexion au canal XMPP, le périphérique DOIT appeler / cloudprint / API pour vérifier si\n  les paramètres locaux ont été modifiés depuis la dernière fois.\n4.1.3.1. Paramètres locaux en attente\nLe paramètre &quot;local_settings&quot; utilisé par le périphérique pour appeler l&#39;API du serveur NE DOIT JAMAIS contenir\n  section &quot;en attente&quot;.\n4.1.3.2. Paramètres locaux actuels\nUNIQUEMENT l’appareil peut changer la section &quot;actuelle&quot; des &quot;paramètres locaux&quot;.\n  Tout le monde changera la section &quot;en attente&quot; et attendra que les modifications soient apportées.\n  propagé à la section &quot;en cours&quot; par le périphérique.\n4.1.4. Hors ligne\nLorsqu&#39;il est impossible de contacter le serveur au démarrage, après notification, le périphérique DOIT utiliser le dernier\n  paramètres locaux.\n4.1.5. Suppression de l&#39;appareil du service\nSi le périphérique a été supprimé du service (GCP par exemple), une notification XMPP sera envoyée.\n  envoyé à l&#39;appareil. La notification sera au format suivant:\n/effacer\nÀ la réception d&#39;une telle notification, le périphérique DOIT se rendre sur le serveur pour vérifier son état. Nuage\n  Les périphériques d’impression DOIVENT utiliser:\n/ cloudprint / printer? printerid =\nLe périphérique DOIT recevoir une réponse HTTP réussie avec success = false et aucun périphérique / imprimante.\n  la description. Cela signifie que le périphérique a été retiré du serveur et que le périphérique DOIT effacer ses\n  informations d’authentification et passer en mode de paramètres d’usine par défaut.\nTOUTE heure à laquelle le périphérique reçoit une réponse indiquant qu&#39;il a été supprimé à la suite de la\n  / cloudprint / API (démarrage, notification des paramètres de mise à jour, ping quotidien), elle DOIT supprimer ses\n  informations d&#39;identification et aller en mode par défaut.\n4.2. API / privet / info\nL&#39;info API est OBLIGATOIRE et DOIT être implémentée par tous les appareils. C&#39;est une requête HTTP GET pour\n  &quot;/ privet / info&quot; url: GET / privet / info HTTP / 1.1\nL&#39;API info renvoie des informations de base sur un périphérique et les fonctionnalités qu&#39;il prend en charge. Cette API\n  NE DOIT jamais changer l’état du dispositif ni effectuer aucune action, car il est vulnérable aux attaques XSRF.\n  C&#39;est la SEULE API autorisée à avoir un en-tête &quot;X-Privet-Token&quot; vide. Les clients devraient\n  API call / privet / info avec en-tête &quot;X-Privet-Token&quot; définie sur X-Privet-Token:\n  &quot;&quot;\nL&#39;API info DOIT renvoyer des données cohérentes avec les données disponibles dans l&#39;enregistrement TXT lors de la découverte.\n4.2.1. Contribution\n/ privet / info L&#39;API n&#39;a pas de paramètre d&#39;entrée.\n4.2.2. Revenir\nL&#39;API / privet / info renvoie des informations de base sur le périphérique et les fonctionnalités prises en charge.\nLa colonne TXT indique le champ correspondant dans l’enregistrement DNS-SD TXT.","html":"<p>L&#039;objet &quot;en cours&quot; indique les paramètres en vigueur pour le moment.\nL&#039;objet &quot;en attente&quot; indique les paramètres à appliquer au périphérique (cet objet\n  peut être manquant).\nUne fois que le périphérique voit les paramètres &quot;en attente&quot;, il DOIT mettre à jour son état (voir ci-dessous).\n4.1.3. Mise à jour\nSi une mise à jour des paramètres est nécessaire, une notification XMPP sera envoyée au périphérique. La notification\n  sera dans le format suivant:\n/mettre à jour les paramètres\nÀ la réception d&#039;une telle notification, le périphérique DOIT interroger le serveur pour obtenir les derniers paramètres.\n  Les périphériques Cloud Print DOIVENT utiliser:\n/ cloudprint / printer? printerid =\nUne fois que le périphérique voit la section &quot;en attente&quot; suite à l’API / cloudprint / printer (à\n  démarrage ou en raison de la notification), il DOIT mettre à jour son état interne pour se souvenir du nouveau\n  paramètres. Il DOIT appeler l&#039;API du serveur pour confirmer les nouveaux paramètres. Pour les imprimantes en nuage, le périphérique\n  DOIT appeler / cloudprint / update API et utiliser le paramètre &quot;local_settings&quot; comme pendant\n  enregistrement.\nLors de la reconnexion au canal XMPP, le périphérique DOIT appeler / cloudprint / API pour vérifier si\n  les paramètres locaux ont été modifiés depuis la dernière fois.\n4.1.3.1. Paramètres locaux en attente\nLe paramètre &quot;local_settings&quot; utilisé par le périphérique pour appeler l&#039;API du serveur NE DOIT JAMAIS contenir\n  section &quot;en attente&quot;.\n4.1.3.2. Paramètres locaux actuels\nUNIQUEMENT l’appareil peut changer la section &quot;actuelle&quot; des &quot;paramètres locaux&quot;.\n  Tout le monde changera la section &quot;en attente&quot; et attendra que les modifications soient apportées.\n  propagé à la section &quot;en cours&quot; par le périphérique.\n4.1.4. Hors ligne\nLorsqu&#039;il est impossible de contacter le serveur au démarrage, après notification, le périphérique DOIT utiliser le dernier\n  paramètres locaux.\n4.1.5. Suppression de l&#039;appareil du service\nSi le périphérique a été supprimé du service (GCP par exemple), une notification XMPP sera envoyée.\n  envoyé à l&#039;appareil. La notification sera au format suivant:\n/effacer\nÀ la réception d&#039;une telle notification, le périphérique DOIT se rendre sur le serveur pour vérifier son état. Nuage\n  Les périphériques d’impression DOIVENT utiliser:\n/ cloudprint / printer? printerid =\nLe périphérique DOIT recevoir une réponse HTTP réussie avec success = false et aucun périphérique / imprimante.\n  la description. Cela signifie que le périphérique a été retiré du serveur et que le périphérique DOIT effacer ses\n  informations d’authentification et passer en mode de paramètres d’usine par défaut.\nTOUTE heure à laquelle le périphérique reçoit une réponse indiquant qu&#039;il a été supprimé à la suite de la\n  / cloudprint / API (démarrage, notification des paramètres de mise à jour, ping quotidien), elle DOIT supprimer ses\n  informations d&#039;identification et aller en mode par défaut.\n4.2. API / privet / info\nL&#039;info API est OBLIGATOIRE et DOIT être implémentée par tous les appareils. C&#039;est une requête HTTP GET pour\n  &quot;/ privet / info&quot; url: GET / privet / info HTTP / 1.1\nL&#039;API info renvoie des informations de base sur un périphérique et les fonctionnalités qu&#039;il prend en charge. Cette API\n  NE DOIT jamais changer l’état du dispositif ni effectuer aucune action, car il est vulnérable aux attaques XSRF.\n  C&#039;est la SEULE API autorisée à avoir un en-tête &quot;X-Privet-Token&quot; vide. Les clients devraient\n  API call / privet / info avec en-tête &quot;X-Privet-Token&quot; définie sur X-Privet-Token:\n  &quot;&quot;\nL&#039;API info DOIT renvoyer des données cohérentes avec les données disponibles dans l&#039;enregistrement TXT lors de la découverte.\n4.2.1. Contribution\n/ privet / info L&#039;API n&#039;a pas de paramètre d&#039;entrée.\n4.2.2. Revenir\nL&#039;API / privet / info renvoie des informations de base sur le périphérique et les fonctionnalités prises en charge.\nLa colonne TXT indique le champ correspondant dans l’enregistrement DNS-SD TXT.</p>"},{"id":"text-25","type":"text","heading":"","plain_text":"Nom de la valeur\nType de valeur\nLa description\nSMS","html":"<p>Nom de la valeur\nType de valeur\nLa description\nSMS</p>"},{"id":"text-26","type":"text","heading":"","plain_text":"version\nchaîne\nVersion la plus récente (major.minor) de l&#39;API prise en charge, actuellement\n    1,0","html":"<p>version\nchaîne\nVersion la plus récente (major.minor) de l&#039;API prise en charge, actuellement\n    1,0</p>"},{"id":"text-27","type":"text","heading":"","plain_text":"Nom\nchaîne\nNom lisible par l&#39;homme du périphérique.\nty","html":"<p>Nom\nchaîne\nNom lisible par l&#039;homme du périphérique.\nty</p>"},{"id":"text-28","type":"text","heading":"","plain_text":"la description\nchaîne\n(facultatif) Description de l&#39;appareil. DEVRAIT être modifiable par\n    utilisateur.\nRemarque","html":"<p>la description\nchaîne\n(facultatif) Description de l&#039;appareil. DEVRAIT être modifiable par\n    utilisateur.\nRemarque</p>"},{"id":"text-29","type":"text","heading":"","plain_text":"url\nchaîne\nURL du serveur avec lequel cet appareil parle. L&#39;URL DOIT inclure\n    spécification du protocole, par exemple: https://www.google.com/cloudprint.\nurl","html":"<p>url\nchaîne\nURL du serveur avec lequel cet appareil parle. L&#039;URL DOIT inclure\n    spécification du protocole, par exemple: https://www.google.com/cloudprint.\nurl</p>"},{"id":"text-30","type":"text","heading":"","plain_text":"type\nliste de chaînes\nListe des types d&#39;appareils pris en charge.\ntype","html":"<p>type\nliste de chaînes\nListe des types d&#039;appareils pris en charge.\ntype</p>"},{"id":"text-31","type":"text","heading":"","plain_text":"identifiant\nchaîne\nIdentifiant de périphérique, vide si le périphérique n&#39;a pas encore été enregistré.\nidentifiant","html":"<p>identifiant\nchaîne\nIdentifiant de périphérique, vide si le périphérique n&#039;a pas encore été enregistré.\nidentifiant</p>"},{"id":"text-32","type":"text","heading":"","plain_text":"état_périphérique\nchaîne\nEtat de l&#39;appareil.tourner au ralenti signifie que l&#39;appareil est\n    prêtEn traitement signifie que le périphérique est occupé et que les fonctionnalités peuvent être limitées pendant un certain temps\n    arrêté signifie que l&#39;appareil ne fonctionne pas et que l&#39;intervention de l&#39;utilisateur est requise","html":"<p>état_périphérique\nchaîne\nEtat de l&#039;appareil.tourner au ralenti signifie que l&#039;appareil est\n    prêtEn traitement signifie que le périphérique est occupé et que les fonctionnalités peuvent être limitées pendant un certain temps\n    arrêté signifie que l&#039;appareil ne fonctionne pas et que l&#039;intervention de l&#039;utilisateur est requise</p>"},{"id":"text-33","type":"text","heading":"","plain_text":"état_connexion\nchaîne\nEtat de la connexion au serveur (base_url)\n    en ligne &#8211; connexion disponible\n    hors ligne &#8211; pas de connection\n    de liaison &#8211; effectuer les étapes de démarrage\n    pas configuré &#8211; la connexion n&#39;a pas encore été configurée\n    Un périphérique enregistré peut signaler son état de connexion en fonction de l&#39;état de la notification.\n    canal (par exemple, l&#39;état de la connexion XMPP).\ncs","html":"<p>état_connexion\nchaîne\nEtat de la connexion au serveur (base_url)\n    en ligne &#8211; connexion disponible\n    hors ligne &#8211; pas de connection\n    de liaison &#8211; effectuer les étapes de démarrage\n    pas configuré &#8211; la connexion n&#039;a pas encore été configurée\n    Un périphérique enregistré peut signaler son état de connexion en fonction de l&#039;état de la notification.\n    canal (par exemple, l&#039;état de la connexion XMPP).\ncs</p>"},{"id":"text-34","type":"text","heading":"","plain_text":"fabricant\nchaîne\nNom du fabricant de l&#39;appareil","html":"<p>fabricant\nchaîne\nNom du fabricant de l&#039;appareil</p>"},{"id":"text-35","type":"text","heading":"","plain_text":"modèle\nchaîne\nModèle de l&#39;appareil","html":"<p>modèle\nchaîne\nModèle de l&#039;appareil</p>"},{"id":"text-36","type":"text","heading":"","plain_text":"numéro de série\nchaîne\nIdentifiant unique de l&#39;appareil. Dans cette spécification, cela DOIT être\n    un UUID. (Spec GCP 1.1)\n    (facultatif) Nous vous recommandons vivement d’utiliser le même identifiant de numéro de série partout, donc différent.\n    les clients peuvent identifier le même appareil. Par exemple, les imprimeurs implémentant IPP peuvent utiliser cette interface série.\n    numéro d&#39;identification dans le champ &quot;printer-device-id&quot;.","html":"<p>numéro de série\nchaîne\nIdentifiant unique de l&#039;appareil. Dans cette spécification, cela DOIT être\n    un UUID. (Spec GCP 1.1)\n    (facultatif) Nous vous recommandons vivement d’utiliser le même identifiant de numéro de série partout, donc différent.\n    les clients peuvent identifier le même appareil. Par exemple, les imprimeurs implémentant IPP peuvent utiliser cette interface série.\n    numéro d&#039;identification dans le champ &quot;printer-device-id&quot;.</p>"},{"id":"text-37","type":"text","heading":"","plain_text":"firmware\nchaîne\nVersion du firmware de l&#39;appareil","html":"<p>firmware\nchaîne\nVersion du firmware de l&#039;appareil</p>"},{"id":"text-38","type":"text","heading":"","plain_text":"la disponibilité\nint\nNombre de secondes à partir du démarrage du périphérique.","html":"<p>la disponibilité\nint\nNombre de secondes à partir du démarrage du périphérique.</p>"},{"id":"text-39","type":"text","heading":"","plain_text":"setup_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    instructions d&#39;installation","html":"<p>setup_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    instructions d&#039;installation</p>"},{"id":"text-40","type":"text","heading":"","plain_text":"support_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    support, informations FAQ","html":"<p>support_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    support, informations FAQ</p>"},{"id":"text-41","type":"text","heading":"","plain_text":"update_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    mettre à jour les instructions du firmware","html":"<p>update_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    mettre à jour les instructions du firmware</p>"},{"id":"text-42","type":"text","heading":"","plain_text":"x-privet-token\nchaîne\nValeur de la X-Privet-Token en-tête qui a\n    à transmettre à toutes les API pour empêcher les attaques XSSI et XSRF. Voir 6.1. pour plus de détails.","html":"<p>x-privet-token\nchaîne\nValeur de la X-Privet-Token en-tête qui a\n    à transmettre à toutes les API pour empêcher les attaques XSSI et XSRF. Voir 6.1. pour plus de détails.</p>"},{"id":"text-43","type":"text","heading":"","plain_text":"api\ndescription des API\nListe des API prises en charge (décrites ci-dessous)","html":"<p>api\ndescription des API\nListe des API prises en charge (décrites ci-dessous)</p>"},{"id":"text-44","type":"text","heading":"","plain_text":"état sémantique\nJSON\n(facultatif) Etat sémantique de l&#39;appareil en\n    Format CloudDeviceState.","html":"<p>état sémantique\nJSON\n(facultatif) Etat sémantique de l&#039;appareil en\n    Format CloudDeviceState.</p>"},{"id":"text-45","type":"text","heading":"","plain_text":"api &#8211; est une liste JSON contenant la liste des API disponibles via le réseau local. Remarque\n  toutes les API ne sont peut-être pas disponibles simultanément sur le réseau local. Par exemple, un nouveau\n  L&#39;appareil connecté ne doit supporter que l&#39;API / Register:","html":"<p>api &#8211; est une liste JSON contenant la liste des API disponibles via le réseau local. Remarque\n  toutes les API ne sont peut-être pas disponibles simultanément sur le réseau local. Par exemple, un nouveau\n  L&#039;appareil connecté ne doit supporter que l&#039;API / Register:</p>"},{"id":"text-46","type":"text","heading":"","plain_text":"&quot;api&quot;: [\n        \"/privet/register\",\n]","html":"<p>&quot;api&quot;: [\n        &quot;/privet/register&quot;,\n]</p>"},{"id":"text-47","type":"text","heading":"","plain_text":"Une fois l&#39;enregistrement de l&#39;appareil terminé, l&#39;appareil DEVRAIT cesser de prendre en charge l&#39;API / register. le\nLe périphérique doit également vérifier auprès du service afin de déterminer quelles API peuvent être exposées sur le serveur local.\nréseau. Par exemple:","html":"<p>Une fois l&#039;enregistrement de l&#039;appareil terminé, l&#039;appareil DEVRAIT cesser de prendre en charge l&#039;API / register. le\nLe périphérique doit également vérifier auprès du service afin de déterminer quelles API peuvent être exposées sur le serveur local.\nréseau. Par exemple:</p>"},{"id":"text-48","type":"text","heading":"","plain_text":"&quot;api&quot;: [\n        \"/privet/accesstoken\",\n        \"/privet/capabilities\",\n        \"/privet/printer/submitdoc\",\n]","html":"<p>&quot;api&quot;: [\n        &quot;/privet/accesstoken&quot;,\n        &quot;/privet/capabilities&quot;,\n        &quot;/privet/printer/submitdoc&quot;,\n]</p>"},{"id":"text-49","type":"text","heading":"","plain_text":"Les API suivantes sont disponibles à ce moment:","html":"<p>Les API suivantes sont disponibles à ce moment:</p>"},{"id":"text-50","type":"text","heading":"","plain_text":"/ privet / register &#8211; API pour l&#39;enregistrement de périphérique sur le réseau local. (voir\n    / privet / register API pour plus de détails). Cette API DOIT être cachée une fois le périphérique réussi.\n    enregistré dans le nuage.\n/ privet / accesstoken &#8211; API permettant de demander un jeton d’accès à l’appareil (voir\n    / privet / accesstoken API pour plus de détails).\n/ privet / capacités &#8211; API permettant de récupérer les capacités du périphérique (voir / privet / capacités\n    API pour plus de détails).\n/ privet / printer / * &#8211; API spécifique au type de périphérique &quot;imprimante&quot;, voir imprimante\n    API spécifiques pour plus de détails.","html":"<p>/ privet / register &#8211; API pour l&#039;enregistrement de périphérique sur le réseau local. (voir\n    / privet / register API pour plus de détails). Cette API DOIT être cachée une fois le périphérique réussi.\n    enregistré dans le nuage.\n/ privet / accesstoken &#8211; API permettant de demander un jeton d’accès à l’appareil (voir\n    / privet / accesstoken API pour plus de détails).\n/ privet / capacités &#8211; API permettant de récupérer les capacités du périphérique (voir / privet / capacités\n    API pour plus de détails).\n/ privet / printer / * &#8211; API spécifique au type de périphérique &quot;imprimante&quot;, voir imprimante\n    API spécifiques pour plus de détails.</p>"},{"id":"text-51","type":"text","heading":"","plain_text":"Voici un exemple de réponse / privet / info. (Notez le manque de l’API / privet / register, car\nce périphérique est déjà enregistré):","html":"<p>Voici un exemple de réponse / privet / info. (Notez le manque de l’API / privet / register, car\nce périphérique est déjà enregistré):</p>"},{"id":"text-52","type":"text","heading":"","plain_text":"        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;name&quot;: &quot;l’imprimante de Gene&quot;,\n        &quot;description&quot;: &quot;Imprimante connectée via un connecteur Chrome&quot;,\n        &quot;url&quot;: &quot;https://www.google.com/cloudprint&quot;,\n        &quot;type&quot;: [\n                \"printer\"\n        ],\n        &quot;id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n        &quot;device_state&quot;: &quot;inactif&quot;,\n        &quot;connection_state&quot;: &quot;en ligne&quot;,\n        &quot;fabricant&quot;: &quot;Google&quot;,\n        &quot;modèle&quot;: &quot;Google Chrome&quot;,\n        &quot;numéro de série&quot;: &quot;1111-22222-33333-4444&quot;,\n        &quot;firmware&quot;: &quot;24.0.1312.52&quot;,\n        &quot;disponibilité&quot;: 600,\n        &quot;setup_url&quot;: &quot;http://support.google.com/cloudprint/answer/1686197/?hl=fr&quot;,\n        &quot;support_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;update_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;x-privet-token&quot;: &quot;AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659&quot;,\n        &quot;api&quot;: [\n                \"/privet/accesstoken\",\n                \"/privet/capabilities\",\n                \"/privet/printer/submitdoc\",\n        ]","html":"<p>        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;name&quot;: &quot;l’imprimante de Gene&quot;,\n        &quot;description&quot;: &quot;Imprimante connectée via un connecteur Chrome&quot;,\n        &quot;url&quot;: &quot;https://www.google.com/cloudprint&quot;,\n        &quot;type&quot;: [\n                &quot;printer&quot;\n        ],\n        &quot;id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n        &quot;device_state&quot;: &quot;inactif&quot;,\n        &quot;connection_state&quot;: &quot;en ligne&quot;,\n        &quot;fabricant&quot;: &quot;Google&quot;,\n        &quot;modèle&quot;: &quot;Google Chrome&quot;,\n        &quot;numéro de série&quot;: &quot;1111-22222-33333-4444&quot;,\n        &quot;firmware&quot;: &quot;24.0.1312.52&quot;,\n        &quot;disponibilité&quot;: 600,\n        &quot;setup_url&quot;: &quot;http://support.google.com/cloudprint/answer/1686197/?hl=fr&quot;,\n        &quot;support_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;update_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;x-privet-token&quot;: &quot;AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659&quot;,\n        &quot;api&quot;: [\n                &quot;/privet/accesstoken&quot;,\n                &quot;/privet/capabilities&quot;,\n                &quot;/privet/printer/submitdoc&quot;,\n        ]</p>"},{"id":"text-53","type":"text","heading":"","plain_text":"Voici un exemple de réponse / privet / info pour une imprimante à court d’encre (avis\n  état de sémantique):","html":"<p>Voici un exemple de réponse / privet / info pour une imprimante à court d’encre (avis\n  état de sémantique):</p>"},{"id":"text-54","type":"text","heading":"","plain_text":"{\n        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;name&quot;: &quot;l’imprimante de Gene&quot;,\n        &quot;description&quot;: &quot;Imprimante connectée via un connecteur Chrome&quot;,\n        &quot;url&quot;: &quot;https://www.google.com/cloudprint&quot;,\n        &quot;type&quot;: [\n                \"printer\"\n        ],\n        &quot;id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n        &quot;device_state&quot;: &quot;stoppé&quot;,\n        &quot;connection_state&quot;: &quot;en ligne&quot;,\n        &quot;fabricant&quot;: &quot;Google&quot;,\n        &quot;modèle&quot;: &quot;Google Chrome&quot;,\n        &quot;numéro de série&quot;: &quot;1111-22222-33333-4444&quot;,\n        &quot;firmware&quot;: &quot;24.0.1312.52&quot;,\n        &quot;disponibilité&quot;: 600,\n        &quot;setup_url&quot;: &quot;http://support.google.com/cloudprint/answer/1686197/?hl=fr&quot;,\n        &quot;support_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;update_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;x-privet-token&quot;: &quot;AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659&quot;,\n        &quot;api&quot;: [\n                \"/privet/accesstoken\",\n                \"/privet/capabilities\",\n                \"/privet/printer/submitdoc\",\n        ],\n        &quot;état sémantique&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;imprimante&quot;: \n                        &quot;state&quot;: &quot;STOPPED&quot;,\n                        &quot;marker_state&quot;: \n                                &quot;article&quot;: [\n                                        \n                                                \"vendor_id\": \"ink\",\n                                                \"state\": \"EXHAUSTED\",\n                                                \"level_percent\": 0\n                                        \n                                ]\n                        \n                \n        \n}","html":"<p>{\n        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;name&quot;: &quot;l’imprimante de Gene&quot;,\n        &quot;description&quot;: &quot;Imprimante connectée via un connecteur Chrome&quot;,\n        &quot;url&quot;: &quot;https://www.google.com/cloudprint&quot;,\n        &quot;type&quot;: [\n                &quot;printer&quot;\n        ],\n        &quot;id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n        &quot;device_state&quot;: &quot;stoppé&quot;,\n        &quot;connection_state&quot;: &quot;en ligne&quot;,\n        &quot;fabricant&quot;: &quot;Google&quot;,\n        &quot;modèle&quot;: &quot;Google Chrome&quot;,\n        &quot;numéro de série&quot;: &quot;1111-22222-33333-4444&quot;,\n        &quot;firmware&quot;: &quot;24.0.1312.52&quot;,\n        &quot;disponibilité&quot;: 600,\n        &quot;setup_url&quot;: &quot;http://support.google.com/cloudprint/answer/1686197/?hl=fr&quot;,\n        &quot;support_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;update_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;x-privet-token&quot;: &quot;AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659&quot;,\n        &quot;api&quot;: [\n                &quot;/privet/accesstoken&quot;,\n                &quot;/privet/capabilities&quot;,\n                &quot;/privet/printer/submitdoc&quot;,\n        ],\n        &quot;état sémantique&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;imprimante&quot;: \n                        &quot;state&quot;: &quot;STOPPED&quot;,\n                        &quot;marker_state&quot;: \n                                &quot;article&quot;: [\n                                        \n                                                &quot;vendor_id&quot;: &quot;ink&quot;,\n                                                &quot;state&quot;: &quot;EXHAUSTED&quot;,\n                                                &quot;level_percent&quot;: 0\n                                        \n                                ]\n                        \n                \n        \n}</p>"},{"id":"text-55","type":"text","heading":"","plain_text":"4.2.3. les erreurs\n/ privet / info API devrait SEULEMENT renvoyer une erreur si X-Privet-Token l&#39;en-tête est manquant. Il\n  DOIT être une erreur HTTP 400:\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\n4.3. / privet / register API\n/ privet / register est facultative. C&#39;est une requête HTTP POST. / privet / register API DOIT vérifier\n  pour une validité X-Privet-Token entête. Le périphérique DOIT implémenter cette API sur\n  &quot;/ privet / register&quot; url:","html":"<p>4.2.3. les erreurs\n/ privet / info API devrait SEULEMENT renvoyer une erreur si X-Privet-Token l&#039;en-tête est manquant. Il\n  DOIT être une erreur HTTP 400:\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\n4.3. / privet / register API\n/ privet / register est facultative. C&#039;est une requête HTTP POST. / privet / register API DOIT vérifier\n  pour une validité X-Privet-Token entête. Le périphérique DOIT implémenter cette API sur\n  &quot;/ privet / register&quot; url:</p>"},{"id":"text-56","type":"text","heading":"","plain_text":"POST /privet/register?action=start&amp;user=user@domain.com HTTP / 1.1\nPOST /privet/register?action=complete&amp;user=user@domain.com HTTP / 1.1","html":"<p>POST /privet/register?action=start&amp;user=user@domain.com HTTP / 1.1\nPOST /privet/register?action=complete&amp;user=user@domain.com HTTP / 1.1</p>"},{"id":"text-57","type":"text","heading":"","plain_text":"L’appareil doit exposer l’API / privet / register UNIQUEMENT lorsqu’il autorise l’enregistrement anonyme à la\n  moment. Par exemple:","html":"<p>L’appareil doit exposer l’API / privet / register UNIQUEMENT lorsqu’il autorise l’enregistrement anonyme à la\n  moment. Par exemple:</p>"},{"id":"text-58","type":"text","heading":"","plain_text":"Lorsque le périphérique est allumé (ou après avoir cliqué sur un bouton spécial du périphérique) et n’a pas\n    été enregistré, il devrait exposer l’API / privet / register pour permettre à un utilisateur du répertoire local\n    réseau pour réclamer l’imprimante.\nUne fois l’enregistrement terminé, le périphérique doit cesser d’exposer l’API / privet / register à\n    empêcher un autre utilisateur du réseau local de récupérer le périphérique.\nCertains appareils peuvent avoir différentes façons d’enregistrer des appareils et ne doivent pas exposer le\n    / privet / register à tous (par exemple, le connecteur Chrome Cloud Print).","html":"<p>Lorsque le périphérique est allumé (ou après avoir cliqué sur un bouton spécial du périphérique) et n’a pas\n    été enregistré, il devrait exposer l’API / privet / register pour permettre à un utilisateur du répertoire local\n    réseau pour réclamer l’imprimante.\nUne fois l’enregistrement terminé, le périphérique doit cesser d’exposer l’API / privet / register à\n    empêcher un autre utilisateur du réseau local de récupérer le périphérique.\nCertains appareils peuvent avoir différentes façons d’enregistrer des appareils et ne doivent pas exposer le\n    / privet / register à tous (par exemple, le connecteur Chrome Cloud Print).</p>"},{"id":"text-59","type":"text","heading":"","plain_text":"Le processus d’enregistrement se déroule en 3 étapes (voir Enregistrement anonyme pour Cloud Print).","html":"<p>Le processus d’enregistrement se déroule en 3 étapes (voir Enregistrement anonyme pour Cloud Print).</p>"},{"id":"text-60","type":"text","heading":"","plain_text":"Lancer le processus d&#39;inscription anonyme.\nUn client initie ce processus en appelant l&#39;API / privet / register. L&#39;appareil peut attendre\n    confirmation de l&#39;utilisateur à ce moment.\nObtenez le jeton de réclamation.","html":"<p>Lancer le processus d&#039;inscription anonyme.\nUn client initie ce processus en appelant l&#039;API / privet / register. L&#039;appareil peut attendre\n    confirmation de l&#039;utilisateur à ce moment.\nObtenez le jeton de réclamation.</p>"},{"id":"text-61","type":"text","heading":"","plain_text":"Le client interroge pour savoir quand l&#39;appareil est prêt à continuer. Une fois que l&#39;appareil est prêt, il\n  envoie une demande au serveur pour récupérer le jeton d&#39;enregistrement et l&#39;URL d&#39;inscription. Jeton reçu\n  et URL DEVRAIT être retourné au client. Au cours de cette étape, si le périphérique reçoit un autre appel pour\n  initialiser l&#39;enregistrement, il devrait:","html":"<p>Le client interroge pour savoir quand l&#039;appareil est prêt à continuer. Une fois que l&#039;appareil est prêt, il\n  envoie une demande au serveur pour récupérer le jeton d&#039;enregistrement et l&#039;URL d&#039;inscription. Jeton reçu\n  et URL DEVRAIT être retourné au client. Au cours de cette étape, si le périphérique reçoit un autre appel pour\n  initialiser l&#039;enregistrement, il devrait:</p>"},{"id":"text-62","type":"text","heading":"","plain_text":"Si c’est le même utilisateur qui a commencé l’enregistrement, supprimez toutes les données précédentes (le cas échéant) et démarrez le système.\n    un nouveau processus d&#39;inscription.\nS&#39;il s&#39;agit d&#39;un utilisateur différent, retourne une erreur device_busy et un délai d&#39;attente de 30 secondes.","html":"<p>Si c’est le même utilisateur qui a commencé l’enregistrement, supprimez toutes les données précédentes (le cas échéant) et démarrez le système.\n    un nouveau processus d&#039;inscription.\nS&#039;il s&#039;agit d&#039;un utilisateur différent, retourne une erreur device_busy et un délai d&#039;attente de 30 secondes.</p>"},{"id":"text-63","type":"text","heading":"","plain_text":"Processus d&#39;inscription complet.\nUne fois que le client a réclamé le périphérique, il doit lui notifier son achèvement.\n  enregistrement. Une fois le processus d&#39;enregistrement terminé, l&#39;appareil doit envoyer une mise à jour.\n  annonce, y compris l&#39;ID de périphérique nouvellement acquis.\nRemarque: lorsque le périphérique traite un appel d&#39;API / privet / register, aucune autre API / privet / register\n  les appels peuvent être traités simultanément. Le périphérique DOIT retourner l&#39;erreur device_busy et 30 secondes\n  temps libre.\nLa confirmation de l&#39;utilisateur pour l&#39;enregistrement sur l&#39;appareil est fortement recommandée. Si mis en œuvre, le\n  le périphérique DOIT attendre la confirmation de l&#39;utilisateur APRÈS qu&#39;il reçoive un / privet / register? action = start API\n  appel. Le client appellera / privet / register? Action = getClaimToken pour savoir quand\n  la confirmation de l&#39;utilisateur est terminée et le jeton de réclamation est disponible. Si l&#39;utilisateur annule son inscription le\n  l&#39;appareil (par exemple, appuie sur le bouton Annuler), l&#39;erreur user_cancel DOIT être renvoyée. Si l&#39;utilisateur\n  l’enregistrement n’a pas été confirmé dans un certain délai, l’erreur confirmation_timeout DOIT être\n  revenu. Voir la section des valeurs par défaut pour plus de détails.\n4.3.1. Contribution\nL&#39;API / privet / register a les paramètres d&#39;entrée suivants:","html":"<p>Processus d&#039;inscription complet.\nUne fois que le client a réclamé le périphérique, il doit lui notifier son achèvement.\n  enregistrement. Une fois le processus d&#039;enregistrement terminé, l&#039;appareil doit envoyer une mise à jour.\n  annonce, y compris l&#039;ID de périphérique nouvellement acquis.\nRemarque: lorsque le périphérique traite un appel d&#039;API / privet / register, aucune autre API / privet / register\n  les appels peuvent être traités simultanément. Le périphérique DOIT retourner l&#039;erreur device_busy et 30 secondes\n  temps libre.\nLa confirmation de l&#039;utilisateur pour l&#039;enregistrement sur l&#039;appareil est fortement recommandée. Si mis en œuvre, le\n  le périphérique DOIT attendre la confirmation de l&#039;utilisateur APRÈS qu&#039;il reçoive un / privet / register? action = start API\n  appel. Le client appellera / privet / register? Action = getClaimToken pour savoir quand\n  la confirmation de l&#039;utilisateur est terminée et le jeton de réclamation est disponible. Si l&#039;utilisateur annule son inscription le\n  l&#039;appareil (par exemple, appuie sur le bouton Annuler), l&#039;erreur user_cancel DOIT être renvoyée. Si l&#039;utilisateur\n  l’enregistrement n’a pas été confirmé dans un certain délai, l’erreur confirmation_timeout DOIT être\n  revenu. Voir la section des valeurs par défaut pour plus de détails.\n4.3.1. Contribution\nL&#039;API / privet / register a les paramètres d&#039;entrée suivants:</p>"},{"id":"text-64","type":"text","heading":"","plain_text":"Nom\nValeur","html":"<p>Nom\nValeur</p>"},{"id":"text-65","type":"text","heading":"","plain_text":"action\nPeut être l&#39;un des suivants:\n    début &#8211; pour commencer le processus d&#39;inscription\n    getClaimToken &#8211; récupérer le jeton de réclamation pour le périphérique\n    Annuler &#8211; annuler le processus d&#39;inscription\n    Achevée &#8211; terminer le processus d&#39;inscription","html":"<p>action\nPeut être l&#039;un des suivants:\n    début &#8211; pour commencer le processus d&#039;inscription\n    getClaimToken &#8211; récupérer le jeton de réclamation pour le périphérique\n    Annuler &#8211; annuler le processus d&#039;inscription\n    Achevée &#8211; terminer le processus d&#039;inscription</p>"},{"id":"text-66","type":"text","heading":"","plain_text":"utilisateur\nEmail de l&#39;utilisateur qui réclamera cet appareil.","html":"<p>utilisateur\nEmail de l&#039;utilisateur qui réclamera cet appareil.</p>"},{"id":"text-67","type":"text","heading":"","plain_text":"Le périphérique DOIT vérifier que l’adresse électronique de toutes les actions (start, getClaimToken, annuler,\n  complète) correspond.\n4.3.2. Revenir\nL&#39;API / privet / register renvoie les données suivantes:","html":"<p>Le périphérique DOIT vérifier que l’adresse électronique de toutes les actions (start, getClaimToken, annuler,\n  complète) correspond.\n4.3.2. Revenir\nL&#039;API / privet / register renvoie les données suivantes:</p>"},{"id":"text-68","type":"text","heading":"","plain_text":"Nom de la valeur\nType de valeur\nLa description","html":"<p>Nom de la valeur\nType de valeur\nLa description</p>"},{"id":"text-69","type":"text","heading":"","plain_text":"action\nchaîne\nMême action que dans le paramètre d&#39;entrée.","html":"<p>action\nchaîne\nMême action que dans le paramètre d&#039;entrée.</p>"},{"id":"text-70","type":"text","heading":"","plain_text":"utilisateur\nchaîne (optionnel)\nMême utilisateur que dans le paramètre d&#39;entrée (peut être manquant, si\n    omis dans l&#39;entrée).","html":"<p>utilisateur\nchaîne (optionnel)\nMême utilisateur que dans le paramètre d&#039;entrée (peut être manquant, si\n    omis dans l&#039;entrée).</p>"},{"id":"text-71","type":"text","heading":"","plain_text":"jeton\nchaîne (optionnel)\nJeton d&#39;inscription (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;).","html":"<p>jeton\nchaîne (optionnel)\nJeton d&#039;inscription (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;).</p>"},{"id":"text-72","type":"text","heading":"","plain_text":"claim_url\nchaîne (optionnel)\nURL d&#39;enregistrement (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;). Pour les imprimantes en nuage, il faut\n    être &quot;complete_invite_url&quot; reçu du serveur.","html":"<p>claim_url\nchaîne (optionnel)\nURL d&#039;enregistrement (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;). Pour les imprimantes en nuage, il faut\n    être &quot;complete_invite_url&quot; reçu du serveur.</p>"},{"id":"text-73","type":"text","heading":"","plain_text":"automation_claim_url\nchaîne (optionnel)\nURL d&#39;enregistrement (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;). Pour les imprimantes en nuage, il faut\n    être &quot;automatic_invite_url&quot; reçu du serveur.","html":"<p>automation_claim_url\nchaîne (optionnel)\nURL d&#039;enregistrement (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;). Pour les imprimantes en nuage, il faut\n    être &quot;automatic_invite_url&quot; reçu du serveur.</p>"},{"id":"text-74","type":"text","heading":"","plain_text":"Reference de l&#39;appareil\nchaîne (optionnel)\nNouvel identifiant d&#39;appareil (omis pour la réponse &quot;start&quot;,\n    obligatoire pour &quot;complet&quot;).","html":"<p>Reference de l&#039;appareil\nchaîne (optionnel)\nNouvel identifiant d&#039;appareil (omis pour la réponse &quot;start&quot;,\n    obligatoire pour &quot;complet&quot;).</p>"},{"id":"text-75","type":"text","heading":"","plain_text":"Le périphérique DOIT retourner son identifiant de périphérique dans la réponse de l&#39;API / privet / info UNIQUEMENT après l&#39;enregistrement.\n  Achevée.\nExemple 1:","html":"<p>Le périphérique DOIT retourner son identifiant de périphérique dans la réponse de l&#039;API / privet / info UNIQUEMENT après l&#039;enregistrement.\n  Achevée.\nExemple 1:</p>"},{"id":"text-76","type":"text","heading":"","plain_text":"        &quot;action&quot;: &quot;start&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,","html":"<p>        &quot;action&quot;: &quot;start&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,</p>"},{"id":"text-77","type":"text","heading":"","plain_text":"Exemple 2:","html":"<p>Exemple 2:</p>"},{"id":"text-78","type":"text","heading":"","plain_text":"        &quot;action&quot;: &quot;getClaimToken&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;claim_url&quot;: &quot;https://domain.com/SoMeUrL&quot;,","html":"<p>        &quot;action&quot;: &quot;getClaimToken&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;claim_url&quot;: &quot;https://domain.com/SoMeUrL&quot;,</p>"},{"id":"text-79","type":"text","heading":"","plain_text":"Exemple 3:","html":"<p>Exemple 3:</p>"},{"id":"text-80","type":"text","heading":"","plain_text":"        &quot;action&quot;: &quot;complet&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;device_id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,","html":"<p>        &quot;action&quot;: &quot;complet&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;device_id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,</p>"},{"id":"text-81","type":"text","heading":"","plain_text":"4.3.3. les erreurs\nL&#39;API / privet / register peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):","html":"<p>4.3.3. les erreurs\nL&#039;API / privet / register peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):</p>"},{"id":"text-82","type":"text","heading":"","plain_text":"Erreur\nLa description","html":"<p>Erreur\nLa description</p>"},{"id":"text-83","type":"text","heading":"","plain_text":"device_busy\nLe périphérique est occupé et ne peut pas effectuer l’action demandée. Recommencez\n    après timeout.","html":"<p>device_busy\nLe périphérique est occupé et ne peut pas effectuer l’action demandée. Recommencez\n    après timeout.</p>"},{"id":"text-84","type":"text","heading":"","plain_text":"waiting_user_action\nEn réponse à &quot;getClaimToken&quot;, cette erreur indique que le\n    le périphérique est toujours en attente de confirmation de l&#39;utilisateur, et la requête &quot;getClaimToken&quot; doit être réessayée après\n    temps libre.","html":"<p>waiting_user_action\nEn réponse à &quot;getClaimToken&quot;, cette erreur indique que le\n    le périphérique est toujours en attente de confirmation de l&#039;utilisateur, et la requête &quot;getClaimToken&quot; doit être réessayée après\n    temps libre.</p>"},{"id":"text-85","type":"text","heading":"","plain_text":"user_cancel\nL&#39;utilisateur a explicitement annulé le processus d&#39;inscription depuis l&#39;appareil.","html":"<p>user_cancel\nL&#039;utilisateur a explicitement annulé le processus d&#039;inscription depuis l&#039;appareil.</p>"},{"id":"text-86","type":"text","heading":"","plain_text":"confirmation_timeout\nLa confirmation de l&#39;utilisateur expire.","html":"<p>confirmation_timeout\nLa confirmation de l&#039;utilisateur expire.</p>"},{"id":"text-87","type":"text","heading":"","plain_text":"invalide_action\nUne action invalide est appelée. Par exemple, si le client appelé\n    action = terminé avant d&#39;appeler action = start et action = getClaimToken.","html":"<p>invalide_action\nUne action invalide est appelée. Par exemple, si le client appelé\n    action = terminé avant d&#039;appeler action = start et action = getClaimToken.</p>"},{"id":"text-88","type":"text","heading":"","plain_text":"parent_invalide\nParamètres non valides spécifiés dans la demande. (Paramètres inconnus\n    doit être ignoré pour une compatibilité future). Par exemple, renvoyez ceci si le client\n    appelé action = inconnu ou utilisateur =.","html":"<p>parent_invalide\nParamètres non valides spécifiés dans la demande. (Paramètres inconnus\n    doit être ignoré pour une compatibilité future). Par exemple, renvoyez ceci si le client\n    appelé action = inconnu ou utilisateur =.</p>"},{"id":"text-89","type":"text","heading":"","plain_text":"device_config_error\nLa date / heure (ou certains autres paramètres) est incorrecte sur l&#39;appareil\n    côté. L&#39;utilisateur doit aller (sur le site Web interne du périphérique) et configurer les paramètres du périphérique.","html":"<p>device_config_error\nLa date / heure (ou certains autres paramètres) est incorrecte sur l&#039;appareil\n    côté. L&#039;utilisateur doit aller (sur le site Web interne du périphérique) et configurer les paramètres du périphérique.</p>"},{"id":"text-90","type":"text","heading":"","plain_text":"hors ligne\nL’appareil est actuellement hors ligne et ne peut pas communiquer avec le serveur.","html":"<p>hors ligne\nL’appareil est actuellement hors ligne et ne peut pas communiquer avec le serveur.</p>"},{"id":"text-91","type":"text","heading":"","plain_text":"erreur du serveur\nErreur du serveur pendant le processus d&#39;inscription.","html":"<p>erreur du serveur\nErreur du serveur pendant le processus d&#039;inscription.</p>"},{"id":"text-92","type":"text","heading":"","plain_text":"invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la requête.","html":"<p>invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la requête.</p>"},{"id":"text-93","type":"text","heading":"","plain_text":"Le périphérique DOIT cesser d’exposer l’API / privet / register une fois l’enregistrement effectué avec succès.\n  terminé. Si le périphérique n&#39;expose pas l&#39;API / privet / register, il DOIT renvoyer l&#39;erreur HTTP 404.\n  Par conséquent, si un périphérique est déjà enregistré, l&#39;appel de cette API DOIT renvoyer 404. Si le\n  L&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l&#39;erreur HTTP 400.\n4.4. / privet / accesstoken API\n/ privet / accesstoken API est FACULTATIF. C&#39;est une requête HTTP GET. / privet / accesstoken API DOIT vérifier\npour un en-tête &quot;X-Privet-Token&quot; valide. Le périphérique DOIT implémenter cette API sur le\n&quot;/ privet / accesstoken&quot; url:\nGET / privet / accesstoken HTTP / 1.1\nLorsque le périphérique reçoit l&#39;appel de l&#39;API / accesstoken, il doit appeler le serveur pour récupérer le\n  jeton d&#39;accès pour l&#39;utilisateur donné et renvoyer le jeton au client. Le client utilisera ensuite le\n  jeton d&#39;accès pour accéder à cet appareil via le cloud.\nLes périphériques Cloud Print DOIVENT appeler l&#39;API suivante:\n/ cloudprint / proximitétoken\net passez les paramètres &quot;printerid =&quot; et &quot;user&quot; du local\nAPI. En cas de succès, la réponse du serveur contiendra l&#39;objet suivant:","html":"<p>Le périphérique DOIT cesser d’exposer l’API / privet / register une fois l’enregistrement effectué avec succès.\n  terminé. Si le périphérique n&#039;expose pas l&#039;API / privet / register, il DOIT renvoyer l&#039;erreur HTTP 404.\n  Par conséquent, si un périphérique est déjà enregistré, l&#039;appel de cette API DOIT renvoyer 404. Si le\n  L&#039;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l&#039;erreur HTTP 400.\n4.4. / privet / accesstoken API\n/ privet / accesstoken API est FACULTATIF. C&#039;est une requête HTTP GET. / privet / accesstoken API DOIT vérifier\npour un en-tête &quot;X-Privet-Token&quot; valide. Le périphérique DOIT implémenter cette API sur le\n&quot;/ privet / accesstoken&quot; url:\nGET / privet / accesstoken HTTP / 1.1\nLorsque le périphérique reçoit l&#039;appel de l&#039;API / accesstoken, il doit appeler le serveur pour récupérer le\n  jeton d&#039;accès pour l&#039;utilisateur donné et renvoyer le jeton au client. Le client utilisera ensuite le\n  jeton d&#039;accès pour accéder à cet appareil via le cloud.\nLes périphériques Cloud Print DOIVENT appeler l&#039;API suivante:\n/ cloudprint / proximitétoken\net passez les paramètres &quot;printerid =&quot; et &quot;user&quot; du local\nAPI. En cas de succès, la réponse du serveur contiendra l&#039;objet suivant:</p>"},{"id":"text-94","type":"text","heading":"","plain_text":"&quot;proximité_token&quot;: \n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;expires_in&quot;: 600","html":"<p>&quot;proximité_token&quot;: \n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;expires_in&quot;: 600</p>"},{"id":"text-95","type":"text","heading":"","plain_text":"Les périphériques Cloud Print DOIVENT transmettre la valeur de l’objet &quot;proximité_token&quot; dans la réponse.\naux appels d’API locaux / privet / accesstoken. Il est plus avantageux (à l’avenir) que l’appareil puisse\npasse TOUS les paramètres (y compris ceux qui ne sont pas décrits dans cette spécification).\n4.4.1. Contribution\nL&#39;API / privet / accesstoken a les paramètres d&#39;entrée suivants:","html":"<p>Les périphériques Cloud Print DOIVENT transmettre la valeur de l’objet &quot;proximité_token&quot; dans la réponse.\naux appels d’API locaux / privet / accesstoken. Il est plus avantageux (à l’avenir) que l’appareil puisse\npasse TOUS les paramètres (y compris ceux qui ne sont pas décrits dans cette spécification).\n4.4.1. Contribution\nL&#039;API / privet / accesstoken a les paramètres d&#039;entrée suivants:</p>"},{"id":"text-96","type":"text","heading":"","plain_text":"Nom\nValeur","html":"<p>Nom\nValeur</p>"},{"id":"text-97","type":"text","heading":"","plain_text":"utilisateur\nEmail de l&#39;utilisateur qui a eu l&#39;intention d&#39;utiliser ce jeton d&#39;accès. Peut être vide dans le\n    demande.","html":"<p>utilisateur\nEmail de l&#039;utilisateur qui a eu l&#039;intention d&#039;utiliser ce jeton d&#039;accès. Peut être vide dans le\n    demande.</p>"},{"id":"text-98","type":"text","heading":"","plain_text":"4.4.2. Revenir\n/ privet / accesstoken L&#39;API renvoie les données suivantes:","html":"<p>4.4.2. Revenir\n/ privet / accesstoken L&#039;API renvoie les données suivantes:</p>"},{"id":"text-99","type":"text","heading":"","plain_text":"Nom de la valeur\nType de valeur\nLa description","html":"<p>Nom de la valeur\nType de valeur\nLa description</p>"},{"id":"text-100","type":"text","heading":"","plain_text":"jeton\nchaîne\nJeton d&#39;accès renvoyé par le serveur","html":"<p>jeton\nchaîne\nJeton d&#039;accès renvoyé par le serveur</p>"},{"id":"text-101","type":"text","heading":"","plain_text":"utilisateur\nchaîne\nMême utilisateur que dans le paramètre d&#39;entrée.","html":"<p>utilisateur\nchaîne\nMême utilisateur que dans le paramètre d&#039;entrée.</p>"},{"id":"text-102","type":"text","heading":"","plain_text":"expire dans\nint\nNombre de secondes jusqu&#39;à l&#39;expiration de ce jeton. Reçu de\n    le serveur et passé dans cette réponse.","html":"<p>expire dans\nint\nNombre de secondes jusqu&#039;à l&#039;expiration de ce jeton. Reçu de\n    le serveur et passé dans cette réponse.</p>"},{"id":"text-103","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-104","type":"text","heading":"","plain_text":"        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;expires_in&quot;: 600","html":"<p>        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;expires_in&quot;: 600</p>"},{"id":"text-105","type":"text","heading":"","plain_text":"4.4.3. les erreurs\nL&#39;API / privet / accesstoken peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):","html":"<p>4.4.3. les erreurs\nL&#039;API / privet / accesstoken peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):</p>"},{"id":"text-106","type":"text","heading":"","plain_text":"Erreur\nLa description","html":"<p>Erreur\nLa description</p>"},{"id":"text-107","type":"text","heading":"","plain_text":"hors ligne\nL&#39;appareil est actuellement hors ligne et ne peut pas parler au serveur.","html":"<p>hors ligne\nL&#039;appareil est actuellement hors ligne et ne peut pas parler au serveur.</p>"},{"id":"text-108","type":"text","heading":"","plain_text":"accès refusé\nDroits insuffisants. Accès refusé. L&#39;appareil doit renvoyer cette\n    erreur lorsque la demande a été explicitement refusée par le serveur.","html":"<p>accès refusé\nDroits insuffisants. Accès refusé. L&#039;appareil doit renvoyer cette\n    erreur lorsque la demande a été explicitement refusée par le serveur.</p>"},{"id":"text-109","type":"text","heading":"","plain_text":"parent_invalide\nParamètres non valides spécifiés dans la demande. (Paramètres inconnus\n    doit être ignoré pour une compatibilité future). Par exemple, si le client appelé\n    / accesstoken? user = ou / accesstoken.","html":"<p>parent_invalide\nParamètres non valides spécifiés dans la demande. (Paramètres inconnus\n    doit être ignoré pour une compatibilité future). Par exemple, si le client appelé\n    / accesstoken? user = ou / accesstoken.</p>"},{"id":"text-110","type":"text","heading":"","plain_text":"erreur du serveur\nErreur du serveur.","html":"<p>erreur du serveur\nErreur du serveur.</p>"},{"id":"text-111","type":"text","heading":"","plain_text":"invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la demande.","html":"<p>invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la demande.</p>"},{"id":"text-112","type":"text","heading":"","plain_text":"Si le périphérique n&#39;expose pas l&#39;API / privet / accesstoken, il DOIT renvoyer l&#39;erreur HTTP 404. Si la\n  L&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l&#39;erreur HTTP 400.\n4.5 / privet / API de capacités\n/ privet / features est facultatif. C&#39;est une requête HTTP GET. / privet / functions API DOIT vérifier\npour un en-tête &quot;X-Privet-Token&quot; valide. Le périphérique DOIT implémenter cette API sur\nURL &quot;/ privet / capacités&quot;:\nGET / privet / capacités HTTP / 1.1\nLorsque le périphérique reçoit / appel de l&#39;API de fonctionnalités, si le périphérique est capable, il DEVRAIT contacter\nle serveur pour obtenir des capacités mises à jour. Par exemple, si une imprimante prend en charge la publication d&#39;un travail d&#39;impression\n(reçu localement) à travers le service Cloud Print, il devrait renvoyer les fonctionnalités que le\nLe service d&#39;impression en nuage reviendrait. Cloud Print dans ce cas peut altérer l&#39;imprimante d&#39;origine\nfonctions en ajoutant de nouvelles fonctionnalités avant d’envoyer le travail à l’imprimante. Le plus\nLe cas courant est une liste de types de documents pris en charge. Si l&#39;imprimante est hors ligne, elle devrait renvoyer\ntypes de documents qu&#39;il prend en charge. Cependant, si l&#39;imprimante est en ligne et enregistrée auprès de Cloud Print it\nDOIT retourner &quot;* / *&quot; parmi les types pris en charge. Le service Cloud Print sera exécuté\nla conversion nécessaire dans ce cas. Pour l’impression hors ligne, l’imprimante DOIT prendre en charge au moins la\nformat &quot;image / pwg-raster&quot;.\n4.5.1. Contribution\nL&#39;API / privet / functions a les paramètres d&#39;entrée suivants:","html":"<p>Si le périphérique n&#039;expose pas l&#039;API / privet / accesstoken, il DOIT renvoyer l&#039;erreur HTTP 404. Si la\n  L&#039;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l&#039;erreur HTTP 400.\n4.5 / privet / API de capacités\n/ privet / features est facultatif. C&#039;est une requête HTTP GET. / privet / functions API DOIT vérifier\npour un en-tête &quot;X-Privet-Token&quot; valide. Le périphérique DOIT implémenter cette API sur\nURL &quot;/ privet / capacités&quot;:\nGET / privet / capacités HTTP / 1.1\nLorsque le périphérique reçoit / appel de l&#039;API de fonctionnalités, si le périphérique est capable, il DEVRAIT contacter\nle serveur pour obtenir des capacités mises à jour. Par exemple, si une imprimante prend en charge la publication d&#039;un travail d&#039;impression\n(reçu localement) à travers le service Cloud Print, il devrait renvoyer les fonctionnalités que le\nLe service d&#039;impression en nuage reviendrait. Cloud Print dans ce cas peut altérer l&#039;imprimante d&#039;origine\nfonctions en ajoutant de nouvelles fonctionnalités avant d’envoyer le travail à l’imprimante. Le plus\nLe cas courant est une liste de types de documents pris en charge. Si l&#039;imprimante est hors ligne, elle devrait renvoyer\ntypes de documents qu&#039;il prend en charge. Cependant, si l&#039;imprimante est en ligne et enregistrée auprès de Cloud Print it\nDOIT retourner &quot;* / *&quot; parmi les types pris en charge. Le service Cloud Print sera exécuté\nla conversion nécessaire dans ce cas. Pour l’impression hors ligne, l’imprimante DOIT prendre en charge au moins la\nformat &quot;image / pwg-raster&quot;.\n4.5.1. Contribution\nL&#039;API / privet / functions a les paramètres d&#039;entrée suivants:</p>"},{"id":"text-113","type":"text","heading":"","plain_text":"Nom\nValeur","html":"<p>Nom\nValeur</p>"},{"id":"text-114","type":"text","heading":"","plain_text":"hors ligne\n(facultatif) Ne peut être que &quot;hors ligne = 1&quot;. Dans ce cas, l&#39;appareil doit retourner\n    capacités pour une utilisation hors connexion (si elles sont différentes des capacités &quot;en ligne&quot;).","html":"<p>hors ligne\n(facultatif) Ne peut être que &quot;hors ligne = 1&quot;. Dans ce cas, l&#039;appareil doit retourner\n    capacités pour une utilisation hors connexion (si elles sont différentes des capacités &quot;en ligne&quot;).</p>"},{"id":"text-115","type":"text","heading":"","plain_text":"4.5.2. Revenir\nL&#39;API / privet / features renvoie les fonctionnalités de périphérique dans le fichier JSON CDD (Cloud Device Description)\nformat (voir le document CDD pour plus de détails). Les imprimantes au minimum DOIVENT renvoyer une liste des types pris en charge\nici. Par exemple, une imprimante Cloud Ready actuellement en ligne peut renvoyer quelque chose comme ceci (à\nle minimum):","html":"<p>4.5.2. Revenir\nL&#039;API / privet / features renvoie les fonctionnalités de périphérique dans le fichier JSON CDD (Cloud Device Description)\nformat (voir le document CDD pour plus de détails). Les imprimantes au minimum DOIVENT renvoyer une liste des types pris en charge\nici. Par exemple, une imprimante Cloud Ready actuellement en ligne peut renvoyer quelque chose comme ceci (à\nle minimum):</p>"},{"id":"text-116","type":"text","heading":"","plain_text":"        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;imprimante&quot;: \n                &quot;supported_content_type&quot;: [\n                        \n                                \"content_type\": \"application/pdf\",\n                                \"min_version\": \"1.4\"\n                        ,\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" ,\n                         \"content_type\": \"*/*\" \n                ]","html":"<p>        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;imprimante&quot;: \n                &quot;supported_content_type&quot;: [\n                        \n                                &quot;content_type&quot;: &quot;application/pdf&quot;,\n                                &quot;min_version&quot;: &quot;1.4&quot;\n                        ,\n                         &quot;content_type&quot;: &quot;image/pwg-raster&quot; ,\n                         &quot;content_type&quot;: &quot;image/jpeg&quot; ,\n                         &quot;content_type&quot;: &quot;*/*&quot; \n                ]</p>"},{"id":"text-117","type":"text","heading":"","plain_text":"et quand il est déconnecté du serveur, il peut retourner:","html":"<p>et quand il est déconnecté du serveur, il peut retourner:</p>"},{"id":"text-118","type":"text","heading":"","plain_text":"        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;imprimante&quot;: \n                &quot;supported_content_type&quot;: [\n                        \n                                \"content_type\": \"application/pdf\",\n                                \"min_version\": \"1.4\"\n                        ,\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" \n                ]","html":"<p>        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;imprimante&quot;: \n                &quot;supported_content_type&quot;: [\n                        \n                                &quot;content_type&quot;: &quot;application/pdf&quot;,\n                                &quot;min_version&quot;: &quot;1.4&quot;\n                        ,\n                         &quot;content_type&quot;: &quot;image/pwg-raster&quot; ,\n                         &quot;content_type&quot;: &quot;image/jpeg&quot; \n                ]</p>"},{"id":"text-119","type":"text","heading":"","plain_text":"Remarque: Les imprimantes expriment la priorité du type de contenu pris en charge en utilisant la commande. Pour\n  Par exemple, dans les exemples ci-dessus, l’imprimante indique qu’elle préfère les données &quot;application / pdf&quot; à\n  &quot;image / pwg-raster&quot; et &quot;image / jpeg&quot;. Les clients doivent respecter les priorités des imprimantes si possible\n  (voir le document CDD pour plus de détails).\n4.5.3. les erreurs\nL&#39;API / privet / features peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):","html":"<p>Remarque: Les imprimantes expriment la priorité du type de contenu pris en charge en utilisant la commande. Pour\n  Par exemple, dans les exemples ci-dessus, l’imprimante indique qu’elle préfère les données &quot;application / pdf&quot; à\n  &quot;image / pwg-raster&quot; et &quot;image / jpeg&quot;. Les clients doivent respecter les priorités des imprimantes si possible\n  (voir le document CDD pour plus de détails).\n4.5.3. les erreurs\nL&#039;API / privet / features peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):</p>"},{"id":"text-120","type":"text","heading":"","plain_text":"Erreur\nLa description","html":"<p>Erreur\nLa description</p>"},{"id":"text-121","type":"text","heading":"","plain_text":"invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la requête.","html":"<p>invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la requête.</p>"},{"id":"text-122","type":"text","heading":"","plain_text":"Si le périphérique n&#39;expose pas l&#39;API / privet / features, il DOIT renvoyer HTTP 404.\n  Erreur. Si l&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer une erreur HTTP 400.\n4.6. les erreurs\nLes erreurs sont renvoyées par les API ci-dessus au format suivant:","html":"<p>Si le périphérique n&#039;expose pas l&#039;API / privet / features, il DOIT renvoyer HTTP 404.\n  Erreur. Si l&#039;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer une erreur HTTP 400.\n4.6. les erreurs\nLes erreurs sont renvoyées par les API ci-dessus au format suivant:</p>"},{"id":"text-123","type":"text","heading":"","plain_text":"Nom de la valeur\nType de valeur\nLa description","html":"<p>Nom de la valeur\nType de valeur\nLa description</p>"},{"id":"text-124","type":"text","heading":"","plain_text":"Erreur\nchaîne\nType d&#39;erreur (défini par API)","html":"<p>Erreur\nchaîne\nType d&#039;erreur (défini par API)</p>"},{"id":"text-125","type":"text","heading":"","plain_text":"la description\nchaîne (optionnel)\nDescription lisible par l&#39;homme de l&#39;erreur.","html":"<p>la description\nchaîne (optionnel)\nDescription lisible par l&#039;homme de l&#039;erreur.</p>"},{"id":"text-126","type":"text","heading":"","plain_text":"server_api\nchaîne (optionnel)\nEn cas d&#39;erreur de serveur, ce champ contient\n    l&#39;API du serveur qui a échoué.","html":"<p>server_api\nchaîne (optionnel)\nEn cas d&#039;erreur de serveur, ce champ contient\n    l&#039;API du serveur qui a échoué.</p>"},{"id":"text-127","type":"text","heading":"","plain_text":"code_serveur\nint (facultatif)\nEn cas d&#39;erreur de serveur, ce champ contient\n    ce code d&#39;erreur que le serveur a renvoyé.","html":"<p>code_serveur\nint (facultatif)\nEn cas d&#039;erreur de serveur, ce champ contient\n    ce code d&#039;erreur que le serveur a renvoyé.</p>"},{"id":"text-128","type":"text","heading":"","plain_text":"code_http_serveur\nint (facultatif)\nEn cas d&#39;erreur HTTP du serveur, ce champ\n    contient le code d&#39;erreur HTTP serveur renvoyé.","html":"<p>code_http_serveur\nint (facultatif)\nEn cas d&#039;erreur HTTP du serveur, ce champ\n    contient le code d&#039;erreur HTTP serveur renvoyé.</p>"},{"id":"text-129","type":"text","heading":"","plain_text":"temps libre\nint (facultatif)\nNombre de secondes que le client attend avant\n    nouvelle tentative (pour les erreurs récupérables uniquement). Le client DOIT randomiser le délai d’expiration réel de cette valeur sur\n    une valeur de + 20%.","html":"<p>temps libre\nint (facultatif)\nNombre de secondes que le client attend avant\n    nouvelle tentative (pour les erreurs récupérables uniquement). Le client DOIT randomiser le délai d’expiration réel de cette valeur sur\n    une valeur de + 20%.</p>"},{"id":"text-130","type":"text","heading":"","plain_text":"Toutes les API DOIVENT renvoyer une erreur HTTP 400 si l&#39;en-tête X-Privet-Token est manquant.\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\nExemple 1:","html":"<p>Toutes les API DOIVENT renvoyer une erreur HTTP 400 si l&#039;en-tête X-Privet-Token est manquant.\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\nExemple 1:</p>"},{"id":"text-131","type":"text","heading":"","plain_text":"        &quot;erreur&quot;: &quot;erreur_serveur&quot;,\n        &quot;description&quot;: &quot;Service indisponible&quot;,\n        &quot;server_api&quot;: &quot;/ submit&quot;,\n        &quot;code_http_serveur&quot;: 503","html":"<p>        &quot;erreur&quot;: &quot;erreur_serveur&quot;,\n        &quot;description&quot;: &quot;Service indisponible&quot;,\n        &quot;server_api&quot;: &quot;/ submit&quot;,\n        &quot;code_http_serveur&quot;: 503</p>"},{"id":"text-132","type":"text","heading":"","plain_text":"Exemple 2:","html":"<p>Exemple 2:</p>"},{"id":"text-133","type":"text","heading":"","plain_text":"        &quot;error&quot;: &quot;printer_busy&quot;,\n        &quot;description&quot;: &quot;L&#39;imprimante est en train d&#39;imprimer un autre travail&quot;,\n        &quot;timeout&quot;: 15","html":"<p>        &quot;error&quot;: &quot;printer_busy&quot;,\n        &quot;description&quot;: &quot;L&#039;imprimante est en train d&#039;imprimer un autre travail&quot;,\n        &quot;timeout&quot;: 15</p>"},{"id":"text-134","type":"text","heading":"","plain_text":"5. API d&#39;imprimante\nL&#39;un des types de périphérique pris en charge par ce protocole est le type imprimante. Les appareils supportant ce type PEUVENT\n  implémenter certaines fonctionnalités spécifiques aux imprimantes. Idéalement, l’impression sur des imprimantes prêtes au cloud\n  passer par un serveur Cloud Print:","html":"<p>5. API d&#039;imprimante\nL&#039;un des types de périphérique pris en charge par ce protocole est le type imprimante. Les appareils supportant ce type PEUVENT\n  implémenter certaines fonctionnalités spécifiques aux imprimantes. Idéalement, l’impression sur des imprimantes prêtes au cloud\n  passer par un serveur Cloud Print:</p>"},{"id":"text-135","type":"text","heading":"","plain_text":"Dans certains cas, un client peut avoir besoin d’envoyer un document localement. Cela peut être nécessaire lorsque le client ne le fait pas\n  avoir un identifiant Google ou est incapable de parler au serveur Cloud Print. Dans ce cas, le travail d&#39;impression sera\n  être soumis localement à l&#39;imprimante. L’imprimante utilisera à son tour le service Cloud Print pour\n  mise en file d&#39;attente et conversion. L’imprimante republiera le travail soumis localement sur le Cloud. Print\n  service, puis demandez-le, car il a été envoyé via le cloud. Ce processus fournira une\n  expérience utilisateur flexible en termes de service (conversion) et de gestion / suivi des travaux d&#39;impression.","html":"<p>Dans certains cas, un client peut avoir besoin d’envoyer un document localement. Cela peut être nécessaire lorsque le client ne le fait pas\n  avoir un identifiant Google ou est incapable de parler au serveur Cloud Print. Dans ce cas, le travail d&#039;impression sera\n  être soumis localement à l&#039;imprimante. L’imprimante utilisera à son tour le service Cloud Print pour\n  mise en file d&#039;attente et conversion. L’imprimante republiera le travail soumis localement sur le Cloud. Print\n  service, puis demandez-le, car il a été envoyé via le cloud. Ce processus fournira une\n  expérience utilisateur flexible en termes de service (conversion) et de gestion / suivi des travaux d&#039;impression.</p>"},{"id":"text-136","type":"text","heading":"","plain_text":"Since the Cloud Print service implements conversion, the printer SHOULD advertise supporting all\n  input formats (&quot;*/*&quot;) among the list of the supported content types:","html":"<p>Since the Cloud Print service implements conversion, the printer SHOULD advertise supporting all\n  input formats (&quot;*/*&quot;) among the list of the supported content types:</p>"},{"id":"text-137","type":"text","heading":"","plain_text":"        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;printer&quot;: \n                &quot;supported_content_type&quot;: [\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"*/*\" \n                ]","html":"<p>        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;printer&quot;: \n                &quot;supported_content_type&quot;: [\n                         &quot;content_type&quot;: &quot;image/pwg-raster&quot; ,\n                         &quot;content_type&quot;: &quot;*/*&quot; \n                ]</p>"},{"id":"text-138","type":"text","heading":"","plain_text":"In some cases a completely offline solution is desired. Since printers support a limited number\n  of input formats, a client will need to convert documents to a few natively supported printer\n  formats.","html":"<p>In some cases a completely offline solution is desired. Since printers support a limited number\n  of input formats, a client will need to convert documents to a few natively supported printer\n  formats.</p>"},{"id":"text-139","type":"text","heading":"","plain_text":"This spec REQUIRES all printers to support at least the PWG Raster (&quot;image/pwg-raster&quot;) format\n  for the offline printing case. A printer may support other formats (for example JPEG) and if a\n  client supports it, it may send documents in that format. The printer MUST expose supported types\n  through the /capabilities API, for example:","html":"<p>This spec REQUIRES all printers to support at least the PWG Raster (&quot;image/pwg-raster&quot;) format\n  for the offline printing case. A printer may support other formats (for example JPEG) and if a\n  client supports it, it may send documents in that format. The printer MUST expose supported types\n  through the /capabilities API, for example:</p>"},{"id":"text-140","type":"text","heading":"","plain_text":"        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;printer&quot;: \n                &quot;supported_content_type&quot;: [\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" \n                ]","html":"<p>        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;printer&quot;: \n                &quot;supported_content_type&quot;: [\n                         &quot;content_type&quot;: &quot;image/pwg-raster&quot; ,\n                         &quot;content_type&quot;: &quot;image/jpeg&quot; \n                ]</p>"},{"id":"text-141","type":"text","heading":"","plain_text":"There are two ways a client may initiate printing over the local network.\nSimple printing &#8211; client sends the document over the local network to /submitdoc API\n  (without specifying the job_id parameter). The submitted document will be printed using default\n  print ticket settings and no print job statuses are needed. If the printer ONLY supports this type\n  of printing, it MUST advertise ONLY /submitdoc API in the /privet/info API response.","html":"<p>There are two ways a client may initiate printing over the local network.\nSimple printing &#8211; client sends the document over the local network to /submitdoc API\n  (without specifying the job_id parameter). The submitted document will be printed using default\n  print ticket settings and no print job statuses are needed. If the printer ONLY supports this type\n  of printing, it MUST advertise ONLY /submitdoc API in the /privet/info API response.</p>"},{"id":"text-142","type":"text","heading":"","plain_text":"&quot;api&quot;: [\n        \"/privet/accesstoken\",\n        \"/privet/capabilities\",\n        \"/privet/printer/submitdoc\",\n]","html":"<p>&quot;api&quot;: [\n        &quot;/privet/accesstoken&quot;,\n        &quot;/privet/capabilities&quot;,\n        &quot;/privet/printer/submitdoc&quot;,\n]</p>"},{"id":"text-143","type":"text","heading":"","plain_text":"Advanced printing &#8211; client should first create a print job on the printer by calling the\n  /privet/printer/createjob API with a valid CJT job ticket in the request. The printer\n  MUST store the print ticket in memory and return a job_id back to the client. Then the client will\n  call the /printer/submitdoc API and specify the previously received job_id. At that time\n  the printer will start printing. The client will poll the printer for print job status by calling\n  le /privet/printer/jobstate API.\nIn a multi-client environment, there is no guarantee how this API is called. It is possible for\n  one client to call /createjob between another client’s /createjob-&gt;/submitdoc\n  calls. To eliminate possible deadlocks and improve usability, we recommended having a small queue\n  of pending print jobs on the printer (at least 3-5):","html":"<p>Advanced printing &#8211; client should first create a print job on the printer by calling the\n  /privet/printer/createjob API with a valid CJT job ticket in the request. The printer\n  MUST store the print ticket in memory and return a job_id back to the client. Then the client will\n  call the /printer/submitdoc API and specify the previously received job_id. At that time\n  the printer will start printing. The client will poll the printer for print job status by calling\n  le /privet/printer/jobstate API.\nIn a multi-client environment, there is no guarantee how this API is called. It is possible for\n  one client to call /createjob between another client’s /createjob-&gt;/submitdoc\n  calls. To eliminate possible deadlocks and improve usability, we recommended having a small queue\n  of pending print jobs on the printer (at least 3-5):</p>"},{"id":"text-144","type":"text","heading":"","plain_text":"/createjob takes the first available spot in the queue.\nJob lifetime (in the queue) is at least 5 minutes.\nIf all spots in the queue are taken, then the oldest, non-printing job shall be removed and a\n    new one will be placed there.\nIf there is a print job currently printing on the device (simple or advanced printing),\n    /submitdoc should return status busy and propose a timeout to retry this print job.\nSi /submitdoc refers to a job that has been removed from the queue (due to\n    replacement or timeout), the printer should return an error invalid_print_job et le\n    client will retry the process from the /createjob step. The client MUST wait for a\n    random timeout period of up to 5 seconds before retrying.","html":"<p>/createjob takes the first available spot in the queue.\nJob lifetime (in the queue) is at least 5 minutes.\nIf all spots in the queue are taken, then the oldest, non-printing job shall be removed and a\n    new one will be placed there.\nIf there is a print job currently printing on the device (simple or advanced printing),\n    /submitdoc should return status busy and propose a timeout to retry this print job.\nSi /submitdoc refers to a job that has been removed from the queue (due to\n    replacement or timeout), the printer should return an error invalid_print_job et le\n    client will retry the process from the /createjob step. The client MUST wait for a\n    random timeout period of up to 5 seconds before retrying.</p>"},{"id":"text-145","type":"text","heading":"","plain_text":"If memory constraints prevent storing multiple pending jobs on the device, it is possible to have\n  a queue of 1 print job long. It should still follow the same protocol as above. After a job has\n  completed or failed with an error, the printer should store information about the job’s\n  status for at least 5 minutes. The queue size for storing completed job statuses should be at\n  least 10. If there are more job statuses that need to be stored, the oldest one may be removed\n  from the queue before the 5 minute timeout.\nRemarque: For now clients will poll for job status. In the future, we may require\n  the printer to send TXT DNS notification when ANY print job status has changed.\n5.1. /privet/printer/createjob API\n/privet/printer/createjob API is OPTIONAL (see Simple Printing above). It is an HTTP POST\n  request. /privet/printer/createjob API MUST check for a valid &quot;X-Privet-Token&quot; header.\n  The device MUST implement this API on &quot;/privet/printer/createjob&quot; url:\nPOST /privet/printer/createjob HTTP/1.1\nWhen receiving /privet/printer/createjob API call, the printer MUST create a new print job ID, store\nthe received print ticket in the CJT format, and return print job id back to the client.\n5.1.1. Input\n/privet/printer/createjob API has no input parameters in URL. The request body should contain the\nprint job ticket data in CJT format.\n5.1.2. Return\n/privet/printer/createjob API returns the following data:","html":"<p>If memory constraints prevent storing multiple pending jobs on the device, it is possible to have\n  a queue of 1 print job long. It should still follow the same protocol as above. After a job has\n  completed or failed with an error, the printer should store information about the job’s\n  status for at least 5 minutes. The queue size for storing completed job statuses should be at\n  least 10. If there are more job statuses that need to be stored, the oldest one may be removed\n  from the queue before the 5 minute timeout.\nRemarque: For now clients will poll for job status. In the future, we may require\n  the printer to send TXT DNS notification when ANY print job status has changed.\n5.1. /privet/printer/createjob API\n/privet/printer/createjob API is OPTIONAL (see Simple Printing above). It is an HTTP POST\n  request. /privet/printer/createjob API MUST check for a valid &quot;X-Privet-Token&quot; header.\n  The device MUST implement this API on &quot;/privet/printer/createjob&quot; url:\nPOST /privet/printer/createjob HTTP/1.1\nWhen receiving /privet/printer/createjob API call, the printer MUST create a new print job ID, store\nthe received print ticket in the CJT format, and return print job id back to the client.\n5.1.1. Input\n/privet/printer/createjob API has no input parameters in URL. The request body should contain the\nprint job ticket data in CJT format.\n5.1.2. Return\n/privet/printer/createjob API returns the following data:</p>"},{"id":"text-146","type":"text","heading":"","plain_text":"Value name\nValue type\nLa description","html":"<p>Value name\nValue type\nLa description</p>"},{"id":"text-147","type":"text","heading":"","plain_text":"job_id\nchaîne\nID of the newly created print job.","html":"<p>job_id\nchaîne\nID of the newly created print job.</p>"},{"id":"text-148","type":"text","heading":"","plain_text":"expires_in\nint\nNumber of seconds this print job is valid.","html":"<p>expires_in\nint\nNumber of seconds this print job is valid.</p>"},{"id":"text-149","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-150","type":"text","heading":"","plain_text":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;expires_in&quot;: 600","html":"<p>        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;expires_in&quot;: 600</p>"},{"id":"text-151","type":"text","heading":"","plain_text":"5.1.3. les erreurs\n/privet/printer/createjob API may return the following errors (see Errors section for details):","html":"<p>5.1.3. les erreurs\n/privet/printer/createjob API may return the following errors (see Errors section for details):</p>"},{"id":"text-152","type":"text","heading":"","plain_text":"Erreur\nLa description","html":"<p>Erreur\nLa description</p>"},{"id":"text-153","type":"text","heading":"","plain_text":"invalid_ticket\nSubmitted print ticket is invalid.","html":"<p>invalid_ticket\nSubmitted print ticket is invalid.</p>"},{"id":"text-154","type":"text","heading":"","plain_text":"printer_busy\nPrinter is busy and can’t currently process /createjob. Recommencez\n    after timeout.","html":"<p>printer_busy\nPrinter is busy and can’t currently process /createjob. Recommencez\n    after timeout.</p>"},{"id":"text-155","type":"text","heading":"","plain_text":"printer_error\nPrinter is in error state and requires user interaction to fix it.\n    Description should contain more detailed explanation (e.g. &quot;Paper jam in Tray 1&quot;).","html":"<p>printer_error\nPrinter is in error state and requires user interaction to fix it.\n    Description should contain more detailed explanation (e.g. &quot;Paper jam in Tray 1&quot;).</p>"},{"id":"text-156","type":"text","heading":"","plain_text":"invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.","html":"<p>invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.</p>"},{"id":"text-157","type":"text","heading":"","plain_text":"If device is not exposing /privet/printer/createjob it MUST return HTTP 404 error. Si\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\n5.2. /privet/printer/submitdoc API\n/privet/printer/submitdoc API is REQUIRED to implement printing over a local network (offline or\nrepost to Cloud Print). It is an HTTP  POST request. /privet/printer/submitdoc API MUST check for a\nvalid &quot;X-Privet-Token&quot; header. The device MUST implement this API on\n&quot;/privet/printer/submitdoc&quot; url:\nPOST /privet/printer/submitdoc HTTP/1.1\nWhen receiving the /privet/printer/submitdoc API call, the printer should start printing. If it is\nunable to begin printing, it MUST return the error printer_busy and a recommended timeout period for\nthe client to wait before trying again.\nIf the printer is not able to hold all of the data in its internal buffer, it SHOULD use TCP\n  mechanisms to slow down data transfer until it prints a portion of the document, making part of\n  the buffer available again. (For example, the printer may set windowsize=0 on TCP layers, which\n  will make the client wait.)\nSubmitting a document to the printer may take a significant amount of time. The client should be\n  able to check the state of the printer and job (advanced printing) while printing is in progress.\n  In order to do that, the printer MUST allow the client to call the /privet/info and\n  /privet/printer/jobstate APIs while processing /privet/printer/submitdoc API calls. Il est\n  recommended for all clients to start a new thread to execute the /privet/printer/submitdoc API\n  call, so that the main thread can use the /privet/info and /privet/printer/jobstate APIs to check\n  printer and job states.\nRemarque: Upon completion or abortion of the local print job, it is strongly\n  recommended (and will be required in a future version of this spec) to report the final state of\n  the job to the /cloudprint/submit interface for accounting and user experience purposes. le\n  parameters &quot;printerid&quot;, &quot;title&quot;, &quot;contentType&quot; and &quot;final_semantic_state&quot; (in\n  PrintJobState format) are required, and the parameters &quot;tag&quot; (repeated\n  parameter) and &quot;ticket&quot; (the ticket of the job in CloudJobTicket format).\n  Note that the provided PrintJobState must actually be final, i.e. its type must be DONE or\n  ABORTED, and a cause must be provided in the case that it is ABORTED (see\n  JobState for details). Also note that this use of the\n  /cloudprint/submit interface to report local print jobs is not mentioned in\n  its specification because that section is intended to describe\n  the interface&#39;s primary use: submitting a print job with the document to print provided in the\n  &quot;content&quot; parameter.\n5.2.1. Input\n/privet/printer/submitdoc API has the following input parameters:","html":"<p>If device is not exposing /privet/printer/createjob it MUST return HTTP 404 error. Si\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\n5.2. /privet/printer/submitdoc API\n/privet/printer/submitdoc API is REQUIRED to implement printing over a local network (offline or\nrepost to Cloud Print). It is an HTTP  POST request. /privet/printer/submitdoc API MUST check for a\nvalid &quot;X-Privet-Token&quot; header. The device MUST implement this API on\n&quot;/privet/printer/submitdoc&quot; url:\nPOST /privet/printer/submitdoc HTTP/1.1\nWhen receiving the /privet/printer/submitdoc API call, the printer should start printing. If it is\nunable to begin printing, it MUST return the error printer_busy and a recommended timeout period for\nthe client to wait before trying again.\nIf the printer is not able to hold all of the data in its internal buffer, it SHOULD use TCP\n  mechanisms to slow down data transfer until it prints a portion of the document, making part of\n  the buffer available again. (For example, the printer may set windowsize=0 on TCP layers, which\n  will make the client wait.)\nSubmitting a document to the printer may take a significant amount of time. The client should be\n  able to check the state of the printer and job (advanced printing) while printing is in progress.\n  In order to do that, the printer MUST allow the client to call the /privet/info and\n  /privet/printer/jobstate APIs while processing /privet/printer/submitdoc API calls. Il est\n  recommended for all clients to start a new thread to execute the /privet/printer/submitdoc API\n  call, so that the main thread can use the /privet/info and /privet/printer/jobstate APIs to check\n  printer and job states.\nRemarque: Upon completion or abortion of the local print job, it is strongly\n  recommended (and will be required in a future version of this spec) to report the final state of\n  the job to the /cloudprint/submit interface for accounting and user experience purposes. le\n  parameters &quot;printerid&quot;, &quot;title&quot;, &quot;contentType&quot; and &quot;final_semantic_state&quot; (in\n  PrintJobState format) are required, and the parameters &quot;tag&quot; (repeated\n  parameter) and &quot;ticket&quot; (the ticket of the job in CloudJobTicket format).\n  Note that the provided PrintJobState must actually be final, i.e. its type must be DONE or\n  ABORTED, and a cause must be provided in the case that it is ABORTED (see\n  JobState for details). Also note that this use of the\n  /cloudprint/submit interface to report local print jobs is not mentioned in\n  its specification because that section is intended to describe\n  the interface&#039;s primary use: submitting a print job with the document to print provided in the\n  &quot;content&quot; parameter.\n5.2.1. Input\n/privet/printer/submitdoc API has the following input parameters:</p>"},{"id":"text-158","type":"text","heading":"","plain_text":"Name\nValeur","html":"<p>Name\nValeur</p>"},{"id":"text-159","type":"text","heading":"","plain_text":"job_id\n(optional) Print job id. May be omitted for simple printing case\n    (voir au dessus). Must match the one returned by the printer.","html":"<p>job_id\n(optional) Print job id. May be omitted for simple printing case\n    (voir au dessus). Must match the one returned by the printer.</p>"},{"id":"text-160","type":"text","heading":"","plain_text":"user_name\n(optional) Human readable user name. This is not definitive, and should\n    only be used for print job annotations. If job is re-posted to the Cloud Print service this\n    string should be attached to the Cloud Print job.","html":"<p>user_name\n(optional) Human readable user name. This is not definitive, and should\n    only be used for print job annotations. If job is re-posted to the Cloud Print service this\n    string should be attached to the Cloud Print job.</p>"},{"id":"text-161","type":"text","heading":"","plain_text":"client_name\n(optional) Name of the client application making this request. Pour\n    display purposes only. If job is re-posted to the Cloud Print service this string should be\n    attached to the Cloud Print job.","html":"<p>client_name\n(optional) Name of the client application making this request. Pour\n    display purposes only. If job is re-posted to the Cloud Print service this string should be\n    attached to the Cloud Print job.</p>"},{"id":"text-162","type":"text","heading":"","plain_text":"job_name\n(optional) Name of the print job to be recorded. If job is re-posted to\n    the Cloud Print service this string should be attached to the Cloud Print job.","html":"<p>job_name\n(optional) Name of the print job to be recorded. If job is re-posted to\n    the Cloud Print service this string should be attached to the Cloud Print job.</p>"},{"id":"text-163","type":"text","heading":"","plain_text":"offline\n(optional) Could only be &quot;offline=1&quot;. In this case printer should\n    only try printing offline (no re-post to Cloud Print server).","html":"<p>offline\n(optional) Could only be &quot;offline=1&quot;. In this case printer should\n    only try printing offline (no re-post to Cloud Print server).</p>"},{"id":"text-164","type":"text","heading":"","plain_text":"Request body should contain a valid document for printing. &quot;Content-Length&quot; should\n  include the correct length of the request. &quot;Content-Type&quot; header should be set to\n  document MIME type and match one of the types in the CDD (unless CDD specifies &quot;*/*&quot;). \nClients are HIGHLY recommended to provide a valid user name (or email), a client name and a job\n  name with this request. Those fields are only used in UIs to improve user experience.\n5.2.2. Return\n/privet/printer/submitdoc API returns following data:","html":"<p>Request body should contain a valid document for printing. &quot;Content-Length&quot; should\n  include the correct length of the request. &quot;Content-Type&quot; header should be set to\n  document MIME type and match one of the types in the CDD (unless CDD specifies &quot;*/*&quot;). \nClients are HIGHLY recommended to provide a valid user name (or email), a client name and a job\n  name with this request. Those fields are only used in UIs to improve user experience.\n5.2.2. Return\n/privet/printer/submitdoc API returns following data:</p>"},{"id":"text-165","type":"text","heading":"","plain_text":"Value name\nValue type\nLa description","html":"<p>Value name\nValue type\nLa description</p>"},{"id":"text-166","type":"text","heading":"","plain_text":"job_id\nchaîne\nID of the newly created print job (simple printing) or\n    job_id specified in the request (advanced printing).","html":"<p>job_id\nchaîne\nID of the newly created print job (simple printing) or\n    job_id specified in the request (advanced printing).</p>"},{"id":"text-167","type":"text","heading":"","plain_text":"expires_in\nint\nNumber of seconds this print job is valid.","html":"<p>expires_in\nint\nNumber of seconds this print job is valid.</p>"},{"id":"text-168","type":"text","heading":"","plain_text":"job_type\nchaîne\nContent-type of the submitted document.","html":"<p>job_type\nchaîne\nContent-type of the submitted document.</p>"},{"id":"text-169","type":"text","heading":"","plain_text":"job_size\nint 64 bit\nSize of the print data in bytes.","html":"<p>job_size\nint 64 bit\nSize of the print data in bytes.</p>"},{"id":"text-170","type":"text","heading":"","plain_text":"job_name\nchaîne\n(optional) Same job name as in input (if any).","html":"<p>job_name\nchaîne\n(optional) Same job name as in input (if any).</p>"},{"id":"text-171","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-172","type":"text","heading":"","plain_text":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;expires_in&quot;: 500,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;","html":"<p>        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;expires_in&quot;: 500,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;</p>"},{"id":"text-173","type":"text","heading":"","plain_text":"5.2.3. les erreurs\n/privet/printer/submitdoc API may return the following errors (see Errors section for details):","html":"<p>5.2.3. les erreurs\n/privet/printer/submitdoc API may return the following errors (see Errors section for details):</p>"},{"id":"text-174","type":"text","heading":"","plain_text":"Erreur\nLa description","html":"<p>Erreur\nLa description</p>"},{"id":"text-175","type":"text","heading":"","plain_text":"invalid_print_job\nInvalid/expired job id is specified in the request. Retry after\n    timeout.","html":"<p>invalid_print_job\nInvalid/expired job id is specified in the request. Retry after\n    timeout.</p>"},{"id":"text-176","type":"text","heading":"","plain_text":"invalid_document_type\nDocument MIME-type is not supported by the printer.","html":"<p>invalid_document_type\nDocument MIME-type is not supported by the printer.</p>"},{"id":"text-177","type":"text","heading":"","plain_text":"invalid_document\nSubmitted document is invalid.","html":"<p>invalid_document\nSubmitted document is invalid.</p>"},{"id":"text-178","type":"text","heading":"","plain_text":"document_too_large\nDocument exceeds maximum size allowed.","html":"<p>document_too_large\nDocument exceeds maximum size allowed.</p>"},{"id":"text-179","type":"text","heading":"","plain_text":"printer_busy\nPrinter is busy and can’t currently process document. Recommencez\n    after timeout.","html":"<p>printer_busy\nPrinter is busy and can’t currently process document. Recommencez\n    after timeout.</p>"},{"id":"text-180","type":"text","heading":"","plain_text":"printer_error\nPrinter is in error state and requires user interaction to fix it.\n    Description should contain more detailed explanation (e.g. &quot;Paper jam in Tray 1&quot;).","html":"<p>printer_error\nPrinter is in error state and requires user interaction to fix it.\n    Description should contain more detailed explanation (e.g. &quot;Paper jam in Tray 1&quot;).</p>"},{"id":"text-181","type":"text","heading":"","plain_text":"invalid_params\nInvalid parameters specified in the request. (Unknown parameters\n    should be safely ignored for future compatibility)","html":"<p>invalid_params\nInvalid parameters specified in the request. (Unknown parameters\n    should be safely ignored for future compatibility)</p>"},{"id":"text-182","type":"text","heading":"","plain_text":"user_cancel\nUser explicitly cancelled printing process from the device.","html":"<p>user_cancel\nUser explicitly cancelled printing process from the device.</p>"},{"id":"text-183","type":"text","heading":"","plain_text":"server_error\nPosting document to Cloud Print has failed.","html":"<p>server_error\nPosting document to Cloud Print has failed.</p>"},{"id":"text-184","type":"text","heading":"","plain_text":"invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.","html":"<p>invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.</p>"},{"id":"text-185","type":"text","heading":"","plain_text":"If the device is not exposing /privet/printer/submitdoc, it MUST return HTTP 404 error. Si la\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\nRemarque: /privet/printer/submitdoc API may require special handling on printer\n  side (because of the large payload attached). In some cases (depends on the printer HTTP server\n  implementation and platform), printer may close socket BEFORE returning HTTP error. In other,\n  printer may return 503 error (instead of Privet error). Printers SHOULD try as much as possible to\n  return Privet. However, every client implementing Privet specification SHOULD be able to handle\n  socket close (no HTTP error) and 503 HTTP error cases for /privet/printer/submitdoc API. Dans ce\n  case, client SHOULD handle it as a Privet &quot;printer_busy&quot; error with\n  &quot;timeout&quot; set to 15 seconds. To avoid infinite retries, client may stop retrying after\n  a reasonable number of attempts (for example, 3).\n5.3. /privet/printer/jobstate API\n/privet/printer/jobstate API is OPTIONAL (see Simple Printing above). It is an HTTP GET request.\n/privet/printer/jobstate API MUST check for a valid &quot;X-Privet-Token&quot; header. The device\nMUST implement this API on &quot;/privet/printer/jobstate&quot; url:\nGET /privet/printer/jobstate HTTP/1.1\nWhen receiving a /privet/printer/jobstate API call, a printer should return the status of the\nrequested print job or invalid_print_job error.\n5.3.1. Input\n/privet/printer/jobstate API has following input parameters:","html":"<p>If the device is not exposing /privet/printer/submitdoc, it MUST return HTTP 404 error. Si la\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\nRemarque: /privet/printer/submitdoc API may require special handling on printer\n  side (because of the large payload attached). In some cases (depends on the printer HTTP server\n  implementation and platform), printer may close socket BEFORE returning HTTP error. In other,\n  printer may return 503 error (instead of Privet error). Printers SHOULD try as much as possible to\n  return Privet. However, every client implementing Privet specification SHOULD be able to handle\n  socket close (no HTTP error) and 503 HTTP error cases for /privet/printer/submitdoc API. Dans ce\n  case, client SHOULD handle it as a Privet &quot;printer_busy&quot; error with\n  &quot;timeout&quot; set to 15 seconds. To avoid infinite retries, client may stop retrying after\n  a reasonable number of attempts (for example, 3).\n5.3. /privet/printer/jobstate API\n/privet/printer/jobstate API is OPTIONAL (see Simple Printing above). It is an HTTP GET request.\n/privet/printer/jobstate API MUST check for a valid &quot;X-Privet-Token&quot; header. The device\nMUST implement this API on &quot;/privet/printer/jobstate&quot; url:\nGET /privet/printer/jobstate HTTP/1.1\nWhen receiving a /privet/printer/jobstate API call, a printer should return the status of the\nrequested print job or invalid_print_job error.\n5.3.1. Input\n/privet/printer/jobstate API has following input parameters:</p>"},{"id":"text-186","type":"text","heading":"","plain_text":"Name\nValeur","html":"<p>Name\nValeur</p>"},{"id":"text-187","type":"text","heading":"","plain_text":"job_id\nPrint job ID to return status for.","html":"<p>job_id\nPrint job ID to return status for.</p>"},{"id":"text-188","type":"text","heading":"","plain_text":"5.3.2. Return\n/privet/printer/jobstate API returns the following data:","html":"<p>5.3.2. Return\n/privet/printer/jobstate API returns the following data:</p>"},{"id":"text-189","type":"text","heading":"","plain_text":"Value name\nValue type\nLa description","html":"<p>Value name\nValue type\nLa description</p>"},{"id":"text-190","type":"text","heading":"","plain_text":"job_id\nchaîne\nPrint job id there status information is for.","html":"<p>job_id\nchaîne\nPrint job id there status information is for.</p>"},{"id":"text-191","type":"text","heading":"","plain_text":"state\nchaîne\ndraft &#8211; print job has been created on the device (no\n    /privet/printer/submitdoc calls have been received yet).\n    queued &#8211; print job has been received and queued, but printing has not started yet.\n    in_progress &#8211; print job is in the progress of printing.\n    stopped &#8211; print job has been paused, but can be restarted manually or automatically.\n    terminé &#8211; print job is done.\n    aborted &#8211; print job failed.","html":"<p>state\nchaîne\ndraft &#8211; print job has been created on the device (no\n    /privet/printer/submitdoc calls have been received yet).\n    queued &#8211; print job has been received and queued, but printing has not started yet.\n    in_progress &#8211; print job is in the progress of printing.\n    stopped &#8211; print job has been paused, but can be restarted manually or automatically.\n    terminé &#8211; print job is done.\n    aborted &#8211; print job failed.</p>"},{"id":"text-192","type":"text","heading":"","plain_text":"la description\nchaîne\n(optional) Human readable description of the print job\n    status. Should include additional information if statestopped or\n    aborted. le semantic_state field usually provides better and more meaningful\n    description to the client.","html":"<p>la description\nchaîne\n(optional) Human readable description of the print job\n    status. Should include additional information if statestopped or\n    aborted. le semantic_state field usually provides better and more meaningful\n    description to the client.</p>"},{"id":"text-193","type":"text","heading":"","plain_text":"expires_in\nint\nNumber of seconds this print job is valid.","html":"<p>expires_in\nint\nNumber of seconds this print job is valid.</p>"},{"id":"text-194","type":"text","heading":"","plain_text":"job_type\nchaîne\n(optional) Content-type of the submitted document.","html":"<p>job_type\nchaîne\n(optional) Content-type of the submitted document.</p>"},{"id":"text-195","type":"text","heading":"","plain_text":"job_size\nint 64 bit\n(optional) Size of the print data in bytes.","html":"<p>job_size\nint 64 bit\n(optional) Size of the print data in bytes.</p>"},{"id":"text-196","type":"text","heading":"","plain_text":"job_name\nchaîne\n(optional) Same job name as in input (if any).","html":"<p>job_name\nchaîne\n(optional) Same job name as in input (if any).</p>"},{"id":"text-197","type":"text","heading":"","plain_text":"server_job_id\nchaîne\n(optional) ID of the job returned from the server (if\n    job has been posted to Cloud Print service). Omitted for offline printing.","html":"<p>server_job_id\nchaîne\n(optional) ID of the job returned from the server (if\n    job has been posted to Cloud Print service). Omitted for offline printing.</p>"},{"id":"text-198","type":"text","heading":"","plain_text":"semantic_state\nJSON\n(optional) Semantic state of the job in\n    PrintJobState format.","html":"<p>semantic_state\nJSON\n(optional) Semantic state of the job in\n    PrintJobState format.</p>"},{"id":"text-199","type":"text","heading":"","plain_text":"Example (printing by reporting through Cloud Print):","html":"<p>Example (printing by reporting through Cloud Print):</p>"},{"id":"text-200","type":"text","heading":"","plain_text":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;in_progress&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;server_job_id&quot;: &quot;1111-2222-3333-4444&quot;","html":"<p>        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;in_progress&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;server_job_id&quot;: &quot;1111-2222-3333-4444&quot;</p>"},{"id":"text-201","type":"text","heading":"","plain_text":"Example (offline printing error):","html":"<p>Example (offline printing error):</p>"},{"id":"text-202","type":"text","heading":"","plain_text":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;stopped&quot;,\n        &quot;description&quot;: &quot;Out of paper&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;","html":"<p>        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;stopped&quot;,\n        &quot;description&quot;: &quot;Out of paper&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;</p>"},{"id":"text-203","type":"text","heading":"","plain_text":"Example (print job aborted by the user):","html":"<p>Example (print job aborted by the user):</p>"},{"id":"text-204","type":"text","heading":"","plain_text":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;aborted&quot;,\n        &quot;description&quot;: &quot;User action&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;semantic_state&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;state&quot;: \n                        &quot;type&quot;: &quot;ABORTED&quot;,\n                        &quot;user_action_cause&quot;: &quot;action_code&quot;: &quot;CANCELLED&quot;\n                ,\n                &quot;pages_printed&quot;: 7\n        ","html":"<p>        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;aborted&quot;,\n        &quot;description&quot;: &quot;User action&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;semantic_state&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;state&quot;: \n                        &quot;type&quot;: &quot;ABORTED&quot;,\n                        &quot;user_action_cause&quot;: &quot;action_code&quot;: &quot;CANCELLED&quot;\n                ,\n                &quot;pages_printed&quot;: 7\n        </p>"},{"id":"text-205","type":"text","heading":"","plain_text":"Example (print job stopped due to out of paper). Notice the reference to the device state. le\nclient will need to call the /privet/info API to get more details about the device state:","html":"<p>Example (print job stopped due to out of paper). Notice the reference to the device state. le\nclient will need to call the /privet/info API to get more details about the device state:</p>"},{"id":"text-206","type":"text","heading":"","plain_text":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;stopped&quot;,\n        &quot;description&quot;: &quot;Out of paper&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: &quot;123456&quot;,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;semantic_state&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;state&quot;: \n                        &quot;type&quot;: &quot;STOPPED&quot;,\n                        &quot;device_state_cause&quot;: &quot;error_code&quot;: &quot;INPUT_TRAY&quot;\n                ,\n                &quot;pages_printed&quot;: 7\n        ","html":"<p>        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;stopped&quot;,\n        &quot;description&quot;: &quot;Out of paper&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: &quot;123456&quot;,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;semantic_state&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;state&quot;: \n                        &quot;type&quot;: &quot;STOPPED&quot;,\n                        &quot;device_state_cause&quot;: &quot;error_code&quot;: &quot;INPUT_TRAY&quot;\n                ,\n                &quot;pages_printed&quot;: 7\n        </p>"},{"id":"text-207","type":"text","heading":"","plain_text":"5.3.3. les erreurs\n/privet/printer/jobstate API may return the following errors (see Errors section for details):","html":"<p>5.3.3. les erreurs\n/privet/printer/jobstate API may return the following errors (see Errors section for details):</p>"},{"id":"text-208","type":"text","heading":"","plain_text":"Erreur\nLa description","html":"<p>Erreur\nLa description</p>"},{"id":"text-209","type":"text","heading":"","plain_text":"invalid_print_job\nInvalid/expired job ID is specified in the request.","html":"<p>invalid_print_job\nInvalid/expired job ID is specified in the request.</p>"},{"id":"text-210","type":"text","heading":"","plain_text":"server_error\nGetting print job status (for print jobs posted to Cloud Print) has\n    failed.","html":"<p>server_error\nGetting print job status (for print jobs posted to Cloud Print) has\n    failed.</p>"},{"id":"text-211","type":"text","heading":"","plain_text":"invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.","html":"<p>invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request.</p>"},{"id":"text-212","type":"text","heading":"","plain_text":"If device is not exposing /privet/printer/jobstate, it MUST return HTTP 404 error. Si la\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\n6. Appendix\n6.1. Default behavior and settings\nThis section will explain the default behavior we expect from ALL Privet-compatible devices.","html":"<p>If device is not exposing /privet/printer/jobstate, it MUST return HTTP 404 error. Si la\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\n6. Appendix\n6.1. Default behavior and settings\nThis section will explain the default behavior we expect from ALL Privet-compatible devices.</p>"},{"id":"text-213","type":"text","heading":"","plain_text":"Out-of-the-box devices should support only /privet/info et\n    /privet/register APIs. All other APIs (e.g. /privet/accesstoken, local printing) should\n    be disabled.\nRegistration requires physical interaction with a device.","html":"<p>Out-of-the-box devices should support only /privet/info et\n    /privet/register APIs. All other APIs (e.g. /privet/accesstoken, local printing) should\n    be disabled.\nRegistration requires physical interaction with a device.</p>"},{"id":"text-214","type":"text","heading":"","plain_text":"User MUST take a physical action on the device (e.g., pressing a button) to confirm their\n      access to the device. \nAfter the user takes the action noted above, the printer should send the\n      /cloudprint/register request. It should not send this request until after the action is taken\n      (see Sequence Diagram 1).\nIf the device is processing a /privet/register request (for instance, waiting on the action\n      above), it must reject all other /privet/register requests. The device MUST return the\n      device_busy error in this case.\nThe device should timeout any /register request that does not receive the physical action\n      mentioned above within 60 seconds. The device MUST return the confirmation_timeout error in\n      this case.\nOptional: Recommended but not required, the following may improve user experience:","html":"<p>User MUST take a physical action on the device (e.g., pressing a button) to confirm their\n      access to the device. \nAfter the user takes the action noted above, the printer should send the\n      /cloudprint/register request. It should not send this request until after the action is taken\n      (see Sequence Diagram 1).\nIf the device is processing a /privet/register request (for instance, waiting on the action\n      above), it must reject all other /privet/register requests. The device MUST return the\n      device_busy error in this case.\nThe device should timeout any /register request that does not receive the physical action\n      mentioned above within 60 seconds. The device MUST return the confirmation_timeout error in\n      this case.\nOptional: Recommended but not required, the following may improve user experience:</p>"},{"id":"text-215","type":"text","heading":"","plain_text":"The printer might flash a light or its screen to indicate that the user needs to take an\n        action to confirm registration.\nThe printer might state on its screen that ‘it is being registered to Google Cloud\n        Print for user ‘abc@def.com’ &#8211; press OK to\n        continue’, where abc@def.com  is the user\n        parameter from the /register API call. This would make it clearer to a user that:","html":"<p>The printer might flash a light or its screen to indicate that the user needs to take an\n        action to confirm registration.\nThe printer might state on its screen that ‘it is being registered to Google Cloud\n        Print for user ‘abc@def.com’ &#8211; press OK to\n        continue’, where abc@def.com  is the user\n        parameter from the /register API call. This would make it clearer to a user that:</p>"},{"id":"text-216","type":"text","heading":"","plain_text":"it is their registration request that s/he is confirming\nwhat is happening if s/he didn’t trigger the request.","html":"<p>it is their registration request that s/he is confirming\nwhat is happening if s/he didn’t trigger the request.</p>"},{"id":"text-217","type":"text","heading":"","plain_text":"In addition to a physical action to confirm from the printer (e.g., ‘Press the OK\n        button’), a printer may also offer the user a button to cancel the request (e.g.,\n        ‘Press Cancel to reject’). This would allow users who did not trigger the\n        registration request to cancel it before the 60 second timeout. The device MUST return the\n        user_cancel error in this case.","html":"<p>In addition to a physical action to confirm from the printer (e.g., ‘Press the OK\n        button’), a printer may also offer the user a button to cancel the request (e.g.,\n        ‘Press Cancel to reject’). This would allow users who did not trigger the\n        registration request to cancel it before the 60 second timeout. The device MUST return the\n        user_cancel error in this case.</p>"},{"id":"text-218","type":"text","heading":"","plain_text":"Ownership transfers:","html":"<p>Ownership transfers:</p>"},{"id":"text-219","type":"text","heading":"","plain_text":"The device may be deleted explicitly from the Cloud service.","html":"<p>The device may be deleted explicitly from the Cloud service.</p>"},{"id":"text-220","type":"text","heading":"","plain_text":"If the device receives success, but no device description as a result of\n        /cloudprint/printer (for GCP) call, it MUST revert to default (out-of-the-box) mode. \nIf the device’s credentials no longer work (explicitly because of &quot;invalid\n        credentials&quot; response from the server), it MUST revert to default (out-of-the-box)\n        mode.","html":"<p>If the device receives success, but no device description as a result of\n        /cloudprint/printer (for GCP) call, it MUST revert to default (out-of-the-box) mode. \nIf the device’s credentials no longer work (explicitly because of &quot;invalid\n        credentials&quot; response from the server), it MUST revert to default (out-of-the-box)\n        mode.</p>"},{"id":"text-221","type":"text","heading":"","plain_text":"Local factory reset MUST clear device’s credentials and set it to default state.\nOptional: The device may provide a menu item to clear credentials and put it into default\n      mode.","html":"<p>Local factory reset MUST clear device’s credentials and set it to default state.\nOptional: The device may provide a menu item to clear credentials and put it into default\n      mode.</p>"},{"id":"text-222","type":"text","heading":"","plain_text":"Devices supporting XMPP notifications MUST include the ability to ping the server. The ping\n    timeout MUST be controllable from the server through &quot;local_settings&quot;.\nThe device may explicitly ping the server (/cloudprint/printer API for GCP, in addition to\n    XMPP pings)  no more often than once a day (24 hours) to make sure they are in sync. Il est\n    recommended to randomize the check window within 24-32 hour window.\nOptional: For Cloud Print devices, it is recommended but not required to have a manual way\n    (button) to allow the user to initiate a check for new print jobs from the device. Some printers\n    already have this.\nOptional. Enterprise printers may have an option to disable local discovery completely. Dans\n    such case, the device MUST update these local settings on the server. New local settings MUST be\n    empty (setting &quot;local_discovery&quot; to &quot;false&quot;, means that it can be\n    re-enabled from the GCP Service).","html":"<p>Devices supporting XMPP notifications MUST include the ability to ping the server. The ping\n    timeout MUST be controllable from the server through &quot;local_settings&quot;.\nThe device may explicitly ping the server (/cloudprint/printer API for GCP, in addition to\n    XMPP pings)  no more often than once a day (24 hours) to make sure they are in sync. Il est\n    recommended to randomize the check window within 24-32 hour window.\nOptional: For Cloud Print devices, it is recommended but not required to have a manual way\n    (button) to allow the user to initiate a check for new print jobs from the device. Some printers\n    already have this.\nOptional. Enterprise printers may have an option to disable local discovery completely. Dans\n    such case, the device MUST update these local settings on the server. New local settings MUST be\n    empty (setting &quot;local_discovery&quot; to &quot;false&quot;, means that it can be\n    re-enabled from the GCP Service).</p>"},{"id":"text-223","type":"text","heading":"","plain_text":"6.1.2 Default Registration Diagram","html":"<p>6.1.2 Default Registration Diagram</p>"},{"id":"text-224","type":"text","heading":"","plain_text":"6.2. XSSI and XSRF attacks and prevention\nThis section will explain the possibility of XSSI and XSRF attacks on the device and how to protect\nfrom them (including token generation techniques).\nMore details are here:","html":"<p>6.2. XSSI and XSRF attacks and prevention\nThis section will explain the possibility of XSSI and XSRF attacks on the device and how to protect\nfrom them (including token generation techniques).\nMore details are here:</p>"},{"id":"text-225","type":"text","heading":"","plain_text":"http://googleonlinesecurity.blogspot.com/2011/05/website-security-for-webmasters.html\nNormally, XSSI and XSRF attacks are possible when a site is using cookie authentication\nmechanisms. While Google doesn’t use cookies with their Cloud Print Service, such attacks are\nstill possible. Local network access, by design, implicitly trusts requests.\n6.2.1. XSSI\nIt is possible for a malicious website to guess the IP address and port number of a\nPrivet-compatible device and to try to call the Privet API using &quot;src=&quot;http://developers.google.com/inside of a  tag:","html":"<p>http://googleonlinesecurity.blogspot.com/2011/05/website-security-for-webmasters.html\nNormally, XSSI and XSRF attacks are possible when a site is using cookie authentication\nmechanisms. While Google doesn’t use cookies with their Cloud Print Service, such attacks are\nstill possible. Local network access, by design, implicitly trusts requests.\n6.2.1. XSSI\nIt is possible for a malicious website to guess the IP address and port number of a\nPrivet-compatible device and to try to call the Privet API using &quot;src=&quot;http://developers.google.com/inside of a  tag:</p>"},{"id":"text-226","type":"text","heading":"","plain_text":"Without protection, malicious websites would be able to execute API calls and access results.\nTo prevent this type of attack, ALL Privet API calls MUST require the\n&quot;X-Privet-Token&quot; header in the request. &quot;src=&quot;http://developers.google.com/script tags are\nnot able to add headers, effectively guarding against this type of attack.\n6.2.2. XSRF","html":"<p>Without protection, malicious websites would be able to execute API calls and access results.\nTo prevent this type of attack, ALL Privet API calls MUST require the\n&quot;X-Privet-Token&quot; header in the request. &quot;src=&quot;http://developers.google.com/script tags are\nnot able to add headers, effectively guarding against this type of attack.\n6.2.2. XSRF</p>"},{"id":"text-227","type":"text","heading":"","plain_text":"http://en.wikipedia.org/wiki/Cross-site_request_forgery\nIt is possible for a malicious website to guess the IP address and port number of a\nPrivet-compatible device and try to call Privet API using an , forms, or some other\ncross-website loading mechanism. Attackers would not be able to access the results of the request,\nbut if the request would perform an action (e.g. printing), they could trigger it.\nTo prevent this attack, we require the following protection:","html":"<p>http://en.wikipedia.org/wiki/Cross-site_request_forgery\nIt is possible for a malicious website to guess the IP address and port number of a\nPrivet-compatible device and try to call Privet API using an , forms, or some other\ncross-website loading mechanism. Attackers would not be able to access the results of the request,\nbut if the request would perform an action (e.g. printing), they could trigger it.\nTo prevent this attack, we require the following protection:</p>"},{"id":"text-228","type":"text","heading":"","plain_text":"Leave /privet/info API open to XSRF\n/privet/info API MUST NOT perform any actions on the device\nUse /privet/info API to receive x-privet-token\nAll other APIs MUST check for a valid x-privet-token in &quot;X-Privet-Token&quot; header.\nx-privet-token SHOULD be valid for only 24 hours.","html":"<p>Leave /privet/info API open to XSRF\n/privet/info API MUST NOT perform any actions on the device\nUse /privet/info API to receive x-privet-token\nAll other APIs MUST check for a valid x-privet-token in &quot;X-Privet-Token&quot; header.\nx-privet-token SHOULD be valid for only 24 hours.</p>"},{"id":"text-229","type":"text","heading":"","plain_text":"Even if an attacker is able to execute the /privet/info API, they would not be able to\nread x-privet-token from the response and therefore would not be able to call any other API.\nIt is strongly recommended to generate the XSRF token using the following algorithm:\nXSRF_token = base64( SHA1(device_secret + DELIMITER + issue_timecounter) + DELIMITER + issue_timecounter )\nXSRF Token Generation Elements:","html":"<p>Even if an attacker is able to execute the /privet/info API, they would not be able to\nread x-privet-token from the response and therefore would not be able to call any other API.\nIt is strongly recommended to generate the XSRF token using the following algorithm:\nXSRF_token = base64( SHA1(device_secret + DELIMITER + issue_timecounter) + DELIMITER + issue_timecounter )\nXSRF Token Generation Elements:</p>"},{"id":"text-230","type":"text","heading":"","plain_text":"DELIMITER is a special character, usually ‘:’\nissue_timecounter is a number of seconds since some event (epoch for timestamp) or\n    device boot time (for CPU counters). issue_timecounter is constantly increasing when\n    the device is up and running (see token verification below).\nSHA1 &#8211; hash function using SHA1 algorithm\nbase64 &#8211; base64 encoding\ndevice_secret &#8211; secret specific to the device. Device secret MUST be updated on every\n    restart.","html":"<p>DELIMITER is a special character, usually ‘:’\nissue_timecounter is a number of seconds since some event (epoch for timestamp) or\n    device boot time (for CPU counters). issue_timecounter is constantly increasing when\n    the device is up and running (see token verification below).\nSHA1 &#8211; hash function using SHA1 algorithm\nbase64 &#8211; base64 encoding\ndevice_secret &#8211; secret specific to the device. Device secret MUST be updated on every\n    restart.</p>"},{"id":"text-231","type":"text","heading":"","plain_text":"Recommended ways to generate device secret:","html":"<p>Recommended ways to generate device secret:</p>"},{"id":"text-232","type":"text","heading":"","plain_text":"Generate a new UUID on every restart\nGenerate a 64 bit random number on every restart","html":"<p>Generate a new UUID on every restart\nGenerate a 64 bit random number on every restart</p>"},{"id":"text-233","type":"text","heading":"","plain_text":"The device is not required to store all of the XSRF tokens it has issued. When the device needs\n  to verify a XSRF token for validity, it should base64-decode the token. Get the\n  issue_timecounter from the second half (cleartext), and try to produce SHA1 hash of\n  device_secret + DELIMITER + issue_timecounter où issue_timecounter is from\n  the token. If the newly generated SHA1 matches the one in the token, device must now check if the\n  issue_timecounter is within the validity period from (24 hours) of the current time\n  counter. To do so, device takes the current time counter (CPU counter for example) and subtracts\n  issue_timecounter à partir de cela. The result MUST be the number of seconds since token\n  issue.\nImportant: This is the recommended way to implement XSRF\n  protection. Clients of the Privet specification shall not try to understand XSRF token, instead\n  they shall treat is as a blackbox. Figure 6.2.3 illustrates a recommended way to implement the\n  X-Privet-Token and verification of a typical request.\n6.2.3 X-Privet Token Generation and Verification Sequence Diagram","html":"<p>The device is not required to store all of the XSRF tokens it has issued. When the device needs\n  to verify a XSRF token for validity, it should base64-decode the token. Get the\n  issue_timecounter from the second half (cleartext), and try to produce SHA1 hash of\n  device_secret + DELIMITER + issue_timecounter où issue_timecounter is from\n  the token. If the newly generated SHA1 matches the one in the token, device must now check if the\n  issue_timecounter is within the validity period from (24 hours) of the current time\n  counter. To do so, device takes the current time counter (CPU counter for example) and subtracts\n  issue_timecounter à partir de cela. The result MUST be the number of seconds since token\n  issue.\nImportant: This is the recommended way to implement XSRF\n  protection. Clients of the Privet specification shall not try to understand XSRF token, instead\n  they shall treat is as a blackbox. Figure 6.2.3 illustrates a recommended way to implement the\n  X-Privet-Token and verification of a typical request.\n6.2.3 X-Privet Token Generation and Verification Sequence Diagram</p>"},{"id":"text-234","type":"text","heading":"","plain_text":"6.3. Workflow diagrams\nThis section will illustrate a workflow in different cases.\n6.3.1. Printer out of the box workflow","html":"<p>6.3. Workflow diagrams\nThis section will illustrate a workflow in different cases.\n6.3.1. Printer out of the box workflow</p>"},{"id":"text-235","type":"text","heading":"","plain_text":"6.3.2. Registered printer startup","html":"<p>6.3.2. Registered printer startup</p>"},{"id":"text-236","type":"text","heading":"","plain_text":"6.3.3 XMPP notifications handling workflow","html":"<p>6.3.3 XMPP notifications handling workflow</p>"},{"id":"text-237","type":"text","heading":"","plain_text":"6.3.4. Check printer settings workflow","html":"<p>6.3.4. Check printer settings workflow</p>"},{"id":"text-238","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"Privet est une API de découverte locale d&#39;appareils de nuage utilisée par les services de nuage. Ce document est organisé\n  dans les sections suivantes:"},{"id":"text-2","heading":"Text","content":"Introduction: introduction à Privet\nDécouverte: mécanismes de découverte locaux\nAnnonces: annonces de découverte locale\nAPI: API Privet pour les périphériques cloud généraux\nAPI d&#39;imprimante: API Privet utilisées par les imprimantes\nAnnexe: schémas supplémentaires"},{"id":"text-3","heading":"Text","content":"1. Introduction\nLes appareils connectés au cloud présentent de nombreux avantages. Ils peuvent utiliser les services de conversion en ligne, le travail hôte\n  file d&#39;attente lorsque l&#39;appareil est hors ligne et accessible de partout dans le monde. Cependant, avec\n  nombreux périphériques accessibles par un utilisateur donné dans le cloud, nous devons fournir une méthode permettant de\n  appareil le plus proche en fonction de l&#39;emplacement. Le protocole Privet a pour objectif de lier la flexibilité des\n  périphériques cloud avec un mécanisme de découverte local approprié, de sorte que les périphériques soient facilement découverts\n  nouveaux environnements.\nLes objectifs de ce protocole sont:"},{"id":"text-4","heading":"Text","content":"rendre les périphériques cloud détectables localement\nenregistrer des périphériques cloud avec un service cloud\nassocier les appareils enregistrés à leur représentation dans le nuage\nactiver la fonctionnalité hors ligne\nsimplifier la mise en œuvre pour que les petits appareils puissent l&#39;utiliser"},{"id":"text-5","heading":"Text","content":"Le protocole Privet comprend 2 parties principales: découverte et API. La découverte est utilisée pour trouver le\n  périphérique sur le réseau local, et l’API permet d’obtenir des informations sur le périphérique et\n  effectuer des actions. Tout au long de ce document, l&#39;appareil désigne un appareil connecté au cloud\n  implémenter le protocole Privet.\n2. découverte\nDiscovery est un protocole basé sur zeroconf (mDNS + DNS-SD). Le périphérique DOIT implémenter IPv4 Link-Local\n  Adresser. L&#39;appareil DOIT être conforme aux spécifications mDNS et DNS-SD.\nLe dispositif DOIT effectuer la résolution des conflits de noms conformément aux spécifications ci-dessus.\n2.1. type de service\nLa découverte de service DNS utilise le format suivant pour les types de service:\n  _applicationprotocol._transportprotocol. Dans le cas du protocole Privet, le service\n  type pour DNS-SD devrait être: _privet._tcp\nL&#39;appareil peut également implémenter d&#39;autres types de services. Il est conseillé d&#39;utiliser le même service\n  nom d&#39;instance pour tous les types de services implémentés par le périphérique. Par exemple: une imprimante peut\n  implémentez les services &quot;Imprimante XYZ._privet._tcp&quot; et &quot;Imprimante XYZ._printer._tcp&quot;. Ça va simplifier\n  configuration pour l&#39;utilisateur. Cependant, les clients Privet rechercheront uniquement &quot;_privet._tcp&quot;.\nEn plus du type de service principal, l’appareil DOIT annoncer les enregistrements PTR pour ses\n  sous-type (s) correspondant (voir spéc. DNS-SD: &quot;7.1. Énumération d&#39;instances sélective (sous-types)&quot;).\n  Le format devrait être le suivant:\n  _._sub.privet._tcp\nActuellement, le seul sous-type de périphérique pris en charge est imprimante. Donc, toutes les imprimantes DOIVENT annoncer\n  deux enregistrements PTR:"},{"id":"text-6","heading":"Text","content":"_privet._tcp.local.\n_printer._sub._privet._tcp.local."},{"id":"text-7","heading":"Text","content":"2.2. Enregistrement TXT\nle Découverte du service DNS définit des champs pour ajouter des informations facultatives sur un service dans\n  les enregistrements TXT. Un enregistrement TXT est constitué de paires clé / valeur. Chaque paire clé / valeur commence à partir du\n  longueur octet suivi de 255 octets de texte au maximum. La clé est le texte avant le premier\n  Le caractère &quot;=&quot; et la valeur correspond au texte après le premier caractère &quot;=&quot;\n  jusqu&#39;à la fin. La spécification ne permet aucune valeur dans l&#39;enregistrement, dans ce cas, il n&#39;y aura aucune\n  Caractère &quot;=&quot; OU pas de texte après le caractère &quot;=&quot;. (Voir spéc. DNS-SD:\n  &quot;6.1. Règles générales de format pour les enregistrements DNS TXT&quot; pour le format d&#39;enregistrement DNS TXT et &quot;6.2. DNS-SD TXT\n  Taille d&#39;enregistrement &quot;pour la longueur recommandée).\nPrivet exige que le périphérique envoie les paires clé / valeur suivantes dans l&#39;enregistrement TXT. Valeur clé\n  les chaînes ne respectent pas la casse, par exemple &quot;CS = online&quot; et &quot;cs = ONLINE&quot; sont\n  le même. Les informations contenues dans l&#39;enregistrement TXT DOIVENT être identiques à celles accessibles via l&#39;API / info (voir 4.1.\n  Section API).\nIl est recommandé de conserver une taille d’enregistrement TXT inférieure à 512 octets.\n2.2.1. txtvers\nVersion de la structure TXT. txtvers DOIT être le premier enregistrement de la structure TXT. Actuellement\n  la seule version supportée est 1.\ntxtvers = 1\n2.2.2. ty\nFournit un nom lisible par l&#39;utilisateur du périphérique. Par exemple:\nty = Modèle d&#39;imprimante Google Cloud Ready XYZ\n2.2.3. note (optionnel)\nFournit un nom lisible par l&#39;utilisateur du périphérique. Par exemple:\nnote = Imprimeur de lobby au 1er étage\nRemarque: Ceci est une clé optionnelle et peut être ignorée. Cependant, si présent, l&#39;utilisateur\n  DEVRAIT pouvoir modifier cette valeur. La même description DOIT être utilisée lors de l&#39;enregistrement d&#39;un appareil.\n2.2.4. url\nURL du serveur auquel cet appareil est connecté (protocole compris). Par exemple:\nurl = https: //www.google.com/cloudprint\n2.2.5. type\nListe de sous-types de périphérique pris en charge par ce périphérique, séparés par des virgules. Le format est:\n  &quot;type = _subtype1, _subtype2&quot;. Actuellement, le seul sous-type de périphérique pris en charge est\n  imprimante.\ntype = imprimante\nChaque sous-type répertorié doit être annoncé à l&#39;aide d&#39;un enregistrement PTR correspondant. Pour chaque supporté\n  service, il doit y avoir un élément correspondant. Nom du sous-type de service\n  (._sub.privet._tcp) devrait être égal au type de périphérique ici.\n2.2.6. identifiant\nReference de l&#39;appareil. Si le périphérique n&#39;a pas encore été enregistré, cette clé doit être présente, mais la valeur\n  devrait être vide. Par exemple:"},{"id":"text-8","heading":"Text","content":"id = 11111111-2222-3333-4444-555555555555\n  id ="},{"id":"text-9","heading":"Text","content":"2.2.7. cs\nIndique l’état actuel de la connexion du périphérique. Quatre valeurs possibles sont définies dans cette\n  spec."},{"id":"text-10","heading":"Text","content":"&quot;online&quot; indique que l&#39;appareil est actuellement connecté au cloud.\n&quot;hors ligne&quot; indique que le périphérique est disponible sur le réseau local, mais\n    ne peux pas parler au serveur.\n&quot;connexion&quot; indique que le périphérique effectue sa séquence de démarrage et est en train de\n    pas encore complètement en ligne.\n&quot;non configuré&quot; indique que l&#39;accès Internet de l&#39;appareil n&#39;a pas été\n    configuré pour le moment. Cette valeur n’est pas utilisée actuellement, mais peut être utile dans les futures versions du logiciel.\n    spécification."},{"id":"text-11","heading":"Text","content":"Par exemple:"},{"id":"text-12","heading":"Text","content":"cs = en ligne\ncs = hors ligne\ncs = connexion"},{"id":"text-13","heading":"Text","content":"Si le périphérique a été enregistré dans un nuage, il doit vérifier au démarrage la connectivité avec\n  serveur pour détecter son état de connexion (par exemple, appeler une API cloud pour obtenir les paramètres du périphérique). le\n  L’équipement peut utiliser l’état de la connexion de son canal de notification (XMPP, par exemple) pour signaler cette valeur.\n  Les périphériques non enregistrés au démarrage peuvent envoyer un ping à un domaine afin de détecter leur état de connexion (par exemple,\n  exemple, effectuez un ping sur www.google.com pour les périphériques d’impression dans le cloud\n3. Annonces\nAu démarrage, à l&#39;arrêt ou au changement d&#39;état du périphérique, le périphérique DOIT exécuter l&#39;étape de l&#39;annonce\n  décrit dans la spécification mDNS. Il\n  DEVRAIT envoyer l&#39;annonce correspondante au moins deux fois avec un intervalle d&#39;au moins une seconde\n  entre eux.\n3.1. Commencez\nAu démarrage de l&#39;appareil, il DOIT exécuter les étapes de vérification et d&#39;annonce décrites dans le manuel mDNS.\n  spécification. Les enregistrements SRV, PTR et TXT doivent être envoyés dans ce cas. Il est recommandé de grouper\n  tous les enregistrements dans une réponse DNS si possible. Si non, l&#39;ordre suivant est recommandé: SRV,\n  PTR, enregistrements TXT.\n3.2. Fermer\nLors de l’arrêt de l’appareil, il DEVRAIT essayer d’en informer toutes les parties intéressées en envoyant un message.\n  &quot;Au revoir paquet&quot; avec TTL = 0 (comme décrit dans la documentation de mDNS).\n3.3. Mise à jour\nSi l’une des informations décrites dans TXT a changé, le périphérique DOIT envoyer une mise à jour.\n  annonce. Dans ce cas, il suffit d’envoyer le nouvel enregistrement TXT. Par exemple, après un\n  appareil est enregistré, il DOIT envoyer une annonce de mise à jour incluant le nouvel identifiant d&#39;appareil.\n4. API\nUne fois qu&#39;un périphérique cloud a été découvert, la communication client est activée avec le périphérique.\n  directement sur le réseau local. Toutes les API sont basées sur HTTP 1.1. Les formats de données sont basés sur JSON. API\n  les requêtes peuvent être des requêtes GET ou POST.\nChaque demande DOIT contenir un &quot;X-Privet-Token&quot;en-tête. La SEULE demande\n  autorisé à avoir un en-tête &quot;X-Privet-Token&quot; vide est la requête / privet / info (note\n  l&#39;en-tête DOIT toujours être présent). Si l&#39;en-tête &quot;X-Privet-Token&quot; est manquant, le\n  le périphérique DOIT répondre avec l&#39;erreur HTTP 400 suivante:\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\nSi l&#39;en-tête &quot;X-Privet-Token&quot; est vide ou invalide, le périphérique DOIT répondre avec\n  &quot;erreur X-Privet-Token non valide&quot; (invalid_x_privet_token, voir la section Erreurs pour plus de détails).\n  détails). La seule exception est l&#39;API / info. Pour voir plus d&#39;informations sur pourquoi cela est fait et comment les jetons\n  voir Annexe A: Attaques XSSI et XSRF et prévention.\nSi une API demandée n&#39;existe pas ou n&#39;est pas prise en charge, le périphérique DOIT renvoyer une erreur HTTP 404.\n4.1. Disponibilité de l&#39;API\nAvant TOUTE API ne soit exposée (y compris l’API / info), le périphérique DOIT contacter le serveur pour vérifier\n  paramètres locaux. Les paramètres locaux DOIVENT être préservés entre\n  redémarre. Si le serveur n&#39;est pas disponible, les derniers paramètres locaux connus doivent être utilisés. Si la\n  L&#39;appareil n&#39;a pas encore été enregistré, il devrait suivre les paramètres par défaut.\nLes périphériques Cloud Print DOIVENT suivre les étapes ci-dessous pour enregistrer, recevoir et mettre à jour les paramètres locaux.\n4.1.1. enregistrement\nLorsque le périphérique s&#39;inscrit, il DOIT spécifier le paramètre &quot;local_settings&quot;, comme suit:"},{"id":"text-14","heading":"Text","content":"       &quot;actuel&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: true,\n                &quot;printer / conversion_printing_enabled&quot;: true,\n                &quot;xmpp_timeout_value&quot;: 300\n        "},{"id":"text-15","heading":"Text","content":"Les paramètres suivants peuvent être définis:"},{"id":"text-16","heading":"Text","content":"Nom de la valeur\nType de valeur\nLa description"},{"id":"text-17","heading":"Text","content":"découverte_locale\nbooléen\nIndique si la fonctionnalité de découverte locale est\n    permis. Si &quot;false&quot;, toutes les découvertes d&#39;API locale (y compris / info) et DNS-SD doivent être désactivées. Par\n    Par défaut, les périphériques nouvellement enregistrés doivent passer &quot;true&quot;."},{"id":"text-18","heading":"Text","content":"access_token_enabled\nbooléen (optionnel)\nIndique si / accesstoken API\n    devrait être exposé sur le réseau local. Par défaut devrait être &quot;true&quot;."},{"id":"text-19","heading":"Text","content":"printer / local_printing_enabled\nbooléen (optionnel)\nIndique si local\n    la fonctionnalité d’impression (/ printer / createjob, / printer / submitdoc, / printer / jobstate) devrait être\n    exposés sur le réseau local. Par défaut devrait être &quot;true&quot;."},{"id":"text-20","heading":"Text","content":"printer / conversion_printing_enabled\nbooléen (optionnel)\nIndique si local\n    l&#39;impression peut envoyer le travail au serveur pour la conversion. Cela n’a de sens que lorsque l’impression locale est activée."},{"id":"text-21","heading":"Text","content":"xmpp_timeout_value\nint (facultatif)\nIndique le nombre de secondes entre\n    Pingles de canal XMPP. Par défaut, DOIT être 300 (5 minutes) ou plus."},{"id":"text-22","heading":"Text","content":"Important: L’absence de valeur optionnelle indique que le\n  la fonctionnalité correspondante est complètement non prise en charge par le périphérique.\n4.1.2. Commencez\nAu démarrage du périphérique, le serveur doit contacter le serveur pour vérifier quelles API sont disponibles pour être exposées dans\n  le réseau local. Pour les imprimantes connectées à Cloud Print, elles doivent appeler:\n/ cloudprint / printer? printerid =\nou\n/ cloudprint / list\n/ cloudprint / printer est préférable à / cloudprint / list, mais les deux fonctionneront.\nCette API renvoie les paramètres actuels du périphérique, y compris les paramètres de l&#39;API locale. La réponse du\n  Le serveur aura le format suivant:"},{"id":"text-23","heading":"Text","content":"&quot;paramètres locaux&quot;: \n        &quot;actuel&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: true,\n                &quot;printer / conversion_printing_enabled&quot;: true,\n                &quot;xmpp_timeout_value&quot;: 300\n         ,\n         &quot;en attente&quot;: \n                &quot;local_discovery&quot;: true,\n                &quot;access_token_enabled&quot;: true,\n                &quot;printer / local_printing_enabled&quot;: false,\n                &quot;printer / conversion_printing_enabled&quot;: false,\n                &quot;xmpp_timeout_value&quot;: 500\n         "},{"id":"text-24","heading":"Text","content":"L&#39;objet &quot;en cours&quot; indique les paramètres en vigueur pour le moment.\nL&#39;objet &quot;en attente&quot; indique les paramètres à appliquer au périphérique (cet objet\n  peut être manquant).\nUne fois que le périphérique voit les paramètres &quot;en attente&quot;, il DOIT mettre à jour son état (voir ci-dessous).\n4.1.3. Mise à jour\nSi une mise à jour des paramètres est nécessaire, une notification XMPP sera envoyée au périphérique. La notification\n  sera dans le format suivant:\n/mettre à jour les paramètres\nÀ la réception d&#39;une telle notification, le périphérique DOIT interroger le serveur pour obtenir les derniers paramètres.\n  Les périphériques Cloud Print DOIVENT utiliser:\n/ cloudprint / printer? printerid =\nUne fois que le périphérique voit la section &quot;en attente&quot; suite à l’API / cloudprint / printer (à\n  démarrage ou en raison de la notification), il DOIT mettre à jour son état interne pour se souvenir du nouveau\n  paramètres. Il DOIT appeler l&#39;API du serveur pour confirmer les nouveaux paramètres. Pour les imprimantes en nuage, le périphérique\n  DOIT appeler / cloudprint / update API et utiliser le paramètre &quot;local_settings&quot; comme pendant\n  enregistrement.\nLors de la reconnexion au canal XMPP, le périphérique DOIT appeler / cloudprint / API pour vérifier si\n  les paramètres locaux ont été modifiés depuis la dernière fois.\n4.1.3.1. Paramètres locaux en attente\nLe paramètre &quot;local_settings&quot; utilisé par le périphérique pour appeler l&#39;API du serveur NE DOIT JAMAIS contenir\n  section &quot;en attente&quot;.\n4.1.3.2. Paramètres locaux actuels\nUNIQUEMENT l’appareil peut changer la section &quot;actuelle&quot; des &quot;paramètres locaux&quot;.\n  Tout le monde changera la section &quot;en attente&quot; et attendra que les modifications soient apportées.\n  propagé à la section &quot;en cours&quot; par le périphérique.\n4.1.4. Hors ligne\nLorsqu&#39;il est impossible de contacter le serveur au démarrage, après notification, le périphérique DOIT utiliser le dernier\n  paramètres locaux.\n4.1.5. Suppression de l&#39;appareil du service\nSi le périphérique a été supprimé du service (GCP par exemple), une notification XMPP sera envoyée.\n  envoyé à l&#39;appareil. La notification sera au format suivant:\n/effacer\nÀ la réception d&#39;une telle notification, le périphérique DOIT se rendre sur le serveur pour vérifier son état. Nuage\n  Les périphériques d’impression DOIVENT utiliser:\n/ cloudprint / printer? printerid =\nLe périphérique DOIT recevoir une réponse HTTP réussie avec success = false et aucun périphérique / imprimante.\n  la description. Cela signifie que le périphérique a été retiré du serveur et que le périphérique DOIT effacer ses\n  informations d’authentification et passer en mode de paramètres d’usine par défaut.\nTOUTE heure à laquelle le périphérique reçoit une réponse indiquant qu&#39;il a été supprimé à la suite de la\n  / cloudprint / API (démarrage, notification des paramètres de mise à jour, ping quotidien), elle DOIT supprimer ses\n  informations d&#39;identification et aller en mode par défaut.\n4.2. API / privet / info\nL&#39;info API est OBLIGATOIRE et DOIT être implémentée par tous les appareils. C&#39;est une requête HTTP GET pour\n  &quot;/ privet / info&quot; url: GET / privet / info HTTP / 1.1\nL&#39;API info renvoie des informations de base sur un périphérique et les fonctionnalités qu&#39;il prend en charge. Cette API\n  NE DOIT jamais changer l’état du dispositif ni effectuer aucune action, car il est vulnérable aux attaques XSRF.\n  C&#39;est la SEULE API autorisée à avoir un en-tête &quot;X-Privet-Token&quot; vide. Les clients devraient\n  API call / privet / info avec en-tête &quot;X-Privet-Token&quot; définie sur X-Privet-Token:\n  &quot;&quot;\nL&#39;API info DOIT renvoyer des données cohérentes avec les données disponibles dans l&#39;enregistrement TXT lors de la découverte.\n4.2.1. Contribution\n/ privet / info L&#39;API n&#39;a pas de paramètre d&#39;entrée.\n4.2.2. Revenir\nL&#39;API / privet / info renvoie des informations de base sur le périphérique et les fonctionnalités prises en charge.\nLa colonne TXT indique le champ correspondant dans l’enregistrement DNS-SD TXT."},{"id":"text-25","heading":"Text","content":"Nom de la valeur\nType de valeur\nLa description\nSMS"},{"id":"text-26","heading":"Text","content":"version\nchaîne\nVersion la plus récente (major.minor) de l&#39;API prise en charge, actuellement\n    1,0"},{"id":"text-27","heading":"Text","content":"Nom\nchaîne\nNom lisible par l&#39;homme du périphérique.\nty"},{"id":"text-28","heading":"Text","content":"la description\nchaîne\n(facultatif) Description de l&#39;appareil. DEVRAIT être modifiable par\n    utilisateur.\nRemarque"},{"id":"text-29","heading":"Text","content":"url\nchaîne\nURL du serveur avec lequel cet appareil parle. L&#39;URL DOIT inclure\n    spécification du protocole, par exemple: https://www.google.com/cloudprint.\nurl"},{"id":"text-30","heading":"Text","content":"type\nliste de chaînes\nListe des types d&#39;appareils pris en charge.\ntype"},{"id":"text-31","heading":"Text","content":"identifiant\nchaîne\nIdentifiant de périphérique, vide si le périphérique n&#39;a pas encore été enregistré.\nidentifiant"},{"id":"text-32","heading":"Text","content":"état_périphérique\nchaîne\nEtat de l&#39;appareil.tourner au ralenti signifie que l&#39;appareil est\n    prêtEn traitement signifie que le périphérique est occupé et que les fonctionnalités peuvent être limitées pendant un certain temps\n    arrêté signifie que l&#39;appareil ne fonctionne pas et que l&#39;intervention de l&#39;utilisateur est requise"},{"id":"text-33","heading":"Text","content":"état_connexion\nchaîne\nEtat de la connexion au serveur (base_url)\n    en ligne &#8211; connexion disponible\n    hors ligne &#8211; pas de connection\n    de liaison &#8211; effectuer les étapes de démarrage\n    pas configuré &#8211; la connexion n&#39;a pas encore été configurée\n    Un périphérique enregistré peut signaler son état de connexion en fonction de l&#39;état de la notification.\n    canal (par exemple, l&#39;état de la connexion XMPP).\ncs"},{"id":"text-34","heading":"Text","content":"fabricant\nchaîne\nNom du fabricant de l&#39;appareil"},{"id":"text-35","heading":"Text","content":"modèle\nchaîne\nModèle de l&#39;appareil"},{"id":"text-36","heading":"Text","content":"numéro de série\nchaîne\nIdentifiant unique de l&#39;appareil. Dans cette spécification, cela DOIT être\n    un UUID. (Spec GCP 1.1)\n    (facultatif) Nous vous recommandons vivement d’utiliser le même identifiant de numéro de série partout, donc différent.\n    les clients peuvent identifier le même appareil. Par exemple, les imprimeurs implémentant IPP peuvent utiliser cette interface série.\n    numéro d&#39;identification dans le champ &quot;printer-device-id&quot;."},{"id":"text-37","heading":"Text","content":"firmware\nchaîne\nVersion du firmware de l&#39;appareil"},{"id":"text-38","heading":"Text","content":"la disponibilité\nint\nNombre de secondes à partir du démarrage du périphérique."},{"id":"text-39","heading":"Text","content":"setup_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    instructions d&#39;installation"},{"id":"text-40","heading":"Text","content":"support_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    support, informations FAQ"},{"id":"text-41","heading":"Text","content":"update_url\nchaîne\n(facultatif) URL (protocole compris) de la page avec\n    mettre à jour les instructions du firmware"},{"id":"text-42","heading":"Text","content":"x-privet-token\nchaîne\nValeur de la X-Privet-Token en-tête qui a\n    à transmettre à toutes les API pour empêcher les attaques XSSI et XSRF. Voir 6.1. pour plus de détails."},{"id":"text-43","heading":"Text","content":"api\ndescription des API\nListe des API prises en charge (décrites ci-dessous)"},{"id":"text-44","heading":"Text","content":"état sémantique\nJSON\n(facultatif) Etat sémantique de l&#39;appareil en\n    Format CloudDeviceState."},{"id":"text-45","heading":"Text","content":"api &#8211; est une liste JSON contenant la liste des API disponibles via le réseau local. Remarque\n  toutes les API ne sont peut-être pas disponibles simultanément sur le réseau local. Par exemple, un nouveau\n  L&#39;appareil connecté ne doit supporter que l&#39;API / Register:"},{"id":"text-46","heading":"Text","content":"&quot;api&quot;: [\n        \"/privet/register\",\n]"},{"id":"text-47","heading":"Text","content":"Une fois l&#39;enregistrement de l&#39;appareil terminé, l&#39;appareil DEVRAIT cesser de prendre en charge l&#39;API / register. le\nLe périphérique doit également vérifier auprès du service afin de déterminer quelles API peuvent être exposées sur le serveur local.\nréseau. Par exemple:"},{"id":"text-48","heading":"Text","content":"&quot;api&quot;: [\n        \"/privet/accesstoken\",\n        \"/privet/capabilities\",\n        \"/privet/printer/submitdoc\",\n]"},{"id":"text-49","heading":"Text","content":"Les API suivantes sont disponibles à ce moment:"},{"id":"text-50","heading":"Text","content":"/ privet / register &#8211; API pour l&#39;enregistrement de périphérique sur le réseau local. (voir\n    / privet / register API pour plus de détails). Cette API DOIT être cachée une fois le périphérique réussi.\n    enregistré dans le nuage.\n/ privet / accesstoken &#8211; API permettant de demander un jeton d’accès à l’appareil (voir\n    / privet / accesstoken API pour plus de détails).\n/ privet / capacités &#8211; API permettant de récupérer les capacités du périphérique (voir / privet / capacités\n    API pour plus de détails).\n/ privet / printer / * &#8211; API spécifique au type de périphérique &quot;imprimante&quot;, voir imprimante\n    API spécifiques pour plus de détails."},{"id":"text-51","heading":"Text","content":"Voici un exemple de réponse / privet / info. (Notez le manque de l’API / privet / register, car\nce périphérique est déjà enregistré):"},{"id":"text-52","heading":"Text","content":"        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;name&quot;: &quot;l’imprimante de Gene&quot;,\n        &quot;description&quot;: &quot;Imprimante connectée via un connecteur Chrome&quot;,\n        &quot;url&quot;: &quot;https://www.google.com/cloudprint&quot;,\n        &quot;type&quot;: [\n                \"printer\"\n        ],\n        &quot;id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n        &quot;device_state&quot;: &quot;inactif&quot;,\n        &quot;connection_state&quot;: &quot;en ligne&quot;,\n        &quot;fabricant&quot;: &quot;Google&quot;,\n        &quot;modèle&quot;: &quot;Google Chrome&quot;,\n        &quot;numéro de série&quot;: &quot;1111-22222-33333-4444&quot;,\n        &quot;firmware&quot;: &quot;24.0.1312.52&quot;,\n        &quot;disponibilité&quot;: 600,\n        &quot;setup_url&quot;: &quot;http://support.google.com/cloudprint/answer/1686197/?hl=fr&quot;,\n        &quot;support_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;update_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;x-privet-token&quot;: &quot;AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659&quot;,\n        &quot;api&quot;: [\n                \"/privet/accesstoken\",\n                \"/privet/capabilities\",\n                \"/privet/printer/submitdoc\",\n        ]"},{"id":"text-53","heading":"Text","content":"Voici un exemple de réponse / privet / info pour une imprimante à court d’encre (avis\n  état de sémantique):"},{"id":"text-54","heading":"Text","content":"{\n        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;name&quot;: &quot;l’imprimante de Gene&quot;,\n        &quot;description&quot;: &quot;Imprimante connectée via un connecteur Chrome&quot;,\n        &quot;url&quot;: &quot;https://www.google.com/cloudprint&quot;,\n        &quot;type&quot;: [\n                \"printer\"\n        ],\n        &quot;id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,\n        &quot;device_state&quot;: &quot;stoppé&quot;,\n        &quot;connection_state&quot;: &quot;en ligne&quot;,\n        &quot;fabricant&quot;: &quot;Google&quot;,\n        &quot;modèle&quot;: &quot;Google Chrome&quot;,\n        &quot;numéro de série&quot;: &quot;1111-22222-33333-4444&quot;,\n        &quot;firmware&quot;: &quot;24.0.1312.52&quot;,\n        &quot;disponibilité&quot;: 600,\n        &quot;setup_url&quot;: &quot;http://support.google.com/cloudprint/answer/1686197/?hl=fr&quot;,\n        &quot;support_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;update_url&quot;: &quot;http://support.google.com/cloudprint/?hl=fr&quot;,\n        &quot;x-privet-token&quot;: &quot;AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659&quot;,\n        &quot;api&quot;: [\n                \"/privet/accesstoken\",\n                \"/privet/capabilities\",\n                \"/privet/printer/submitdoc\",\n        ],\n        &quot;état sémantique&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;imprimante&quot;: \n                        &quot;state&quot;: &quot;STOPPED&quot;,\n                        &quot;marker_state&quot;: \n                                &quot;article&quot;: [\n                                        \n                                                \"vendor_id\": \"ink\",\n                                                \"state\": \"EXHAUSTED\",\n                                                \"level_percent\": 0\n                                        \n                                ]\n                        \n                \n        \n}"},{"id":"text-55","heading":"Text","content":"4.2.3. les erreurs\n/ privet / info API devrait SEULEMENT renvoyer une erreur si X-Privet-Token l&#39;en-tête est manquant. Il\n  DOIT être une erreur HTTP 400:\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\n4.3. / privet / register API\n/ privet / register est facultative. C&#39;est une requête HTTP POST. / privet / register API DOIT vérifier\n  pour une validité X-Privet-Token entête. Le périphérique DOIT implémenter cette API sur\n  &quot;/ privet / register&quot; url:"},{"id":"text-56","heading":"Text","content":"POST /privet/register?action=start&amp;user=user@domain.com HTTP / 1.1\nPOST /privet/register?action=complete&amp;user=user@domain.com HTTP / 1.1"},{"id":"text-57","heading":"Text","content":"L’appareil doit exposer l’API / privet / register UNIQUEMENT lorsqu’il autorise l’enregistrement anonyme à la\n  moment. Par exemple:"},{"id":"text-58","heading":"Text","content":"Lorsque le périphérique est allumé (ou après avoir cliqué sur un bouton spécial du périphérique) et n’a pas\n    été enregistré, il devrait exposer l’API / privet / register pour permettre à un utilisateur du répertoire local\n    réseau pour réclamer l’imprimante.\nUne fois l’enregistrement terminé, le périphérique doit cesser d’exposer l’API / privet / register à\n    empêcher un autre utilisateur du réseau local de récupérer le périphérique.\nCertains appareils peuvent avoir différentes façons d’enregistrer des appareils et ne doivent pas exposer le\n    / privet / register à tous (par exemple, le connecteur Chrome Cloud Print)."},{"id":"text-59","heading":"Text","content":"Le processus d’enregistrement se déroule en 3 étapes (voir Enregistrement anonyme pour Cloud Print)."},{"id":"text-60","heading":"Text","content":"Lancer le processus d&#39;inscription anonyme.\nUn client initie ce processus en appelant l&#39;API / privet / register. L&#39;appareil peut attendre\n    confirmation de l&#39;utilisateur à ce moment.\nObtenez le jeton de réclamation."},{"id":"text-61","heading":"Text","content":"Le client interroge pour savoir quand l&#39;appareil est prêt à continuer. Une fois que l&#39;appareil est prêt, il\n  envoie une demande au serveur pour récupérer le jeton d&#39;enregistrement et l&#39;URL d&#39;inscription. Jeton reçu\n  et URL DEVRAIT être retourné au client. Au cours de cette étape, si le périphérique reçoit un autre appel pour\n  initialiser l&#39;enregistrement, il devrait:"},{"id":"text-62","heading":"Text","content":"Si c’est le même utilisateur qui a commencé l’enregistrement, supprimez toutes les données précédentes (le cas échéant) et démarrez le système.\n    un nouveau processus d&#39;inscription.\nS&#39;il s&#39;agit d&#39;un utilisateur différent, retourne une erreur device_busy et un délai d&#39;attente de 30 secondes."},{"id":"text-63","heading":"Text","content":"Processus d&#39;inscription complet.\nUne fois que le client a réclamé le périphérique, il doit lui notifier son achèvement.\n  enregistrement. Une fois le processus d&#39;enregistrement terminé, l&#39;appareil doit envoyer une mise à jour.\n  annonce, y compris l&#39;ID de périphérique nouvellement acquis.\nRemarque: lorsque le périphérique traite un appel d&#39;API / privet / register, aucune autre API / privet / register\n  les appels peuvent être traités simultanément. Le périphérique DOIT retourner l&#39;erreur device_busy et 30 secondes\n  temps libre.\nLa confirmation de l&#39;utilisateur pour l&#39;enregistrement sur l&#39;appareil est fortement recommandée. Si mis en œuvre, le\n  le périphérique DOIT attendre la confirmation de l&#39;utilisateur APRÈS qu&#39;il reçoive un / privet / register? action = start API\n  appel. Le client appellera / privet / register? Action = getClaimToken pour savoir quand\n  la confirmation de l&#39;utilisateur est terminée et le jeton de réclamation est disponible. Si l&#39;utilisateur annule son inscription le\n  l&#39;appareil (par exemple, appuie sur le bouton Annuler), l&#39;erreur user_cancel DOIT être renvoyée. Si l&#39;utilisateur\n  l’enregistrement n’a pas été confirmé dans un certain délai, l’erreur confirmation_timeout DOIT être\n  revenu. Voir la section des valeurs par défaut pour plus de détails.\n4.3.1. Contribution\nL&#39;API / privet / register a les paramètres d&#39;entrée suivants:"},{"id":"text-64","heading":"Text","content":"Nom\nValeur"},{"id":"text-65","heading":"Text","content":"action\nPeut être l&#39;un des suivants:\n    début &#8211; pour commencer le processus d&#39;inscription\n    getClaimToken &#8211; récupérer le jeton de réclamation pour le périphérique\n    Annuler &#8211; annuler le processus d&#39;inscription\n    Achevée &#8211; terminer le processus d&#39;inscription"},{"id":"text-66","heading":"Text","content":"utilisateur\nEmail de l&#39;utilisateur qui réclamera cet appareil."},{"id":"text-67","heading":"Text","content":"Le périphérique DOIT vérifier que l’adresse électronique de toutes les actions (start, getClaimToken, annuler,\n  complète) correspond.\n4.3.2. Revenir\nL&#39;API / privet / register renvoie les données suivantes:"},{"id":"text-68","heading":"Text","content":"Nom de la valeur\nType de valeur\nLa description"},{"id":"text-69","heading":"Text","content":"action\nchaîne\nMême action que dans le paramètre d&#39;entrée."},{"id":"text-70","heading":"Text","content":"utilisateur\nchaîne (optionnel)\nMême utilisateur que dans le paramètre d&#39;entrée (peut être manquant, si\n    omis dans l&#39;entrée)."},{"id":"text-71","heading":"Text","content":"jeton\nchaîne (optionnel)\nJeton d&#39;inscription (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;)."},{"id":"text-72","heading":"Text","content":"claim_url\nchaîne (optionnel)\nURL d&#39;enregistrement (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;). Pour les imprimantes en nuage, il faut\n    être &quot;complete_invite_url&quot; reçu du serveur."},{"id":"text-73","heading":"Text","content":"automation_claim_url\nchaîne (optionnel)\nURL d&#39;enregistrement (obligatoire pour\n    Réponse &quot;getClaimToken&quot;, omise pour &quot;démarrer&quot;, &quot;complète&quot;, &quot;annuler&quot;). Pour les imprimantes en nuage, il faut\n    être &quot;automatic_invite_url&quot; reçu du serveur."},{"id":"text-74","heading":"Text","content":"Reference de l&#39;appareil\nchaîne (optionnel)\nNouvel identifiant d&#39;appareil (omis pour la réponse &quot;start&quot;,\n    obligatoire pour &quot;complet&quot;)."},{"id":"text-75","heading":"Text","content":"Le périphérique DOIT retourner son identifiant de périphérique dans la réponse de l&#39;API / privet / info UNIQUEMENT après l&#39;enregistrement.\n  Achevée.\nExemple 1:"},{"id":"text-76","heading":"Text","content":"        &quot;action&quot;: &quot;start&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,"},{"id":"text-77","heading":"Text","content":"Exemple 2:"},{"id":"text-78","heading":"Text","content":"        &quot;action&quot;: &quot;getClaimToken&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;claim_url&quot;: &quot;https://domain.com/SoMeUrL&quot;,"},{"id":"text-79","heading":"Text","content":"Exemple 3:"},{"id":"text-80","heading":"Text","content":"        &quot;action&quot;: &quot;complet&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;device_id&quot;: &quot;11111111-2222-3333-4444-555555555555&quot;,"},{"id":"text-81","heading":"Text","content":"4.3.3. les erreurs\nL&#39;API / privet / register peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):"},{"id":"text-82","heading":"Text","content":"Erreur\nLa description"},{"id":"text-83","heading":"Text","content":"device_busy\nLe périphérique est occupé et ne peut pas effectuer l’action demandée. Recommencez\n    après timeout."},{"id":"text-84","heading":"Text","content":"waiting_user_action\nEn réponse à &quot;getClaimToken&quot;, cette erreur indique que le\n    le périphérique est toujours en attente de confirmation de l&#39;utilisateur, et la requête &quot;getClaimToken&quot; doit être réessayée après\n    temps libre."},{"id":"text-85","heading":"Text","content":"user_cancel\nL&#39;utilisateur a explicitement annulé le processus d&#39;inscription depuis l&#39;appareil."},{"id":"text-86","heading":"Text","content":"confirmation_timeout\nLa confirmation de l&#39;utilisateur expire."},{"id":"text-87","heading":"Text","content":"invalide_action\nUne action invalide est appelée. Par exemple, si le client appelé\n    action = terminé avant d&#39;appeler action = start et action = getClaimToken."},{"id":"text-88","heading":"Text","content":"parent_invalide\nParamètres non valides spécifiés dans la demande. (Paramètres inconnus\n    doit être ignoré pour une compatibilité future). Par exemple, renvoyez ceci si le client\n    appelé action = inconnu ou utilisateur =."},{"id":"text-89","heading":"Text","content":"device_config_error\nLa date / heure (ou certains autres paramètres) est incorrecte sur l&#39;appareil\n    côté. L&#39;utilisateur doit aller (sur le site Web interne du périphérique) et configurer les paramètres du périphérique."},{"id":"text-90","heading":"Text","content":"hors ligne\nL’appareil est actuellement hors ligne et ne peut pas communiquer avec le serveur."},{"id":"text-91","heading":"Text","content":"erreur du serveur\nErreur du serveur pendant le processus d&#39;inscription."},{"id":"text-92","heading":"Text","content":"invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la requête."},{"id":"text-93","heading":"Text","content":"Le périphérique DOIT cesser d’exposer l’API / privet / register une fois l’enregistrement effectué avec succès.\n  terminé. Si le périphérique n&#39;expose pas l&#39;API / privet / register, il DOIT renvoyer l&#39;erreur HTTP 404.\n  Par conséquent, si un périphérique est déjà enregistré, l&#39;appel de cette API DOIT renvoyer 404. Si le\n  L&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l&#39;erreur HTTP 400.\n4.4. / privet / accesstoken API\n/ privet / accesstoken API est FACULTATIF. C&#39;est une requête HTTP GET. / privet / accesstoken API DOIT vérifier\npour un en-tête &quot;X-Privet-Token&quot; valide. Le périphérique DOIT implémenter cette API sur le\n&quot;/ privet / accesstoken&quot; url:\nGET / privet / accesstoken HTTP / 1.1\nLorsque le périphérique reçoit l&#39;appel de l&#39;API / accesstoken, il doit appeler le serveur pour récupérer le\n  jeton d&#39;accès pour l&#39;utilisateur donné et renvoyer le jeton au client. Le client utilisera ensuite le\n  jeton d&#39;accès pour accéder à cet appareil via le cloud.\nLes périphériques Cloud Print DOIVENT appeler l&#39;API suivante:\n/ cloudprint / proximitétoken\net passez les paramètres &quot;printerid =&quot; et &quot;user&quot; du local\nAPI. En cas de succès, la réponse du serveur contiendra l&#39;objet suivant:"},{"id":"text-94","heading":"Text","content":"&quot;proximité_token&quot;: \n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;expires_in&quot;: 600"},{"id":"text-95","heading":"Text","content":"Les périphériques Cloud Print DOIVENT transmettre la valeur de l’objet &quot;proximité_token&quot; dans la réponse.\naux appels d’API locaux / privet / accesstoken. Il est plus avantageux (à l’avenir) que l’appareil puisse\npasse TOUS les paramètres (y compris ceux qui ne sont pas décrits dans cette spécification).\n4.4.1. Contribution\nL&#39;API / privet / accesstoken a les paramètres d&#39;entrée suivants:"},{"id":"text-96","heading":"Text","content":"Nom\nValeur"},{"id":"text-97","heading":"Text","content":"utilisateur\nEmail de l&#39;utilisateur qui a eu l&#39;intention d&#39;utiliser ce jeton d&#39;accès. Peut être vide dans le\n    demande."},{"id":"text-98","heading":"Text","content":"4.4.2. Revenir\n/ privet / accesstoken L&#39;API renvoie les données suivantes:"},{"id":"text-99","heading":"Text","content":"Nom de la valeur\nType de valeur\nLa description"},{"id":"text-100","heading":"Text","content":"jeton\nchaîne\nJeton d&#39;accès renvoyé par le serveur"},{"id":"text-101","heading":"Text","content":"utilisateur\nchaîne\nMême utilisateur que dans le paramètre d&#39;entrée."},{"id":"text-102","heading":"Text","content":"expire dans\nint\nNombre de secondes jusqu&#39;à l&#39;expiration de ce jeton. Reçu de\n    le serveur et passé dans cette réponse."},{"id":"text-103","heading":"Text","content":"Exemple:"},{"id":"text-104","heading":"Text","content":"        &quot;jeton&quot;: &quot;AAA111222333444555666777&quot;,\n        &quot;utilisateur&quot;: &quot;utilisateur@domaine.com&quot;,\n        &quot;expires_in&quot;: 600"},{"id":"text-105","heading":"Text","content":"4.4.3. les erreurs\nL&#39;API / privet / accesstoken peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):"},{"id":"text-106","heading":"Text","content":"Erreur\nLa description"},{"id":"text-107","heading":"Text","content":"hors ligne\nL&#39;appareil est actuellement hors ligne et ne peut pas parler au serveur."},{"id":"text-108","heading":"Text","content":"accès refusé\nDroits insuffisants. Accès refusé. L&#39;appareil doit renvoyer cette\n    erreur lorsque la demande a été explicitement refusée par le serveur."},{"id":"text-109","heading":"Text","content":"parent_invalide\nParamètres non valides spécifiés dans la demande. (Paramètres inconnus\n    doit être ignoré pour une compatibilité future). Par exemple, si le client appelé\n    / accesstoken? user = ou / accesstoken."},{"id":"text-110","heading":"Text","content":"erreur du serveur\nErreur du serveur."},{"id":"text-111","heading":"Text","content":"invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la demande."},{"id":"text-112","heading":"Text","content":"Si le périphérique n&#39;expose pas l&#39;API / privet / accesstoken, il DOIT renvoyer l&#39;erreur HTTP 404. Si la\n  L&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l&#39;erreur HTTP 400.\n4.5 / privet / API de capacités\n/ privet / features est facultatif. C&#39;est une requête HTTP GET. / privet / functions API DOIT vérifier\npour un en-tête &quot;X-Privet-Token&quot; valide. Le périphérique DOIT implémenter cette API sur\nURL &quot;/ privet / capacités&quot;:\nGET / privet / capacités HTTP / 1.1\nLorsque le périphérique reçoit / appel de l&#39;API de fonctionnalités, si le périphérique est capable, il DEVRAIT contacter\nle serveur pour obtenir des capacités mises à jour. Par exemple, si une imprimante prend en charge la publication d&#39;un travail d&#39;impression\n(reçu localement) à travers le service Cloud Print, il devrait renvoyer les fonctionnalités que le\nLe service d&#39;impression en nuage reviendrait. Cloud Print dans ce cas peut altérer l&#39;imprimante d&#39;origine\nfonctions en ajoutant de nouvelles fonctionnalités avant d’envoyer le travail à l’imprimante. Le plus\nLe cas courant est une liste de types de documents pris en charge. Si l&#39;imprimante est hors ligne, elle devrait renvoyer\ntypes de documents qu&#39;il prend en charge. Cependant, si l&#39;imprimante est en ligne et enregistrée auprès de Cloud Print it\nDOIT retourner &quot;* / *&quot; parmi les types pris en charge. Le service Cloud Print sera exécuté\nla conversion nécessaire dans ce cas. Pour l’impression hors ligne, l’imprimante DOIT prendre en charge au moins la\nformat &quot;image / pwg-raster&quot;.\n4.5.1. Contribution\nL&#39;API / privet / functions a les paramètres d&#39;entrée suivants:"},{"id":"text-113","heading":"Text","content":"Nom\nValeur"},{"id":"text-114","heading":"Text","content":"hors ligne\n(facultatif) Ne peut être que &quot;hors ligne = 1&quot;. Dans ce cas, l&#39;appareil doit retourner\n    capacités pour une utilisation hors connexion (si elles sont différentes des capacités &quot;en ligne&quot;)."},{"id":"text-115","heading":"Text","content":"4.5.2. Revenir\nL&#39;API / privet / features renvoie les fonctionnalités de périphérique dans le fichier JSON CDD (Cloud Device Description)\nformat (voir le document CDD pour plus de détails). Les imprimantes au minimum DOIVENT renvoyer une liste des types pris en charge\nici. Par exemple, une imprimante Cloud Ready actuellement en ligne peut renvoyer quelque chose comme ceci (à\nle minimum):"},{"id":"text-116","heading":"Text","content":"        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;imprimante&quot;: \n                &quot;supported_content_type&quot;: [\n                        \n                                \"content_type\": \"application/pdf\",\n                                \"min_version\": \"1.4\"\n                        ,\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" ,\n                         \"content_type\": \"*/*\" \n                ]"},{"id":"text-117","heading":"Text","content":"et quand il est déconnecté du serveur, il peut retourner:"},{"id":"text-118","heading":"Text","content":"        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;imprimante&quot;: \n                &quot;supported_content_type&quot;: [\n                        \n                                \"content_type\": \"application/pdf\",\n                                \"min_version\": \"1.4\"\n                        ,\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" \n                ]"},{"id":"text-119","heading":"Text","content":"Remarque: Les imprimantes expriment la priorité du type de contenu pris en charge en utilisant la commande. Pour\n  Par exemple, dans les exemples ci-dessus, l’imprimante indique qu’elle préfère les données &quot;application / pdf&quot; à\n  &quot;image / pwg-raster&quot; et &quot;image / jpeg&quot;. Les clients doivent respecter les priorités des imprimantes si possible\n  (voir le document CDD pour plus de détails).\n4.5.3. les erreurs\nL&#39;API / privet / features peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):"},{"id":"text-120","heading":"Text","content":"Erreur\nLa description"},{"id":"text-121","heading":"Text","content":"invalid_x_privet_token\nX-Privet-Token est invalide ou vide dans la requête."},{"id":"text-122","heading":"Text","content":"Si le périphérique n&#39;expose pas l&#39;API / privet / features, il DOIT renvoyer HTTP 404.\n  Erreur. Si l&#39;en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer une erreur HTTP 400.\n4.6. les erreurs\nLes erreurs sont renvoyées par les API ci-dessus au format suivant:"},{"id":"text-123","heading":"Text","content":"Nom de la valeur\nType de valeur\nLa description"},{"id":"text-124","heading":"Text","content":"Erreur\nchaîne\nType d&#39;erreur (défini par API)"},{"id":"text-125","heading":"Text","content":"la description\nchaîne (optionnel)\nDescription lisible par l&#39;homme de l&#39;erreur."},{"id":"text-126","heading":"Text","content":"server_api\nchaîne (optionnel)\nEn cas d&#39;erreur de serveur, ce champ contient\n    l&#39;API du serveur qui a échoué."},{"id":"text-127","heading":"Text","content":"code_serveur\nint (facultatif)\nEn cas d&#39;erreur de serveur, ce champ contient\n    ce code d&#39;erreur que le serveur a renvoyé."},{"id":"text-128","heading":"Text","content":"code_http_serveur\nint (facultatif)\nEn cas d&#39;erreur HTTP du serveur, ce champ\n    contient le code d&#39;erreur HTTP serveur renvoyé."},{"id":"text-129","heading":"Text","content":"temps libre\nint (facultatif)\nNombre de secondes que le client attend avant\n    nouvelle tentative (pour les erreurs récupérables uniquement). Le client DOIT randomiser le délai d’expiration réel de cette valeur sur\n    une valeur de + 20%."},{"id":"text-130","heading":"Text","content":"Toutes les API DOIVENT renvoyer une erreur HTTP 400 si l&#39;en-tête X-Privet-Token est manquant.\nHTTP / 1.1 400 En-tête X-Privet-Token manquant.\nExemple 1:"},{"id":"text-131","heading":"Text","content":"        &quot;erreur&quot;: &quot;erreur_serveur&quot;,\n        &quot;description&quot;: &quot;Service indisponible&quot;,\n        &quot;server_api&quot;: &quot;/ submit&quot;,\n        &quot;code_http_serveur&quot;: 503"},{"id":"text-132","heading":"Text","content":"Exemple 2:"},{"id":"text-133","heading":"Text","content":"        &quot;error&quot;: &quot;printer_busy&quot;,\n        &quot;description&quot;: &quot;L&#39;imprimante est en train d&#39;imprimer un autre travail&quot;,\n        &quot;timeout&quot;: 15"},{"id":"text-134","heading":"Text","content":"5. API d&#39;imprimante\nL&#39;un des types de périphérique pris en charge par ce protocole est le type imprimante. Les appareils supportant ce type PEUVENT\n  implémenter certaines fonctionnalités spécifiques aux imprimantes. Idéalement, l’impression sur des imprimantes prêtes au cloud\n  passer par un serveur Cloud Print:"},{"id":"text-135","heading":"Text","content":"Dans certains cas, un client peut avoir besoin d’envoyer un document localement. Cela peut être nécessaire lorsque le client ne le fait pas\n  avoir un identifiant Google ou est incapable de parler au serveur Cloud Print. Dans ce cas, le travail d&#39;impression sera\n  être soumis localement à l&#39;imprimante. L’imprimante utilisera à son tour le service Cloud Print pour\n  mise en file d&#39;attente et conversion. L’imprimante republiera le travail soumis localement sur le Cloud. Print\n  service, puis demandez-le, car il a été envoyé via le cloud. Ce processus fournira une\n  expérience utilisateur flexible en termes de service (conversion) et de gestion / suivi des travaux d&#39;impression."},{"id":"text-136","heading":"Text","content":"Since the Cloud Print service implements conversion, the printer SHOULD advertise supporting all\n  input formats (&quot;*/*&quot;) among the list of the supported content types:"},{"id":"text-137","heading":"Text","content":"        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;printer&quot;: \n                &quot;supported_content_type&quot;: [\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"*/*\" \n                ]"},{"id":"text-138","heading":"Text","content":"In some cases a completely offline solution is desired. Since printers support a limited number\n  of input formats, a client will need to convert documents to a few natively supported printer\n  formats."},{"id":"text-139","heading":"Text","content":"This spec REQUIRES all printers to support at least the PWG Raster (&quot;image/pwg-raster&quot;) format\n  for the offline printing case. A printer may support other formats (for example JPEG) and if a\n  client supports it, it may send documents in that format. The printer MUST expose supported types\n  through the /capabilities API, for example:"},{"id":"text-140","heading":"Text","content":"        &quot;version&quot;: &quot;1.0&quot;,\n        &quot;printer&quot;: \n                &quot;supported_content_type&quot;: [\n                         \"content_type\": \"image/pwg-raster\" ,\n                         \"content_type\": \"image/jpeg\" \n                ]"},{"id":"text-141","heading":"Text","content":"There are two ways a client may initiate printing over the local network.\nSimple printing &#8211; client sends the document over the local network to /submitdoc API\n  (without specifying the job_id parameter). The submitted document will be printed using default\n  print ticket settings and no print job statuses are needed. If the printer ONLY supports this type\n  of printing, it MUST advertise ONLY /submitdoc API in the /privet/info API response."},{"id":"text-142","heading":"Text","content":"&quot;api&quot;: [\n        \"/privet/accesstoken\",\n        \"/privet/capabilities\",\n        \"/privet/printer/submitdoc\",\n]"},{"id":"text-143","heading":"Text","content":"Advanced printing &#8211; client should first create a print job on the printer by calling the\n  /privet/printer/createjob API with a valid CJT job ticket in the request. The printer\n  MUST store the print ticket in memory and return a job_id back to the client. Then the client will\n  call the /printer/submitdoc API and specify the previously received job_id. At that time\n  the printer will start printing. The client will poll the printer for print job status by calling\n  le /privet/printer/jobstate API.\nIn a multi-client environment, there is no guarantee how this API is called. It is possible for\n  one client to call /createjob between another client’s /createjob-&gt;/submitdoc\n  calls. To eliminate possible deadlocks and improve usability, we recommended having a small queue\n  of pending print jobs on the printer (at least 3-5):"},{"id":"text-144","heading":"Text","content":"/createjob takes the first available spot in the queue.\nJob lifetime (in the queue) is at least 5 minutes.\nIf all spots in the queue are taken, then the oldest, non-printing job shall be removed and a\n    new one will be placed there.\nIf there is a print job currently printing on the device (simple or advanced printing),\n    /submitdoc should return status busy and propose a timeout to retry this print job.\nSi /submitdoc refers to a job that has been removed from the queue (due to\n    replacement or timeout), the printer should return an error invalid_print_job et le\n    client will retry the process from the /createjob step. The client MUST wait for a\n    random timeout period of up to 5 seconds before retrying."},{"id":"text-145","heading":"Text","content":"If memory constraints prevent storing multiple pending jobs on the device, it is possible to have\n  a queue of 1 print job long. It should still follow the same protocol as above. After a job has\n  completed or failed with an error, the printer should store information about the job’s\n  status for at least 5 minutes. The queue size for storing completed job statuses should be at\n  least 10. If there are more job statuses that need to be stored, the oldest one may be removed\n  from the queue before the 5 minute timeout.\nRemarque: For now clients will poll for job status. In the future, we may require\n  the printer to send TXT DNS notification when ANY print job status has changed.\n5.1. /privet/printer/createjob API\n/privet/printer/createjob API is OPTIONAL (see Simple Printing above). It is an HTTP POST\n  request. /privet/printer/createjob API MUST check for a valid &quot;X-Privet-Token&quot; header.\n  The device MUST implement this API on &quot;/privet/printer/createjob&quot; url:\nPOST /privet/printer/createjob HTTP/1.1\nWhen receiving /privet/printer/createjob API call, the printer MUST create a new print job ID, store\nthe received print ticket in the CJT format, and return print job id back to the client.\n5.1.1. Input\n/privet/printer/createjob API has no input parameters in URL. The request body should contain the\nprint job ticket data in CJT format.\n5.1.2. Return\n/privet/printer/createjob API returns the following data:"},{"id":"text-146","heading":"Text","content":"Value name\nValue type\nLa description"},{"id":"text-147","heading":"Text","content":"job_id\nchaîne\nID of the newly created print job."},{"id":"text-148","heading":"Text","content":"expires_in\nint\nNumber of seconds this print job is valid."},{"id":"text-149","heading":"Text","content":"Exemple:"},{"id":"text-150","heading":"Text","content":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;expires_in&quot;: 600"},{"id":"text-151","heading":"Text","content":"5.1.3. les erreurs\n/privet/printer/createjob API may return the following errors (see Errors section for details):"},{"id":"text-152","heading":"Text","content":"Erreur\nLa description"},{"id":"text-153","heading":"Text","content":"invalid_ticket\nSubmitted print ticket is invalid."},{"id":"text-154","heading":"Text","content":"printer_busy\nPrinter is busy and can’t currently process /createjob. Recommencez\n    after timeout."},{"id":"text-155","heading":"Text","content":"printer_error\nPrinter is in error state and requires user interaction to fix it.\n    Description should contain more detailed explanation (e.g. &quot;Paper jam in Tray 1&quot;)."},{"id":"text-156","heading":"Text","content":"invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request."},{"id":"text-157","heading":"Text","content":"If device is not exposing /privet/printer/createjob it MUST return HTTP 404 error. Si\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\n5.2. /privet/printer/submitdoc API\n/privet/printer/submitdoc API is REQUIRED to implement printing over a local network (offline or\nrepost to Cloud Print). It is an HTTP  POST request. /privet/printer/submitdoc API MUST check for a\nvalid &quot;X-Privet-Token&quot; header. The device MUST implement this API on\n&quot;/privet/printer/submitdoc&quot; url:\nPOST /privet/printer/submitdoc HTTP/1.1\nWhen receiving the /privet/printer/submitdoc API call, the printer should start printing. If it is\nunable to begin printing, it MUST return the error printer_busy and a recommended timeout period for\nthe client to wait before trying again.\nIf the printer is not able to hold all of the data in its internal buffer, it SHOULD use TCP\n  mechanisms to slow down data transfer until it prints a portion of the document, making part of\n  the buffer available again. (For example, the printer may set windowsize=0 on TCP layers, which\n  will make the client wait.)\nSubmitting a document to the printer may take a significant amount of time. The client should be\n  able to check the state of the printer and job (advanced printing) while printing is in progress.\n  In order to do that, the printer MUST allow the client to call the /privet/info and\n  /privet/printer/jobstate APIs while processing /privet/printer/submitdoc API calls. Il est\n  recommended for all clients to start a new thread to execute the /privet/printer/submitdoc API\n  call, so that the main thread can use the /privet/info and /privet/printer/jobstate APIs to check\n  printer and job states.\nRemarque: Upon completion or abortion of the local print job, it is strongly\n  recommended (and will be required in a future version of this spec) to report the final state of\n  the job to the /cloudprint/submit interface for accounting and user experience purposes. le\n  parameters &quot;printerid&quot;, &quot;title&quot;, &quot;contentType&quot; and &quot;final_semantic_state&quot; (in\n  PrintJobState format) are required, and the parameters &quot;tag&quot; (repeated\n  parameter) and &quot;ticket&quot; (the ticket of the job in CloudJobTicket format).\n  Note that the provided PrintJobState must actually be final, i.e. its type must be DONE or\n  ABORTED, and a cause must be provided in the case that it is ABORTED (see\n  JobState for details). Also note that this use of the\n  /cloudprint/submit interface to report local print jobs is not mentioned in\n  its specification because that section is intended to describe\n  the interface&#39;s primary use: submitting a print job with the document to print provided in the\n  &quot;content&quot; parameter.\n5.2.1. Input\n/privet/printer/submitdoc API has the following input parameters:"},{"id":"text-158","heading":"Text","content":"Name\nValeur"},{"id":"text-159","heading":"Text","content":"job_id\n(optional) Print job id. May be omitted for simple printing case\n    (voir au dessus). Must match the one returned by the printer."},{"id":"text-160","heading":"Text","content":"user_name\n(optional) Human readable user name. This is not definitive, and should\n    only be used for print job annotations. If job is re-posted to the Cloud Print service this\n    string should be attached to the Cloud Print job."},{"id":"text-161","heading":"Text","content":"client_name\n(optional) Name of the client application making this request. Pour\n    display purposes only. If job is re-posted to the Cloud Print service this string should be\n    attached to the Cloud Print job."},{"id":"text-162","heading":"Text","content":"job_name\n(optional) Name of the print job to be recorded. If job is re-posted to\n    the Cloud Print service this string should be attached to the Cloud Print job."},{"id":"text-163","heading":"Text","content":"offline\n(optional) Could only be &quot;offline=1&quot;. In this case printer should\n    only try printing offline (no re-post to Cloud Print server)."},{"id":"text-164","heading":"Text","content":"Request body should contain a valid document for printing. &quot;Content-Length&quot; should\n  include the correct length of the request. &quot;Content-Type&quot; header should be set to\n  document MIME type and match one of the types in the CDD (unless CDD specifies &quot;*/*&quot;). \nClients are HIGHLY recommended to provide a valid user name (or email), a client name and a job\n  name with this request. Those fields are only used in UIs to improve user experience.\n5.2.2. Return\n/privet/printer/submitdoc API returns following data:"},{"id":"text-165","heading":"Text","content":"Value name\nValue type\nLa description"},{"id":"text-166","heading":"Text","content":"job_id\nchaîne\nID of the newly created print job (simple printing) or\n    job_id specified in the request (advanced printing)."},{"id":"text-167","heading":"Text","content":"expires_in\nint\nNumber of seconds this print job is valid."},{"id":"text-168","heading":"Text","content":"job_type\nchaîne\nContent-type of the submitted document."},{"id":"text-169","heading":"Text","content":"job_size\nint 64 bit\nSize of the print data in bytes."},{"id":"text-170","heading":"Text","content":"job_name\nchaîne\n(optional) Same job name as in input (if any)."},{"id":"text-171","heading":"Text","content":"Exemple:"},{"id":"text-172","heading":"Text","content":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;expires_in&quot;: 500,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;"},{"id":"text-173","heading":"Text","content":"5.2.3. les erreurs\n/privet/printer/submitdoc API may return the following errors (see Errors section for details):"},{"id":"text-174","heading":"Text","content":"Erreur\nLa description"},{"id":"text-175","heading":"Text","content":"invalid_print_job\nInvalid/expired job id is specified in the request. Retry after\n    timeout."},{"id":"text-176","heading":"Text","content":"invalid_document_type\nDocument MIME-type is not supported by the printer."},{"id":"text-177","heading":"Text","content":"invalid_document\nSubmitted document is invalid."},{"id":"text-178","heading":"Text","content":"document_too_large\nDocument exceeds maximum size allowed."},{"id":"text-179","heading":"Text","content":"printer_busy\nPrinter is busy and can’t currently process document. Recommencez\n    after timeout."},{"id":"text-180","heading":"Text","content":"printer_error\nPrinter is in error state and requires user interaction to fix it.\n    Description should contain more detailed explanation (e.g. &quot;Paper jam in Tray 1&quot;)."},{"id":"text-181","heading":"Text","content":"invalid_params\nInvalid parameters specified in the request. (Unknown parameters\n    should be safely ignored for future compatibility)"},{"id":"text-182","heading":"Text","content":"user_cancel\nUser explicitly cancelled printing process from the device."},{"id":"text-183","heading":"Text","content":"server_error\nPosting document to Cloud Print has failed."},{"id":"text-184","heading":"Text","content":"invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request."},{"id":"text-185","heading":"Text","content":"If the device is not exposing /privet/printer/submitdoc, it MUST return HTTP 404 error. Si la\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\nRemarque: /privet/printer/submitdoc API may require special handling on printer\n  side (because of the large payload attached). In some cases (depends on the printer HTTP server\n  implementation and platform), printer may close socket BEFORE returning HTTP error. In other,\n  printer may return 503 error (instead of Privet error). Printers SHOULD try as much as possible to\n  return Privet. However, every client implementing Privet specification SHOULD be able to handle\n  socket close (no HTTP error) and 503 HTTP error cases for /privet/printer/submitdoc API. Dans ce\n  case, client SHOULD handle it as a Privet &quot;printer_busy&quot; error with\n  &quot;timeout&quot; set to 15 seconds. To avoid infinite retries, client may stop retrying after\n  a reasonable number of attempts (for example, 3).\n5.3. /privet/printer/jobstate API\n/privet/printer/jobstate API is OPTIONAL (see Simple Printing above). It is an HTTP GET request.\n/privet/printer/jobstate API MUST check for a valid &quot;X-Privet-Token&quot; header. The device\nMUST implement this API on &quot;/privet/printer/jobstate&quot; url:\nGET /privet/printer/jobstate HTTP/1.1\nWhen receiving a /privet/printer/jobstate API call, a printer should return the status of the\nrequested print job or invalid_print_job error.\n5.3.1. Input\n/privet/printer/jobstate API has following input parameters:"},{"id":"text-186","heading":"Text","content":"Name\nValeur"},{"id":"text-187","heading":"Text","content":"job_id\nPrint job ID to return status for."},{"id":"text-188","heading":"Text","content":"5.3.2. Return\n/privet/printer/jobstate API returns the following data:"},{"id":"text-189","heading":"Text","content":"Value name\nValue type\nLa description"},{"id":"text-190","heading":"Text","content":"job_id\nchaîne\nPrint job id there status information is for."},{"id":"text-191","heading":"Text","content":"state\nchaîne\ndraft &#8211; print job has been created on the device (no\n    /privet/printer/submitdoc calls have been received yet).\n    queued &#8211; print job has been received and queued, but printing has not started yet.\n    in_progress &#8211; print job is in the progress of printing.\n    stopped &#8211; print job has been paused, but can be restarted manually or automatically.\n    terminé &#8211; print job is done.\n    aborted &#8211; print job failed."},{"id":"text-192","heading":"Text","content":"la description\nchaîne\n(optional) Human readable description of the print job\n    status. Should include additional information if statestopped or\n    aborted. le semantic_state field usually provides better and more meaningful\n    description to the client."},{"id":"text-193","heading":"Text","content":"expires_in\nint\nNumber of seconds this print job is valid."},{"id":"text-194","heading":"Text","content":"job_type\nchaîne\n(optional) Content-type of the submitted document."},{"id":"text-195","heading":"Text","content":"job_size\nint 64 bit\n(optional) Size of the print data in bytes."},{"id":"text-196","heading":"Text","content":"job_name\nchaîne\n(optional) Same job name as in input (if any)."},{"id":"text-197","heading":"Text","content":"server_job_id\nchaîne\n(optional) ID of the job returned from the server (if\n    job has been posted to Cloud Print service). Omitted for offline printing."},{"id":"text-198","heading":"Text","content":"semantic_state\nJSON\n(optional) Semantic state of the job in\n    PrintJobState format."},{"id":"text-199","heading":"Text","content":"Example (printing by reporting through Cloud Print):"},{"id":"text-200","heading":"Text","content":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;in_progress&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;server_job_id&quot;: &quot;1111-2222-3333-4444&quot;"},{"id":"text-201","heading":"Text","content":"Example (offline printing error):"},{"id":"text-202","heading":"Text","content":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;stopped&quot;,\n        &quot;description&quot;: &quot;Out of paper&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;"},{"id":"text-203","heading":"Text","content":"Example (print job aborted by the user):"},{"id":"text-204","heading":"Text","content":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;aborted&quot;,\n        &quot;description&quot;: &quot;User action&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: 123456,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;semantic_state&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;state&quot;: \n                        &quot;type&quot;: &quot;ABORTED&quot;,\n                        &quot;user_action_cause&quot;: &quot;action_code&quot;: &quot;CANCELLED&quot;\n                ,\n                &quot;pages_printed&quot;: 7\n        "},{"id":"text-205","heading":"Text","content":"Example (print job stopped due to out of paper). Notice the reference to the device state. le\nclient will need to call the /privet/info API to get more details about the device state:"},{"id":"text-206","heading":"Text","content":"        &quot;job_id&quot;: &quot;123&quot;,\n        &quot;state&quot;: &quot;stopped&quot;,\n        &quot;description&quot;: &quot;Out of paper&quot;,\n        &quot;expires_in&quot;: 100,\n        &quot;job_type&quot;: &quot;application/pdf&quot;,\n        &quot;job_size&quot;: &quot;123456&quot;,\n        &quot;job_name&quot;: &quot;My PDF document&quot;,\n        &quot;semantic_state&quot;: \n                &quot;version&quot;: &quot;1.0&quot;,\n                &quot;state&quot;: \n                        &quot;type&quot;: &quot;STOPPED&quot;,\n                        &quot;device_state_cause&quot;: &quot;error_code&quot;: &quot;INPUT_TRAY&quot;\n                ,\n                &quot;pages_printed&quot;: 7\n        "},{"id":"text-207","heading":"Text","content":"5.3.3. les erreurs\n/privet/printer/jobstate API may return the following errors (see Errors section for details):"},{"id":"text-208","heading":"Text","content":"Erreur\nLa description"},{"id":"text-209","heading":"Text","content":"invalid_print_job\nInvalid/expired job ID is specified in the request."},{"id":"text-210","heading":"Text","content":"server_error\nGetting print job status (for print jobs posted to Cloud Print) has\n    failed."},{"id":"text-211","heading":"Text","content":"invalid_x_privet_token\nX-Privet-Token is invalid or empty in the request."},{"id":"text-212","heading":"Text","content":"If device is not exposing /privet/printer/jobstate, it MUST return HTTP 404 error. Si la\n  X-Privet-Token header is missing, the device MUST return HTTP 400 error.\n6. Appendix\n6.1. Default behavior and settings\nThis section will explain the default behavior we expect from ALL Privet-compatible devices."},{"id":"text-213","heading":"Text","content":"Out-of-the-box devices should support only /privet/info et\n    /privet/register APIs. All other APIs (e.g. /privet/accesstoken, local printing) should\n    be disabled.\nRegistration requires physical interaction with a device."},{"id":"text-214","heading":"Text","content":"User MUST take a physical action on the device (e.g., pressing a button) to confirm their\n      access to the device. \nAfter the user takes the action noted above, the printer should send the\n      /cloudprint/register request. It should not send this request until after the action is taken\n      (see Sequence Diagram 1).\nIf the device is processing a /privet/register request (for instance, waiting on the action\n      above), it must reject all other /privet/register requests. The device MUST return the\n      device_busy error in this case.\nThe device should timeout any /register request that does not receive the physical action\n      mentioned above within 60 seconds. The device MUST return the confirmation_timeout error in\n      this case.\nOptional: Recommended but not required, the following may improve user experience:"},{"id":"text-215","heading":"Text","content":"The printer might flash a light or its screen to indicate that the user needs to take an\n        action to confirm registration.\nThe printer might state on its screen that ‘it is being registered to Google Cloud\n        Print for user ‘abc@def.com’ &#8211; press OK to\n        continue’, where abc@def.com  is the user\n        parameter from the /register API call. This would make it clearer to a user that:"},{"id":"text-216","heading":"Text","content":"it is their registration request that s/he is confirming\nwhat is happening if s/he didn’t trigger the request."},{"id":"text-217","heading":"Text","content":"In addition to a physical action to confirm from the printer (e.g., ‘Press the OK\n        button’), a printer may also offer the user a button to cancel the request (e.g.,\n        ‘Press Cancel to reject’). This would allow users who did not trigger the\n        registration request to cancel it before the 60 second timeout. The device MUST return the\n        user_cancel error in this case."},{"id":"text-218","heading":"Text","content":"Ownership transfers:"},{"id":"text-219","heading":"Text","content":"The device may be deleted explicitly from the Cloud service."},{"id":"text-220","heading":"Text","content":"If the device receives success, but no device description as a result of\n        /cloudprint/printer (for GCP) call, it MUST revert to default (out-of-the-box) mode. \nIf the device’s credentials no longer work (explicitly because of &quot;invalid\n        credentials&quot; response from the server), it MUST revert to default (out-of-the-box)\n        mode."},{"id":"text-221","heading":"Text","content":"Local factory reset MUST clear device’s credentials and set it to default state.\nOptional: The device may provide a menu item to clear credentials and put it into default\n      mode."},{"id":"text-222","heading":"Text","content":"Devices supporting XMPP notifications MUST include the ability to ping the server. The ping\n    timeout MUST be controllable from the server through &quot;local_settings&quot;.\nThe device may explicitly ping the server (/cloudprint/printer API for GCP, in addition to\n    XMPP pings)  no more often than once a day (24 hours) to make sure they are in sync. Il est\n    recommended to randomize the check window within 24-32 hour window.\nOptional: For Cloud Print devices, it is recommended but not required to have a manual way\n    (button) to allow the user to initiate a check for new print jobs from the device. Some printers\n    already have this.\nOptional. Enterprise printers may have an option to disable local discovery completely. Dans\n    such case, the device MUST update these local settings on the server. New local settings MUST be\n    empty (setting &quot;local_discovery&quot; to &quot;false&quot;, means that it can be\n    re-enabled from the GCP Service)."},{"id":"text-223","heading":"Text","content":"6.1.2 Default Registration Diagram"},{"id":"text-224","heading":"Text","content":"6.2. XSSI and XSRF attacks and prevention\nThis section will explain the possibility of XSSI and XSRF attacks on the device and how to protect\nfrom them (including token generation techniques).\nMore details are here:"},{"id":"text-225","heading":"Text","content":"http://googleonlinesecurity.blogspot.com/2011/05/website-security-for-webmasters.html\nNormally, XSSI and XSRF attacks are possible when a site is using cookie authentication\nmechanisms. While Google doesn’t use cookies with their Cloud Print Service, such attacks are\nstill possible. Local network access, by design, implicitly trusts requests.\n6.2.1. XSSI\nIt is possible for a malicious website to guess the IP address and port number of a\nPrivet-compatible device and to try to call the Privet API using &quot;src=&quot;http://developers.google.com/inside of a  tag:"},{"id":"text-226","heading":"Text","content":"Without protection, malicious websites would be able to execute API calls and access results.\nTo prevent this type of attack, ALL Privet API calls MUST require the\n&quot;X-Privet-Token&quot; header in the request. &quot;src=&quot;http://developers.google.com/script tags are\nnot able to add headers, effectively guarding against this type of attack.\n6.2.2. XSRF"},{"id":"text-227","heading":"Text","content":"http://en.wikipedia.org/wiki/Cross-site_request_forgery\nIt is possible for a malicious website to guess the IP address and port number of a\nPrivet-compatible device and try to call Privet API using an , forms, or some other\ncross-website loading mechanism. Attackers would not be able to access the results of the request,\nbut if the request would perform an action (e.g. printing), they could trigger it.\nTo prevent this attack, we require the following protection:"},{"id":"text-228","heading":"Text","content":"Leave /privet/info API open to XSRF\n/privet/info API MUST NOT perform any actions on the device\nUse /privet/info API to receive x-privet-token\nAll other APIs MUST check for a valid x-privet-token in &quot;X-Privet-Token&quot; header.\nx-privet-token SHOULD be valid for only 24 hours."},{"id":"text-229","heading":"Text","content":"Even if an attacker is able to execute the /privet/info API, they would not be able to\nread x-privet-token from the response and therefore would not be able to call any other API.\nIt is strongly recommended to generate the XSRF token using the following algorithm:\nXSRF_token = base64( SHA1(device_secret + DELIMITER + issue_timecounter) + DELIMITER + issue_timecounter )\nXSRF Token Generation Elements:"},{"id":"text-230","heading":"Text","content":"DELIMITER is a special character, usually ‘:’\nissue_timecounter is a number of seconds since some event (epoch for timestamp) or\n    device boot time (for CPU counters). issue_timecounter is constantly increasing when\n    the device is up and running (see token verification below).\nSHA1 &#8211; hash function using SHA1 algorithm\nbase64 &#8211; base64 encoding\ndevice_secret &#8211; secret specific to the device. Device secret MUST be updated on every\n    restart."},{"id":"text-231","heading":"Text","content":"Recommended ways to generate device secret:"},{"id":"text-232","heading":"Text","content":"Generate a new UUID on every restart\nGenerate a 64 bit random number on every restart"},{"id":"text-233","heading":"Text","content":"The device is not required to store all of the XSRF tokens it has issued. When the device needs\n  to verify a XSRF token for validity, it should base64-decode the token. Get the\n  issue_timecounter from the second half (cleartext), and try to produce SHA1 hash of\n  device_secret + DELIMITER + issue_timecounter où issue_timecounter is from\n  the token. If the newly generated SHA1 matches the one in the token, device must now check if the\n  issue_timecounter is within the validity period from (24 hours) of the current time\n  counter. To do so, device takes the current time counter (CPU counter for example) and subtracts\n  issue_timecounter à partir de cela. The result MUST be the number of seconds since token\n  issue.\nImportant: This is the recommended way to implement XSRF\n  protection. Clients of the Privet specification shall not try to understand XSRF token, instead\n  they shall treat is as a blackbox. Figure 6.2.3 illustrates a recommended way to implement the\n  X-Privet-Token and verification of a typical request.\n6.2.3 X-Privet Token Generation and Verification Sequence Diagram"},{"id":"text-234","heading":"Text","content":"6.3. Workflow diagrams\nThis section will illustrate a workflow in different cases.\n6.3.1. Printer out of the box workflow"},{"id":"text-235","heading":"Text","content":"6.3.2. Registered printer startup"},{"id":"text-236","heading":"Text","content":"6.3.3 XMPP notifications handling workflow"},{"id":"text-237","heading":"Text","content":"6.3.4. Check printer settings workflow"},{"id":"text-238","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":"https://tutos-gameserver.fr/wp-content/uploads/2019/10/google-blue.png"},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2019/10/13/privet-cloud-print-developpeurs-google-bien-choisir-son-serveur-d-impression/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/10/13/privet-cloud-print-developpeurs-google-bien-choisir-son-serveur-d-impression/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/10/13/privet-cloud-print-developpeurs-google-bien-choisir-son-serveur-d-impression/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}