Android GB28181 SIP註冊

Android GB28181 SIP註冊

demo下載地址:https://download.csdn.net/download/m0_37039192/12487977

  1. 直接上代碼

public class SipStackAndroid implements SipListener {
    private static SipStackAndroid instance = null;
    public static SipStack sipStack;
    public static SipProvider sipProvider;
    public static HeaderFactory headerFactory;
    public static AddressFactory addressFactory;
    public static MessageFactory messageFactory;
    public static SipFactory sipFactory;
    public static ListeningPoint udpListeningPoint;
    // 本地IP
    public static String localIp = "192.168.10.88";
    // 本地斷開
    public static int localPort = 5080;
    // 本地路徑
    public static String localEndpoint = localIp + ":" + localPort;
    // 類型
    public static String transport = "udp";
    // 服務器IP
    public static String remoteIp = "192.168.10.147";
    // 服務器斷開
    public static int remotePort = 5060;
    // 服務區路徑
    public static String remoteEndpoint = remoteIp + ":" + remotePort;
    // 賬戶
    public static String sipUserName = "123";
    // 密碼
    public String sipPassword = "12345678";
    protected SipStackAndroid() {
        initialize();
    }
    public static SipStackAndroid getInstance() {
        if (instance == null) {
            instance = new SipStackAndroid();
        }
        return instance;
    }
    private static void initialize() {
        sipStack = null;
        sipFactory = SipFactory.getInstance();
        sipFactory.setPathName("android.gov.nist");
        Properties properties = new Properties();
        properties.setProperty("android.javax.sip.OUTBOUND_PROXY", remoteEndpoint + "/" + transport);
        properties.setProperty("android.javax.sip.STACK_NAME", "TextClient");
        try {
            // 創建 SipStack 對象
            sipStack = sipFactory.createSipStack(properties);
            QLog.e("創建sipStack " +sipStack);
            QLog.e("createSipStack " + sipStack);
        } catch (PeerUnavailableException e) {
            e.printStackTrace();
            QLog.e("創建 SipStack 對象出錯: " + e.getMessage());
            System.exit(0);
        }
        try {
            headerFactory = sipFactory.createHeaderFactory();
            addressFactory = sipFactory.createAddressFactory();
            messageFactory = sipFactory.createMessageFactory();
            udpListeningPoint = sipStack.createListeningPoint(localIp, localPort, transport);
            sipProvider = sipStack.createSipProvider(udpListeningPoint);
            sipProvider.addSipListener(SipStackAndroid.getInstance());
            QLog.e("初始化完成");
        } catch (PeerUnavailableException e) {
            e.printStackTrace();
            QLog.e(e.getLocalizedMessage());
            System.exit(0);
        } catch (Exception e) {
            QLog.e("創建偵聽器點 出錯" + e.getLocalizedMessage());
            e.printStackTrace();
        }
    }
    /**
     * 開始註冊
     */
    public void send_register() {
        try {
            SipStackAndroid.getInstance();
            AddressFactory addressFactory = SipStackAndroid.addressFactory;
            SipStackAndroid.getInstance();
            SipProvider sipProvider = SipStackAndroid.sipProvider;
            SipStackAndroid.getInstance();
            MessageFactory messageFactory = SipStackAndroid.messageFactory;
            SipStackAndroid.getInstance();
            HeaderFactory headerFactory = SipStackAndroid.headerFactory;
            // 爲請求創建地址和via頭
            Address fromAddress = addressFactory.createAddress("sip:" + SipStackAndroid.sipUserName + "@" + SipStackAndroid.remoteIp);
            fromAddress.setDisplayName(SipStackAndroid.sipUserName);
            Address toAddress = addressFactory.createAddress("sip:" + SipStackAndroid.sipUserName + "@" + SipStackAndroid.remoteIp);
            toAddress.setDisplayName(SipStackAndroid.sipUserName);
            Address contactAddress = createContactAddress();
            ArrayList viaHeaders = createViaHeader();
            URI requestURI = addressFactory.createAddress("sip:" + SipStackAndroid.remoteEndpoint).getURI();
            // 生成請求
            final Request request = messageFactory.createRequest(requestURI, Request.REGISTER, sipProvider.getNewCallId(),
                    headerFactory.createCSeqHeader(1l, Request.REGISTER),
                    headerFactory.createFromHeader(fromAddress, "c3ff411e"),
                    headerFactory.createToHeader(toAddress, null), viaHeaders,
                    headerFactory.createMaxForwardsHeader(70));
            // 添加 contact 請求頭
            request.addHeader(headerFactory.createContactHeader(contactAddress));
            ExpiresHeader eh = headerFactory.createExpiresHeader(300);
            request.addHeader(eh);
            QLog.e("請求的內容\n" + request.toString());
            ClientTransaction transaction = sipProvider.getNewClientTransaction(request);
            //通過客戶端事務有狀態地發送請求。
            transaction.sendRequest();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    ClientTransaction inviteTid;

    public void send_cancellation(){
        // 爲請求創建地址和via頭
        try {
            Address fromAddress = addressFactory.createAddress("sip:" + SipStackAndroid.sipUserName + "@" + SipStackAndroid.remoteIp);
            fromAddress.setDisplayName(SipStackAndroid.sipUserName);
            Address toAddress = addressFactory.createAddress("sip:" + SipStackAndroid.sipUserName + "@" + SipStackAndroid.remoteIp);
            toAddress.setDisplayName(SipStackAndroid.sipUserName);
            Address contactAddress = createContactAddress();
            ArrayList viaHeaders = createViaHeader();
            URI requestURI = addressFactory.createAddress("sip:" + SipStackAndroid.remoteEndpoint).getURI();
            // 生成請求
            Request request = messageFactory.createRequest(requestURI, Request.REGISTER, sipProvider.getNewCallId(),
                        headerFactory.createCSeqHeader(1l, Request.REGISTER),
                        headerFactory.createFromHeader(fromAddress, "c3ff411e"),
                        headerFactory.createToHeader(toAddress, null), viaHeaders,
                        headerFactory.createMaxForwardsHeader(70));

            // 添加 contact 請求頭
            request.addHeader(headerFactory.createContactHeader(contactAddress));
            ExpiresHeader eh = headerFactory.createExpiresHeader(0);
            request.addHeader(eh);
            QLog.e("註銷內容\n" + request.toString());
            ClientTransaction transaction = sipProvider.getNewClientTransaction(request);
            //通過客戶端事務有狀態地發送請求。
            transaction.sendRequest();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private Address createContactAddress() {
        try {
            SipStackAndroid.getInstance();
            return SipStackAndroid.addressFactory.createAddress("sip:" + SipStackAndroid.sipUserName + "@"
                    + SipStackAndroid.localEndpoint + ";transport=udp"
                    + ";registering_acc=23_23_228_238");

        } catch (ParseException e) {
            return null;
        }

    }

    private ArrayList createViaHeader() {
        ArrayList viaHeaders = new ArrayList();
        ViaHeader myViaHeader;
        try {
            SipStackAndroid.getInstance();
            myViaHeader = SipStackAndroid.headerFactory.createViaHeader(SipStackAndroid.localIp, SipStackAndroid.localPort, SipStackAndroid.transport, null);
            myViaHeader.setRPort();
            viaHeaders.add(myViaHeader);
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (InvalidArgumentException e) {
            e.printStackTrace();
        }
        return viaHeaders;
    }

    @Override
    public void processResponse(ResponseEvent responseEvent) {
        QLog.e("過程響應" + responseEvent.toString());
        ResponseEventExt responseEventExt = (ResponseEventExt) responseEvent;
        Response response = responseEvent.getResponse();
        ClientTransaction tid = responseEvent.getClientTransaction();
        QLog.e("過程響應" + response.toString());
        // 獲取返回信息的狀態code
        if (response.getStatusCode() == Response.PROXY_AUTHENTICATION_REQUIRED || response.getStatusCode() == Response.UNAUTHORIZED) {
            AuthenticationHelper authenticationHelper = ((SipStackExt) sipStack).getAuthenticationHelper(new AccountManagerImpl(sipUserName, responseEventExt.getRemoteIpAddress(), sipPassword), headerFactory);
            try {
                inviteTid = authenticationHelper.handleChallenge(responseEventExt.getResponse(), tid, sipProvider, 5, true);
                QLog.e("發送信息:" + inviteTid.getRequest().toString());
                inviteTid.sendRequest();
            } catch (NullPointerException e) {
                QLog.e("*********" + e.getLocalizedMessage());
                e.printStackTrace();
            } catch (SipException e) {
                QLog.e("*********" + e.getLocalizedMessage());
                e.printStackTrace();
            }
        }
    }

    @Override
    public void processRequest(RequestEvent requestEvent) {
        QLog.e("處理請求" + requestEvent.getRequest().toString());
    }

    @Override
    public void processTimeout(TimeoutEvent timeoutEvent) {
        QLog.e("進程超時" + timeoutEvent.toString());
    }

    @Override
    public void processIOException(IOExceptionEvent ioExceptionEvent) {
        QLog.e("IO 超時" + ioExceptionEvent.toString());
    }

    @Override
    public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {
        QLog.e("進程事務已終止" + transactionTerminatedEvent.toString());
    }

    @Override
    public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
        QLog.e("進程對話已終止" + dialogTerminatedEvent.toString());
    }

    private void sendMessage(String to, String message) throws ParseException,

            InvalidArgumentException, SipException {

        SipStackAndroid.getInstance();

        SipURI from = SipStackAndroid.addressFactory.createSipURI(SipStackAndroid.getInstance().sipUserName, SipStackAndroid.getInstance().localEndpoint);

        SipStackAndroid.getInstance();

        Address fromNameAddress = SipStackAndroid.addressFactory.createAddress(from);

        SipStackAndroid.getInstance();

// fromNameAddress.setDisplayName(sipUsername);

        FromHeader fromHeader = SipStackAndroid.headerFactory.createFromHeader(fromNameAddress,

                "Tzt0ZEP92");

        SipStackAndroid.getInstance();

        URI toAddress = SipStackAndroid.addressFactory.createURI(to);

        SipStackAndroid.getInstance();

        Address toNameAddress = SipStackAndroid.addressFactory.createAddress(toAddress);

        SipStackAndroid.getInstance();

// toNameAddress.setDisplayName(username);

        ToHeader toHeader = SipStackAndroid.headerFactory.createToHeader(toNameAddress, null);

        SipStackAndroid.getInstance();

        URI requestURI = SipStackAndroid.addressFactory.createURI(to);

// requestURI.setTransportParam("udp");

        ArrayList viaHeaders = createViaHeader();

        SipStackAndroid.getInstance();

        CallIdHeader callIdHeader = SipStackAndroid.sipProvider.getNewCallId();

        SipStackAndroid.getInstance();

        CSeqHeader cSeqHeader = SipStackAndroid.headerFactory.createCSeqHeader(50l,

                Request.MESSAGE);

        SipStackAndroid.getInstance();

        MaxForwardsHeader maxForwards = SipStackAndroid.headerFactory

                .createMaxForwardsHeader(70);

        SipStackAndroid.getInstance();

        Request request = SipStackAndroid.messageFactory.createRequest(requestURI,

                Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,

                toHeader, viaHeaders, maxForwards);

        SipStackAndroid.getInstance();

        SupportedHeader supportedHeader = SipStackAndroid.headerFactory

                .createSupportedHeader("replaces, outbound");

        request.addHeader(supportedHeader);

        SipStackAndroid.getInstance();

        SipURI routeUri = SipStackAndroid.addressFactory.createSipURI(null, SipStackAndroid.getInstance().remoteIp);

        routeUri.setTransportParam(SipStackAndroid.transport);

        routeUri.setLrParam();

        routeUri.setPort(SipStackAndroid.remotePort);

        SipStackAndroid.getInstance();

        Address routeAddress = SipStackAndroid.addressFactory.createAddress(routeUri);

        SipStackAndroid.getInstance();

        RouteHeader route =SipStackAndroid.headerFactory.createRouteHeader(routeAddress);

        request.addHeader(route);

        SipStackAndroid.getInstance();

        ContentTypeHeader contentTypeHeader = SipStackAndroid.headerFactory

                .createContentTypeHeader("text", "plain");

        request.setContent(message, contentTypeHeader);

        System.out.println(request);

        SipStackAndroid.getInstance();

        ClientTransaction transaction = SipStackAndroid.sipProvider

                .getNewClientTransaction(request);

// Send the request statefully, through the client transaction.

        transaction.sendRequest();

    }
}
  1. 使用 GB28181_ServerPlatform 服務器進行聯調:點擊打開軟件後就已經啓動了SIP信令服務器,上級註冊服務器這塊區域直接忽略即可。
    在這裏插入圖片描述

3.使用cmd進行查看端口號是否被監聽來保證打開服務器是否正常

輸入 netstat -ano|findstr 端口號 ----> 查看佔用端口號的進程

4.參考文獻:

1.https://blog.csdn.net/xiaoyu8388/article/details/81943794?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase

2.https://www.jianshu.com/p/383a242bed79

3.https://blog.csdn.net/lyyslsw1230_163com/article/details/8454851

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章