# SMPP
SMPP (İngilizce Short Message Peer to Peer Protocol; Eşler Arası Kısa Mesaj Protokolü), telekominikasyonda, Harici Kısa Mesaj Varlıkları (ESME), Yönlendirme varlıkları (RE) ve Mesaj Merkezleri (SMSC) arasında kısa mesaj verisinin transferi için, esnek bir veri iletişim arayüzünün sağlanması amacıyla tasarlanan, özgür, endüstri standardı olan bir protokoldür. Genellikle üçüncü partilerde(haber organizasyonları gibi) toplu mesaj iletimini sağlamak amacıyla kullanılır. Dolayısıyla, UMTS, IS-95 (CDMA), CDMA2000, ANSI-136 (TDMA) ve iDEN gibi GSM olmayan SMS protokollerine destek verir. SMPP, SS7 ağlarının dışında, kısa mesaj değiş tokuşu için yaygın olarak kullanılır.
Genellikle GSM operatörleri ve katma değerli servis sağlayıcılar arasında toplu SMS gönderimlerinde kullanılır. Bir dış SMS servisi (ESME) SMPP kullanarak TCP/IP veya X.25 üzerinden kendi uygulama katmanında bir Servis Mesajı Merkezi (SMSC) ile SMS alışverişinde bulunabilir.


## Tarihçe.
SMPP, başlangıçta küçük bir İrlanda şirketi olan ve daha sonra Logica'nın (firma parçalandı ve artık Acision olarak biliniyor) satın aldığı Aldiscon tarafından tasarlandı. Protokol, aslen geliştirici Ian J Chambers tarafından, SMSC'nin mesaj iletimindeki işlevselliğini SS7 kullanmaksızın test edebilmek amacıyla yaratıldı. 1999 yılında, resmen Logica SMPP'yi, önceleri adı SMPP Geliştiricileri Forumu olan, sonra The SMS Forum olarak adlandırılan (artık forum dağıldı) topluluğa teslim etti. SMPP protokolünün teknik özellikleri, 2007 yılı sonunda kapanan SMS Forum'un web sitesi sayesinde halen mevcuttur. SMPP sahipliği, SMS Forum'un dağılması ile tekrar Acision firmasına döndü.
SMPP geliştirimine ara verildi ve SMS forumu dağıldı. SMS forum websitesiden:
Temmuz 31, 2007 - Kâr amacı gütmeyen, uluslararası kablosuz iletişim endüstrisinin yararı için, görevi SMS'i (Short Message Service) geliştirme, teşvik etme ve tanıtma olan SMS Forum, 27 Temmuz 2007 tarihi itibarıyla terhis ediliecektir.
Yapılan haberle ilişkili bir basın açıklaması, aynı zamanda bu sitenin kısa bir süre sonra askıya alınacağını uyarmıştı.Bunun aksine site uzun bir süre daha çoğu işlev ve özellikleri sunar durumdaydı (31 Ocak 2012'ye kadar).
SMS Forum'un eski teknik moderatörü ve ağ uzmanı olan Cormac Long'a göre site, çalışmasını durdurdu. SMPP tanımlamaları için Acision ile iletişim kurulması gerekir. Dosyalar ayrıca birçok diğer mevcut sitede mevcut olarak bulunabilir.


## SMPP işlevleri.
Protokol, PDU'ların (İngilizce "Protocol Data Units", protokol veri birimlerinin veya paketlerin) istek/cevap çiftlerinin OSI 4. katmanı bağlantıları (TCP oturumu veya X.25 SVC3) üzerinden takas edilmesine dayanır. PDU'lar verimli olmaları için ikili olarak kodlanmışlardır. Veri takası eşzamanlı olarak yapılabilir: Her eş gönderilecek her PDU için cevap bekler. Asenkron olarak da yapılması mümkündür: çoklu istekler bekleme olmaksızın gönderilebilir ve diğer eş tarafından düzensiz sırayla kabul edilebilir. İsteklere pencere adı verilir; en iyi performans için, iletişimde bulunan taraflar aynı pencere boyutu ile yapılandırılmış olmalıdır.


## Desteklediği işlemler.
SMPP birçok çift-yönlü mesajlaşma fonksiyonunu destekler:
  - Bir ya da birden fazla noktaya SMS gönderimi
  - Servis Mesaj Merkezinden SMS alımı 
  - Gönderilen SMS'ler için durum sorgusu
  - SMS gönderiminin iptali veya gönderimdeki SMS'in değiştirilmesi
  - SMS gönderim zamanlaması
  - Mesaj tipinin (datagram veya depola-ilet) belirlenmesi
  - SMS öncelik belirlenmesi
  - Veri kodlama tipinin belirlenmesi
  - SMSler için geçerlilik süresi belilenmesi
  - SMS ve servis eşleşmesi (mesela SMSle sesli mesaj uyarısı)


## Bağlantı tipleri.
SMPP 3 ayrı bağlantı tipi sunar
  - Gönderici (Transmitter)
  - Alıcı (Receiver)
  - Gönderici&Alıcı (Transreceiver) (SMPP 3.4'ten itibaren)
Bir SMPP oturumu 5 ayrı durumda olabilir:
  - OPEN: Bağlı ve oturum için bekliyor
  - BOUND_TX: Gönderici (transmitter) olarak bağlı
  - BOUND_RX: Alıcı (receiver) olarak bağlı. Bu oturum tipinde dış mesaj sistemi (ESME) mesaj merkezinden (SMSC) mesaj almaya hazırdır.
  - BOUND_TRX: Hem alıcı hem gönderici. Genelde SMS iletim raporları da almak için kullanılır
  - CLOSED: Oturum kapalı ve bağlı değil.


## Fonksiyonlar.
Dış SMS sistemi (ESME)'den SMSC'ye şu işlevler geçerlidir:
  - submit_sm
  - data_sm
  - query_sm
  - cancel_sm
  - replace_sm
Bu fonksiyonların çağrılmasına karşılık SMSC cevap döner. (submit_sm_resp, cancel_sm_resp)
SMSC'den ESME'ye doğru geçerli işlevler ise:
  - deliver_sm
  - data_sm


### SMPP Sürümleri.
SMPP standardı zaman geçtikçe gelişti. Çokça kullanılan SMPP sürümleri şunlardır:
  - SMPP 3.3 (en eski kullanılan sürümdür  sadece GSM'i destekler)
  - SMPP 3.4 (Etiket Uzunluğu Değeri (TLV) parametreleri, GSM olmayan SMS teknolojileri ve telsiz alıcı-verici desteği eklenmiştir (tekil bağlantılar mesajları alabilir ve iletebilir))
  - SMPP 5.0 (SMPP'nin en son versiyonudur  hücre yayını için destek eklenmiştir)
Geçerli sürüme, bağlama komutundaki interface_version parametresi ile aktarılır.


## PDU Biçimi.
SMPP PDU'su başlık ile başlar, gövde ile devam eder:


### PDU Başlığı.
Her PDU bir başlık ile başlar. Başlık 4 alandan oluşur, her alanın uzunluğu 4 oktettir:
  - Komut Genişliği (command_length): PDU'nun tamamının uzunluğu (komut genişliğinin kendisi de dahil olmak üzere)  16 oktetten küçük veya eşit olmak zorundadır.
  - Komut ID (command_id): SMPP işlemini (veya komutunu) tanımlar.
  - Komut Durumu (command_status): İsteklerde her zaman 0 değerini alır  cevaplarda ise, işlemin sonucu ile alakalı bilgiyi tutar.
  - Dizi ID (sequence_number): SMPP oturumu içerisindeki istekler ve cevaplar arasındaki ilişkiyi belirtmek için kullanılır  asenkron iletişime izin verir (pencereleme).
SMPP'de bütün sayısal alanlar ilk oktetin En Anlamlı Bit (MSB) olduğu, big endian sıralamayı kullanır.


## Örnek.
Aşağıdaki örnekte 60 oktetlik submit_sm PDU'nun ikili kodlanmış hali bulunmaktadır. 16'lık oktetler halinde gösterilen veri, bu PDU'nun başlığının ve gövdesinin tekil döküm halidir.
Bu, SMPP özelliklerinin, submit_sm PDU'sunun tanımıyla bölge bölge nasıl ikili kodlandığını gösteren en iyi örnektir.
İlk tırnak içindeki terimler bölümün adını(command_length gibi), virgülden sonraki parantez içerisindeki rakamlar ve/veya harfler bölgeye karşılık gelen değeri ((60)), sonraki oktetler ise bu değerlerin ikili karşılığını (... 00 00 00 3C) temsil eder.


### PDU Başlığı.
 'command_length', (60) ... 00 00 00 3C
 'command_id', (4) ... 00 00 00 04
 'command_status', (0) ... 00 00 00 00
 'sequence_number', (5) ... 00 00 00 05


### PDU Gövdesi.
 'service_type', () ... 00
 'source_addr_ton', (2) ... 02
 'source_addr_npi', (8) ... 08
 'source_addr', (555) ... 35 35 35 00
 'dest_addr_ton', (1) ... 01
 'dest_addr_npi', (1) ... 01
 'dest_addr', (555555555) ... 35 35 35 35 35 35 35 35 35 00
 'esm_class', (0) ... 00
 'protocol_id', (0) ... 00
 'priority_flag', (0) ... 00
 'schedule_delivery_time', (0) ... 00
 'validity_period', (0) ... 00
 'registered_delivery', (0) ... 00
 'replace_if_present_flag', (0) ... 00
 'data_coding', (0) ... 00
 'sm_default_msg_id', (0) ... 00
 'sm_length', (15) ... 0F
 'short_message', (Hello wikipedia) ... 48 65 6C 6C 6F 20 77 69 6B 69 70 65 64 69 61""


## SMPP'nin Tuhaflıkları.
Birçok kabuller olmasına rağmen, SMPP birkaç şüpheli özellik barındırır:
  - GSM 7 bit varsayılan alfabesi için data_coding alanı boş olarak kalır.
  - data_coding = 0 alanı için standartlaştırılmış bir anlam yoktur.
  - Shift-JIS kodlaması desteği belirsizdir.
  - submit_sm_resp alanı SMPP sürümleri arasında uyumsuzluk gösterir.


### GSM 7 bit varsayılan alfabesi için data_coding alanı boştur.
GSM 03.38'i temel alan SMPP 3.3'te data_coding değerleri bulunmasına rağmen, SMPP 3.4'ten beri GSM 7 bit varsayılan alfabesi için data_coding değeri yoktur.


### data_coding = 0 alanı için standartlaştırılmış bir anlam yoktur.
SMPP 3.4 ve 5.0'a göre data_coding = 0, "SMSC Varsayılan Alfabesi" anlamına gelir. SMSC'nin türüne ve yapılandırmasına bağlı olarak kodlamaya tabi tutulduğunda gerçekten bu anlamı verir.


### Shift-JIS kodlaması desteği belirsizdir.
CDMA'daki C.R1001 standardı kodlamalardan biri olan Shift-JIS Japonca için kullanılır. SMPP 3.4 ve 5.0 Japonca için üç kodlama tanımlar (JIS, ISO-2022-JP ve Genişletilmiş Kanji JIS), fakat hiçbiri CDMA MSG_ENCODING 00101 ile tanımlanamaz. SMPP'deki Shift-JIS'de mesajları taşımak için Piktogram kodlama (data_coding = 9) kullanılır.


### submit_sm_resp alanı SMPP sürümleri arasında uyumsuzluk gösterir.
submit_sm başarısız olduğunda SMSC, sıfır olmayan bir command_status'un değeri ve "empty" message_id ile bir submit_sm_resp döndürür.