songww
2020-05-10 3a502b36a8cfcdd455edb22e5771115559873731
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package com.genersoft.iot.vmp.gb28181.transmit.cmd;
 
import java.text.ParseException;
import java.util.ArrayList;
 
import javax.sip.InvalidArgumentException;
import javax.sip.address.Address;
import javax.sip.address.SipURI;
import javax.sip.header.CSeqHeader;
import javax.sip.header.CallIdHeader;
import javax.sip.header.ContentTypeHeader;
import javax.sip.header.FromHeader;
import javax.sip.header.MaxForwardsHeader;
import javax.sip.header.ToHeader;
import javax.sip.header.ViaHeader;
import javax.sip.message.Request;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.SipLayer;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.Host;
 
/**
 * @Description:TODO(这里用一句话描述这个类的作用)
 * @author: songww
 * @date: 2020年5月6日 上午9:29:02
 */
@Component
public class SIPRequestHeaderProvider {
 
    @Autowired
    private SipLayer layer;
 
    @Autowired
    private SipConfig sipConfig;
    
    public Request createMessageRequest(Device device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException {
        Request request = null;
        Host host = device.getHost();
        // sipuri
        SipURI requestURI = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress());
        // via
        ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
        ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(),
                device.getTransport(), viaTag);
        viaHeaders.add(viaHeader);
        // from
        SipURI fromSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),
                sipConfig.getSipIp() + ":" + sipConfig.getSipPort());
        Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI);
        FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag);
        // to
        SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress());
        Address toAddress = layer.getAddressFactory().createAddress(toSipURI);
        ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress, toTag);
        // callid
        CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? layer.getTcpSipProvider().getNewCallId()
                : layer.getUdpSipProvider().getNewCallId();
        // Forwards
        MaxForwardsHeader maxForwards = layer.getHeaderFactory().createMaxForwardsHeader(70);
        // ceq
        CSeqHeader cSeqHeader = layer.getHeaderFactory().createCSeqHeader(1L, Request.MESSAGE);
 
        request = layer.getMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
                toHeader, viaHeaders, maxForwards);
        ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
        request.setContent(content, contentTypeHeader);
        return request;
    }
    
    public Request createInviteRequest(Device device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException {
        Request request = null;
        Host host = device.getHost();
        //请求行
        SipURI requestLine = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress());
        //via
        ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
        ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag);
        viaHeader.setRPort();
        viaHeaders.add(viaHeader);
        //from
        SipURI fromSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),sipConfig.getSipIp()+":"+sipConfig.getSipPort());
        Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI);
        FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack
        //to
        SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),host.getAddress()); 
        Address toAddress = layer.getAddressFactory().createAddress(toSipURI);
        ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress,null);
 
        //callid
        CallIdHeader callIdHeader = null;
        if(device.getTransport().equals("TCP")) {
            callIdHeader = layer.getTcpSipProvider().getNewCallId();
        }
        if(device.getTransport().equals("UDP")) {
            callIdHeader = layer.getUdpSipProvider().getNewCallId();
        }
        
        //Forwards
        MaxForwardsHeader maxForwards = layer.getHeaderFactory().createMaxForwardsHeader(70);
        //ceq
        CSeqHeader cSeqHeader = layer.getHeaderFactory().createCSeqHeader(1L, Request.INVITE);
        request = layer.getMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
        ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "SDP");
        request.setContent(content, contentTypeHeader);
        return request;
    }
}