• C语言框架FreeSwitch自定义事件介绍与使用示例


    ✨ 博客主页:小小马车夫的主页
    ✨ 所属专栏:FreeSwitch开发实践
    ✨ 专栏介绍:主要介绍博主在实际项目中使用FreeSwitch开发外呼类项目的一些经验心得,主要涉及FreeSwitch的基本安装编译、基本配置、ESL、WSS、录音、自定义模块、media bug、语音播放、MRCP及对接AI机器人等内容。内容在持续更新中,如果感兴趣可以对专栏进行订阅~

    请添加图片描述


    前言

    我们在之前章节介绍过ESL自定义事件订阅《【FreeSwitch开发实践】 ESL简介》,本篇介绍下在FreeSwitch中编写自定义模块,并定义自定义事件,然后发送事件、和用fs_cli中进行事件订阅。

    自定义事件,是在FreeSwitch标准事件如Answer、Hangup事件之外,用于扩展事件,在实际业务中,可通过自定义事件将一些重要的结果,如ASR的识别结果、空号识别检测结果,通过ESL传输出来。


    1、FreeSwitch自定义事件

    先看代码:

    switch_bool_t fire_my_event(switch_core_session_t* session)
    {
    	switch_event_t *event = NULL;
    	
    	const char* var = "my custom event";
    	switch_channel_t *channel = switch_core_session_get_channel(session);
    
    	if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, "my_event_name") == SWITCH_STATUS_SUCCESS) {
    
    		switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Custom-Variable", var);
    		switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Unique-ID", 		     switch_core_session_get_uuid(session));
    		switch_channel_event_set_data(channel, event);
    		switch_event_fire(&event);
    	}
    	return SWITCH_TRUE;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. fire_my_event函数定义自定义事件、并设置事件参数、发送事件。
    2. switch_event_create_subclass 定义事件, SWITCH_EVENT_CUSTOM为自定义事件, 事件名称my_event_name.
    3. ‘switch_event_add_header_string’ 添加事件参数, 为键值对,会出现在订阅事件体中。
    4. switch_event_fire 发送事件。

    2、配置拨号计划

    本次示例,模块名称:myevent, 自定义事件名称:my_event_name·。

      <extension name="myevent-diaplan">
          <condition field="destination_number" expression="^10099$">
            <action application="answer"/>
            <action application="myevent"/>
            <action application="echo" data=""/>
            <action application="hangup" data=""/>
          condition>
      extension>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    10099 是拨号计划的名称。

    3、fs_cli事件订阅

    /event plain CUSTOM my_event_name
    
    • 1

    my_event_name 就是事件名称。

    4、拨打软电话测试及结果输出

    拨打软电话测试:

    originate user/1000 10099
    
    • 1
    1. 首先,需要注册1000软电话,参考《【FreeSwitch开发实践】使用SIP客户端Yate连接FreeSwitch进行VoIP通话》
    2. 10099就是前面定义的拨号计划名称。

    输出:

    Event-Subclass: my_event_name
    Event-Name: CUSTOM
    Core-UUID: 25e79748-6092-4221-bf08-0ff2ff57baca
    FreeSWITCH-Hostname: VM-8-10-centos
    FreeSWITCH-Switchname: VM-8-10-centos
    FreeSWITCH-IPv4: 10.0.8.10
    FreeSWITCH-IPv6: fe80::5054:ff:fe58:28ea
    Event-Date-Local: 2022-08-07 14:35:19
    Event-Date-GMT: Sun, 07 Aug 2022 06:35:19 GMT
    Event-Date-Timestamp: 1659854119135626
    Event-Calling-File: mod_myevent.c
    Event-Calling-Function: fire_my_event
    Event-Calling-Line-Number: 58
    Event-Sequence: 7236
    Custom-Variable: my custom event
    Unique-ID: 38ce44cd-d85d-46e2-a48e-be497e139f8a
    Channel-State: CS_EXECUTE
    Channel-Call-State: ACTIVE
    Channel-State-Number: 4
    Channel-Name: sofia/internal/1000@221.216.208.120:33493
    Unique-ID: 38ce44cd-d85d-46e2-a48e-be497e139f8a
    Call-Direction: outbound
    Presence-Call-Direction: outbound
    Channel-HIT-Dialplan: true
    Channel-Presence-ID: 1000@10.0.8.10
    Channel-Call-UUID: 38ce44cd-d85d-46e2-a48e-be497e139f8a
    Answer-State: answered
    Channel-Read-Codec-Name: PCMU
    Channel-Read-Codec-Rate: 8000
    Channel-Read-Codec-Bit-Rate: 64000
    Channel-Write-Codec-Name: PCMU
    Channel-Write-Codec-Rate: 8000
    Channel-Write-Codec-Bit-Rate: 64000
    Caller-Direction: outbound
    Caller-Logical-Direction: outbound
    Caller-Dialplan: XML
    Caller-Caller-ID-Name: Outbound Call
    Caller-Caller-ID-Number: 1000
    Caller-Orig-Caller-ID-Number: 0000000000
    Caller-Callee-ID-Number: 0000000000
    Caller-Network-Addr: 221.216.208.120
    Caller-ANI: 0000000000
    Caller-Destination-Number: 10099
    Caller-Unique-ID: 38ce44cd-d85d-46e2-a48e-be497e139f8a
    Caller-Source: src/switch_ivr_originate.c
    Caller-Transfer-Source: 1659854119:38061f99-7fe0-4b03-9bdd-f0ca758622d3:bl_xfer:10099/default/XML
    Caller-Context: default
    Caller-RDNIS: 1000
    Caller-Channel-Name: sofia/internal/1000@221.216.208.120:33493
    Caller-Profile-Index: 2
    Caller-Profile-Created-Time: 1659854119135626
    Caller-Channel-Created-Time: 1659854083475630
    Caller-Channel-Answered-Time: 1659854119115643
    Caller-Channel-Progress-Time: 1659854083535627
    Caller-Channel-Progress-Media-Time: 0
    Caller-Channel-Hangup-Time: 0
    Caller-Channel-Transfer-Time: 0
    Caller-Channel-Resurrect-Time: 0
    Caller-Channel-Bridged-Time: 0
    Caller-Channel-Last-Hold: 0
    Caller-Channel-Hold-Accum: 0
    Caller-Screen-Bit: true
    Caller-Privacy-Hide-Name: false
    Caller-Privacy-Hide-Number: false
    variable_direction: outbound
    variable_is_outbound: true
    variable_uuid: 38ce44cd-d85d-46e2-a48e-be497e139f8a
    variable_session_id: 16
    variable_sip_profile_name: internal
    variable_text_media_flow: disabled
    variable_channel_name: sofia/internal/1000@221.216.208.120:33493
    variable_sip_destination_url: sip:1000@221.216.208.120:33493
    variable_dialed_user: 1000
    variable_dialed_domain: 10.0.8.10
    variable_sip_invite_domain: 10.0.8.10
    variable_presence_id: 1000@10.0.8.10
    variable_audio_media_flow: sendrecv
    variable_local_video_ip: 10.0.8.10
    variable_local_video_port: 21828
    variable_video_media_flow: sendrecv
    variable_rtp_local_sdp_str: v=0
    o=FreeSWITCH 1659822373 1659822374 IN IP4 10.0.8.10
    s=FreeSWITCH
    c=IN IP4 10.0.8.10
    t=0 0
    m=audio 31710 RTP/AVP 9 0 8 101
    a=rtpmap:9 G722/8000
    a=rtpmap:0 PCMU/8000
    a=rtpmap:8 PCMA/8000
    a=rtpmap:101 telephone-event/8000
    a=fmtp:101 0-15
    a=ptime:20
    a=sendrecv
    m=video 21828 RTP/AVP 102
    b=AS:3072
    a=rtpmap:102 VP8/90000
    a=sendrecv
    a=rtcp-fb:102 ccm fir
    a=rtcp-fb:102 ccm tmmbr
    a=rtcp-fb:102 nack
    a=rtcp-fb:102 nack pli
    
    • 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

    从自定义事件体中可以看到事件定义的变量Custom-VariableUnique-ID

    总结

    以上就本篇的内容,主要介绍如下:

    • 自定义事件的定义
    • 自定义事件变量设置
    • 拨号计划配置
    • fs_cli自定义事件订阅
    • 拨打软电话测试和订阅自定义事件结果

    本文代码完整例子下载地址
    (代码下载需要积分,如果没有积分可以私信博主即可以免费获取)

    如果觉得有些帮助或觉得文章还不错,请关注一下博主,你的关注是我持续写作的动力。另外,如果有什么问题,可以在评论区留言,或者私信博主,博主看到后会第一时间回复。

    想对未来的自己说的话: 🎈🎈间歇性的努力和蒙混过日子,都是对之前努力的清零🎈🎈

    欢迎转载,转载请注明出处:https://xiao2macf.blog.csdn.net/article/details/126211171

  • 相关阅读:
    武汉儿童医院变电所电力运维平台系统的设计及应用
    第11章_数据库的设计规范
    怎样在CSDN插入代码块 怎么变色?
    PCL 滤波采样(二)——直通滤波
    vue3 自定义指令
    京东一面挂在了CAS算法的三大问题上,痛定思痛不做同一个知识点的小丑
    磁盘怎么删除分区,磁盘管理怎么删除分区
    竖曲线全线计算
    在2024年WWDC大会上,苹果宣布了其全新的“Apple Intelligence”AI功能以及ISO18功能
    Vue:列表排序和筛选(运用计算属性和监视属性(侦听属性))
  • 原文地址:https://blog.csdn.net/xxm524/article/details/126211171