OPTIONS sip: carol@chicago.com SIP / 2.0 Via: SIP / 2.0 / UDP pc33.atlanta.com; branch = z9hG4bKhjhs8ass877 Max-Forwards: 70 To: <sip: carol@chicago.com> From: Alice <sip: alice@atlanta.com>; tag = 1928301774 Call ID: a84b4c76e66710 CSeq: 63104 OPTIONS Contact: <sip: alice@pc33.atlanta.com> Accept: application / sdp Content-Length: 0The answer to such a request should be the same as if we sent an INVITE request, for example, it can be 200 (OK), meaning that the remote party is ready to accept the call. Let's get down to the practical part, it comes down to what we need to prepare the ip package with relevant data and send it to the remote side and get an answer to it. To do this, we can write a simple script, for example, in Perl:
#! / usr / bin / perl use IO :: Socket; use POSIX 'strftime'; sub SipPing { my ($ msg, $ remotehost, $ callid, $ socket, $ date, $ branch, $ localip, $ dest); $ remotehost = shift; $ localip = shift; $ socket = IO :: Socket :: INET-> new ( PeerAddr => $ remotehost, PeerPort => 5060, LocalPort => 5060, LocalAddr => $ localip, Reuse => 1, Proto => 'udp', ); $ callid. = ('0' .. '9', "a" .. "f") [int (rand (16))] for 1 .. 32; $ date = strftime ('% a,% e% B% Y% I:% M:% S% Z', localtime ()); $ branch = "z9hG4bk". time (); my $ packet = qq ( OPTIONS sip: $ remotehost SIP / 2.0 Via: SIP / 2.0 / UDP $ localip: 5060; branch = z9hG4bK39aaa111; rport Max-Forwards: 70 From: "UA" <sip: ua \ @ $ localip>; tag = as54192a85 To: <sip: $ remotehost> Contact: <sip: asterisk \ @ $ localip: 5060> Call ID: 7706430b46622c057aeaa5ec057a0b59 \ @ $ localip: 5060 CSeq: 102 OPTIONS User-Agent: UA Date: Wed, 21 Dec 2013 00:00:01 GMT Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH Supported: replaces, timer Content-Length: 0 ); print $ socket $ packet; eval { local $ SIG {ALRM} = sub {die}; alarm 1; my $ sock_addr = recv ($ socket, $ msg, 190,0); alarm 0; one; } or die "Failed"; if ($ msg) { print "Response: $ msg \ n"; } else { print "Failed"; } close ($ socket); } $ remoteHost = '192.168.0.3'; $ localIp = '192.168.0.2'; & SipPing ($ remoteHost, $ localIp);With the help of such a simple script, you can check the availability of the SIP agent, without the need for registration or a call. It should be noted that some providers allow receiving OPTIONS requests only from port 5060 to port 5060, for this we specify the local port, and if the port is busy, for example, Asterisk, then the Reuse => 1 parameter is useful. That's all.
Source: https://habr.com/ru/post/212401/
All Articles