Perili

Privet, bulut hizmetleri tarafından kullanılan bir Bulut Cihazı Yerel Keşif API'sıdır. Bu belge aşağıdaki bölümlerde düzenlenmiştir:

  1. Giriş: Privet'e giriş
  2. Keşif: Yerel keşif mekanizmaları
  3. Duyurular: Yerel keşif duyuruları
  4. API: Genel bulut cihazları için Privet API'leri
  5. Yazıcı API'si: Yazıcılar tarafından kullanılan Privet API'ları
  6. Ek: ek diyagramlar

1. Giriş

Buluta bağlı cihazların birçok avantajı vardır. Ekip, online dönüşüm hizmetlerini kullanabilir, cihaz internete bağlı değilken iş sıralarını barındırabilir ve dünyanın herhangi bir yerinden erişilebilir. Ancak, belirli bir kullanıcı tarafından erişilebilen birçok bulut cihazına sahip olduğumuz için, konuma göre en yakın cihazı bulmak amacıyla bir yöntem sağlamamız gerekir. Privet protokolünün amacı, cihazların yeni ortamlarda kolayca keşfedilebilmesi için bulut cihazlarının esnekliğini uygun bir yerel keşif mekanizmasıyla bağlamaktır.

Bu protokolün hedefleri şunlardır:
  • bulut cihazlarını yerel olarak bulunabilir hale getirme
  • bulut cihazları bir bulut hizmetiyle kaydettirme
  • kayıtlı cihazları bulut temsilleriyle ilişkilendirme
  • çevrimdışı işlevleri etkinleştir
  • küçük cihazların kullanabilmesi için uygulamayı basitleştirme

Privet protokolü iki ana bölümden oluşur: keşif ve API. Discovery, yerel ağdaki cihazı bulmak için kullanılır. API ise cihazla ilgili bilgi almak ve bazı işlemler gerçekleştirmek için kullanılır. Bu dokümanda, cihaz Privet protokolünü uygulayan bulut bağlantılı bir cihaza işaret etmektedir.

2. Discovery

Discovery, sıfır konferans tabanlı (mDNS + DNS-SD) bir protokoldür. Cihaz, IPv4 Bağlantı Yerel Adreslemesini UYGULAMALIDIR. Cihazın mDNS ve DNS-SD özelliklerine uygun olması ZORUNLUDUR.

Cihazın yukarıdaki özelliklere göre ad çakışmasını çözümlemesi ZORUNLUDUR.

2.1. Hizmet Türü

DNS Service Discovery, hizmet türleri için şu biçimi kullanır: _applicationprotocol._transportprotocol. Privet protokolü durumunda, DNS-SD için hizmet türü şöyle olmalıdır: _privet._tcp

Cihaz diğer hizmet türlerini de uygulayabilir. Cihaz tarafından uygulanan tüm hizmet türleri için aynı hizmet örneği adını kullanmanız önerilir. Örneğin: "Yazıcı XYZ._privet._tcp" ve Yazıcı "XYZ._printer._tcp&quot" hizmetleri uygulayabilir. Bu, kullanıcı için kurulumu basitleştirir. Ancak Privet istemcileri yalnızca "_privet._tcp" kodunu arar.

Cihazın, ana hizmet türüne ek olarak ilgili alt türleri için PTR kayıtlarının tanıtımını yapması GEREKİR (DNS-SD spesifikasyonuna bakın: "7.1). Seçici Örnek Sıralama (Alt türler) Biçim şu şekilde olmalıdır: _<subtype>._sub._privet._tcp

Şu anda desteklenen tek cihaz alt türü yazıcı'dır. Bu nedenle, tüm yazıcılar iki PTR kaydının reklamını yapmalıdır:

  • _privet._tcp.local'a gidin.
  • _printer._alt._privet._tcp.local

2.2. TXT kaydı

DNS Service Discovery, TXT kayıtlarına bir hizmet hakkında isteğe bağlı bilgiler eklenecek alanları tanımlar. TXT kaydı, anahtar/değer çiftlerinden oluşur. Her anahtar/değer çifti, uzunluk baytından başlayıp 255 bayta kadar metinden oluşur. Anahtar, ilk "=" karakterinden önceki metindir. Değer ise ilk "=" karakterinden sonraki metindir. Spesifikasyon, kayıtta değer olmamasına izin verir. Bu durumda, "=" karakteri VEYA "=" karakterinden sonra gelen metin bulunmaz. (DNS-SD özelliklerine bakın: "6.1. DNS TXT kaydı biçimi ve&6.2. DNS-SD TXT Kayıt Boyutu') önerilir.

Privet, cihazın TXT kaydında aşağıdaki anahtar/değer çiftlerini göndermesini gerektirir. Anahtar/Değer dizeleri büyük/küçük harfe duyarlı değildir. Örneğin, "CS=online" ve "cs=Çevrimiçi" aynıdır. TXT kaydındaki bilgilerin, /info API üzerinden erişilebilmesi gereken bilgilerle aynı olması ZORUNLUDUR (bkz.4.1 API bölümü).

TXT kaydı boyutunun 512 baytın altında tutulması önerilir.

2.2.1. txtver dosyaları

TXT yapısının sürümü. txtver öğeleri, TXT yapısının ilk kaydı olmalıdır. Şu anda desteklenen tek sürüm 1'dir.

txtvers=1

2.2.2. ty

Cihazın kullanıcı tarafından okunabilen bir adını sağlar. Örnek:

ty=Google Cloud Ready Printer Model XYZ

2.2.3. not (isteğe bağlı)

Cihazın kullanıcı tarafından okunabilen bir adını sağlar. Örnek:

note=1st floor lobby printer

Not: Bu anahtar isteğe bağlıdır ve atlanabilir. Ancak varsa, kullanıcı bu değeri değiştirebilmelidir. Cihaz kaydedilirken aynı açıklama kullanılmalıdır.

2.2.4. url

Bu cihazın bağlı olduğu sunucu URL'si (protokol dahil). Örnek:

url=https://www.google.com/cloudprint

2.2.5. tür

Bu cihaz tarafından desteklenen cihaz alt türlerinin virgülle ayrılmış listesi. Biçim: "type=_subtype1,_subtype2" Şu anda desteklenen tek cihaz alt türü yazıcı'dır.

type=printer

Listelenen her bir alt tür, ilgili PTR kaydı kullanılarak tanıtılmalıdır. Desteklenen her hizmet alt türü için karşılık gelen bir öğe olmalıdır. Hizmet alt tür adı (<alt türü>._sub._privet._tcp), burada cihaz türüne eşit olmalıdır.

2.2.6. kimlik

Cihaz kimliği. Cihaz henüz kaydedilmemişse bu anahtar mevcut olmalı ancak değer boş olmalıdır. Örnek:

  id=11111111-2222-3333-4444-555555555555
  id=

2.2.7. cs

Cihazın geçerli bağlantı durumunu belirtir. Bu spesifikasyonda dört olası değer tanımlanır.

  • "online"; cihazın buluta bağlı olduğunu gösterir.
  • "çevrimdışı" ifadesi, cihazın yerel ağda olduğunu ancak sunucuyla iletişim kuramadığını gösterir.
  • "bağlanıyor", cihazın başlangıç sırasını sergilediğini ve henüz tam olarak internete bağlı olmadığını gösterir.
  • "Yapılandırılmadı" ifadesi, cihazın internet erişiminin henüz yapılandırılmadığını belirtir. Bu değer şu anda kullanılmasa da spesifikasyonun gelecekteki sürümlerinde faydalı olabilir.
Örneğin:
  • cs=online
  • cs=çevrimdışı
  • cs=bağlantı oluşturma

Cihaz bir buluta kaydedildiyse başlangıçta bağlantı durumunu algılamak için bir sunucuyla olan bağlantısını kontrol etmelidir (örneğin, cihaz ayarlarını almak için Cloud API'yi çağırma). Cihaz, bu değeri bildirmek için bildirim kanalı (ör. XMPP) bağlantısını kullanabilir. Başlangıçta kayıtlı olmayan cihazlar, bağlantı durumlarını algılamak için bir alanı pingleyebilir (örneğin, bulut yazdırma cihazları için www.google.com).

3. Duyurular

Cihaz başlatılırken, kapatılma veya durum değişikliği durumunda, cihazın duyuru adımını mDNS spesifikasyonunda açıklandığı şekilde gerçekleştirmesi GEREKİR. İlgili duyuru en az iki kez, aralarında en az bir saniyelik aralıkla gönderilmelidir.

3.1. Girişim şirketi

Cihaz başlatılırken mDNS spesifikasyonunda açıklanan durum inceleme ve duyuru adımlarının uygulanması GEREKİR. Bu durumda SRV, PTR ve TXT kayıtları gönderilmelidir. Mümkünse tüm kayıtları tek bir DNS yanıtında gruplandırmanız önerilir. Ayarlanmamışsa şu sıranın kullanılması önerilir: SRV, PTR, TXT kayıtları.

3.2. Kapat

Cihaz kapandığında, TTL=0 ile birlikte bir >goodbye paketi&quot göndererek (mDNS dokümanlarında açıklandığı şekilde) konuyla ilgilenen tüm taraflara bildirimde bulunulması gerekir.

3.3. Güncelle

TXT'de açıklanan bilgilerin değişmesi durumunda, cihazın bir güncelleme duyurusu göndermesi GEREKİR. Bu durumda yeni TXT kaydının gönderilmesi yeterlidir. Örneğin, bir cihaz kaydettirildikten sonra yeni cihaz kimliğini içeren bir güncelleme duyurusu GÖNDERİLMELİDİR.

4. API

Bir bulut cihazı keşfedildikten sonra cihazla doğrudan yerel ağ üzerinden istemci iletişimi etkinleştirilir. Tüm API'ler HTTP 1.1 tabanlıdır. Veri biçimleri JSON'a dayalıdır. API istekleri, GET veya POST istekleri olabilir.

Her isteğin geçerli bir X-Privet-Token başlığı içermesi ZORUNLUDUR. Boş bir "X-Privet-Token" başlığına sahip olmasına izin verilen YALNIZCA istek, /privet/info isteğidir (üst bilginin hâlâ mevcut olması ZORUNLUDUR). "X-Privet-Token" başlığı yoksa cihaz, aşağıdaki HTTP 400 hatasıyla yanıt vermelidir:

HTTP/1.1 400 Missing X-Privet-Token header.

"X-Privet-Token" başlığı boş veya geçersizse cihaz "invalid X-Privet-Token error" Bunun tek istisnası /info API'sidir. Bunun neden yapıldığı ve jetonların nasıl oluşturulması gerektiği hakkında daha fazla bilgi edinmek için Ek A: XSSI ve XSRF saldırıları ve önleme sayfasına bakın.

İstenen bir API yoksa veya desteklenmiyorsa cihazın bir HTTP 404 hatası döndürmesi ZORUNLUDUR.

4.1. API kullanılabilirliği

HERHANGİ BİR API'nin (/info API dahil) gösterilmeden önce yerel ayarları kontrol etmek için cihazın sunucuyla iletişime geçmesi GEREKİR. Yeniden başlatmalar arasında yerel ayarların korunması ZORUNLUDUR. Sunucu kullanılamıyorsa bilinen son yerel ayarlar kullanılmalıdır. Cihaz henüz kayıtlı değilse varsayılan ayarlara uygun olmalıdır.

Cloud Print cihazları yerel ayarları kaydettirmek, almak ve güncellemek için aşağıdaki adımları UYGULAMALIDIR.

4.1.1. Kayıt

Cihaz kaydedildiğinde "local_settings" parametresini şu şekilde belirtmelidir:

{
       "current": {
                "local_discovery": true,
                "access_token_enabled": true,
                "printer/local_printing_enabled": true,
                "printer/conversion_printing_enabled": true,
                "xmpp_timeout_value": 300
        }
}
Aşağıdaki ayarlar belirlenebilir:
Değer AdıDeğer TürüAçıklama
yerel_keşifbooleanYerel keşif işlevine izin verilip verilmediğini belirtir. "False" yanlışsa tüm yerel API'ler (/info dahil) ve DNS-SD keşif devre dışı bırakılmalıdır. Yeni kaydolan cihazlar varsayılan olarak "true" değerini iletmelidir.
erişim_jetonu_etkinleştirildiboole (isteğe bağlı)/accesstoken API'nin yerel ağda açığa çıkıp çıkmayacağını belirtir. Varsayılan olarak "true" olmalıdır.
yazıcı/local_printing_etkinboole (isteğe bağlı)Yerel yazdırma işlevinin (/printer/createjob, /printer/submitdoc, /printer/jobstate) yerel ağda görünmesinin gerekip gerekmediğini belirtir. Varsayılan olarak "true" olmalıdır.
yazıcı/conversion_printing_enabledboole (isteğe bağlı)Yerel yazdırma hizmetinin dönüşüm için sunucuya iş gönderip gönderemeyeceğini belirtir. Yalnızca yerel yazdırma özelliği etkinleştirildiğinde mantıklıdır.
xmpp_zaman aşımı_değeriint (isteğe bağlı)XMPP kanal ping'leri arasındaki saniye sayısını belirtir. Varsayılan olarak 300 (5 dakika) veya daha fazla olmalıdır.

Önemli: İsteğe bağlı değerin olmaması, ilgili işlevin cihaz tarafından tamamen desteklenmediğini gösterir.

4.1.2. Girişim şirketi

Cihaz başlatılırken, yerel ağda gösterilebilecek API'leri kontrol etmek için sunucuyla iletişime geçmesi gerekir. Cloud Print'e bağlı yazıcıların şunları çağırması gerekir:

/cloudprint/printer?printerid=<printer_id>
veya
/cloudprint/list

/Kablolu/yazıcı yerine /IP adresi/yazıcı tercih edilir, ancak ikisi de çalışır.

Bu API, yerel API ayarları da dahil olmak üzere mevcut cihaz parametrelerini döndürür. Sunucudan alınan yanıt aşağıdaki biçimde olacaktır:

"local_settings": {
        "current": {
                "local_discovery": true,
                "access_token_enabled": true,
                "printer/local_printing_enabled": true,
                "printer/conversion_printing_enabled": true,
                "xmpp_timeout_value": 300
         },
         "pending": {
                "local_discovery": true,
                "access_token_enabled": true,
                "printer/local_printing_enabled": false,
                "printer/conversion_printing_enabled": false,
                "xmpp_timeout_value": 500
         }
}

"geçerli" nesne, o anda geçerli olan ayarları belirtir.

"bekleyen" nesnesi, cihaza uygulanması gereken ayarları belirtir (bu nesne eksik olabilir).

Cihaz "beklemede" ayarlarını gördükten sonra durumunu güncellemesi gerekir (aşağıya bakın).

4.1.3. Güncelle

Ayarların güncellenmesi gerekiyorsa cihaza bir XMPP bildirimi gönderilir. Bildirim aşağıdaki biçimde olacaktır:

<device_id>/update_settings

Bu tür bir bildirim alındığında cihaz en son ayarları alabilmek için sunucuyu sorgulamalıdır. Cloud Print cihazları şunları KULLANMALIDIR:

/cloudprint/printer?printerid=<printer_id>

Cihaz, / kablolu/yazıcı API'sinin sonucu olarak (başlangıçta veya bildirim nedeniyle) "beklemede" bölümünü gördükten sonra, yeni ayarları hatırlamak için dahili durumunu güncellemesi GEREKİR. Yeni ayarların onaylanması için Server API'nin çağrılması gerekir. Cloud Printers için cihazın kayıt sırasında /db/update API'yi çağırması ve "local_settings" parametresini kullanması GEREKİR.

XMPP kanalına yeniden bağlanırken, yerel ayarların son seferden beri değişip değişmediğini kontrol etmek için cihazın /kablolu/yazıcı API'sini çağırması ZORUNLUDUR.

4.1.3.1. Yerel Ayarlar Beklemede

Cihazın API sunucusunu çağırmak için kullandığı "local_settings" parametresi, HEMEN "beklemede" bölümünü İÇERMEMELİDİR.

4.1.3.2. Yerel Ayarlar

YALNIZCA cihaz, "yerel_ayarlar"ın "geçerli" bölümünü değiştirebilir. Diğer herkes "beklemede" bölümünü değiştirir ve değişikliklerin cihaz tarafından "geçerli" bölümüne yayılmasını bekler.

4.1.4. Çevrimdışı

Başlatma sırasında sunucuyla iletişim kurulamadığı durumlarda, bildirimden sonra cihazın bilinen son yerel ayarları kullanması ZORUNLUDUR.

4.1.5 Cihaz hizmetten siliniyor

Cihaz hizmetten silindiyse (örneğin, GCP) cihaza bir XMPP bildirimi gönderilir. Bildirim aşağıdaki biçimde olacaktır:

<device_id>/delete

Böyle bir bildirim alındığında cihaz, durumunu kontrol etmek için sunucuya gitmelidir. Cloud Print cihazları şunları KULLANMALIDIR:

/cloudprint/printer?printerid=<printer_id>

Cihaz, başarılı=yanlış şeklinde başarılı bir HTTP yanıtı ALMALI ve cihaz/yazıcı açıklaması OLMAMALIDIR. Bu, cihazın sunucudan kaldırıldığı ve cihazın kimlik bilgilerini silip varsayılan fabrika ayarları moduna geçmesi ZORUNLU olduğu anlamına gelir.

Cihaz, / IP adresi/yazıcı API'si (başlangıç, güncelleme ayarları bildirimi, günlük ping) nedeniyle silindiğini belirten bir yanıt aldığında, kimlik bilgilerini silmesi ve varsayılan moda geçmesi ZORUNLUDUR.

4.2. /privet/bilgi API'si

Info API, ZORUNLUDUR ve her cihaz tarafından uygulanması GEREKİR. Bu, "/privet/info" URL'si için bir HTTP GET isteğidir: GET /privet/info HTTP/1.1

info API, bir cihaz ve desteklediği işlev hakkında temel bilgiler döndürür. Bu API, XSRF saldırılarına açık olduğundan hiçbir zaman cihaz durumunu değiştirmemeli veya işlem yapmamalıdır. Bu, boş X&Privet-Token başlığı olmasına izin verilen TEK API'dır. Müşteriler, /privet/info API'yi X-Privet-Token başlığı olacak şekilde çağırmalıdır: ""

Info API, keşif sırasında TXT kaydında bulunan verilerle tutarlı veriler döndürmelidir.

4.2.1. Gir

/privet/info API'da giriş parametresi yoktur.

4.2.2. Return

/privet/info API cihaz ve desteklenen işlevlerle ilgili temel bilgileri döndürür.

TXT sütunu, DNS-SD TXT kaydındaki ilgili alanı gösterir.

Değer AdıDeğer TürüAçıklamaTXT (TXT)
sürümstringDesteklenen en yüksek API sürümü (major.minor) şu anda 1.0'dır
adstringCihazın kullanıcılar tarafından okunabilen adı.ty
açıklamastring(isteğe bağlı) Cihaz açıklaması. DEĞİŞKEN OLMALIDIR.not
urlstringBu cihazın konuştuğu sunucunun URL'si. URL, protokol spesifikasyonu içermelidir. Örneğin: https://www.google.com/IP adresi.url
türdize listesiDesteklenen cihaz türlerinin listesi.tür
idstringCihaz kimliği, cihaz henüz kaydedilmemişse boş. id
cihaz_durumustringCihazın durumu.
Boşta durumu, cihazın hazır olduğu anlamına gelir
işleme, cihazın meşgul olduğu ve işlevselliğin bir süre sınırlı olabileceği anlamına gelir
durduruldu, cihazın çalışmadığı ve kullanıcı müdahalesinin gerektiği anlamına gelir
bağlantı_durumustringSunucu bağlantısının durumu (base_url)
online - bağlantı mevcut
çevrimdışı - bağlantı yok
bağlanıyor - başlangıç adımları gerçekleştiriliyor
yapılandırılmamış - bağlantı henüz yapılandırılmamış
Kayıtlı bir cihaz, bağlantı durumunu bildirim kanalının durumuna göre raporlayabilir (ör. XMPP bağlantı durumu).
cs
üreticistringCihaz üreticisinin adı
modelstringCihazın modeli
seri_numarasıstringBenzersiz cihaz tanımlayıcı. Bu spesifikasyonda bu UUID olmalıdır. (GCP 1.1 spesifikasyonu)
(isteğe bağlı) Farklı istemcilerin aynı cihazı tanımlayabilmesi için her yerde aynı seri numarası kimliğini kullanmanız önerilir. Örneğin, IPP'yi uygulayan yazıcılar bu seri numarası kimliğini "yazıcı-cihaz kimliği" alanında kullanabilir.
donanım yazılımıstringCihaz donanım yazılımı sürümü
çalışma süresiintCihazın başlatılmasından itibaren geçen saniye sayısı.
kurulum_url'sistring(isteğe bağlı) Kurulum talimatlarını içeren sayfanın URL'si (protokol dahil)
destek_url'sistring(isteğe bağlı) Destek içeren sayfanın URL'si (protokol dahil), SSS bilgileri
güncelle_urlstring(isteğe bağlı) Donanım yazılımı güncelleme talimatlarını içeren sayfanın URL'si (protokol dahil)
x-privet-jetonstringXSSI ve XSRF saldırılarını önlemek için tüm API'lere aktarılması gereken X-Privet-Token üstbilgisinin değeri. Ayrıntılar için 6.1'e bakın.
apiAPI'lerin açıklamasıDesteklenen API'lerin listesi (aşağıda açıklanmıştır)
semantik_eyaletJSON(isteğe bağlı) Cihazın CloudDeviceState biçiminde semantik durumu.

api: Yerel ağ üzerinden kullanılabilen API'lerin listesini içeren bir JSON listesidir. Yerel API'de tüm API'lerin aynı anda kullanılamayabilir. Örneğin, yeni bağlanan bir cihaz yalnızca /register API'sini desteklemelidir:

"api": [
        "/privet/register",
]
Cihaz kaydı tamamlandıktan sonra cihaz, /register API'sini desteklemeyi bırakmalıdır. Cihaz, yerel ağ üzerinden hangi API'lerin açığa çıkabileceğini bildirmek için hizmetle de iletişim kurmalıdır. Örneğin:
"api": [
        "/privet/accesstoken",
        "/privet/capabilities",
        "/privet/printer/submitdoc",
]

Şu anda aşağıdaki API'ler kullanılabilir:

  • /privet/register: Yerel ağ üzerinden cihaz kaydı için API. (Ayrıntılar için /privet/register API adresine bakın). Cihaz buluta başarıyla kaydedildikten sonra bu API'nin gizlenmesi ZORUNLUDUR.
  • /privet/accesstoken: Cihazdan erişim jetonu isteyen API (ayrıntılar için /privet/accesstoken API'ye bakın).
  • /privet/capabilities: Cihaz özelliklerini alma API'sı (ayrıntılar için /privet/capabilities API'ye bakın).
  • /privet/printer/* - Cihaz türüne özel API; yazıcıya özel API'leri ayrıntılı olarak inceleyin.
Aşağıda, /privet/info yanıtının bir örneği verilmiştir. (Bu, kayıtlı bir cihaz olduğundan /privet/register API'sinin mevcut olmadığını unutmayın):
{
        "version": "1.0",
        "name": "Gene’s printer",
        "description": "Printer connected through Chrome connector",
        "url": "https://www.google.com/cloudprint",
        "type": [
                "printer"
        ],
        "id": "11111111-2222-3333-4444-555555555555",
        "device_state": "idle",
        "connection_state": "online",
        "manufacturer": "Google",
        "model": "Google Chrome",
        "serial_number": "1111-22222-33333-4444",
        "firmware": "24.0.1312.52",
        "uptime": 600,
        "setup_url": "http://support.google.com/cloudprint/answer/1686197/?hl=en",
        "support_url": "http://support.google.com/cloudprint/?hl=en",
        "update_url": "http://support.google.com/cloudprint/?hl=en",
        "x-privet-token": "AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ:1358377509659",
        "api": [
                "/privet/accesstoken",
                "/privet/capabilities",
                "/privet/printer/submitdoc",
        ]
}
Münihin bittiği bir yazıcıya ait /privet/info yanıtının bir örneğini burada bulabilirsiniz (bildirim semantik_durumu alanı):
{
        "version": "1.0",
        "name": "Gene’s printer",
        "description": "Printer connected through Chrome connector",
        "url": "https://www.google.com/cloudprint",
        "type": [
                "printer"
        ],
        "id": "11111111-2222-3333-4444-555555555555",
        "device_state": "stopped",
        "connection_state": "online",
        "manufacturer": "Google",
        "model": "Google Chrome",
        "serial_number": "1111-22222-33333-4444",
        "firmware": "24.0.1312.52",
        "uptime": 600,
        "setup_url": "http://support.google.com/cloudprint/answer/1686197/?hl=en",
        "support_url": "http://support.google.com/cloudprint/?hl=en",
        "update_url": "http://support.google.com/cloudprint/?hl=en",
        "x-privet-token": "AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ:1358377509659",
        "api": [
                "/privet/accesstoken",
                "/privet/capabilities",
                "/privet/printer/submitdoc",
        ],
        "semantic_state": {
                "version": "1.0",
                "printer": {
                        "state": "STOPPED",
                        "marker_state": {
                                "item": [
                                        {
                                                "vendor_id": "ink",
                                                "state": "EXHAUSTED",
                                                "level_percent": 0
                                        }
                                ]
                        }
                }
        }
}

4.2.3. Hatalar

/privet/info API YALNIZCA X-Privet-Token üstbilgisi yoksa hata döndürür. HTTP 400 hatası OLMALIDIR:

HTTP/1.1 400 Missing X-Privet-Token header.

4.3. /privet/register API'sı

/privet/register API İSTEĞE BAĞLI'dır. Bu bir HTTP POST isteğidir. /privet/register API'nin geçerli bir X-Privet-Token üst bilgisini kontrol etmesi ZORUNLUDUR. Cihaz, bu API'yi "/privet/register" URL'sinde UYGULAMALIDIR:

POST /privet/register?action=start&user=user@domain.com HTTP/1.1
POST /privet/register?action=complete&user=user@domain.com HTTP/1.1

Cihaz, şu anda anonim kayda izin verdiğinde /privet/register API'yi göstermelidir. Örnek:

  • Cihaz açık olduğunda (veya cihazdaki özel bir düğmeyi tıkladıktan sonra) ve henüz kaydedilmemişse yerel ağdaki bir kullanıcının yazıcıyı talep etmesi için cihazın /privet/register API'sini göstermesi gerekir.
  • Kayıt işlemi tamamlandıktan sonra, yerel ağdaki başka bir kullanıcının cihazı geri almasını önlemek için cihaz, /privet/register API'yi açığa çıkarmayı durdurmalıdır.
  • Bazı cihazların cihazları kaydettirmek için farklı yöntemleri olabilir ve /privet/register API'yi hiç kullanıma sunmamalıdır (örneğin, Chrome Cloud Print bağlayıcı).

Kayıt işlemi 3 adımdan oluşur (Cloud Print için anonim kayda bakın).

  1. Anonim kayıt işlemi başlatın.
  2. İstemci bu işlemi /privet/register API'sini çağırarak başlatır. Cihaz, o sırada kullanıcı onayını bekleyebilir.
  3. Hak talebi jetonu alın.

Cihazın devam etmeye hazır olup olmadığını öğrenmek için istemci anketleri yapar. Cihaz hazır olduğunda sunucuyu kaydetme jetonunu ve URL'yi alması için bir istek gönderir. Alınan jeton ve URL istemciye iade edilmelidir. Bu adımda cihaz, kaydı başlatmak için başka bir arama alırsa şunları yapmalıdır:

  • Bu, kaydı başlatan kullanıcıysa (varsa) önceki tüm verileri bırakın ve yeni bir kayıt işlemi başlatın.
  • Farklı bir kullanıcıysa: device_meşgul hatası ve 30 saniyelik zaman aşımı hatası döndürün.

Kayıt işlemini tamamlayın.

İstemci cihazın sahipliğini üstlendikten sonra kaydı tamamlaması için cihazı bilgilendirmelidir. Kayıt işlemi tamamlandıktan sonra cihaz, yeni edinilen cihaz kimliğini de içeren bir güncelleme duyurusu gönderir.

Not: Cihaz, bir /privet/register API çağrısını işlerken, diğer hiçbir /privet/register API çağrısı aynı anda işlenemez. Cihaz, device_meşgul hatası ve 30 saniyelik zaman aşımı hatası döndürmelidir.

Cihaza kaydolmak için kullanıcı onayı önemle tavsiye edilir. Uygulanması halinde cihaz, /privet/register?action=start API çağrısı aldıktan SONRA kullanıcı onayını beklemelidir. İstemci, kullanıcı onayının ne zaman tamamlandığını ve hak talebi jetonunun ne zaman kullanılabilir olduğunu öğrenmek için /privet/register?action=getClaimToken API'yi çağıracaktır. Kullanıcı, cihazda kaydı iptal ederse (ör. İptal düğmesine basarsa) user_cancel hatasının döndürülmesi ZORUNLUDUR. Kullanıcı belirli bir zaman aralığında kaydı onaylamadıysa verification_timeout hatasının döndürülmesi gerekir. Daha ayrıntılı bilgi için varsayılanlar bölümünü inceleyin.

4.3.1 Gir

/privet/register API aşağıdaki giriş parametrelerine sahiptir:
AdDeğer
işlemŞunlardan biri olabilir:
start - kayıt sürecini başlatmak için
getClaimToken - cihaz için hak talebi jetonunu alın
iptal - kayıt işlemini iptal etmek için
complete - kayıt işlemini tamamlamak için
kullanıcıBu cihaz için hak talebinde bulunacak kullanıcının e-posta adresi.

Cihaz, tüm işlemlerle ilgili e-posta adresinin (start, getClaimToken, iptal, tamamlandı) eşleşip eşleşmediğini kontrol ETMELİDİR.

4.3.2. Return

/privet/register API aşağıdaki verileri döndürür:
Değer adıDeğer türüAçıklama
işlemstringGiriş parametresindekiyle aynı işlem.
kullanıcıdize (isteğe bağlı)Giriş parametresindeki kullanıcının aynısı (girişte yoksa eksik olabilir).
tokendize (isteğe bağlı)Kayıt jetonu ("getClaimToken" yanıtı için; "quot;start " & &;;complete&‘t;; "cancel"
URL_hak talebidize (isteğe bağlı)Kayıt URL'si ("&Claim;Token" yanıtı için; "quot;start" & "tamamlandı" "&t;iptal&"; Cloud Printers için bu, sunucudan alınan "complete_visit_url"
otomatik_hak talebinde_urldize (isteğe bağlı)Kayıt URL'si ("&Claim;Token" yanıtı için; "quot;start" & "tamamlandı" "&t;iptal&"; Cloud Printers için bu, sunucudan alınan "auto_visit_url"
cihaz_kimliğidize (isteğe bağlı)Yeni cihaz kimliği ("pret" başlangıç yanıtı için yoksayılır, "tamamlandı" için zorunludur).

YALNIZCA kayıt tamamlandıktan sonra cihazın /privet/info API yanıtında cihaz kimliğini döndürmesi ZORUNLUDUR.

1. Örnek:

{
        "action": "start",
        "user": "user@domain.com",
}

2. Örnek:

{
        "action": "getClaimToken",
        "user": "user@domain.com",
        "token": "AAA111222333444555666777",
        "claim_url": "https://domain.com/SoMeUrL",
}

3. Örnek:

{
        "action": "complete",
        "user": "user@domain.com",
        "device_id": "11111111-2222-3333-4444-555555555555",
}

4.3.3. Hatalar

/privet/register API aşağıdaki hataları döndürebilir (ayrıntılar için bkz. Hatalar bölümü):
HataAçıklama
cihaz_meşgulCihaz meşgul ve istenen işlemi gerçekleştiremiyor. Zaman aşımından sonra yeniden deneyin.
beklemede_kullanıcı_işlemi"getClaimToken"a yanıt olarak bu hata, cihazın hâlâ kullanıcı onayını beklediğini ve "getClaimToken" isteğinin zaman aşımından sonra yeniden denenmesi gerektiğini gösterir.
kullanici_iptaliKullanıcı, cihazdan kayıt işlemini açıkça iptal etti.
onay_zaman aşımıKullanıcı onayı zaman aşımına uğrar.
geçersiz_işlemGeçersiz işlem çağrılır. Örneğin, istemci action=start ve action=getClaimToken çağrısından önce action=complete adını aldıysa.
geçersiz_parametrelerİstekte geçersiz parametreler belirtildi. (Bilinmeyen parametreler, gelecekteki uyumluluk için güvenli bir şekilde yoksayılmalıdır). Örneğin, istemci action=unknown veya user= ise bu değeri döndürün.
cihaz_yapılandırma_hatasıTarih, saat (veya diğer bazı ayarlar) cihaz tarafında yanlış. Kullanıcının cihaz dahili web sitesine gitmesi ve cihaz ayarlarını yapılandırması gerekir.
çevrimdışıCihaz şu anda internete bağlı değil ve sunucuyla konuşamıyor.
Sunucu_hatasıKayıt işlemi sırasında sunucu hatası oluştu.
geçersiz_x_ayrıca_jetonX-Privet-Token geçersiz veya istekte boş.

Kayıt işlemi başarıyla tamamlandıktan sonra cihaz, /privet/register API'yi açığa çıkarmamalıdır. Cihaz, /privet/register API'yi göstermiyorsa HTTP 404 hatası döndürmesi GEREKİR. Bu nedenle, kayıtlı bir cihaz varsa bu API'nin çağrılmasının 404 hatası döndürmesi ZORUNLUDUR. X-Privet-Token başlığı yoksa cihazın HTTP 400 hatası döndürmesi ZORUNLUDUR.

4.4. /privet/accesstoken API'sı

/privet/accesstoken API İSTEĞE BAĞLI'dır. Bu bir HTTP GET isteğidir. /privet/accesstoken API geçerli bir "X-Privet-Token" başlığı olup olmadığını kontrol ETMELİDİR. Cihaz, bu API'yi aşağıdaki URL'de UYGULAMALIDIR: /privet/accesstoken"
GET /privet/accesstoken HTTP/1.1

Cihaz, /accesstoken API çağrısını aldığında, belirli bir kullanıcının erişim jetonunu almak ve jetonu istemciye döndürecek şekilde sunucuya çağrı yapmalıdır. Ardından istemci, bulut üzerinden bu cihaza erişmek için erişim jetonunu kullanır.

Cloud Print cihazları aşağıdaki API'yi çağırmalıdır:

/cloudprint/proximitytoken
ve yerel API'den "printerid=<printer_id>""user" parametresini iletin. Başarılı olursa sunucu yanıtı şu nesneyi içerir:
"proximity_token": {
        "user": "user@domain.com",
        "token": "AAA111222333444555666777",
        "expires_in": 600
}
Cloud Print cihazları, yanıttaki "proximity_token" nesnesinin değerini yerel /privet/accesstoken API çağrılarına iletmelidir. Cihazın TÜM parametreleri geçirebilmesi daha faydalıdır (gelecek için dayanıklıdır) (bu spesifikasyonda açıklanmayanlar dahil).

4.4.1. Gir

/privet/accesstoken API aşağıdaki giriş parametrelerine sahiptir:
AdDeğer
kullanıcıBu erişim jetonunu kullanmayı amaçlayan kullanıcının e-posta adresi. İstekte boş olabilir.

4.4.2. Return

/privet/accesstoken API aşağıdaki verileri döndürür:
Değer adıDeğer türüAçıklama
tokenstringSunucu tarafından döndürülen erişim jetonu
kullanıcıstringGiriş parametresindeki kullanıcıyla aynı.
süresi doluyorintBu jetonun süresinin dolmasına saniye sayısı. Sunucudan alındı ve bu yanıtta iletildi.

Örnek:

{
        "token": "AAA111222333444555666777",
        "user": "user@domain.com",
        "expires_in": 600
}

4.4.3. Hatalar

/privet/accesstoken API aşağıdaki hataları döndürebilir (ayrıntılar için bkz. Hatalar bölümü):
HataAçıklama
çevrimdışıCihaz şu anda çevrimdışı ve sunucuyla iletişim kuramıyor.
erişim_reddedildiYetersiz haklar. Erişim reddedildi. İstek sunucu tarafından açıkça reddedildiğinde cihaz bu hatayı döndürmelidir.
geçersiz_parametrelerİstekte geçersiz parametreler belirtildi. (Bilinmeyen parametreler, gelecekteki uyumluluk için güvenli bir şekilde yoksayılmalıdır). Örneğin, istemcinin adı /accesstoken?user= veya /accesstoken ise.
Sunucu_hatasıSunucu hatası.
geçersiz_x_ayrıca_jetonX-Privet-Token geçersiz veya istekte boş.

Cihaz, /privet/accesstoken API'yi göstermiyorsa HTTP 404 hatası döndürmelidir. X-Privet-Token başlığı yoksa cihazın HTTP 400 hatası döndürmesi ZORUNLUDUR.

4.5. /privet/Yetenekleri API'sı

/privet/capabilities API İSTEĞE BAĞLI'dır. Bu bir HTTP GET isteğidir. /privet/capabilities API geçerli bir "X-Privet-Token" başlığı kontrol ETMELİDİR. Cihaz, bu API'yi \quot/privet/capabilities" URL'sinde UYGULAMALIDIR:
GET /privet/capabilities HTTP/1.1
Cihaz /capabilities API çağrısını aldığında, güncellenmiş özellikleri alabilmesi için sunucuyla İLETİŞİME GEÇMESİ GEREKİR. Örneğin, bir yazıcı otomatik olarak Cloud Print hizmeti üzerinden kendisine bir yazdırma işi (yerel olarak alınır) yayınlamayı destekliyorsa Cloud Print hizmetinin döndüreceği özellikleri döndürmesi gerekir. Bu durumda Cloud Print, işi yazıcıya göndermeden önce gerçekleştirebileceği yeni özellikleri ekleyerek orijinal yazıcı özelliklerini değiştirebilir. En yaygın durum, desteklenen doküman türlerinin listesidir. Yazıcı çevrimdışıysa desteklediği doküman türlerini döndürmelidir. Ancak, yazıcı çevrimiçiyse ve Cloud Print'e kayıtlıysa desteklenen türlerden biri olarak "*/*" döndürmelidir. Bu durumda Cloud Print hizmeti gerekli dönüşümü gerçekleştirir. Çevrimdışı yazdırma için yazıcının en azından "image/pwg-raster" biçimini desteklemesi ZORUNLUDUR.

4.5.1. Gir

/privet/capabilities API'de aşağıdaki giriş parametreleri bulunur:
AdDeğer
çevrimdışı(isteğe bağlı) Yalnızca "Offline=1" olabilir. Bu durumda, cihaz çevrimdışı kullanım için özellikler döndürmelidir ("online" olanaklarından farklıysa).

4.5.2. Return

/privet/capabilities API, Cloud Device Description (CDD) JSON biçiminde cihaz özellikleri döndürür (ayrıntılar için CDD dokümanına bakın). Yazıcılar en azından burada desteklenen türlerin listesini döndürmelidir. Örneğin, şu anda online olan Cloud Ready özellikli bir yazıcı aşağıdaki gibi bir değer döndürebilir (en azından):
{
        "version": "1.0",
        "printer": {
                "supported_content_type": [
                        {
                                "content_type": "application/pdf",
                                "min_version": "1.4"
                        },
                        { "content_type": "image/pwg-raster" },
                        { "content_type": "image/jpeg" },
                        { "content_type": "*/*" }
                ]
        }
}
Sunucuyla bağlantısı kesildiğinde şu cihaz döndürülebilir:
{
        "version": "1.0",
        "printer": {
                "supported_content_type": [
                        {
                                "content_type": "application/pdf",
                                "min_version": "1.4"
                        },
                        { "content_type": "image/pwg-raster" },
                        { "content_type": "image/jpeg" }
                ]
        }
}

Not: Yazıcılar, desteklenen içerik türü önceliğini sıra kullanarak ifade eder. Örneğin, yukarıdaki örneklerde yazıcı ""image/pwg-raster" & "image/jpeg" yerine 'veri' seçeneğini tercih ettiğini belirtir. Müşteriler, mümkün olduğunda yazıcı önceliğine saygı göstermelidir (ayrıntılar için CDD dokümanına bakın).

4.5.3. Hatalar

/privet/capabilities API aşağıdaki hataları döndürebilir (ayrıntılar için Hatalar bölümüne bakın):
HataAçıklama
geçersiz_x_ayrıca_jetonX-Privet-Token geçersiz veya istekte boş.

Cihaz, /privet/capabilities API'yi göstermiyorsa HTTP 404 hatası döndürmelidir. X-Privet-Token başlığı yoksa cihazın HTTP 400 hatası döndürmesi ZORUNLUDUR.

4.6. Hatalar

Hatalar, yukarıdaki API'lerden şu biçimde döndürülür:
Değer adıDeğer türüAçıklama
hatastringHata türü (API başına tanımlanır)
açıklamadize (isteğe bağlı)Hatanın kullanıcılar tarafından okunabilen açıklaması.
Server_apidize (isteğe bağlı)Sunucu hatası durumunda, bu alan başarısız olan sunucu API'sini içerir.
sunucu_koduint (isteğe bağlı)Sunucu hatası durumunda, bu alan sunucunun döndürdüğü hata kodunu içerir.
Server_http_code [Sunucu_http_kodu]int (isteğe bağlı)Sunucu HTTP hatası durumunda, bu alan sunucu tarafından döndürülen HTTP hata kodu içerir.
zaman aşımıint (isteğe bağlı)İstemcinin yeniden denemeden önce bekleyeceği saniye sayısı (yalnızca kurtarılabilir hatalar için). İstemci bu değerdeki gerçek zaman aşımını +%20'lik bir değerle rastgele hale getirmelidir.

X-Privet-Token başlığı eksikse tüm API'lerin HTTP 400 hatası döndürmesi ZORUNLUDUR.

HTTP/1.1 400 X-Privet-Token başlığı yok.

1. Örnek:

{
        "error": "server_error",
        "description": "Service unavailable",
        "server_api": "/submit",
        "server_http_code": 503
}

2. Örnek:

{
        "error": "printer_busy",
        "description": "Printer is currently printing other job",
        "timeout": 15
}

5. Yazıcı API'sı

Bu protokolü destekleyen cihaz türlerinden biri tür yazıcıdır. Bu türü destekleyen cihazlar, yazıcılara özgü bazı işlevler uygulayabilir. İdeal olarak, bulut özellikli yazıcılara yazdırma işlemi bir Cloud Print sunucusu üzerinden yapılır:

Bazı durumlarda, müşterinin bir dokümanı yerel olarak göndermesi gerekebilir. İstemcinin Google Kimliği yoksa veya Cloud Print sunucusuyla iletişim kuramıyorsa gerekli olabilir. Bu durumda, yazdırma işi yerel olarak yazıcıya gönderilir. Yazıcı da bunun ardından, iş sıralaması ve dönüşüm için Cloud Print hizmetini kullanır. Yazıcı, yerel olarak Cloud Print hizmetine gönderilen işi yeniden yayınlar ve daha sonra iş bulut üzerinden gönderilir. Bu işlem, hizmet (dönüşüm) ve yazdırma işi yönetimi/izleme açısından esnek bir kullanıcı deneyimi sağlar.

Cloud Print hizmeti dönüşümü uyguladığından, yazıcı desteklenen içerik türleri listesindeki tüm giriş biçimlerini ('****) destekleyen bir reklam yayınlamalıdır:

{
        "version": "1.0",
        "printer": {
                "supported_content_type": [
                        { "content_type": "image/pwg-raster" },
                        { "content_type": "*/*" }
                ]
        }
}

Bazı durumlarda, tamamen çevrimdışı bir çözüm tercih edilir. Yazıcılar sınırlı sayıda giriş biçimini desteklediğinden, bir istemcinin dokümanları yerel olarak desteklenen birkaç yazıcı biçimine dönüştürmesi gerekir.

Bu spesifikasyon, tüm yazıcıların çevrimdışı baskı kılıfı için en azından PWG Sıva ("image/pwg-raster") biçimini desteklemesini GEREKTİR. Bir yazıcı diğer biçimleri (ör. JPEG) destekleyebilir ve bir istemci destekliyorsa bu biçimdeki dokümanları gönderebilir. Yazıcı, desteklenen türleri /capabilities API üzerinden göstermelidir. Örneğin:

{
        "version": "1.0",
        "printer": {
                "supported_content_type": [
                        { "content_type": "image/pwg-raster" },
                        { "content_type": "image/jpeg" }
                ]
        }
}
İstemcinin yerel ağ üzerinden yazdırmaya başlamanın iki yolu vardır.

Basit yazdırma - İstemci, dokümanı yerel ağ üzerinden /submitdoc API'ye gönderir (Job_id parametresi belirtilmeden). Gönderilen belge, varsayılan yazdırma bileti ayarları kullanılarak yazdırılır ve yazdırma işi durumu gerekmez. Yazıcı YALNIZCA bu tür yazdırmayı destekliyorsa /privet /info API yanıtında YALNIZCA/submitdoc API reklamını yapmalıdır.

"api": [
        "/privet/accesstoken",
        "/privet/capabilities",
        "/privet/printer/submitdoc",
]

Gelişmiş yazdırma: İstemci öncelikle istekte geçerli bir CJT iş bileti içeren /privet/printer/createjob API'sini çağırarak yazıcıda bir yazdırma işi oluşturmalıdır. Yazıcının yazdırma biletini bellekte depolaması ve istemciye bir iş kimliği döndürmesi GEREKİR. Ardından, istemci /printer/submitdoc API'yi çağırır ve önceden alınan job_id'yi belirtir. Ardından, yazıcı yazdırmaya başlar. İstemci, yazdırma işi durumu için /privet/printer/jobstate API'sini çağırarak yazıcıyı yok sayar.

Çok müşterili ortamda, bu API'nin nasıl çağrılacağının garantisi yoktur. Bir istemcinin, başka bir istemcinin/createjob->/submitdoc çağrıları arasında /createjob çağrısı yapması mümkündür. Olası kilitlenmeleri önlemek ve kullanılabilirliği iyileştirmek için yazıcıda beklemedeki yazdırma işlerinin az sayıda (en az 3-5) olmasını öneririz:

  • /createjob, sıraya eklenecek ilk spotu alır.
  • İş ömrü (sırada) en az 5 dakika olmalıdır.
  • Sıradaki tüm noktalar alınırsa yazdırılacak en eski iş kaldırılır ve orada yeni bir iş olur.
  • Şu anda cihazda yazdırılan bir yazdırma işi varsa (basit veya gelişmiş yazdırma) /submitdoc, meşgul durumunu döndürmeli ve bu yazdırma işini yeniden denemek için zaman aşımı teklif etmelidir.
  • /submitdoc, sıradan kaldırılmış (değişim veya zaman aşımı nedeniyle) bir işe başvuruyorsa yazıcının bir invalid_print_job hatası döndürmesi gerekir ve istemci, /createjob adımından işlemi yeniden dener. İstemcinin tekrar deneyebilmesi için 5 saniyelik rastgele zaman aşımı süresi beklemesi ZORUNLUDUR.

Bellek kısıtlamaları, cihazda bekleyen birden fazla işin depolanmasını engelliyorsa 1 yazdırma işi sırası sıraya alınabilir. Yukarıdakiyle aynı protokole uymalıdır. Bir iş bir hata mesajıyla tamamlandıktan veya başarısız olduktan sonra, yazıcı en az 5 dakika boyunca işin durumuyla ilgili bilgileri depolamalıdır. Tamamlanan iş durumlarının saklanacağı sıra en az 10 olmalıdır. Depolanması gereken daha fazla iş durumu varsa en eski durum, 5 dakika zaman aşımından önce sıradan kaldırılabilir.

Not: Şu an için müşteriler iş durumuna göre anket yapabilir. Gelecekte, HERHANGİ BİR yazdırma işi durumu değiştiğinde yazıcının TXT DNS bildirimini göndermesini zorunlu kılabiliriz.

5.1. /privet/yazıcı/createjob API'si

/privet/printer/createjob API İSTEĞE BAĞLIdır (yukarıdaki Basit Yazdırma bölümüne bakın). Bu bir HTTP POST isteğidir. /privet/printer/createjob API geçerli bir "X-Privet-Token" başlığı ÖNCESİ olmalıdır. Cihaz, bu API'yi "privet/printer/createjob" URL'sinde UYGULAMALIDIR:

POST /privet/printer/createjob HTTP/1.1
/privet/printer/createjob API çağrısı alırken, yazıcının yeni bir yazdırma işi kimliği oluşturması, alınan yazdırma biletini CJT biçiminde depolaması ve yazdırma işi kimliğini istemciye geri göndermesi GEREKİR.

5.1.1. Gir

/privet/printer/createjob API'sinde URL'de giriş parametresi yok. İstek gövdesi, CJT biçiminde yazdırma işi bilet verilerini içermelidir.

5.1.2. Return

/privet/printer/createjob API aşağıdaki verileri döndürür:
Değer adıDeğer türüAçıklama
iş_kimliğistringYeni oluşturulan yazdırma işinin kimliği.
süresi doluyorintBu yazdırma işinin geçerli olduğu saniye sayısı.

Örnek:

{
        "job_id": "123",
        "expires_in": 600
}

5.1.3. Hatalar

/privet/printer/createjob API aşağıdaki hataları döndürebilir (ayrıntılar için Hatalar bölümüne bakın):
HataAçıklama
geçersiz_biletGönderilen baskı bileti geçersiz.
yazıcı_meşgulYazıcı meşgul ve şu anda /createjob işlenemiyor. Zaman aşımından sonra yeniden deneyin.
yazıcı_hatasıYazıcı hata durumunda ve düzeltmek için kullanıcı etkileşimi gerekiyor. Açıklama daha ayrıntılı açıklama içermelidir (ör. "Tepsi 1'deki kağıt reçeli).
geçersiz_x_ayrıca_jetonX-Privet-Token geçersiz veya istekte boş.

Cihaz, /privet/printer/createjob durumu göstermiyorsa HTTP 404 hatası döndürmelidir. X-Privet-Token başlığı yoksa cihazın HTTP 400 hatası döndürmesi ZORUNLUDUR.

5.2. /privet/printer/submitdoc API

Yazdırmanın yerel bir ağ üzerinden uygulanması (çevrimdışı veya Cloud Print'te yeniden yayınlama) için /privet/printer/submitdoc API GEREKLİDİR. Bu bir HTTP POST isteğidir. /privet/printer/submitdoc API geçerli bir "X-Privet-Token" başlığı kontrol ETMELİDİR. Cihaz, bu API'yi \quot;/privet/printer/submitdoc" url adresinde UYGULAMALIDIR:
POST /privet/printer/submitdoc HTTP/1.1
/privet/printer/submitdoc API çağrısı alınırken yazıcı yazdırmaya başlamalıdır. Yazdırmaya başlanamıyorsa istemcinin tekrar denemeden önce beklemesi için yazıcı_meşgul hatası ve önerilen zaman aşımı süresinin döndürülmesi GEREKİR.

Yazıcı dahili veri arabelleğinin tamamında veri tutamadığında, dokümanın bir kısmı yazdırılana kadar veri aktarımını yavaşlatmak için TCP mekanizmalarını KULLANMALIDIR. Böylece, arabelleğin bir kısmı tekrar kullanılabilir hale gelir. (Örneğin, yazıcı TCP katmanında windowsize=0 değerini ayarlayabilir ve böylece istemcinin beklemesi sağlanır.)

Yazıcıya doküman göndermek çok uzun sürebilir. İstemci, yazdırma işlemi devam ederken yazıcının ve işin (gelişmiş yazdırma) durumunu kontrol edebilmelidir. Bunu yapmak için yazıcının, istemcinin /privet/printer/submitdoc API çağrılarını işlerken/privet/info ve /privet/printer/jobstate API'lerini çağırmasına izin vermesi GEREKİR. Ana ileti dizisinin, yazıcı ve iş durumlarını kontrol etmek için /privet/info ve/privet /printer/jobstate API'lerini kullanabilmesi amacıyla /privet/printer/submitdoc API çağrısını yürütmek amacıyla yeni bir ileti dizisi başlatması önerilir.

Not: Yerel yazdırma işinin tamamlanmasının veya kürtajının tamamlanmasının ardından, muhasebe ve kullanıcı deneyimi için işin son durumunu /Kablolama/gönderme arayüzüne bildirmeniz önemle tavsiye edilir (ve bu spesifikasyonların gelecekteki bir sürümünde gereklidir). "Printerid", "title"ve"quot;contentType"ve"Final_semantic_state&"; Sağlanan PrintJobState'in gerçekten nihai olması, yani türünün TAMAMLANDI veya ABONE OLMALI olması, ABSATILMIŞ olması durumunda bir neden sağlanması gerektiğini unutmayın (ayrıntılar için JobState'e bakın). Ayrıca, yerel yazdırma işlerini raporlamak için /db/submit arayüzünün bu şekilde kullanılmasının spesifikasyonunda belirtilmediğinden unutmayın. Bu bölüm, arayüzün birincil kullanımını açıklamak içindir: "content" parametresinde sağlanan belgeyle birlikte yazdırma işi göndermek.

5.2.1. Gir

/privet/printer/submitdoc API aşağıdaki giriş parametrelerine sahiptir:
AdDeğer
iş_kimliği(isteğe bağlı) Yazdırma işi kimliği. Basit baskı kılıfları için çıkarılabilir (yukarıya bakın). Yazıcının döndürdüğüyle eşleşmelidir.
kullanıcı_adı(isteğe bağlı) İnsan tarafından okunabilir kullanıcı adı. Bu kesin bir bilgi değildir ve yalnızca yazdırma işi ek açıklamaları için kullanılmalıdır. İş, Cloud Print hizmetine yeniden yayınlanırsa bu dize, Cloud Print işine eklenmelidir.
istemci_adı(isteğe bağlı) Bu isteği yapan istemci uygulamasının adı. Yalnızca görüntüleme amaçlıdır. İş, Cloud Print hizmetine yeniden yayınlanırsa bu dize, Cloud Print işine eklenmelidir.
iş_adı(isteğe bağlı) Kaydedilecek yazdırma işinin adı. İş, Cloud Print hizmetine yeniden yayınlanırsa bu dize, Cloud Print işine eklenmelidir.
çevrimdışı(isteğe bağlı) Yalnızca "Offline=1" olabilir. Bu durumda, yazıcı yalnızca çevrimdışı yazdırmayı denemelidir (Cloud Print sunucusuna yeniden yayınlanmamalıdır).

İstek metni, yazdırılmak üzere geçerli bir doküman içermelidir. "İçerik Uzunluğu", isteğin doğru uzunluğunu içermelidir. "Content-Type" başlığı, doküman MIME türüne ayarlanmalıdır ve CDD'deki türlerden biriyle eşleşmelidir (CDD "&";*/*" belirtmediği sürece).

Müşterilerin bu istekte geçerli bir kullanıcı adı (veya e-posta adresi), müşteri adı ve iş adı belirtmesi önemle tavsiye edilir. Bu alanlar yalnızca kullanıcı deneyimini iyileştirmek için kullanıcı arayüzlerinde kullanılır.

5.2.2. Return

/privet/printer/submitdoc API aşağıdaki verileri döndürür:
Değer adıDeğer türüAçıklama
iş_kimliğistringİstekte belirtilen yeni oluşturulan yazdırma işinin (basit yazdırma) veya Job_id kimliği (gelişmiş baskı).
süresi doluyorintBu yazdırma işinin geçerli olduğu saniye sayısı.
iş_türüstringGönderilen belgenin içerik türü.
iş_boyutuint 64 bitYazdırma verilerinin bayt cinsinden boyutu.
iş_adıstring(isteğe bağlı) Girişle aynı iş adı (varsa).

Örnek:

{
        "job_id": "123",
        "expires_in": 500,
        "job_type": "application/pdf",
        "job_size": 123456,
        "job_name": "My PDF document"
}

5.2.3. Hatalar

/privet/printer/submitdoc API aşağıdaki hataları döndürebilir (ayrıntılar için bkz. Hatalar bölümü):
HataAçıklama
Geçersiz_Yazdırma_İşiİstekte geçersiz/süresi dolmuş iş kimliği belirtildi. Zaman aşımından sonra yeniden deneyin.
geçersiz_doküman_türüDoküman MIME türü yazıcı tarafından desteklenmiyor.
geçersiz_dokümanGönderilen belge geçersiz.
doküman_çok_büyükDoküman izin verilen maksimum boyutu aşıyor.
yazıcı_meşgulYazıcı meşgul ve şu anda dokümanı işleyemiyor. Zaman aşımından sonra yeniden deneyin.
yazıcı_hatasıYazıcı hata durumunda ve düzeltmek için kullanıcı etkileşimi gerekiyor. Açıklama daha ayrıntılı açıklama içermelidir (ör. "Tepsi 1'deki kağıt reçeli).
geçersiz_parametrelerİstekte geçersiz parametreler belirtildi. (Bilinmeyen parametreler, gelecekteki uyumluluk için güvenli bir şekilde yoksayılmalıdır)
kullanici_iptaliKullanıcı, yazdırma işlemini cihazdan açıkça iptal etti.
Sunucu_hatasıDoküman Cloud Print'e gönderilemedi.
geçersiz_x_ayrıca_jetonX-Privet-Token geçersiz veya istekte boş.

Cihaz, /privet/printer/submitdoc dosyasını göstermiyorsa HTTP 404 hatası döndürmelidir. X-Privet-Token başlığı yoksa cihazın HTTP 400 hatası döndürmesi ZORUNLUDUR.

Not: /privet/printer/submitdoc API, yazıcı tarafında özel işlem gerektirebilir (ekteki büyük yük nedeniyle). Bazı durumlarda (yazıcı HTTP sunucusunun uygulamasına ve platformuna bağlıdır) yazıcı, HTTP hatası döndürmeden ÖNCE soketi kapatabilir. Aksi halde, yazıcı 503 hatasını (Pritve hatası yerine) döndürebilir. Yazıcılar Privet'i iade etmek için mümkün olduğunca çok çabalamalıdır. Ancak Privet spesifikasyonunu uygulayan her istemci, /privet/printer/submitdoc API için soket kapatma (HTTP hatası yok) ve 503 HTTP hata durumları ile başa çıkabilmelidir. Bu durumda, müşteri bunu 15 saniyeye ayarlanmış "Prevet"printer_meşgul" hatası olarak ele ALMALIDIR. Sonsuz yeniden denemelerin önlenmesi için müşteri, makul sayıda denemeden sonra (örneğin, 3) işlemi yeniden deneyebilir.

5.3. /privet/yazıcı/jobstate API'sı

/privet/printer/jobstate API İSTEĞE BAĞLIdır (yukarıdaki Basit Yazdırma bölümüne bakın). Bu bir HTTP GET isteğidir. /privet/printer/jobstate API geçerli bir "X-Privet-Token" başlığı olup olmadığını TEST ETMELİDİR. Cihazın bu API'yi "/privet/printer/jobstate" url'sinde uygulaması GEREKİR:
GET /privet/printer/jobstate HTTP/1.1
Bir /privet/printer/jobstate API çağrısı alırken, bir yazıcı istenen yazdırma işinin durumunu veya geçersiz_print_job hatasını döndürmelidir.

5.3.1. Gir

/privet/printer/jobstate API'sında aşağıdaki giriş parametreleri bulunur:
AdDeğer
iş_kimliğiDurumunu döndürmek için iş kimliğini yazdırın.

5.3.2. Return

/privet/printer/jobstate API aşağıdaki verileri döndürür:
Değer adıDeğer türüAçıklama
iş_kimliğistringYazdırma işi kimliği, durum bilgilerini içerir.
statestringtaslak: Yazdırma işi cihazda oluşturuldu (henüz bir /privet/printer/submitdoc çağrısı alınmadı).
sırasına alındı: Yazdırma işi alındı ve sıraya alındı, ancak yazdırma henüz başlamadı.
in_progress: Yazdırma işi, yazdırma işlemi devam ediyordur.
Durduruldu: Yazdırma işi duraklatıldı, ancak manuel veya otomatik olarak yeniden başlatılabilir.
tamamlandı - Yazdırma işi tamamlandı.
iptal edildi - Yazdırma işi başarısız oldu.
açıklamastring(isteğe bağlı) Yazdırma işi durumunun kullanıcı tarafından okunabilir açıklaması. state< durdurulmuş veya iptal edilmişse ek bilgiler içermelidir. semantic_state alanı genellikle müşteriye daha iyi ve daha anlamlı bir açıklama sağlar.
süresi doluyorintBu yazdırma işinin geçerli olduğu saniye sayısı.
iş_türüstring(isteğe bağlı) Gönderilen belgenin içerik türü.
iş_boyutuint 64 bit(isteğe bağlı) Yazdırma verilerinin bayt cinsinden boyutu.
iş_adıstring(isteğe bağlı) Girişle aynı iş adı (varsa).
Sunucu_iş_kimliğistring(isteğe bağlı) Sunucudan döndürülen işin kimliği (iş, Cloud Print hizmetine yayınlandıysa). Çevrimdışı baskı için atlandı.
semantik_eyaletJSON(isteğe bağlı) İşin PrintJobState biçimindeki semantik durumu.

Örnek (Cloud Print aracılığıyla raporlama yaparak yazdırma):

{
        "job_id": "123",
        "state": "in_progress",
        "expires_in": 100,
        "job_type": "application/pdf",
        "job_size": 123456,
        "job_name": "My PDF document",
        "server_job_id": "1111-2222-3333-4444"
}

Örnek (çevrimdışı yazdırma hatası):

{
        "job_id": "123",
        "state": "stopped",
        "description": "Out of paper",
        "expires_in": 100,
        "job_type": "application/pdf",
        "job_size": 123456,
        "job_name": "My PDF document"
}

Örnek (kullanıcı tarafından iptal edilen yazdırma işi):

{
        "job_id": "123",
        "state": "aborted",
        "description": "User action",
        "expires_in": 100,
        "job_type": "application/pdf",
        "job_size": 123456,
        "job_name": "My PDF document",
        "semantic_state": {
                "version": "1.0",
                "state": {
                        "type": "ABORTED",
                        "user_action_cause": {"action_code": "CANCELLED"}
                },
                "pages_printed": 7
        }
}

Örnek (basılı olmadığı için yazdırma işi durduruldu). Cihaz durumu referansına dikkat edin. İstemcinin, cihaz durumu hakkında daha ayrıntılı bilgi edinmek için /privet/info API'yi çağırması gerekir:

{
        "job_id": "123",
        "state": "stopped",
        "description": "Out of paper",
        "expires_in": 100,
        "job_type": "application/pdf",
        "job_size": "123456",
        "job_name": "My PDF document",
        "semantic_state": {
                "version": "1.0",
                "state": {
                        "type": "STOPPED",
                        "device_state_cause": {"error_code": "INPUT_TRAY"}
                },
                "pages_printed": 7
        }
}

5.3.3. Hatalar

/privet/printer/jobstate API aşağıdaki hataları döndürebilir (ayrıntılar için bkz. Hatalar bölümü):
HataAçıklama
Geçersiz_Yazdırma_İşiİstekte geçersiz/geçerlilik süresi dolmuş iş kimliği belirtildi.
Sunucu_hatasıYazdırma işi durumu (Cloud Print'e gönderilen yazdırma işleri için) alınamadı.
geçersiz_x_ayrıca_jetonX-Privet-Token geçersiz veya istekte boş.

Cihaz, /privet/printer/jobstate 'i göstermiyorsa HTTP 404 hatası döndürmesi GEREKİR. X-Privet-Token başlığı yoksa cihazın HTTP 400 hatası döndürmesi ZORUNLUDUR.

6. Ek

6.1. Varsayılan davranış ve ayarlar

Bu bölümde, TÜM Privet uyumlu cihazlardan beklediğimiz varsayılan davranış açıklanmaktadır.
  • Kullanıma hazır cihazlar yalnızca /privet/info ve /privet/register API'lerini desteklemelidir. Diğer tüm API'ler (ör. /privet/accesstoken, yerel yazdırma) devre dışı bırakılmalıdır.
  • Kayıt için cihazla fiziksel etkileşim gereklidir.
    • Kullanıcının cihaza erişimini onaylamak için cihazda fiziksel bir işlem yapması (ör. bir düğmeye basması) ZORUNLUDUR.
    • Kullanıcı, yukarıda belirtilen işlemi gerçekleştirdikten sonra, yazıcının /db/register isteğini göndermesi gerekir. İşlem gönderilene kadar bu isteği göndermemelidir (Adım Dizisi 1'e bakın).
    • Cihaz, bir /privet/register isteğini işliyorsa (örneğin, yukarıdaki işlemi bekliyorsa) diğer tüm /privet/register isteklerini reddetmelidir. Bu durumda cihazın device_meşgul hatası döndürmesi ZORUNLUDUR.
    • Cihaz, yukarıda belirtilen fiziksel işlemi almayan /register isteklerini 60 saniye içinde zaman aşımına uğratmalıdır. Bu durumda cihazın onay_zaman aşımı hatasını döndürmesi ZORUNLUDUR.
    • İsteğe bağlı: Önerilir ancak zorunlu değildir. Aşağıdakiler kullanıcı deneyimini iyileştirebilir:
      • Yazıcı, kullanıcının kaydı onaylamak için işlem yapması gerektiğini belirtmek üzere yanıp sönen bir ışık veya ekran yakabilir.
      • Yazıcı, ekranında "abc@def.com" kullanıcısı için Google Cloud Print'e kaydedildiğini belirtebilir. Devam etmek için Tamam'a basın. Burada abc@def.com, /register API çağrısındaki kullanıcı parametresidir. Bu sayede, kullanıcılar aşağıdaki hususları daha net anlayabilir:
        • kendisinden onay alması gerekir.
        • Kullanıcı isteği tetiklememişse ne olur?
      • Yazıcıdan onaylayacağınız fiziksel bir işleme ek olarak (ör. "Tamam düğmesine basın") yazıcıya, bu isteği iptal etmek için kullanıcıya bir düğme de sunulabilir (ör. "Reddetmek için İptal'e basın"). Bu, kayıt isteğini tetiklemeyen kullanıcıların 60 saniyelik zaman aşımından önce isteği iptal etmesine olanak tanır. Bu durumda cihaz user_cancel hatası döndürmelidir.
  • Sahiplik aktarmaları:
    • Cihaz, Cloud hizmetinden açıkça silinebilir.
      • Cihaz başarılı olursa ancak / kablolu/yazıcı (GCP için) çağrısının sonucu olarak hiçbir cihaz açıklaması almazsa cihazın varsayılan (kullanıma hazır) moduna dönmesi ZORUNLUDUR.
      • Cihazın kimlik bilgileri artık çalışmıyorsa (Sunucudan gelen "geçersiz kimlik bilgileri" yanıtı nedeniyle) açık bir şekilde varsayılan (kullanıma hazır) moda dönmesi GEREKİR.
    • Yerel fabrika ayarlarına sıfırlama işlemi cihazın kimlik bilgilerini temizlemeli ve varsayılan duruma ayarlamalıdır.
    • İsteğe bağlı: Cihaz, kimlik bilgilerini temizlemek ve varsayılan moda almak için bir menü öğesi sağlayabilir.
  • XMPP bildirimlerini destekleyen cihazların sunucuya ping atabilmeyi gerektirmesi ZORUNLUDUR. Ping zaman aşımının sunucudan kontrol edilebilmesi gerekir. Yerel ayar "&";
  • Cihaz, senkronize edildiklerinden emin olmak için sunucuya günde en fazla bir kez (24 saat) açık bir şekilde sunucuyu (XMPP ping'lerinin yanı sıra GCP için / kablolu/yazıcı API'si) açıkça pingleyebilir. Kontrol aralığını 24-32 saat içinde rastgele ayarlamanız önerilir.
  • İsteğe bağlı: Cloud Print cihazları için önerilir ancak kullanıcının cihazdan yeni yazdırma işlerini kontrol etmesine olanak sağlamak için manuel bir yönteme (düğme) sahip olunması gerekmez. Bazı yazıcılarda bu özellik zaten bulunur.
  • İsteğe bağlı. Kurumsal yazıcılarda, yerel keşfi tamamen devre dışı bırakma seçeneği olabilir. Bu durumda, cihazın sunucudaki bu yerel ayarları güncellemesi GEREKİR. Yeni yerel ayarların boş olması GEREKMEZ ("local_discovery"&#t;false" özelliğinin ayarlanması, GCP Hizmetinden yeniden etkinleştirilebileceği anlamına gelir).

6.1.2 Varsayılan Kayıt Şeması

6.2. XSSI ve XSRF saldırıları ve önleme

Bu bölümde, cihaza XSSI ve XSRF saldırılarının gerçekleşme olasılığı ve bunlardan nasıl korunacağınız (jeton oluşturma teknikleri dahil) açıklanmaktadır.
Daha fazla bilgiye buradan ulaşabilirsiniz: http://googleonlinesecurity.blogspot.com/2011/05/website-security-for-webmasters.html
Normalde bir site, çerez kimlik doğrulama mekanizmaları kullandığında XSSI ve XSRF saldırıları yapılabilir. Google, Cloud Print Hizmeti ile çerezleri kullanmasa da bu tür saldırılar yine de mümkündür. Tasarım gereği yerel ağ erişimi, isteklere dolaylı olarak güvenir.

6.2.1. XYS

Kötü amaçlı web siteleri, Princit ile uyumlu bir cihazın IP adresini ve bağlantı noktası numarasını tahmin edip "src=<api name>"&hl=tr etiketinin içinde Privet API'yi çağırmaya çalışabilir:
<script type="text/javascript" src="http://192.168.1.42:8080/privet/info"></script>
Koruma olmadan, kötü amaçlı web siteleri API çağrılarını yürütebilir ve sonuçlara erişebilir.
Bu tür saldırıyı önlemek için ALL Privet API çağrılarının istekte X&Prtt-Token başlığı olması ZORUNLUDUR. "quot;src=<api>" komut dosyası etiketleri başlık ekleyemez ve bu tür saldırılara karşı etkili bir koruma sağlar.

6.2.2. XSRF

http://en.wikipedia.org/wiki/Cross-site_request_forgery
Kötü amaçlı bir web sitesinin, Princit uyumlu bir cihazın IP adresini ve bağlantı noktası numarasını tahmin edip <iframe> formları veya diğer web siteleri arası yükleme mekanizmasını kullanarak Privet API'yi çağırmaya çalışması mümkündür. Saldırganlar isteğin sonuçlarına erişemez ancak istek bir işlem gerçekleştirdiğinde (ör. yazdırma) bunu tetikleyebilir.

Bu saldırıyı önlemek için aşağıdaki korumaya ihtiyacımız vardır:

  • /privet/info API'yi XSRF'ye açık bırakın
  • /privet/info API'nın cihazda herhangi bir işlem YAPMAMASI GEREKİR
  • X-privet-jetonunu almak için /privet/info API'yi kullanın
  • Diğer tüm API'lerin "X-Privet-Token" başlığı içinde geçerli bir x-privet-token kodu denetlemesi GEREKİR.
  • x-privet-token yalnızca 24 saat süreyle geçerlidir.

Bir saldırgan /privet/info API'yi yürütebilse bile, yanıttaki x-privet-token değerini okuyamaz ve bu nedenle, başka bir API'yi çağıramaz.

XSRF jetonunu aşağıdaki algoritmayı kullanarak oluşturmanız önerilir:

XSRF_token = base64( SHA1(device_secret + DELIMITER + issue_timecounter) + DELIMITER + issue_timecounter )

XSRF Jeton Oluşturma Öğeleri:

  • VoiceOver özel bir karakterdir ve genellikle ":" olur.
  • issue_time sayaç, bazı etkinliklerin (zaman damgası için dönem) veya cihaz başlatma süresinin (CPU sayaçları için) başlangıcından bu yana geçen bir sayıdır. issue_timecontract, cihaz hazır olduğunda sürekli olarak artıyor (aşağıdaki jeton doğrulamasına bakın).
  • SHA1: SHA1 algoritmasını kullanan karma işlevi
  • base64: base64 kodlaması
  • device_secret: cihaza özel gizli anahtar. Her yeniden başlatma işleminde cihaz gizli anahtarının güncellenmesi GEREKİR.

Cihaz gizli anahtarı oluşturmanın önerilen yolları:

  • Her yeniden başlatmada yeni bir UUID oluştur
  • Her yeniden başlatmada 64 bit rastgele sayı oluştur

Cihaz, verdiği tüm XSRF jetonlarını depolamak için gerekli değildir. Cihazın bir XSRF jetonunun geçerliliğini doğrulaması gerektiğinde, base64 jetonunun kodunu çözmesi gerekir. İkinci yarısından issue_time sayaç değerini alın (temiz metin) ve device_secret + + issue_timecontract'in SHA1 karmasını oluşturmayı deneyin. Burada issue_timekarşı jetondan gelir. Yeni oluşturulan SHA1, jetondakiyle eşleşiyorsa cihazın issue_time birim'in geçerli zaman sayacından (24 saat) itibaren geçerli olup olmadığını kontrol etmesi gerekir. Bunun için cihaz, mevcut saat sayacını (örneğin, CPU sayacı) alıp issue_time sayaç değerini bu değerden çıkarır. Sonuç, jeton sorunundan bu yana geçen saniye sayısı olmalıdır.

Önemli: Bu, XSRF korumasını uygulamanın önerilen yoludur. Privet spesifikasyonunun müşterileri XSRF jetonunu anlamaya çalışmazlar, bunun yerine kara kutu olarak değerlendirirler. Şekil 6.2.3'te, X-Princet Token'ın uygulanması ve önerilen bir isteğin doğrulanması için önerilen bir yöntem gösterilmektedir.

6.2.3 X Önceliği Jeton Oluşturma ve Doğrulama Sırası Diyagramı

6.3. İş akışı şemaları

Bu bölümde, farklı durumlarda bir iş akışı gösterilecektir.

6.3.1. Yazıcı kullanıma hazır iş akışı

6.3.2. Kayıtlı yazıcı başlatma

6.3.3 XMPP bildirimlerini işleme iş akışı

6.3.4. Yazıcı ayarları iş akışını kontrol etme