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,
json,
api,
jsapi,
fsapi