Privet, bulut hizmetleri tarafından kullanılan bir Cloud Device Local Discovery API'sidir. Bu belge aşağıdaki bölümlerden oluşur:
- Giriş: Privet'e giriş
- Discovery: Yerel keşif mekanizmaları
- Duyurular: Yerel keşif duyuruları
- API: Genel bulut cihazları için Privet API'leri
- Printer API: Yazıcılar tarafından kullanılan Privet API'leri
- Ek: Ek diyagramlar
1. Giriş
Buluta bağlı cihazların birçok avantajı vardır. Çevrimiçi dönüştürme hizmetlerini kullanabilir, cihaz çevrimdışıyken iş kuyruklarını barındırabilir ve dünyanın her yerinden erişilebilir. Ancak belirli bir kullanıcı tarafından erişilebilen çok sayıda bulut cihazı olduğundan, konuma göre en yakın cihazı bulmak için bir yöntem sağlamamız gerekir. Privet protokolünün amacı, bulut cihazlarının esnekliğini uygun bir yerel bulma mekanizmasıyla birleştirerek cihazların yeni ortamlarda kolayca bulunmasını sağlamaktır.
Bu protokolün hedefleri şunlardır:- Bulut cihazları yerel olarak bulunabilir hale getirme
- Bulut cihazları bir bulut hizmetine kaydetme
- kayıtlı cihazları buluttaki temsilleriyle ilişkilendirme
- çevrimdışı işlevselliği etkinleştirme
- küçük cihazların kullanabilmesi için uygulamayı basitleştirme
Privet protokolü, keşif ve API olmak üzere 2 ana bölümden oluşur. Yerel ağdaki cihazı bulmak için Discovery, cihaz hakkında bilgi almak ve bazı işlemleri gerçekleştirmek için ise API kullanılır. Bu belgede cihaz, Privet protokolünü uygulayan buluta bağlı bir cihazı ifade eder.
2. Discovery
Keşif, zeroconf tabanlı (mDNS + DNS-SD) bir protokoldür. Cihaz, IPv4 bağlantı yerel adreslemeyi uygulamalıdır. Cihaz, mDNS ve DNS-SD özelliklerine UYGUN OLMALIDIR.
- http://www.rfc-editor.org/rfc/rfc3927.txt (IPv4 Link-local)
- http://www.rfc-editor.org/rfc/rfc4862.txt (IPv6 Bağlantı Yerel)
- http://www.rfc-editor.org/rfc/rfc6762.txt (mDNS)
- http://www.rfc-editor.org/rfc/rfc6763.txt (DNS-SD)
Cihaz, yukarıdaki spesifikasyonlara göre ad çakışması çözümü uygulamalıdır.
2.1. Hizmet Türü
DNS hizmet keşfi, hizmet türleri için şu biçimi kullanır: _applicationprotocol._transportprotocol. Privet protokolü söz konusu olduğunda DNS-SD için hizmet türü: _privet._tcp olmalıdır.
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ın kullanılması önerilir. Örneğin: Bir yazıcı, "Printer XYZ._privet._tcp" ve "Printer XYZ._printer._tcp" hizmetlerini uygulayabilir. Kullanıcı için kurulumu basitleştirir. Ancak Privet istemcileri yalnızca "_privet._tcp"yi arar.
Cihaz, ana hizmet türüne ek olarak, ilgili alt türlerinin PTR kayıtlarını da yayınLAMALIDIR (DNS-SD spesifikasyonu: "7.1. Seçici Örnek Numaralandırma (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 İKİ PTR kaydı yayınlamalıdır:
- _privet._tcp.local.
- _printer._sub._privet._tcp.local.
2.2. TXT kaydı
DNS Hizmet Bulma, TXT kayıtlarına bir hizmetle ilgili isteğe bağlı bilgileri eklemek için alanları tanımlar. TXT kaydı, anahtar/değer çiftlerinden oluşur. Her anahtar/değer çifti, uzunluk baytıyla başlar ve ardından en fazla 255 baytlık metin gelir. Anahtar, ilk "=" karakterinden önceki metin, değer ise ilk "=" karakterinden sonraki metindir. Spesifikasyon, kayıtta değer olmamasına izin verir. Bu durumda, "=" karakteri veya "=" karakterinden sonra metin olmaz. (DNS-SD spesifikasyonuna bakın: "6.1. DNS TXT kaydı biçimi için "DNS TXT Kayıtları İçin Genel Biçim Kuralları" ve "6.2. DNS-SD TXT Record Size" (DNS-SD TXT Kaydı Boyutu) bölümüne bakın.
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=ONLINE" aynıdır. TXT kaydındaki bilgiler, /info API'si üzerinden erişilebilen bilgilerle aynı OLMALIDIR (4.1. bölümüne bakın). API bölümü).
TXT kaydı boyutunun 512 baytın altında tutulması önerilir.
2.2.1. txtvers
TXT yapısının sürümü. txtvers, TXT yapısının ilk kaydı OLMALIDIR. Şu anda yalnızca 1. sürüm desteklenmektedir.
txtvers=1
2.2.2. ty
Cihazın kullanıcı tarafından okunabilir adını sağlar. Örneğin:
ty=Google Cloud Ready Printer Model XYZ
2.2.3. note (isteğe bağlı)
Cihazın kullanıcı tarafından okunabilir adını sağlar. Örneğin:
note=1st floor lobby printer
Not: Bu isteğe bağlı bir anahtardır ve atlanabilir. Ancak varsa kullanıcı bu değeri değiştirebilmelidir. Cihazı kaydederken aynı açıklama KULLANILMALIDIR.
2.2.4. url
Bu cihazın bağlı olduğu sunucu URL'si (protokol dahil). Örneğin:
url=https://www.google.com/cloudprint
2.2.5. type
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 alt tür, karşılık gelen bir PTR kaydı kullanılarak reklamı yapı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ı (<subtype>._sub._privet._tcp), cihaz türüne eşit olmalıdır.
2.2.6. id
Cihaz kimliği. Cihaz henüz kaydedilmediyse bu anahtar mevcut olmalı ancak değer boş olmalıdır. Örneğin:
id=11111111-2222-3333-4444-555555555555 id=
2.2.7. cs
Cihazın mevcut bağlantı durumunu gösterir. Bu spesifikasyonda dört olası değer tanımlanmıştır.
- "online", cihazın şu anda buluta bağlı olduğunu gösterir.
- "Çevrimdışı", cihazın yerel ağda kullanılabildiğini ancak sunucuyla iletişim kuramadığını gösterir.
- "Bağlanıyor", cihazın başlatma sırasını gerçekleştirdiğini ve henüz tam olarak internete bağlanmadığını gösterir.
- "not-configured", cihazın internet erişiminin henüz yapılandırılmadığını gösterir. Bu değer şu anda kullanılmamaktadır ancak spesifikasyonun gelecekteki sürümlerinde faydalı olabilir.
- cs=online
- cs=offline
- cs=connecting
Cihaz bir buluta kaydedilmişse başlatıldığında bağlantı durumunu tespit etmek için bir sunucuyla bağlantıyı kontrol etmelidir (örneğin, cihaz ayarlarını almak için bulut API'si çağrısı). Cihaz, bu değeri bildirmek için bildirim kanalı (ör. XMPP) bağlantı durumunu kullanabilir. Başlangıçta kayıtlı olmayan cihazlar, bağlantı durumlarını algılamak için bir alana ping gönderebilir (örneğin, Cloud Print cihazları için www.google.com'a ping gönderilir).
3. Duyurular
Cihaz başlatıldığında, kapatıldığında veya durum değişikliği olduğunda cihaz, mDNS spesifikasyonunda açıklandığı gibi duyuru adımını gerçekleştirmelidir. İlgili duyuruyu aralarında en az bir saniye aralık olacak şekilde en az iki kez göndermelidir.
3.1. Başlangıç
Cihaz başlatıldığında, mDNS spesifikasyonunda açıklandığı şekilde yoklama ve duyurma adımlarını uygulaması ZORUNLUDUR. Bu durumda SRV, PTR ve TXT kayıtları gönderilmelidir. Mümkünse tüm kayıtların tek bir DNS yanıtında gruplandırılması önerilir. Aksi takdirde, SRV, PTR, TXT kayıtları sırası önerilir.
3.2. Kapat
Cihaz kapatıldığında, TTL=0 olan bir "goodbye packet" (mDNS belgelerinde açıklandığı gibi) göndererek ilgili tüm tarafları bu konuda bilgilendirmeye ÇALIŞMALIDIR.
3.3. Güncelle
TXT'de açıklanan bilgilerden herhangi biri değişirse cihaz, güncelleme duyurusu GÖNDERMELİDİR. Bu durumda yalnızca yeni TXT kaydını göndermeniz yeterlidir. Örneğin, bir cihaz kaydedildikten sonra yeni cihaz kimliğini içeren bir güncelleme duyurusu göndermelidir.
4. API
Bir bulut cihazı keşfedildikten sonra, istemci iletişimi doğrudan yerel ağ üzerinden cihazla etkinleştirilir. Tüm API'ler HTTP 1.1 tabanlıdır. Veri biçimleri JSON tabanlıdır. API istekleri GET veya POST istekleri olabilir.
Her istekte geçerli bir "X-Privet-Token" başlığı OLMALIDIR. Boş bir "X-Privet-Token" başlığına izin verilen TEK istek /privet/info isteğidir (başlığın yine de mevcut olması GEREKTİĞİNİ unutmayın). "X-Privet-Token" başlığı eksikse cihaz, aşağıdaki HTTP 400 hatasıyla yanıt VERMELİDİR:
HTTP/1.1 400 Missing X-Privet-Token header.
"X-Privet-Token" başlığı boşsa veya geçersizse cihaz, "invalid X-Privet-Token error" (invalid_x_privet_token, ayrıntılar için Hatalar bölümüne bakın) ile yanıt VERMELİDİR. Bunun tek istisnası /info API'sidir. Bu işlemin neden yapıldığı ve jetonların nasıl oluşturulması gerektiği hakkında daha fazla bilgi için Ek A: XSSI ve XSRF saldırıları ve önleme bölümüne bakın.
İstenen bir API yoksa veya desteklenmiyorsa cihaz, HTTP 404 hatası döndürmelidir.
4.1. API kullanılabilirliği
/info API'si dahil olmak üzere HERHANGİ BİR API kullanıma sunulmadan önce cihaz, yerel ayarları kontrol etmek için sunucuyla iletişime GEÇMELİDİR. Yerel ayarlar yeniden başlatmalar arasında KORUNMALIDIR. Sunucu kullanılamıyorsa bilinen son yerel ayarlar kullanılmalıdır. Cihaz henüz kaydedilmediyse varsayılan ayarları kullanır.
Cloud Print cihazlarının kaydolmak, yerel ayarları almak ve güncellemek için aşağıdaki adımları uygulaması ZORUNLUDUR.
4.1.1. Kayıt
Cihaz kaydolduğunda "local_settings" parametresini aşağıdaki gibi BELİRTmelidir:
{ "current": { "local_discovery": true, "access_token_enabled": true, "printer/local_printing_enabled": true, "printer/conversion_printing_enabled": true, "xmpp_timeout_value": 300 } }
Değer Adı | Değer Türü | Açıklama |
---|---|---|
local_discovery | boolean | Yerel bulma işlevine izin verilip verilmediğini gösterir. "false" ise /info dahil tüm yerel API ve DNS-SD bulma devre dışı bırakılmalıdır. Varsayılan olarak, yeni kaydedilen cihazlar "true" değerini iletmelidir. |
access_token_enabled | boolean (isteğe bağlı) | /accesstoken API'sinin yerel ağda kullanıma sunulup sunulmayacağını gösterir. Varsayılan olarak "true" olmalıdır. |
printer/local_printing_enabled | boolean (isteğe bağlı) | Yerel yazdırma işlevinin (/printer/createjob, /printer/submitdoc, /printer/jobstate) yerel ağda kullanıma sunulup sunulmayacağını belirtir. Varsayılan olarak "true" olmalıdır. |
printer/conversion_printing_enabled | boolean (isteğe bağlı) | Yerel yazdırma işleminin, dönüştürme için işi sunucuya gönderip gönderemeyeceğini belirtir. Yalnızca yerel yazdırma etkinleştirildiğinde anlamlıdır. |
xmpp_timeout_value | int (isteğe bağlı) | XMPP kanalı ping'leri arasındaki saniye sayısını gösterir. Varsayılan olarak 300 (5 dakika) veya daha fazla olmalıdır. |
Önemli: İsteğe bağlı değerlerin olmaması, ilgili işlevin cihaz tarafından tamamen desteklenmediğini gösterir.
4.1.2. Başlangıç
Cihaz başlatıldığında, yerel ağda hangi API'lerin kullanılabileceğini kontrol etmek için sunucuyla iletişime geçmelidir. Cloud Print'e bağlı yazıcılar için aşağıdaki numara aranmalıdır:
/cloudprint/printer?printerid=<printer_id>
/cloudprint/list
/cloudprint/list yerine /cloudprint/printer tercih edilir ancak her ikisi de çalışır.
Bu API, yerel API'nin ayarları da dahil olmak üzere mevcut cihaz parametrelerini döndürür. Sunucudan gelen yanıt aşağıdaki biçimde olur:
"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 } }
"current" nesnesi, şu anda geçerli olan ayarları gösterir.
"pending" nesnesi, cihaza uygulanması gereken ayarları gösterir (bu nesne eksik olabilir).
Cihaz, "beklemede" ayarları gördüğünde durumunu GÜNCELLEMELİDİR (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 olur:
<device_id>/update_settings
Böyle bir bildirim alındığında cihaz, en son ayarları almak için sunucuya SORMALIDIR. Cloud Print cihazları ŞUNLARI kullanmalıdır:
/cloudprint/printer?printerid=<printer_id>
Cihaz, /cloudprint/printer API'si sonucunda (başlangıçta veya bildirim nedeniyle) "beklemede" bölümünü gördüğünde yeni ayarları hatırlamak için dahili durumunu GÜNCELLEMELİDİR. Yeni ayarları onaylamak için sunucu API'sini ÇAĞIRMALIDIR. Cloud Print yazıcılar için cihaz, /cloudprint/update API'sini ÇAĞIRMALIDIR ve kayıt sırasında "local_settings" parametresini kullanmalıdır.
XMPP kanalına yeniden bağlanırken cihaz, yerel ayarların son seferden bu yana değiştirilip değiştirilmediğini kontrol etmek için /cloudprint/printer API'sini ÇAĞIRMALIDIR.
4.1.3.1. Yerel Ayarlar Beklemede
Cihazın sunucu API'sini çağırmak için kullandığı "local_settings" parametresi ASLA "pending" bölümünü içermemelidir.
4.1.3.2. Geçerli Yerel Ayarlar
"local_settings" bölümünün "current" kısmını YALNIZCA cihaz değiştirebilir. Diğer herkes "beklemede" bölümünü değiştirir ve değişikliklerin cihaz tarafından "mevcut" bölümüne yayılmasını bekler.
4.1.4. Çevrimdışı
Başlatma sırasında sunucuyla iletişim kurulamadığında, bildirimden sonra cihaz, bilinen son yerel ayarları KULLANMALIDIR.
4.1.5. Cihazı hizmetten silme
Cihaz hizmetten (ör. GCP) silindiyse cihaza bir XMPP bildirimi gönderilir. Bildirim aşağıdaki biçimde olur:
<device_id>/delete
Böyle bir bildirim alındığında cihaz, durumunu kontrol etmek için sunucuya GİTMELİDİR. Cloud Print cihazları ŞUNLARI kullanmalıdır:
/cloudprint/printer?printerid=<printer_id>
Cihaz, success=false ile başarılı bir HTTP yanıtı almalı ve cihaz/yazıcı açıklaması olmamalıdır. Bu, cihazın sunucudan kaldırıldığı ve cihazın kimlik bilgilerini silip varsayılan fabrika ayarları moduna geçmesi gerektiği anlamına gelir.
Cihaz, /cloudprint/printer API'si (başlatma, ayar güncelleme bildirimi, günlük ping) sonucunda silindiğini belirten bir yanıt aldığında kimlik bilgilerini SİLMELİ ve varsayılan moda geçmelidir.
4.2. /privet/info API'si
Bilgi API'si ZORUNLUDUR ve her cihaz tarafından uygulanmalıdır. "/privet/info" URL'si için bir HTTP GET isteğidir: GET /privet/info HTTP/1.1
Bilgi API'si, bir cihaz ve desteklediği işlevler hakkında temel bilgiler döndürür. Bu API, XSRF saldırılarına karşı savunmasız olduğundan cihaz durumunu asla değiştirmemeli veya herhangi bir işlem gerçekleştirmemelidir. Boş bir "X-Privet-Token" üstbilgisine izin verilen TEK API budur. İstemciler, /privet/info API'sini "X-Privet-Token" üstbilgisi X-Privet-Token: "" olarak ayarlanmış şekilde çağırmalıdır.
Bilgi API'si, keşif sırasında TXT kaydında bulunan verilerle tutarlı veriler döndürmelidir.
4.2.1. Giriş
/privet/info API'sinin giriş parametresi yoktur.
4.2.2. Return
/privet/info API, cihaz ve desteklenen işlevler hakkında temel bilgiler döndürür.
TXT sütunu, DNS-SD TXT kaydındaki ilgili alanı gösterir.
Değer Adı | Değer Türü | Açıklama | TXT |
---|---|---|---|
sürüm | dize | Desteklenen en yüksek API sürümü (major.minor), şu anda 1.0 | |
ad | dize | Cihazın insan tarafından okunabilir adı. | ty |
açıklama | dize | (İsteğe bağlı) Cihaz açıklaması. Kullanıcı tarafından değiştirilebilmelidir. | not |
url | dize | Bu cihazın iletişim kurduğu sunucunun URL'si. URL, protokol belirtimini İÇERMELİDİR. Örneğin: https://www.google.com/cloudprint. | url |
tür | dize listesi | Desteklenen cihaz türlerinin listesi. | tür |
id | dize | Cihaz kimliği. Cihaz henüz kaydedilmediyse boş olur. | id |
device_state | dize | Cihazın durumu. Boşta, cihazın hazır olduğu anlamına gelir. İşleniyor, 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. | |
connection_state | dize | Sunucuya bağlantının durumu (base_url)
online: Bağlantı kullanılabilir. offline: Bağlantı yok. connecting: Başlangıç adımları gerçekleştiriliyor. not-configured: Bağlantı henüz yapılandırılmadı. Kayıtlı bir cihaz, bildirim kanalının durumuna (ör. XMPP bağlantı durumu) göre bağlantı durumunu bildirebilir. | cs |
üretici | dize | Cihaz üreticisinin adı | |
model | dize | Cihazın modeli | |
serial_number | dize | Benzersiz cihaz tanımlayıcısı. Bu spesifikasyonda bu değer UUID OLMALIDIR. (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ı önemle tavsiye ederiz. Örneğin, IPP'yi uygulayan yazıcılar "printer-device-id" alanında bu seri numarası kimliğini kullanabilir. | |
donanım yazılımı | dize | Cihazın donanım yazılımı sürümü | |
çalışma süresi | int | Cihazın başlatılmasından itibaren geçen saniye sayısı. | |
setup_url | dize | (isteğe bağlı) Kurulum talimatlarını içeren sayfanın URL'si (protokol dahil) | |
support_url | dize | (isteğe bağlı) Destek ve SSS bilgilerinin bulunduğu sayfanın URL'si (protokol dahil) | |
update_url | dize | (isteğe bağlı) Donanım yazılımı güncelleme talimatlarının bulunduğu sayfanın URL'si (protokol dahil) | |
x-privet-token | dize | XSSI ve XSRF saldırılarını önlemek için tüm API'lere iletilmesi gereken X-Privet-Token üstbilgisinin değeri. Ayrıntılar için 6.1. bölümüne bakın. | |
api | API'lerin açıklaması | Desteklenen API'lerin listesi (aşağıda açıklanmıştır) | |
semantic_state | JSON | (isteğe bağlı) Cihazın CloudDeviceState biçimindeki anlamsal durumu. |
api: Yerel ağ üzerinden kullanılabilen API'lerin listesini içeren bir JSON listesidir. Tüm API'lerin yerel ağda aynı anda kullanılamayabileceğini unutmayın. Örneğin, yeni bağlanan bir cihaz yalnızca /register API'sini desteklemelidir:
"api": [ "/privet/register", ]
"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'ye bakın). Bu API, cihaz buluta başarıyla kaydedildikten sonra GİZLENMELİDİR.
- /privet/accesstoken: Cihazdan erişim jetonu istemek için kullanılan API (ayrıntılar için /privet/accesstoken API'sine bakın).
- /privet/capabilities: Cihaz özelliklerini almak için kullanılan API'dir (Ayrıntılar için /privet/capabilities API'sini inceleyin).
- /privet/printer/*: "Yazıcı" cihaz türüne özel API. Ayrıntılar için yazıcıya özel API'leri inceleyin.
{ "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", ] }
{ "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 eksikse hata döndürmelidir. HTTP 400 hatası OLMALIDIR:
HTTP/1.1 400 Missing X-Privet-Token header.
4.3. /privet/register API'si
/privet/register API'si İSTEĞE BAĞLIDIR. Bu bir HTTP POST isteğidir. /privet/register API'si, geçerli bir X-Privet-Token üstbilgisini KONTROL ETMELİDİR. Cihaz, bu API'yi "/privet/register" URL'sinde uygulamalıdır:
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, yalnızca şu anda anonim kayda izin verdiğinde /privet/register API'sini kullanıma sunmalıdır. Örneğin:
- Cihaz açıldığında (veya cihazdaki özel bir düğme tıklandıktan sonra) henüz kaydedilmemişse yerel ağdaki bir kullanıcının yazıcıyı talep etmesine izin vermek için /privet/register API'sini kullanıma sunmalıdır.
- Kayıt işlemi tamamlandıktan sonra cihaz, yerel ağdaki başka bir kullanıcının cihazı geri almasını önlemek için /privet/register API'sini kullanıma sunmayı durdurmalıdır.
- Bazı cihazlarda, cihazları kaydetmek için farklı yöntemler olabilir ve /privet/register API'yi hiç kullanmamaları gerekir (ör. Chrome Cloud Print bağlayıcısı).
Kayıt işlemi 3 adımdan oluşur (Cloud Print için anonim kayda bakın).
- Anonim kayıt sürecini başlatın.
- Bir istemci, /privet/register API'sini çağırarak bu işlemi başlatır. Cihaz, bu sırada kullanıcı onayı bekleyebilir.
- Hak talebi jetonunu alın.
İstemci, cihazın devam etmeye hazır olup olmadığını öğrenmek için yoklama yapar. Cihaz hazır olduğunda, kayıt jetonunu ve kayıt URL'sini almak için sunucuya bir istek gönderir. Alınan jeton ve URL istemciye döndürülmelidir. Bu adım sırasında, cihaz kaydı başlatmak için başka bir arama alırsa:
- Kaydı başlatan kullanıcı aynı kullanıcıysa önceki tüm verileri (varsa) bırakın ve yeni bir kayıt işlemi başlatın.
- Bu farklı bir kullanıcıysa device_busy hatasını ve 30 saniyelik zaman aşımını döndürün.
Kayıt işlemini tamamlayın.
İstemci, cihazı talep ettikten sonra kayıt işlemini tamamlamak için cihaza bildirim göndermelidir. Kayıt işlemi tamamlandıktan sonra cihaz, yeni edinilen cihaz kimliği de dahil olmak üzere bir güncelleme duyurusu göndermelidir.
Not: Cihaz, /privet/register API çağrısını işlerken aynı anda başka /privet/register API çağrıları işlenemez. Cihaz, device_busy hatasını ve 30 saniye zaman aşımını döndürmelidir.
Cihaza kaydolmak için kullanıcı onayı ALINMASI ŞİDDETLE TAVSİYE EDİLİR. Uygulanırsa cihaz, /privet/register?action=start API çağrısını aldıktan SONRA kullanıcı onayını BEKLEMELİDİR. İstemci, kullanıcı onayı tamamlandığında ve hak talebi jetonu kullanılabilir olduğunda bunu öğrenmek için /privet/register?action=getClaimToken API'sini çağırır. Kullanıcı cihazda kaydı iptal ederse (ör. İptal düğmesine basarsa) user_cancel hatası döndürülmelidir. Kullanıcı, belirli bir süre içinde kaydı onaylamadıysa confirmation_timeout hatası döndürülmelidir. Daha fazla bilgi için varsayılanlar bölümüne bakın.
4.3.1. Giriş
/privet/register API'sinde aşağıdaki giriş parametreleri bulunur:Ad | Değer |
---|---|
işlem | Aşağıdakilerden biri olabilir:
start: Kayıt işlemini başlatmak için getClaimToken: Cihaz için hak talebi jetonunu almak üzere cancel: Kayıt işlemini iptal etmek için complete: Kayıt işlemini tamamlamak için |
kullanıcı | Bu cihazı talep edecek kullanıcının e-posta adresi. |
Cihaz, tüm işlemlerden (başlatma, getClaimToken, iptal, tamamlama) gelen e-posta adresinin eşleştiğini KONTROL ETMELİDİR.
4.3.2. Return
/privet/register API'si aşağıdaki verileri döndürür:Değer adı | Değer türü | Açıklama |
---|---|---|
işlem | dize | Giriş parametresindeki işlemle aynı. |
kullanıcı | dize (isteğe bağlı) | Giriş parametresindeki kullanıcıyla aynıdır (girişte atlanırsa eksik olabilir). |
token | dize (isteğe bağlı) | Kayıt jetonu ("getClaimToken" yanıtı için zorunludur, "start", "complete", "cancel" için atlanır). |
claim_url | dize (isteğe bağlı) | Kayıt URL'si ("getClaimToken" yanıtı için zorunlu, "start", "complete", "cancel" için atlanır). Cloud Printer'lar için sunucudan alınan "complete_invite_url" olmalıdır. |
automated_claim_url | dize (isteğe bağlı) | Kayıt URL'si ("getClaimToken" yanıtı için zorunlu, "start", "complete", "cancel" için atlanır). Cloud Printer'lar için sunucudan alınan "automated_invite_url" olmalıdır. |
device_id | dize (isteğe bağlı) | Yeni cihaz kimliği ("başlat" yanıtı için atlanır, "tamamla" için zorunludur). |
Cihaz, /privet/info API yanıtında cihaz kimliğini YALNIZCA kayıt tamamlandıktan sonra döndürmelidir.
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 Hatalar bölümüne bakın):Hata | Açıklama |
---|---|
device_busy | Cihaz meşgul olduğundan istenen işlemi gerçekleştiremiyor. Zaman aşımından sonra yeniden deneyin. |
pending_user_action | Bu hata, "getClaimToken" isteğine yanıt olarak cihazın hâlâ kullanıcı onayı beklediğini ve "getClaimToken" isteğinin zaman aşımından sonra yeniden denenmesi gerektiğini gösterir. |
user_cancel | Kullanıcı, kayıt işlemini cihazdan açıkça iptal etti. |
confirmation_timeout | Kullanıcı onayı zaman aşımına uğradı. |
invalid_action | Geçersiz işlem çağrılıyor. Örneğin, istemci action=start ve action=getClaimToken'ı çağırmadan önce action=complete'i çağırdıysa. |
invalid_params | İstek içinde geçersiz parametreler belirtilmiş. (Bilinmeyen parametreler, gelecekteki uyumluluk için güvenli bir şekilde yoksayılmalıdır). Örneğin, istemci action=unknown veya user= değerini çağırdıysa bunu döndürün. |
device_config_error | Cihaz tarafında tarih/saat (veya diğer bazı ayarlar) yanlış. Kullanıcının (cihazın dahili web sitesine) gidip cihaz ayarlarını yapılandırması gerekir. |
çevrimdışı | Cihaz şu anda internete bağlı değil ve sunucuyla iletişim kuramıyor. |
server_error | Kayıt işlemi sırasında sunucu hatası oluştu. |
invalid_x_privet_token | İstek içinde X-Privet-Token geçersiz veya boş. |
Cihaz, kayıt işlemi başarıyla tamamlandıktan sonra /privet/register API'sini kullanmayı DURDURMALIDIR. Cihaz /privet/register API'sini kullanıma sunmuyorsa HTTP 404 hatası döndürmesi ZORUNLUDUR. Bu nedenle, bir cihaz zaten kayıtlıysa bu API'nin çağrılması 404 döndürmelidir. X-Privet-Token üstbilgisi eksikse cihaz, HTTP 400 hatası döndürmelidir.
4.4 /privet/accesstoken API
/privet/accesstoken API'si İSTEĞE BAĞLIDIR. Bu bir HTTP GET isteğidir. /privet/accesstoken API'si, geçerli bir "X-Privet-Token" üstbilgisinin olup olmadığını KONTROL ETMELİDİR. Cihaz, bu API'yi "/privet/accesstoken" URL'sinde uygulamalıdır:GET /privet/accesstoken HTTP/1.1
Cihaz /accesstoken API çağrısını aldığında, belirtilen kullanıcı için erişim jetonunu almak üzere sunucuyu çağırmalı ve jetonu istemciye döndürmelidir. İstemci daha sonra bu cihaza bulut üzerinden erişmek için erişim jetonunu kullanır.
Cloud Print cihazları AŞAĞIDAKİ API'yi çağırmalıdır:
/cloudprint/proximitytoken
"proximity_token": { "user": "user@domain.com", "token": "AAA111222333444555666777", "expires_in": 600 }
4.4.1. Giriş
/privet/accesstoken API'sinde aşağıdaki giriş parametreleri bulunur:Ad | Değer |
---|---|
kullanıcı | Bu erişim jetonunu kullanmak isteyen kullanıcının e-posta adresi. İstek boş olabilir. |
4.4.2. Return
/privet/accesstoken API'si aşağıdaki verileri döndürür:Değer adı | Değer türü | Açıklama |
---|---|---|
token | dize | Sunucu tarafından döndürülen erişim jetonu |
kullanıcı | dize | Giriş parametresindeki kullanıcıyla aynı kullanıcı. |
expires_in | int | Bu jetonun süresinin dolmasına kadar geçecek saniye sayısı. Sunucudan alınır ve bu yanıtta iletilir. |
Örnek:
{ "token": "AAA111222333444555666777", "user": "user@domain.com", "expires_in": 600 }
4.4.3. Hatalar
/privet/accesstoken API'si aşağıdaki hataları döndürebilir (ayrıntılar için Hatalar bölümüne bakın):Hata | Açıklama |
---|---|
çevrimdışı | Cihaz şu anda çevrimdışı ve sunucuyla iletişim kuramıyor. |
access_denied | Yetersiz haklar. Erişim reddedildi. İstek sunucu tarafından açıkça reddedildiğinde cihaz bu hatayı döndürmelidir. |
invalid_params | İstek içinde geçersiz parametreler belirtilmiş. (Bilinmeyen parametreler, gelecekteki uyumluluk için güvenli bir şekilde yoksayılmalıdır). Örneğin, istemci /accesstoken?user= veya /accesstoken adresini çağırıyorsa. |
server_error | Sunucu hatası. |
invalid_x_privet_token | İstek içinde X-Privet-Token geçersiz veya boş. |
Cihaz, /privet/accesstoken API'sini kullanıma sunmuyorsa HTTP 404 hatası döndürmesi ZORUNLUDUR. X-Privet-Token üstbilgisi eksikse cihaz, HTTP 400 hatası döndürmelidir.
4.5. /privet/capabilities API
/privet/capabilities API'si İSTEĞE BAĞLIDIR. Bu bir HTTP GET isteğidir. /privet/capabilities API'si GEÇERLİ bir "X-Privet-Token" üstbilgisini KONTROL ETMELİDİR. Cihaz, bu API'yi "/privet/capabilities" URL'sinde uygulamalıdır:GET /privet/capabilities HTTP/1.1
4.5.1. Giriş
/privet/capabilities API'sinde aşağıdaki giriş parametreleri bulunur:Ad | Değer |
---|---|
çevrimdışı | (isteğe bağlı) Yalnızca "offline=1" olabilir. Bu durumda cihaz, çevrimdışı kullanım için özellikleri döndürmelidir (özellikler "çevrimiçi" özelliklerden farklıysa). |
4.5.2. Return
/privet/capabilities API, cihaz özelliklerini Cloud Device Description (CDD) JSON biçiminde döndürür (ayrıntılar için CDD belgesine bakın). Yazıcılar, en azından desteklenen türlerin listesini burada döndürmelidir. Örneğin, şu anda internete bağlı olan bir Cloud Ready yazıcı en azından aşağıdakine benzer bir yanıt döndürebilir:{ "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": "*/*" } ] } }
{ "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ırayla belirtir. Örneğin, yukarıdaki örneklerde yazıcı, "image/pwg-raster" ve "image/jpeg" yerine "application/pdf" verilerini tercih ettiğini belirtir. İstemciler, mümkünse yazıcı önceliğine uymalıdır (ayrıntılar için CDD belgesine 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):Hata | Açıklama |
---|---|
invalid_x_privet_token | İstek içinde X-Privet-Token geçersiz veya boş. |
Cihaz /privet/capabilities API'sini kullanıma sunmuyorsa HTTP 404 hatası döndürmelidir. X-Privet-Token üstbilgisi eksikse cihaz HTTP 400 hatası döndürmelidir.
4.6. Hatalar
Yukarıdaki API'lerden döndürülen hatalar aşağıdaki biçimdedir:Değer adı | Değer türü | Açıklama |
---|---|---|
hata | dize | Hata türü (API'ye göre tanımlanır) |
açıklama | dize (isteğe bağlı) | Hatayla ilgili, kullanıcılar tarafından okunabilir açıklama. |
server_api | dize (isteğe bağlı) | Sunucu hatası durumunda bu alan, başarısız olan sunucu API'sini içerir. |
server_code | int (isteğe bağlı) | Sunucu hatası durumunda bu alan, sunucunun döndürdüğü hata kodunu içerir. |
server_http_code | int (isteğe bağlı) | Sunucu HTTP hatası durumunda bu alan, sunucunun döndürdüğü HTTP hata kodunu içerir. |
Mola | int (isteğe bağlı) | İstemcinin yeniden denemeden önce beklemesi gereken süre (yalnızca kurtarılabilir hatalar için). İstemci, gerçek zaman aşımını bu değerden +%20'lik bir değere rastgele hale GETİRMELİDİR. |
X-Privet-Token üstbilgisi eksikse tüm API'ler HTTP 400 hatası döndürmelidir.
HTTP/1.1 400 Missing X-Privet-Token header. (X-Privet-Token üst bilgisi eksik.)
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. Printer API
Bu protokolün desteklediği cihaz türlerinden biri yazıcı türüdür. Bu türü destekleyen cihazlar, yazıcılara özgü bazı işlevleri uygulayabilir. İdeal olarak, bulut özellikli yazıcılarda yazdırma işlemi Cloud Print sunucusu üzerinden yapılır:

Bazı durumlarda müşterinin yerel olarak belge göndermesi gerekebilir. İstemcinin Google Kimliği olmadığı veya Cloud Print sunucusuyla iletişim kuramadığı durumlarda gerekebilir. Bu durumda yazdırma işi yazıcıya yerel olarak gönderilir. Yazıcı da işleri sıraya almak ve dönüştürmek için Cloud Print hizmetini kullanır. Yazıcı, yerel olarak gönderilen işi Cloud Print hizmetine yeniden gönderir ve bulut üzerinden gönderildiği için işi ister. 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üştürme işlemini uyguladığından yazıcı, desteklenen içerik türleri listesinde tüm giriş biçimlerini ("*/*") desteklediğini duyurmalıdır:
{ "version": "1.0", "printer": { "supported_content_type": [ { "content_type": "image/pwg-raster" }, { "content_type": "*/*" } ] } }
Bazı durumlarda tamamen çevrimdışı bir çözüm istenebilir. Yazıcılar sınırlı sayıda giriş biçimini desteklediğinden, istemcilerin belgeleri yerel olarak desteklenen birkaç yazıcı biçimine dönüştürmesi gerekir.

Bu spesifikasyon, çevrimdışı yazdırma için tüm yazıcıların en azından PWG Raster ("image/pwg-raster") biçimini desteklemesini ZORUNLU KILAR. Yazıcılar başka biçimleri (ör. JPEG) destekleyebilir ve bir istemci bu biçimi destekliyorsa belgeleri bu biçimde gönderebilir. Yazıcı, /capabilities API aracılığıyla desteklenen türleri kullanıma sunmalıdır. Örneğin:
{ "version": "1.0", "printer": { "supported_content_type": [ { "content_type": "image/pwg-raster" }, { "content_type": "image/jpeg" } ] } }
Basit yazdırma: İstemci, belgeyi yerel ağ üzerinden /submitdoc API'sine gönderir (job_id parametresini belirtmeden). Gönderilen belge, varsayılan yazdırma bileti ayarları kullanılarak yazdırılır ve yazdırma işi durumlarına gerek yoktur. Yazıcı YALNIZCA bu tür yazdırmayı destekliyorsa /privet /info API yanıtında YALNIZCA/submitdoc API'sini duyurmalıdır.
"api": [ "/privet/accesstoken", "/privet/capabilities", "/privet/printer/submitdoc", ]
Gelişmiş yazdırma: İstemci, istekte geçerli bir CJT iş biletiyle /privet/printer/createjob API'sini çağırarak önce yazıcıda bir yazdırma işi oluşturmalıdır. Yazıcı, yazdırma biletini bellekte saklamalı ve istemciye bir job_id döndürmelidir. Ardından istemci, /printer/submitdoc API'sini çağırır ve daha önce alınan job_id'yi belirtir. Bu sırada yazıcı yazdırmaya başlar. İstemci, /privet/printer/jobstate API'sini çağırarak yazıcıya yazdırma işi durumu için yoklama yapar.
Çok müşterili bir ortamda bu API'nin nasıl çağrılacağı garanti edilmez. Bir istemcinin, başka bir istemcinin/createjob->/submitdoc aramaları arasında /createjob araması yapması mümkündür. Olası kilitlenmeleri ortadan kaldırmak ve kullanılabilirliği artırmak için yazıcıda bekleyen yazdırma işlerinden oluşan küçük bir kuyruk (en az 3-5) oluşturmanızı öneririz:
- /createjob, kuyruktaki ilk uygun yeri alır.
- İşin ömrü (kuyrukta) en az 5 dakika olmalıdır.
- Kuyruktaki tüm yerler doluysa en eski ve yazdırılmayan iş kaldırılır ve yerine yeni bir iş yerleştirilir.
- Cihazda şu anda 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 bir zaman aşımı önermelidir.
- /submitdoc, kuyruktan kaldırılmış bir işi (değiştirme veya zaman aşımı nedeniyle) ifade ediyorsa yazıcı invalid_print_job hatasını döndürmeli ve istemci, işlemi /createjob adımından yeniden denemelidir. İstemci, yeniden denemeden önce 5 saniyeye kadar rastgele bir zaman aşımı süresi beklemelidir.
Bellek kısıtlamaları nedeniyle cihazda birden fazla bekleyen iş depolanamıyorsa 1 yazdırma işinden oluşan bir sıra olabilir. Yine de yukarıdakiyle aynı protokolü izlemelidir. Bir iş tamamlandıktan veya hatayla başarısız olduktan sonra yazıcı, işin durumuyla ilgili bilgileri en az 5 dakika boyunca saklamalıdır. Tamamlanan iş durumlarını depolamak için kullanılan kuyruk boyutu en az 10 olmalıdır. Depolanması gereken daha fazla iş durumu varsa en eski olan, 5 dakikalık zaman aşımı süresi dolmadan önce kuyruktan kaldırılabilir.
Not: Şu an için istemciler iş durumunu yoklayacaktır. Gelecekte, HERHANGİ BİR yazdırma işi durumu değiştiğinde yazıcının TXT DNS bildirimi göndermesini zorunlu tutabiliriz.
5.1. /privet/printer/createjob API
/privet/printer/createjob API'si İSTEĞE BAĞLIDIR (yukarıdaki Basit Yazdırma bölümüne bakın). HTTP POST isteğidir. /privet/printer/createjob API'si, geçerli bir "X-Privet-Token" üstbilgisini KONTROL ETMELİDİR. Cihaz, bu API'yi "/privet/printer/createjob" URL'sinde uygulamalıdır:
POST /privet/printer/createjob HTTP/1.1
5.1.1. Giriş
/privet/printer/createjob API'sinde URL'de giriş parametresi yok. İstek metni, CJT biçiminde yazıcı işi bileti verilerini içermelidir.5.1.2. Return
/privet/printer/createjob API'si aşağıdaki verileri döndürür:Değer adı | Değer türü | Açıklama |
---|---|---|
job_id | dize | Yeni oluşturulan yazdırma işinin kimliği. |
expires_in | int | Bu 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):Hata | Açıklama |
---|---|
invalid_ticket | Gönderilen yazdırma bileti geçersiz. |
printer_busy | Yazıcı meşgul olduğundan şu anda /createjob işlenemiyor/oluşturulamıyor. Zaman aşımından sonra yeniden deneyin. |
printer_error | Yazıcı hata durumundadır ve düzeltmek için kullanıcı etkileşimi gerektirir. Açıklama daha ayrıntılı bir açıklama içermelidir (ör. "Tepsi 1'de kağıt sıkışması"). |
invalid_x_privet_token | İstek içinde X-Privet-Token geçersiz veya boş. |
Cihaz /privet/printer/createjob'u kullanıma sunmuyorsa HTTP 404 hatası döndürmesi ZORUNLUDUR. X-Privet-Token üstbilgisi eksikse cihaz HTTP 400 hatası döndürmelidir.
5.2. /privet/printer/submitdoc API
Yerel ağ üzerinden yazdırma (çevrimdışı veya Cloud Print'e yeniden gönderme) işlevinin uygulanması için /privet/printer/submitdoc API'si ZORUNLUDUR. Bu bir HTTP POST isteğidir. /privet/printer/submitdoc API'si GEÇERLİ bir "X-Privet-Token" üstbilgisinin olup olmadığını KONTROL ETMELİDİR. Cihaz, bu API'yi "/privet/printer/submitdoc" URL'sinde uygulamalıdır:POST /privet/printer/submitdoc HTTP/1.1
Yazıcı, tüm verileri dahili arabelleğinde tutamıyorsa belgenin bir kısmını yazdırana kadar veri aktarımını yavaşlatmak için TCP mekanizmalarını KULLANMALIDIR. Bu sayede arabelleğin bir kısmı tekrar kullanılabilir hale gelir. (Örneğin, yazıcı TCP katmanlarında windowsize=0 değerini ayarlayabilir. Bu durumda istemci beklemek zorunda kalır.)
Yazıcıya doküman gönderme işlemi uzun sürebilir. İstemci, yazdırma işlemi devam ederken yazıcının ve işin durumunu (gelişmiş yazdırma) kontrol edebilmelidir. Bunun için yazıcı, /privet/printer/submitdoc API çağrılarını işlerken istemcinin/privet/info ve /privet/printer/jobstate API'lerini çağırmasına İZİN VERMELİDİR. Ana iş parçacığı, yazıcı ve iş durumlarını kontrol etmek için /privet/info ve/privet /printer/jobstate API'lerini kullanabilsin diye tüm istemcilerin /privet/printer/submitdoc API çağrısını yürütmek için yeni bir iş parçacığı başlatması önerilir.
Not: Yerel yazdırma işi tamamlandığında veya iptal edildiğinde, muhasebe ve kullanıcı deneyimi amacıyla işin son durumunun /cloudprint/submit arayüzüne bildirilmesi önemle tavsiye edilir (ve bu spesifikasyonun gelecekteki bir sürümünde zorunlu olacaktır). "printerid", "title", "contentType" ve "final_semantic_state" (PrintJobState biçiminde) parametreleri zorunludur. "tag" (tekrarlanan parametre) ve "ticket" (CloudJobTicket biçiminde işin bileti) parametreleri isteğe bağlıdır. Sağlanan PrintJobState'in gerçekten nihai olması gerektiğini unutmayın. Yani türü DONE veya ABORTED olmalı ve ABORTED olması durumunda bir neden sağlanmalıdır (ayrıntılar için JobState'e bakın). Ayrıca, yerel yazdırma işlerini bildirmek için /cloudprint/submit arayüzünün bu şekilde kullanılmasının, özelliklerinde belirtilmediğini de unutmayın. Bunun nedeni, bu bölümün arayüzün birincil kullanımını (içerik parametresinde sağlanan yazdırılacak belgeyle birlikte yazdırma işi gönderme) açıklamayı amaçlamasıdır.
5.2.1. Giriş
/privet/printer/submitdoc API'sinde aşağıdaki giriş parametreleri bulunur:Ad | Değer |
---|---|
job_id | (isteğe bağlı) Yazdırma işi kimliği. Basit yazdırma durumunda atlanabilir (yukarıya bakın). Yazıcı tarafından döndürülenle eşleşmelidir. |
user_name | (isteğe bağlı) Kullanıcı tarafından okunabilir kullanıcı adı. Bu kesin bir değer değildir ve yalnızca yazdırma işi ek açıklamaları için kullanılmalıdır. İş Cloud Print hizmetine yeniden gönderilirse bu dize Cloud Print işine eklenmelidir. |
client_name | (isteğe bağlı) Bu isteği gönderen istemci uygulamasının adı. Yalnızca görüntüleme amaçlıdır. İş, Cloud Print hizmetine yeniden gönderilirse bu dize Cloud Print işine eklenmelidir. |
job_name | (isteğe bağlı) Kaydedilecek yazdırma işinin adı. İş Cloud Print hizmetine yeniden gönderilirse 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 gönderme yapılmaz). |
İstek metni, yazdırmak için geçerli bir belge içermelidir. "Content-Length" (İçerik Uzunluğu), isteğin doğru uzunluğunu içermelidir. "Content-Type" üstbilgisi, doküman MIME türüne ayarlanmalı ve CDD'de belirtilen türlerden biriyle eşleşmelidir (CDD'de "*/*" belirtilmediği sürece).
Müşterilerin bu istekle birlikte geçerli bir kullanıcı adı (veya e-posta), müşteri adı ve iş adı sağlaması ŞİDDETLE 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'si aşağıdaki verileri döndürür:Değer adı | Değer türü | Açıklama |
---|---|---|
job_id | dize | Yeni oluşturulan yazdırma işinin kimliği (basit yazdırma) veya istekte belirtilen job_id (gelişmiş yazdırma). |
expires_in | int | Bu yazdırma işinin geçerli olduğu saniye sayısı. |
job_type | dize | Gönderilen belgenin içerik türü. |
job_size | int 64 bit | Yazdırma verilerinin bayt cinsinden boyutu. |
job_name | dize | (İsteğe bağlı) Giriştekiyle 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 Hatalar bölümüne bakın):Hata | Açıklama |
---|---|
invalid_print_job | İstekte geçersiz/süresi dolmuş iş kimliği belirtildi. Zaman aşımından sonra yeniden deneyin. |
invalid_document_type | Belge MIME türü yazıcı tarafından desteklenmiyor. |
invalid_document | Gönderilen belge geçersiz. |
document_too_large | Doküman, izin verilen maksimum boyutu aşıyor. |
printer_busy | Yazıcı meşgul olduğundan şu anda belgeyi işleyemiyor. Zaman aşımından sonra yeniden deneyin. |
printer_error | Yazıcı hata durumundadır ve düzeltmek için kullanıcı etkileşimi gerektirir. Açıklama daha ayrıntılı bir açıklama içermelidir (ör. "Tepsi 1'de kağıt sıkışması"). |
invalid_params | İstek içinde geçersiz parametreler belirtilmiş. (Bilinmeyen parametreler gelecekteki uyumluluk için güvenli bir şekilde yoksayılmalıdır) |
user_cancel | Kullanıcı, yazdırma işlemini cihazdan açıkça iptal etti. |
server_error | Doküman Cloud Print'e gönderilemedi. |
invalid_x_privet_token | İstek içinde X-Privet-Token geçersiz veya boş. |
Cihaz /privet/printer/submitdoc'u kullanıma sunmuyorsa HTTP 404 hatası döndürmesi ZORUNLUDUR. X-Privet-Token üstbilgisi eksikse cihaz, HTTP 400 hatası döndürmelidir.
Not: /privet/printer/submitdoc API'si, yazıcı tarafında özel işlem gerektirebilir (büyük yük nedeniyle). Bazı durumlarda (yazıcı HTTP sunucusu uygulamasına ve platforma bağlıdır) yazıcı, HTTP hatası döndürmeden ÖNCE soketi kapatabilir. Diğer durumlarda yazıcı, Privet hatası yerine 503 hatası döndürebilir. Yazıcılar, mümkün olduğunca Privet değerini döndürmeye ÇALIŞMALIDIR. Ancak Privet spesifikasyonunu uygulayan her istemci, /privet/printer/submitdoc API'si için soket kapatma (HTTP hatası yok) ve 503 HTTP hatası durumlarını işleyebilmelidir. Bu durumda, istemci bunu "timeout" değeri 15 saniye olarak ayarlanmış bir "printer_busy" özel hatası olarak işlemelidir. Sonsuz yeniden denemeyi önlemek için istemci, makul sayıda denemeden (örneğin, 3) sonra yeniden denemeyi durdurabilir.
5.3. /privet/printer/jobstate API
/privet/printer/jobstate API İSTEĞE BAĞLIDIR (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" üstbilgisinin olup olmadığını KONTROL ETMELİDİR. Cihaz, bu API'yi "/privet/printer/jobstate" URL'sinde uygulamalıdır:GET /privet/printer/jobstate HTTP/1.1
5.3.1. Giriş
/privet/printer/jobstate API'sinde aşağıdaki giriş parametreleri bulunur:Ad | Değer |
---|---|
job_id | Durumu döndürülecek yazdırma işi kimliği. |
5.3.2. Return
/privet/printer/jobstate API'si aşağıdaki verileri döndürür:Değer adı | Değer türü | Açıklama |
---|---|---|
job_id | dize | Durum bilgilerinin geçerli olduğu yazdırma işi kimliği. |
durum | dize | taslak: Yazdırma işi cihazda oluşturuldu (henüz /privet/printer/submitdoc çağrıları alınmadı).
Sıraya 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 devam ediyor. Durduruldu: Yazdırma işi duraklatıldı ancak manuel veya otomatik olarak yeniden başlatılabilir. done: Yazdırma işi tamamlandı. iptal edildi: Yazdırma işi başarısız oldu. |
açıklama | dize | (isteğe bağlı) Yazdırma işinin durumuyla ilgili, kullanıcı tarafından okunabilir açıklama. status. Durum< durduruldu veya iptal edildi ise ek bilgiler içermelidir. semantic_state alanı genellikle istemciye daha iyi ve daha anlamlı bir açıklama sağlar. |
expires_in | int | Bu yazdırma işinin geçerli olduğu saniye sayısı. |
job_type | dize | (İsteğe bağlı) Gönderilen belgenin içerik türü. |
job_size | int 64 bit | (İsteğe bağlı) Baskı verilerinin bayt cinsinden boyutu. |
job_name | dize | (İsteğe bağlı) Giriştekiyle aynı iş adı (varsa). |
server_job_id | dize | (İsteğe bağlı) Sunucudan döndürülen işin kimliği (iş, Cloud Print hizmetine gönderilmişse). Çevrimdışı yazdırma için atlanır. |
semantic_state | JSON | (isteğe bağlı) İşin PrintJobState biçimindeki anlamsal durumu. |
Örnek (Cloud Print üzerinden raporlayarak 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 (kağıt bittiği için yazdırma işi durduruldu). Cihaz durumuna yapılan referansa dikkat edin. İstemcinin, cihaz durumu hakkında daha fazla bilgi edinmek için /privet/info API'sini ç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 Hatalar bölümüne bakın):Hata | Açıklama |
---|---|
invalid_print_job | İstek içinde geçersiz/süresi dolmuş iş kimliği belirtildi. |
server_error | Yazdırma işi durumu (Cloud Print'e gönderilen yazdırma işleri için) alınamadı. |
invalid_x_privet_token | İstek içinde X-Privet-Token geçersiz veya boş. |
Cihaz /privet/printer/jobstate'i kullanıma sunmuyorsa HTTP 404 hatası döndürmelidir. X-Privet-Token üstbilgisi eksikse cihaz, HTTP 400 hatası döndürmelidir.
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.- Kutudan çıkan 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.
- Kaydolmak için cihazla fiziksel etkileşim gerekir.
- Kullanıcı, cihaza erişimini onaylamak için cihazda fiziksel bir işlem YAPMALIDIR (ör. bir düğmeye basma).
- Kullanıcı yukarıda belirtilen işlemi yaptıktan sonra yazıcı, /cloudprint/register isteğini göndermelidir. Bu istek, işlem yapılana kadar gönderilmemelidir (bkz. Sıra Şeması 1).
- Cihaz bir /privet/register isteğini işliyorsa (örneğin, yukarıdaki işlemin tamamlanmasını bekliyorsa) diğer tüm /privet/register isteklerini reddetmelidir. Bu durumda cihaz, device_busy hatasını döndürmelidir.
- Cihaz, yukarıda belirtilen fiziksel işlem 60 saniye içinde gerçekleşmezse tüm /register isteklerinin zaman aşımına uğramasına izin vermelidir. Bu durumda cihaz, confirmation_timeout hatasını döndürmelidir.
- İsteğe bağlı: Aşağıdakiler önerilir ancak zorunlu değildir ve kullanıcı deneyimini iyileştirebilir:
- Yazıcı, kullanıcının kaydı onaylamak için bir işlem yapması gerektiğini belirtmek üzere ışığını veya ekranını yanıp söndürebilir.
- Yazıcının ekranında "abc@def.com kullanıcısı için Google Cloud Print'e kaydediliyor. Devam etmek için Tamam'a basın" ifadesi gösterilebilir. Burada abc@def.com, /register API çağrısındaki kullanıcı parametresidir. Bu sayede kullanıcılar şunları daha net bir şekilde anlayabilir:
- onayladıkları kayıt isteğinin kendilerine ait olduğunu
- İsteği tetiklememişse ne olduğunu
- Yazıcıdan onaylamak için fiziksel bir işlemin (ör. "Tamam düğmesine basın" gibi) yazıcı, kullanıcıya isteği iptal etmesi için bir düğme de sunabilir (ör. (Kayıt isteğini reddetmek için İptal'e basın). Bu sayede, kayıt isteğini tetiklemeyen kullanıcılar 60 saniyelik zaman aşımı süresi dolmadan isteği iptal edebilir. Bu durumda cihaz, user_cancel hatasını döndürmelidir.
- Sahiplik aktarımları:
- Cihaz, Cloud hizmetinden açıkça silinmiş olabilir.
- Cihaz, /cloudprint/printer (GCP için) çağrısı sonucunda başarıyla yanıt veriyor ancak cihaz açıklaması almıyorsa varsayılan (kullanıma hazır) moda dönmelidir.
- Cihazın kimlik bilgileri artık çalışmıyorsa (açıkça sunucudan gelen "geçersiz kimlik bilgileri" yanıtı nedeniyle) varsayılan (kullanıma hazır) moda DÖNMELİDİR.
- Yerel fabrika ayarlarına sıfırlama işlemi, cihazın kimlik bilgilerini TEMİZLEMELİ ve cihazı varsayılan duruma getirmelidir.
- İsteğe bağlı: Cihaz, kimlik bilgilerini temizlemek ve varsayılan moda geçmek için bir menü öğesi sağlayabilir.
- XMPP bildirimlerini destekleyen cihazlar, sunucuya ping gönderme özelliğini İÇERMELİDİR. Ping zaman aşımı, "local_settings" aracılığıyla sunucudan kontrol edilebilmelidir.
- Cihaz, senkronize olduğundan emin olmak için sunucuya (/cloudprint/printer API for GCP, XMPP ping'lerine ek olarak) günde bir kereden (24 saat) daha sık ping göndermeyebilir. Kontrol aralığının 24-32 saatlik bir aralıkta rastgeleleştirilmesi önerilir.
- İsteğe bağlı: Cloud Print cihazlarda, kullanıcının cihazdan yeni yazdırma işlerini kontrol etmesini sağlayacak manuel bir yöntem (düğme) olması önerilir ancak zorunlu değildir. Bazı yazıcılarda bu özellik zaten vardır.
- İsteğe bağlıdır. Kurumsal yazıcılarda yerel keşfi tamamen devre dışı bırakma seçeneği olabilir. Bu durumda cihaz, sunucudaki bu yerel ayarları GÜNCELLEMELİDİR. Yeni yerel ayarlar BOŞ olmalıdır ("local_discovery" ayarının "false" olarak 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, cihazda XSSI ve XSRF saldırısı olasılığı ve bu saldırılardan nasıl korunulacağı (jeton oluşturma teknikleri dahil) açıklanmaktadır.Daha fazla bilgiyi burada bulabilirsiniz: http://googleonlinesecurity.blogspot.com/2011/05/website-security-for-webmasters.html
Normalde, XSSI ve XSRF saldırıları, bir site çerez kimlik doğrulama mekanizmalarını kullandığında mümkündür. Google, Cloud Print Hizmeti'nde çerez kullanmasa da bu tür saldırılar yine de mümkündür. Yerel ağ erişimi, tasarım gereği istekleri örtülü olarak güvenir.
6.2.1. XSSI
Kötü amaçlı bir web sitesi, Privet uyumlu bir cihazın IP adresini ve bağlantı noktası numarasını tahmin edip "src=<api adı>" kullanarak Privet API'yi çağırmayı deneyebilir. Bu işlem, <script> etiketi içinde gerçekleştirilir:<script type="text/javascript" src="http://192.168.1.42:8080/privet/info"></script>
Bu tür saldırıları önlemek için TÜM Privet API çağrıları, istekte "X-Privet-Token" üstbilgisini ZORUNLU kılmalıdır. "src=<api>" komut dosyası etiketleri üstbilgi ekleyemez ve bu tür saldırılara karşı etkili bir şekilde koruma sağlar.
6.2.2. XSRF
http://en.wikipedia.org/wiki/Cross-site_request_forgeryKötü amaçlı bir web sitesi, Privet ile uyumlu bir cihazın IP adresini ve bağlantı noktası numarasını tahmin edip <iframe>, formlar veya başka bir web siteleri arası yükleme mekanizması kullanarak Privet API'yi çağırmayı deneyebilir. Saldırganlar isteğin sonuçlarına erişemez ancak istek bir işlem gerçekleştiriyorsa (ör. yazdırma) bu işlemi tetikleyebilirler.
Bu saldırıyı önlemek için aşağıdaki koruma gereklidir:
- /privet/info API'sini XSRF'ye açık bırakma
- /privet/info API, cihazda herhangi bir işlem YAPMAMALIDIR.
- x-privet-token almak için /privet/info API'sini kullanın.
- Diğer tüm API'ler, "X-Privet-Token" başlığında geçerli bir x-privet-token olup olmadığını KONTROL ETMELİDİR.
- x-privet-token YALNIZCA 24 saat boyunca geçerli OLMALIDIR.
Saldırgan /privet/info API'sini yürütebilse bile yanıttan x-privet-token'ı okuyamaz ve bu nedenle başka bir API'yi çağıramaz.
XSRF jetonunu aşağıdaki algoritmayı kullanarak oluşturmanız önemle tavsiye edilir:
XSRF_token = base64( SHA1(device_secret + DELIMITER + issue_timecounter) + DELIMITER + issue_timecounter )
XSRF Jetonu Oluşturma Öğeleri:
- DELIMITER, genellikle ":" olan özel bir karakterdir.
- issue_timecounter, bir etkinlikten (zaman damgası için dönem) veya cihazın başlatılma zamanından (CPU sayaçları için) bu yana geçen saniye sayısıdır. issue_timecounter, cihaz çalışır durumdayken sürekli olarak artar (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 bilgi. Cihazın gizli anahtarı her yeniden başlatmada GÜNCELLENMELİDİR.
Cihaz sırrı oluşturmak için önerilen yöntemler:
- Her yeniden başlatmada yeni bir UUID oluşturma
- Her yeniden başlatmada 64 bitlik rastgele bir sayı oluşturun.
Cihazın, verdiği tüm XSRF jetonlarını saklaması gerekmez. Cihazın geçerlilik için bir XSRF jetonunu doğrulaması gerektiğinde jetonun base64 kodunu çözmesi gerekir. İkinci yarıdan (açık metin) issue_timecounter değerini alın ve device_secret + DELIMITER + issue_timecounter değerinin SHA1 karmasını oluşturmaya çalışın. Burada issue_timecounter, jetondan alınır. Yeni oluşturulan SHA1, jetondakiyle eşleşiyorsa cihazın artık issue_timecounter değerinin geçerli süre içinde (24 saat) olup olmadığını kontrol etmesi gerekir. Bunu yapmak için cihaz, mevcut zaman sayacını (ör. CPU sayacı) alır ve bundan issue_timecounter değerini çıkarır. Sonuç, jetonun yayınlanmasından bu yana geçen saniye sayısı OLMALIDIR.
Önemli: XSRF korumasını uygulamak için bu yöntem önerilir. Privet spesifikasyonunun istemcileri, XSRF jetonunu anlamaya çalışmamalı, bunun yerine onu kara kutu olarak ele almalıdır. Şekil 6.2.3'te, X-Privet-Token'ın uygulanması ve tipik bir isteğin doğrulanması için önerilen bir yöntem gösterilmektedir.
6.2.3 X-Privet Jetonu Oluşturma ve Doğrulama Adım Sırası Diyagramı

6.3. İş akışı şemaları
Bu bölümde, farklı durumlardaki iş akışları gösterilmektedir.6.3.1. Kutudan çıkarılan yazıcı iş akışı

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

6.3.3 XMPP bildirimlerinin işlenmesiyle ilgili iş akışı

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