Freeswitch: fsapi - Json

JSON API

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

| mod_commands.c
	SWITCH_ADD_API(commands_api_interface, "json", "JSON API", json_function, "JSON");
	SWITCH_ADD_JSON_API(json_api_interface, "mediaStats", "JSON Media Stats", json_stats_function, "");
	SWITCH_ADD_JSON_API(json_api_interface, "status", "JSON status API", json_status_function, "");
	SWITCH_ADD_JSON_API(json_api_interface, "fsapi", "JSON FSAPI Gateway", json_api_function, "");
	SWITCH_ADD_JSON_API(json_api_interface, "execute", "JSON session execute application", json_execute_function, "");
	SWITCH_ADD_JSON_API(json_api_interface, "channelData", "JSON channel data application", json_channel_data_function, "");

Использование:

 json {"command" : "...", "data" : "..."}
command
  • status
  • channelData
  • fsapi
  • execute
  • mediaStats

Наибольший интерес представляет команда fsapi, которая является по сути шлюзом между jsonapi и fsapi.
Например это предоставляет возможность выполнять команды fsapi через интерфейс Verto.

Пример#1: Status

 json {"command" : "status", "data" : ""}

Status result

Status result

{"command":"status","data":"","status":"success","response":{"systemStatus":"ready","uptime":{"years":0,"days":20,"hours":20,"minutes":37,"seconds":4,"milliseconds":254,"microseconds":44},"version":"1.6.9 -16-d574870 64bit","sessions":{"count":{"total":132,"active":0,"peak":2,"peak5Min":0,"limit":1000},"rate":{"current":0,"max":30,"peak":2,"peak5Min":0}},"idleCPU":{"used":0,"allowed":99.733333},"stackSizeKB":{"current":240,"max":8192}}}

Пример#2: channelData

 json {"command":"channelData","data":{"uuid":"f50b8552-c41d-11e9-958a-390ef22bcc4a"}}

channelData result

channelData result

{
  "channelData": {
    "core-uuid": "e3d8e6f0-c02e-11e9-b2da-390ef22bcc4a",
    "switchname": "debian",
    "channel_data": {
      "state": "CS_EXECUTE",
      "direction": "inbound",
      "state_number": "4",
      "flags": "0=1;1=1;3=1;4=1;9=1;38=1;44=1;49=1;54=1;96=1;107=1;113=1;114=1;123=1;160=1;165=1",
      "caps": "1=1;2=1;3=1;4=1;5=1;6=1;8=1;9=1"
    },
    "callStats": {
      "audio": {
        "inbound": {
          "raw_bytes": 1622304,
          "media_bytes": 1622304,
          "packet_count": 9432,
          "media_packet_count": 9432,
          "skip_packet_count": 3,
          "jitter_packet_count": 0,
          "dtmf_packet_count": 0,
          "cng_packet_count": 0,
          "flush_packet_count": 0,
          "largest_jb_size": 0,
          "jitter_min_variance": 56.58316,
          "jitter_max_variance": 204.153846,
          "jitter_loss_rate": 0.000324,
          "jitter_burst_rate": 0.999676,
          "mean_interval": 20.010628,
          "flaw_total": 5,
          "quality_percentage": 99,
          "mos": 4.492027,
          "errorLog": [
            {
              "start": 1566396953427906,
              "stop": 1566396956447938,
              "flaws": 1,
              "consecutiveFlaws": 0,
              "durationMS": 3020
            },
            {
              "start": 1566396919187841,
              "stop": 1566396922207838,
              "flaws": 1,
              "consecutiveFlaws": 0,
              "durationMS": 3019
            },
            {
              "start": 1566396890827863,
              "stop": 1566396893847865,
              "flaws": 1,
              "consecutiveFlaws": 0,
              "durationMS": 3020
            }
          ]
        },
        "outbound": {
          "raw_bytes": 1615080,
          "media_bytes": 1615080,
          "packet_count": 9390,
          "media_packet_count": 9390,
          "skip_packet_count": 0,
          "dtmf_packet_count": 0,
          "cng_packet_count": 0,
          "rtcp_packet_count": 0,
          "rtcp_octet_count": 0
        }
      }
    },
    "variables": {
      "direction": "inbound",
      "uuid": "f50b8552-c41d-11e9-958a-390ef22bcc4a",
      "session_id": "9963",
      "sip_from_user": "2774",
      "sip_from_uri": "2774@192.168.210.231",
      "sip_from_host": "192.168.210.231",
      "video_media_flow": "disabled",
      "text_media_flow": "disabled",
      "channel_name": "sofia/internal/2774@192.168.210.231",
      "sip_local_network_addr": "192.168.210.231",
      "sip_network_ip": "192.168.79.231",
      "sip_network_port": "5077",
      "sip_invite_stamp": "1566396855567920",
      "sip_received_ip": "192.168.79.231",
      "sip_received_port": "5077",
      "sip_via_protocol": "udp",
      "sip_from_user_stripped": "2774",
      "sofia_profile_name": "internal",
      "sofia_profile_url": "sip:mod_sofia@192.168.210.231:5070",
      "recovery_profile_name": "internal",
      "sip_Remote-Party-ID": "\"Е.Герас\" <sip:2774@192.168.210.231>;party=calling;screen=yes;privacy=off",
      "sip_cid_type": "rpid",
      "sip_allow": "INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY",
      "sip_req_user": "4346",
      "sip_req_port": "5070",
      "sip_req_uri": "4346@192.168.210.231:5070",
      "sip_req_host": "192.168.210.231",
      "sip_to_user": "4346",
      "sip_to_port": "5070",
      "sip_to_uri": "4346@192.168.210.231:5070",
      "sip_to_host": "192.168.210.231",
      "sip_contact_params": "transport=udp;gw=fs210",
      "sip_contact_user": "gw+fs210",
      "sip_contact_port": "5077",
      "sip_contact_uri": "gw+fs210@192.168.79.231:5077",
      "sip_contact_host": "192.168.79.231",
      "sip_user_agent": "FreeSWITCH-mod_sofia/1.8.5-6-31281a0~64bit",
      "sip_via_host": "192.168.79.231",
      "sip_via_port": "5077",
      "sip_via_rport": "5077",
      "max_forwards": "69",
      "switch_r_sdp": "v=0\r\no=FreeSWITCH 1566379983 1566379984 IN IP4 192.168.79.231\r\ns=FreeSWITCH\r\nc=IN IP4 192.168.79.231\r\nt=0 0\r\nm=audio 16400 RTP/AVP 8 0 101\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-16\r\na=ptime:20\r\n",
      "ep_codec_string": "CORE_PCM_MODULE.PCMA@8000h@20i@64000b,CORE_PCM_MODULE.PCMU@8000h@20i@64000b",
      "rtp_use_codec_string": "PCMA,PCMU,G722,OPUS",
      "remote_audio_media_flow": "sendrecv",
      "rtp_audio_recv_pt": "8",
      "rtp_use_codec_name": "PCMA",
      "rtp_use_codec_rate": "8000",
      "rtp_use_codec_ptime": "20",
      "rtp_use_codec_channels": "1",
      "rtp_last_audio_codec_string": "PCMA@8000h@20i@1c",
      "original_read_codec": "PCMA",
      "original_read_rate": "8000",
      "write_codec": "PCMA",
      "write_rate": "8000",
      "dtmf_type": "rfc2833",
      "id": "120",
      "data": "${dst}@192.168.210.231",
      "codec": "PCMA,PCMU",
      "did_start": "4340",
      "did_end": "4349",
      "type": "user",
      "branch": "rostov",
      "DP_MATCH": "ARRAY::4346|:4346",
      "user_cid_name": "O.Ef",
      "forward_dest": "allhangup",
      "call_timeout_frw": "60",
      "toll_allow": "rostov",
      "forward_mode": "false",
      "call_uuid": "f50b8552-c41d-11e9-958a-390ef22bcc4a",
      "dst": "4346",
      "dmn": "192.168.210.231",
      "ringback": "%(800,3200,425)",
      "transfer_ringback": "%(800,3200,425)",
      "hangup_after_bridge": "true",
      "call_timeout": "30",
      "continue_on_fail": "true",
      "effective_caller_id_name": "Е.Герас",
      "effective_caller_id_number": "2774",
      "called_party_callgroup": "rostov",
      "user_codec": "PCMA,PCMU",
      "absolute_codec_string": "PCMA,PCMU",
      "recordingfile": "2774_4346_2019-08-21-17-14-15_f50b8552-c41d-11e9-958a-390ef22bcc4a.mp3",
      "media_bug_answer_req": "true",
      "local_media_ip": "192.168.210.231",
      "local_media_port": "27140",
      "advertised_media_ip": "192.168.210.231",
      "rtp_use_pt": "8",
      "rtp_use_ssrc": "2844750287",
      "rtp_2833_send_payload": "101",
      "rtp_2833_recv_payload": "101",
      "remote_media_ip": "192.168.79.231",
      "remote_media_port": "16400",
      "current_application_data": "user/4346@192.168.210.231",
      "current_application": "bridge",
      "dialed_user": "4346",
      "dialed_domain": "192.168.210.231",
      "originated_legs": "ARRAY::f517d866-c41d-11e9-95a7-390ef22bcc4a;Outbound Call;4346|:f517d866-c41d-11e9-95a7-390ef22bcc4a;Outbound Call;4346",
      "switch_m_sdp": "v=0\r\no=4346 1616024751 1695411375 IN IP4 192.168.1.37\r\ns=A conversation\r\nc=IN IP4 192.168.1.37\r\nt=0 0\r\nm=audio 10222 RTP/AVP 8 101\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-15\r\n",
      "audio_media_flow": "sendrecv",
      "read_codec": "PCMA",
      "read_rate": "8000",
      "originate_causes": "ARRAY::f517d866-c41d-11e9-95a7-390ef22bcc4a;NONE|:f517d866-c41d-11e9-95a7-390ef22bcc4a;NONE",
      "rtp_local_sdp_str": "v=0\r\no=FreeSWITCH 1566369715 1566369717 IN IP4 192.168.210.231\r\ns=FreeSWITCH\r\nc=IN IP4 192.168.210.231\r\nt=0 0\r\nm=audio 27140 RTP/AVP 8 101\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-16\r\na=ptime:20\r\na=sendrecv\r\n",
      "endpoint_disposition": "ANSWER",
      "originate_disposition": "SUCCESS",
      "DIALSTATUS": "SUCCESS",
      "bridge_to": "f517d866-c41d-11e9-95a7-390ef22bcc4a",
      "last_bridge_to": "f517d866-c41d-11e9-95a7-390ef22bcc4a",
      "bridge_channel": "sofia/branch/4346@192.168.1.37:5060",
      "bridge_uuid": "f517d866-c41d-11e9-95a7-390ef22bcc4a",
      "signal_bond": "f517d866-c41d-11e9-95a7-390ef22bcc4a",
      "sip_to_tag": "XU59r6c89SU1K",
      "sip_from_tag": "2g980641DXDtD",
      "sip_cseq": "8644399",
      "sip_call_id": "b2f519ad-3ebf-1238-999a-902b34d339f2",
      "sip_full_via": "SIP/2.0/UDP 192.168.79.231:5077;rport=5077;branch=z9hG4bK6aQKQgFaptaKN",
      "sip_from_display": "Е.Герас",
      "sip_full_from": "\"Е.Герас\" <sip:2774@192.168.210.231>;tag=2g980641DXDtD",
      "sip_full_to": "<sip:4346@192.168.210.231:5070>;tag=XU59r6c89SU1K",
      "last_sent_callee_id_name": "Outbound Call",
      "last_sent_callee_id_number": "4346"
    },
    "app_log": {
      "applications": [
        {
          "app_name": "lua",
          "app_data": "user_map.lua 4346",
          "app_stamp": "1566396855588725"
        },
        {
          "app_name": "lua",
          "app_data": "directory_user_data.lua 4346",
          "app_stamp": "1566396855590869"
        },
        {
          "app_name": "set",
          "app_data": "dst=4346",
          "app_stamp": "1566396855593245"
        },
        {
          "app_name": "set",
          "app_data": "dmn=192.168.210.231",
          "app_stamp": "1566396855593612"
        },
        {
          "app_name": "set",
          "app_data": "ringback=%(800,3200,425)",
          "app_stamp": "1566396855593960"
        },
        {
          "app_name": "set",
          "app_data": "transfer_ringback=%(800,3200,425)",
          "app_stamp": "1566396855594339"
        },
        {
          "app_name": "set",
          "app_data": "hangup_after_bridge=true",
          "app_stamp": "1566396855594708"
        },
        {
          "app_name": "set",
          "app_data": "call_timeout=30",
          "app_stamp": "1566396855596988"
        },
        {
          "app_name": "set",
          "app_data": "continue_on_fail=true",
          "app_stamp": "1566396855599331"
        },
        {
          "app_name": "set",
          "app_data": "effective_caller_id_name=Е.Герас",
          "app_stamp": "1566396855601601"
        },
        {
          "app_name": "set",
          "app_data": "effective_caller_id_number=2774",
          "app_stamp": "1566396855603925"
        },
        {
          "app_name": "set",
          "app_data": "called_party_callgroup=rostov",
          "app_stamp": "1566396855606278"
        },
        {
          "app_name": "set",
          "app_data": "user_codec=PCMA,PCMU",
          "app_stamp": "1566396855608757"
        },
        {
          "app_name": "db",
          "app_data": "insert/last_dial/rostov/f50b8552-c41d-11e9-958a-390ef22bcc4a",
          "app_stamp": "1566396855609283"
        },
        {
          "app_name": "set",
          "app_data": "absolute_codec_string=PCMA,PCMU",
          "app_stamp": "1566396855628446"
        },
        {
          "app_name": "execute_extension",
          "app_data": "recording XML default",
          "app_stamp": "1566396855628920"
        },
        {
          "app_name": "set",
          "app_data": "recordingfile=2774_4346_2019-08-21-17-14-15_f50b8552-c41d-11e9-958a-390ef22bcc4a.mp3",
          "app_stamp": "1566396855637133"
        },
        {
          "app_name": "set",
          "app_data": "media_bug_answer_req=true",
          "app_stamp": "1566396855637608"
        },
        {
          "app_name": "record_session",
          "app_data": "/rec/2019/08/21/2774_4346_2019-08-21-17-14-15_f50b8552-c41d-11e9-958a-390ef22bcc4a.mp3",
          "app_stamp": "1566396855641102"
        },
        {
          "app_name": "bridge",
          "app_data": "user/4346@192.168.210.231",
          "app_stamp": "1566396855652918"
        }
      ]
    },
    "callflow": [
      {
        "dialplan": "XML",
        "profile_index": "1",
        "extension": {
          "name": "user_map",
          "number": "4346",
          "applications": [
            {
              "app_name": "set",
              "app_data": "dst=4346"
            },
            {
              "app_name": "set",
              "app_data": "dmn=192.168.210.231"
            },
            {
              "app_name": "set",
              "app_data": "ringback=${ru-ring}"
            },
            {
              "app_name": "set",
              "app_data": "transfer_ringback=${ru-ring}"
            },
            {
              "app_name": "set",
              "app_data": "hangup_after_bridge=true"
            },
            {
              "app_name": "set",
              "app_data": "call_timeout=${user_data(${dst}@${dmn} var uservar1)}"
            },
            {
              "app_name": "set",
              "app_data": "continue_on_fail=${user_data(${dst}@${dmn} var uservar4)}"
            },
            {
              "app_name": "set",
              "app_data": "effective_caller_id_name=${user_data(${caller_id_number}@${dmn} var effective_caller_id_name)}"
            },
            {
              "app_name": "set",
              "app_data": "effective_caller_id_number=${user_data(${caller_id_number}@${dmn} var effective_caller_id_number)}"
            },
            {
              "app_name": "set",
              "app_data": "called_party_callgroup=${user_data(${dst}@${dmn} var callgroup)}"
            },
            {
              "app_name": "set",
              "app_data": "user_codec=${user_data(${dst}@${dmn} var codec)}"
            },
            {
              "app_name": "db",
              "app_data": "insert/last_dial/${called_party_callgroup}/${uuid}"
            },
            {
              "app_name": "set",
              "app_data": "absolute_codec_string=${codec}"
            },
            {
              "app_name": "execute_extension",
              "app_data": "recording XML default"
            },
            {
              "app_name": "bridge",
              "app_data": "${type}/${data}"
            },
            {
              "last_executed": "true",
              "app_name": "execute_extension",
              "app_data": "allhangup  XML default"
            }
          ],
          "current_app": "execute_extension",
          "sub_extensions": [
            {
              "name": "record_call_execute",
              "number": "recording",
              "dialplan": "XML",
              "applications": [
                {
                  "app_name": "set",
                  "app_data": "recordingfile=${caller_id_number}_${dst}_${strftime(%Y-%m-%d-%H-%M-%S)}_${uuid}.mp3"
                },
                {
                  "app_name": "set",
                  "app_data": "media_bug_answer_req=true"
                },
                {
                  "app_name": "record_session",
                  "app_data": "${recdir}/${strftime(%Y)}/${strftime(%m)}/${strftime(%d)}/${recordingfile}"
                }
              ]
            }
          ]
        },
        "caller_profile": {
          "username": "2774",
          "dialplan": "XML",
          "caller_id_name": "Е.Герас",
          "ani": "2774",
          "aniii": "",
          "caller_id_number": "2774",
          "network_addr": "192.168.79.231",
          "rdnis": "",
          "destination_number": "4346",
          "uuid": "f50b8552-c41d-11e9-958a-390ef22bcc4a",
          "source": "mod_sofia",
          "context": "default",
          "chan_name": "sofia/internal/2774@192.168.210.231",
          "originatee": {
            "originatee_caller_profiles": [
              {
                "username": "2774",
                "dialplan": "XML",
                "caller_id_name": "Е.Герас",
                "ani": "2774",
                "aniii": "",
                "caller_id_number": "2774",
                "network_addr": "192.168.1.37",
                "rdnis": "",
                "destination_number": "4346",
                "uuid": "f517d866-c41d-11e9-95a7-390ef22bcc4a",
                "source": "mod_sofia",
                "context": "default",
                "chan_name": "sofia/branch/4346@192.168.1.37:5060"
              },
              {
                "username": "2774",
                "dialplan": "XML",
                "caller_id_name": "Е.Герас",
                "ani": "2774",
                "aniii": "",
                "caller_id_number": "2774",
                "network_addr": "192.168.1.37",
                "rdnis": "",
                "destination_number": "4346",
                "uuid": "f517d866-c41d-11e9-95a7-390ef22bcc4a",
                "source": "mod_sofia",
                "context": "default",
                "chan_name": "sofia/branch/4346@192.168.1.37:5060"
              }
            ]
          }
        },
        "times": {
          "created_time": "1566396855567920",
          "profile_created_time": "1566396855567920",
          "progress_time": "1566396855787845",
          "progress_media_time": "1566396872387842",
          "answered_time": "1566396872407836",
          "bridged_time": "1566396872407836",
          "last_hold_time": "0",
          "hold_accum_time": "0",
          "hangup_time": "0",
          "resurrect_time": "0",
          "transfer_time": "0"
        }
      }
    ]
  },
  "sessid": "ac6119c6-c41c-11e9-94bb-390ef22bcc4a"
}

Пример#3: Fsapi

 json {"command":"fsapi","data":{"cmd":"show", "arg":"channels"}}

show channels result

show channels result

{
  "message": "uuid,direction,created,created_epoch,name,state,cid_name,cid_num,ip_addr,dest,application,application_data,dialplan,context,read_codec,read_rate,read_bit_rate,write_codec,write_rate,write_bit_rate,secure,hostname,presence_id,presence_data,accountcode,callstate,callee_name,callee_num,callee_direction,call_uuid,sent_callee_name,sent_callee_num,initial_cid_name,initial_cid_num,initial_ip_addr,initial_dest,initial_dialplan,initial_context\ncdaaa9d2-c339-11e9-a20b-390ef22bcc4a,inbound,2019-08-20 14:01:04,1566298864,sofia/secs/72700@80.xxx.xxx.xxx:5089,CS_EXECUTE,72700,72700,85.xxx.xxx.xxx,2321,bridge,sofia/gateway/fs79/2321,XML,default,opus,48000,0,opus,48000,0,srtp:sdes:AES_CM_128_HMAC_SHA1_80,debian,,,,EARLY,,,,cdaaa9d2-c339-11e9-a20b-390ef22bcc4a,,,72700,72700,85.xxx.xxx.xxx,2321,XML,secs\ncdb98614-c339-11e9-a226-390ef22bcc4a,outbound,2019-08-20 14:01:04,1566298864,sofia/internal/2321,CS_EXCHANGE_MEDIA,72700,72700,85.xxx.xxx.xxx,2321,,,XML,default,opus,48000,0,opus,48000,0,,debian,,,,EARLY,Outbound Call,2321,,cdaaa9d2-c339-11e9-a20b-390ef22bcc4a,,,72700,72700,85.xxx.xxx.xxx,2321,XML,default\n\n2 total.\n"
}

 json {"command":"fsapi", "data": {"cmd": "sofia", "arg":"status profile internal"}}

status profile internal

status profile internal

{"message":"=================================================================================================\nName             \tinternal\nDomain Name      \tN/A\nAuto-NAT         \tfalse\nDBName           \tsofia_reg_internal\nPres Hosts       \t\nDialplan         \tXML\nContext          \tdefault\nChallenge Realm  \tauto_to\nRTP-IP           \t192.168.210.231\nExt-RTP-IP       \t192.168.210.231\nSIP-IP           \t192.168.210.231\nExt-SIP-IP       \t192.168.210.231\nURL              \tsip:mod_sofia@192.168.210.231:5070\nBIND-URL         \tsip:mod_sofia@192.168.210.231:5070;maddr=192.168.210.231;transport=udp,tcp\nHOLD-MUSIC       \tN/A\nOUTBOUND-PROXY   \tN/A\nCODECS IN        \tPCMA,PCMU,G722,OPUS\nCODECS OUT       \tPCMA,PCMU,G722,OPUS\nTEL-EVENT        \t101\nDTMF-MODE        \trfc2833\nCNG              \t13\nSESSION-TO       \t0\nMAX-DIALOG       \t0\nNOMEDIA          \tfalse\nLATE-NEG         \tfalse\nPROXY-MEDIA      \tfalse\nZRTP-PASSTHRU    \tfalse\nAGGRESSIVENAT    \tfalse\nCALLS-IN         \t1960\nFAILED-CALLS-IN  \t684\nCALLS-OUT        \t1746\nFAILED-CALLS-OUT \t557\nREGISTRATIONS    \t2\n"}

json {"command":"fsapi", "data": {"cmd": "sofia", "arg":"profile internal restart"}}
{"command":"fsapi","data":{"cmd":"sofia","arg":"profile internal restart"},"status":"success","response":{"message":"Reload XML [Success]\nrestarting: internal"}}

Freeswitch API

  • freeswitch/api/json.txt
  • Последние изменения: 2019/08/22