freeswitch 이벤트를 생성하는 몇 가지 방식

20197 단어
본고는freeswitch 이벤트를 생성하는 몇 가지 방식을 묘사하였는데 여기에 기록하여 제가 나중에 찾아보는 것도 편리합니다.
운영 체제: debian8.5_x64
4
  • freeswitch 버전: 1.6.8
  • freeswitch 코드에 이벤트 추가


    내장 이벤트가 생성됩니다(SWITCH EVENT MODULE LOAD의 경우).
    switch_event_t *event;
    if (switch_event_create(&event, SWITCH_EVENT_MODULE_LOAD) == SWITCH_STATUS_SUCCESS)
    {
        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "type", "endpoint");
        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "name", ptr->interface_name);
        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "key", new_module->key);
        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "filename", new_module->filename);
        switch_event_fire(&event);
    }

    사용자 지정 이벤트가 생성됩니다.
    if (switch_event_create_subclass(&event,SWITCH_EVENT_CUSTOM,"calltest1::calltest1_sub") == SWITCH_STATUS_SUCCESS)
    {
        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "callee_uuid", "86896a7a-3dc3-4175-aaa1-cdcbfd9bd566");
        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "caller_num", "1000");
        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "callee_num", "1001");
        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "failed_reason", "exten not avaliable");
        switch_event_fire(&event);
    }

    삽입식 스크립트로freeswitch 이벤트 생성


    lua를 사용하여freeswitch 이벤트 생성


    /tmp/1.lua의 내용은 다음과 같습니다.
    function fire_failed_event(callee_uuid,caller_num,callee_num,failed_reason)
        local event = freeswitch.Event("CUSTOM","calltest1::calltest1_sub")
        event:addHeader("callee_uuid",callee_uuid)
        event:addHeader("caller_num",caller_num)
        event:addHeader("callee_num",callee_num)
        event:addHeader("failed_reason",failed_reason)
        event:fire()
    end
    
    fire_failed_event("86896a7a-3dc3-4175-aaa1-cdcbfd9bd566","1000","1001","exten not avaliable")

    fscli에서 실행:
    /event json  CUSTOM calltest1::calltest1_sub
    luarun /tmp/1.lua

    이벤트 내용은 다음과 같습니다.
    {
            "Event-Subclass":       "calltest1::calltest1_sub",
            "Event-Name":   "CUSTOM",
            "Core-UUID":    "ae0f2919-f45f-450c-8d8f-4c9c555032b6",
            "FreeSWITCH-Hostname":  "localhost",
            "FreeSWITCH-Switchname":        "localhost",
            "FreeSWITCH-IPv4":      "192.168.1.101",
            "FreeSWITCH-IPv6":      "::1",
            "Event-Date-Local":     "2016-09-23 16:54:41",
            "Event-Date-GMT":       "Fri, 23 Sep 2016 08:54:41 GMT",
            "Event-Date-Timestamp": "1474620881330278",
            "Event-Calling-File":   "switch_cpp.cpp",
            "Event-Calling-Function":       "Event",
            "Event-Calling-Line-Number":    "262",
            "Event-Sequence":       "347438",
            "callee_uuid":  "86896a7a-3dc3-4175-aaa1-cdcbfd9bd566",
            "caller_num":   "1000",
            "callee_num":   "1001",
            "failed_reason":        "exten not avaliable"
    }

    python으로freeswitch 이벤트 생성


    스크립트/usr/local/freeswitch/scripts/test11.py의 내용은 다음과 같습니다.
    import freeswitch
    import uuid
    
    def fsapi(session,stream,env,args):
        event = freeswitch.Event("CUSTOM","calltest1::calltest1_sub")
        event.addHeader("callee_uuid",str(uuid.uuid4()))
        event.addHeader("caller_num","1000")
        event.addHeader("callee_num","1001")
        event.addHeader("failed_reason","pytest reason")
        event.fire()
        freeswitch.consoleLog("info","fire ")

    실행 효과

    ESL을 통한 이벤트 보내기


    또한 freeswitch의 ESL 인터페이스의 sendEvent 함수를 통해 이벤트를 보낼 수 있습니다

    ESL 라이브러리 방식


    freeswitch에서 제공하는 ESL 개발 라이브러리는 다음과 같습니다.python을 예로 들어 ESL을 통해 이벤트를 보내는 것을 보여 줍니다.
    import ESL
    
    pbxHost,pbxPort = '192.168.1.101','8021'
    pbxAuth = 'Cluecon'
    
    con = ESL.ESLconnection(pbxHost,pbxPort,pbxAuth)    
    e = ESL.ESLevent("CUSTOM","calltest1::calltest1_sub")
    e.addHeader("callee_uuid","42e36a32-d6c9-4fac-841d-95bbab9ce2f5")
    e.addHeader("caller_num","1000")
    e.addHeader("callee_num","1001")
    e.addHeader("failed_reason","pytest reason")
    
    con.sendEvent(e)

    실행 효과

    socket 방식 사용하기


    만약에 어떤 경우에 ESL(예를 들어 윈도우즈에서 ESL을 사용하고 싶다)이 적합하지 않거나 ESL에 버그가 있는 것을 발견하면(이전에python 버전의 ESL에 메모리 유출이 발견된 경우) socket을 사용하여 직접 발송할 수 있다. 예는 다음과 같다.
    import socket  
    
    pbxHost,pbxPort = '192.168.1.101',8021
    pbxAuth = 'ClueCon'
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    sock.connect((pbxHost,pbxPort))
    sock.send('auth %s\r
    \r
    ' % pbxAuth) tmsg = "sendevent CUSTOM\r
    " tmsg += "Event-Name: CUSTOM\r
    " tmsg += "Event-Subclass: calltest1::calltest1_sub\r
    " tmsg += "callee_uuid: 42e36a32-d6c9-4fac-841d-95bbab9ce2f5\r
    " tmsg += "caller_num: 1000\r
    " tmsg += "callee_num: 1001\r
    " tmsg += "failed_reason: pytest reason\r
    " sock.send('%s\r
    ' % tmsg)

    실행 효과
    본문 github 주소:
    https://github.com/mike-zhang/mikeBlogEssays/blob/master/2016/20160927_freeswitch 이벤트를 생성하는 몇 가지 방법입니다.md
    환영하다

    좋은 웹페이지 즐겨찾기