5 Mayıs 2015 Salı

Sinema - "Yes Man - Bay Evet"

Gidilesi filmlerden bir tanesi. İnsanların eğlenmek için o kadar çok fırsatı var ancak her şeye çekingen, isteksiz yaklaşarak ne kadar çok fırsatı harcadığımızı anlatan güzel bir film. Filmden çıktıktan sonra her şeye evet desem acaba hayatım daha mı güzel olur diye düşünüyor insan. Biraz daha hareketli, biraz daha hayata olumlu yaklaşmanızı sağlıyor. Ben oldukça eğlendim, çok gülmemiş olsamda filmden mutlu ayrıldım. Eleştirilecek fazla bir şey yok aklımda, çünkü beklentilerim fazla değildi. Filmdeki karakter herkesin yapmak istediği ancak yapamadığı şeyleri YES diyerek yapabiliyorsa, bazı yaptıkları hariç :), denemekten zarar gelmez gibi...

GSM - Convergent Billing

Based on a true story...
Aşağıda anlatınlar hayal ürünü değil tamamı ile gerçektir :) Yanlışım, hatam var ise, düzeltebilirseniz şimdiden teşekkürler.

Convergent Billing Nedir?
Türkçeye "Birleşik Faturalama Sistemi" olarak çevirebiliriz. GSM sektöründe sunulan bütün servislerin aynı sistem tarafından faturalandırabilmesidir.

Neden Convergent Billing?
Kabaca, müşteriye sunulabilecek onlarca servis var ancak bunu sağlayabilmek için sunulan servislerin ücretlendirilebilmesi lazım. Sunulan servisleri sınırlandırmak istemiyorsak arka planda çalışan ücretlendirme sistemimizin sınırlarının daha geniş olması gerekiyor. Bu da convergent billing sistemini işaret ediyor. Müşteri memnuniyeti servis zenginliği gerektiriyor. GSM operatörlerinin vazgeçilmez hedefi haline gelmiş durumdadır. Mesela bir müşteri isteği olarak şöyle bir şey gelebilir, benim şirket hattım gün içinde faturalı olarak çalışsın ama akşam olunca çalışanımın kontörlü hattı devreye girsin ve benim şirket hattıma akşamki konuşmaların ücretleri yansımasın. Faturalandırma sisteminiz bunun gibi istekleri karşılayabilmeli. Tabi böyle istekleri dinamik bir şekilde karşılaması gerekiyor.

Gaz ve Toz Bulutu:
Faturalandırma sistemleri Call Detail Record(CDR) ile başlar dersek yanlış olmaz herhalde. Peki bu CDR nedir, nereden gelir, içeriği nasıldır, biraz bunun üzerinden geçelim.

GSM sistemini oluşturan temel taşları şu şekilde sayabiliriz; Mobile Stations (Ms - Cep Telefonları), Base Stations (BS - Baz İstasyonları), Mobile Services Switching Centers (MSC - Santraller). Baz istasyonu sistemini de biraz açarsak, içerisinide Base Station Controller (BSC) ve Base Transceiver Stations (BTS) birimlerini barındırır. BTS’ler BSC'ler tarafından kontrol edilirler. BSC’ler bağlı bulundukları MSC’ler tarafından kontrol edilirler. BSC, radyo dalgaları ile ilgili tüm fonksiyonlara kumanda eder. BSC'lerin MS handover, radyo kanalı tahsis etme ve hücre data bilgilerini toplama görevleri vardır. BTS, radyo arabirimini kontrol eder, MS'lere konuşma kanalları ayarlar. Dönelim MSC'ye, MSC; networkteki bağlantının, konuşma ve data haberleşmesinin yapıldığı birimidir, buna interconnect diyoruz. Bu noktada Home Location Register (HLR) ve Visitor’s Location Register (VLR) kavramları devreye girer. HLR; Cep telefonunun nerede olduğu bilgisi ve abonenin kimlik bilgilerine dair her türlü veriyi tutan bilgi bankasıdır, abonenin şebeke genelinde nerede olduğu bilgisine sahiptir. VLR; sadece içinde bulunduğu MSC bölgesi sınırları içerisinde bulunan abonelerin bilgilerini geçici olarak içerir.

Şimdik gelelim konuşma senaryosunda bu birimler bize nasıl yardımcı oluyor:
A numarası B numarasını aramaya çalışıyor diyelim,
- A numarası bir BS servis alanı içerisinde olmalıdır,
- BS sağladığı arama bilgisiyle beraber MSC'ye gerekli bilgileri yollar,
- MSC konuşma talebinde bulunulan B numarası için öncelikle VLR'a başvurar,
- VLR kendi alanında B numarasını bulamaz ise MSC HLR'a B'nin yerini sorar,
- O arada MSC güvenlik katmanlarında A'nın ve B'nin durumunu sorgular,
- Kontrollerden geçen MSISDN bilgileri için OK alınır ve arama devam ettirilir,
- MSC kendi aralığında B numarasına ulaşırsa kendi içinde B'nin durumunu inceler, eğer kendi aralığında B yok ise B'ye bakan MSC ile irtibata geçer ve B'nin durumu hakkında bilgi alır,
- Kontroller sonucunda A ile B arasında Traffic Channel (TCH - Konuşma Kanalı) açılır ve konuşma başlar.

Tabi bu aşamalarda çok daha fazla işlemler yapılıyor, örneğin VLR ve HLR bilgi güncellemeleleri, ancak bizim için önemli olan konuşmanın sonlandığı esnada olanlar:
- Konuşma sonunda MSC bir Call Detail Record (CDR - Konuşma Bilgileri Kaydı) üretir,
- MSC’de üretilen bu kayıtlar bir file içinde toplanır,
- Bu dosya ya her saat veya dolup belirli bir büyüklüğe erişince Billing Gateway’e (BGW - Faturalandırma Servisine) yollanır,
- BGW gelen kayıtları standart bir formata dönüştürdükten sonra bunları rating modülüne yollar.
Ve sonunda indiragandi...


Convergent Billing Bileşenleri Nelerdir, Neler Olabilir?
Service Control Platform (SCP),

Spring MailPreparator

Application Context XML Content:
-beans-
    
    -bean id="propertyConfigurerFW" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"-
        -property name="locations"-
            -list-
                -value-classpath:comrepkinresourcesapplicationContextFW.properties-value-
                -value-classpath:comrepkinresourcesldap.properties-value-
            -list-
Application Context X
        -property-       
        -property name="placeholderPrefix" value="["-        
        -property name="placeholderSuffix" value="]"-     
    -bean-


    -bean id="javaMailSenderImpl" scope="singleton" class="org.springframework.mail.javamail.JavaMailSenderImpl"-
        -property name="host" value="[smtp.host]"-
        -property name="port" value="[smtp.port]"-
          -property name="protocol" value="smtp"-        
        -property name="username" value="[smtp.username]"-
        -property name="password" value="[smtp.password]"-
    -bean-
    
    -bean id="mailPreparator" scope="singleton" class="com.repkin.mail.MailPreparator"-
        -property name="from" value="[smtp.from]" -
        -property name="charSet" value="[charSet]" -
    -bean-
    
    -context:component-scan base-package="com.repkin.mail"-

    -aop:aspectj-autoproxy proxy-target-class="true"-
        
-beans-

Mail Class Content:

package com.repkin.mail;
import java.util.ArrayList;
import java.util.List;
public class Mail {

   private    String                from;
   private    String                to;
   private    String                subject;
   private    String                text;
   private    List    attachments;

   public Attachment getNewAttachment(){
       return new Attachment();
   }

   public Mail() {
       attachments = new ArrayList();
   }
  
   public class Attachment {
       private    String fileName;
       private    String attachmentName;
   
       /*GETTERS AND SETTERS*/   
   }

   /*GETTERS AND SETTERS*/   
}


MailPreparator Class Content:

package com.repkin.mail;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Multipart;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.springframework.mail.javamail.MimeMessagePreparator;

import com.repkin.StringUtil;
import com.repkin.mail.Mail.Attachment;

public class MailPreparator implements MimeMessagePreparator {


private Mail  mail;
private String  from;
private String  charSet;

public void prepare(MimeMessage mimeMessage) throws Exception {
 mimeMessage.addFrom(InternetAddress.parse(getFrom()));
 mimeMessage.addRecipients(RecipientType.TO, mail.getTo());
 mimeMessage.setSubject(mail.getSubject(),getCharSet());
 mimeMessage.setText(mail.getText(),getCharSet());
 if(mail.getAttachments() != null && mail.getAttachments().size() > 0) {
  Multipart multipart = new MimeMultipart();
  MimeBodyPart messageText = new MimeBodyPart();
  messageText.setText(mail.getText(),getCharSet());
  multipart.addBodyPart(messageText);
  for (int i = 0; i < attachment =" mail.getAttachments().get(i);" mimebodypart =" new" filedatasource =" new">= 0) {
  return StringUtil.asNotNullString(attachment).substring(StringUtil.asNotNullString(attachment).lastIndexOf("/")+1);
 }
 return StringUtil.asNotNullString(attachment);
}

/*GETTERS AND SETTERS*/
}

MailServiceImpl Class Content:

package com.repkin.mail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Service;

@Service("mailService")
@Scope("singleton")
public class MailServiceImpl implements MailService {
    private    JavaMailSenderImpl javaMailSenderImpl;
    private    MailPreparator mailPreparator;
 
    public void sendMail(Mail mail) {
        try {
            validateMail(mail);
            mailPreparator.setMail(mail);
            javaMailSenderImpl.setDefaultEncoding("UTF-8");
            javaMailSenderImpl.send(mailPreparator);
        } catch (Exception e) {
        }
    }

    public void validateMail(Mail mail){

    }

    @Autowired
    public void setJavaMailSenderImpl(JavaMailSenderImpl javaMailSenderImpl) {
        this.javaMailSenderImpl = javaMailSenderImpl;
    }

    @Autowired
    public void setMailPreparator(MailPreparator mailPreparator) {
        this.mailPreparator = mailPreparator;
    }
}