JAIN SIP #11 (BYE / OPTIONS)

JAIN SIP #11 (BYE / OPTIONS)

 หลังจากจบเรื่อง Create Invite มาต่อเรื่อง Bye อีกนิด ทบทวน Flow ได้จาก SIP Message in Asterisk

เมื่อ SIP Server ส่ง Invite (ReInvite) เพื่อเตรียมส่ง Bye เราก็ไม่ต้องจัดตั้ง RTP Session ใหม่ จากนั้นก็เตรียมตัวส่ง 200 OK จาก BYE SIP Message โดยตรวจสอบ Bye Request ได้จาก processRequest() เหมือนเดิม ดังนี้ครับ

    public void processRequest(RequestEvent requestReceivedEvent) {
        Request request = requestReceivedEvent.getRequest();
        ServerTransaction serverTransactionId = requestReceivedEvent
                .getServerTransaction();

        System.out.println("\n\nRequest " + request.getMethod()
                + " received at " + sipStack.getStackName()
                + " with server transaction id " + serverTransactionId);


        // We are the UAC so the only request we get is the BYE.
        if (request.getMethod().equals(Request.BYE) )
            processBye(request, serverTransactionId);
        else if (request.getMethod().equals(Request.OPTIONS))
            processOptions(request, serverTransactionId);
        else if (request.getMethod().equals(Request.INVITE))
            processInvite(request, serverTransactionId);
    }

เมื่อเราได้รับ Bye Request เราก็เพียงแต่ตอบ 200 OK ไปให้ SIP Server ดังนี้ครับ

    public void processBye(Request request,
            ServerTransaction serverTransactionId) {
        try {
            System.out.println("Got a bye .");
            if (serverTransactionId == null) {
                System.out.println("Got  null TID.");
                return;
            }
            Dialog dialog = serverTransactionId.getDialog();
            System.out.println("Dialog State = " + dialog.getState());
            Response response = messageFactory.createResponse(200, request);
            serverTransactionId.sendResponse(response);
            System.out.println("Sending OK.");
            System.out.println("Dialog State = " + dialog.getState());          

        } catch (Exception ex) {
            ex.printStackTrace();
            System.exit(0);
        }
    }

ขอเสริมตรงนี้นิด ในระหว่างที่มีการติดต่อสื่อสาร หรือแม้แต่สื่อสารเสร็จเรียบร้อยแล้ว เรามักจะได้ัรับ Options request มาจาก SIP Server อยู่เรื่อย ๆ เพื่อสอบถามข้อมูล เราก็สามารถตอบกลับง่าย ๆ ไปดังนี้ (จริง ๆ แล้วคงจะตอบที่ซับซ้อนกว่านี้ได้ แต่ตอนนี้ผมยังไม่ได้ใช้งานในส่วนนั้นครับ)

    public void processOptions(Request request, ServerTransaction serverTransactionId) {
        try {
            System.out.println("Got an OPTIONS");
            Response response = messageFactory.createResponse(200, request);
            if (serverTransactionId == null) {
                System.out.println("Got null TID.");
                optionsTid = sipProvider.getNewServerTransaction(request);
            }

            optionsTid.sendResponse(response);
            System.out.println("Sending Response OK.");


        } catch (Exception ex) {
            ex.printStackTrace();
            System.exit(0);
        }
    }

เขียนมาหลายตอน คิดว่าคงจะมีประโยชน์บ้างนะครับ :-)