Freeswitch-Python3開發

文章目錄

  • 一、Freeswitch如何使用mod_python3
    • 1.1 Freeswitch和python
    • 1.2 Freeswitch版本選擇
    • 1.3 Freeswitch編譯mod_python3
      • 1.3.1 debian安裝python3
      • 1.3.2 Freeswitch編譯mod_python3
      • 1.3.3 加載
  • 二、如何編寫腳本
    • 2.1 函數的基本框架
    • 2.2 基本使用
      • 2.2.1 觸發條件
      • 2.2.2 默認腳本位置
      • 2.2.3 回調參數如何使用參數
        • 2.2.3.1 handler回調函數參數怎么用
        • 2.2.3.2 set事件回調函數參數怎么用
  • 三、致謝

一、Freeswitch如何使用mod_python3

官網地址:https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_python_1048940/#eol

1.1 Freeswitch和python

請注意,mod_python 基于 python2,并將于 2020 年 1 月 1 日停止使用。請使用 mod_python3。

所以我這里就是使用的python3給大家介紹

1.2 Freeswitch版本選擇

Freeswitch從1.10.7才開始對python3的支持,所以,你的Freeswitch必須不低于Freeswitch1.10.7。

1.3 Freeswitch編譯mod_python3

1.3.1 debian安裝python3

pip install -yq python3-dev python3-pip

在這里插入圖片描述
說明你安裝好了

1.3.2 Freeswitch編譯mod_python3

方法一:直接從源開始編譯
如果你要從頭全部重新編譯一下,你可以到源碼的freeswitch1_10_7/build/modules.conf.in下面取消這個注釋,然后編譯
在這里插入圖片描述
然后就是正常的編譯Freeswitch。如果你還不會編譯Freeswitch,請參考
Freeswitch編譯安裝指南:http://t.csdnimg.cn/tuSVJ

方法二:只編譯mod_python3這個模塊
首先需要再freeswitch1_10_7源碼目錄下執行

 ./configure --with-python3=/usr/bin/python3.9

接著在freeswitch1_10_7/src/mod/languages/mod_python3 目錄下,執行:

make
make install

或者在源碼目錄下執行:

make mod_python3-install

可能是我的版本是freeswitch1_10_7還是其他的什么原因,在源碼目錄下直接執行make mod_python3-install沒有成功,我也沒有深究。有實驗的大佬可以告訴我原因。我就在 freeswitch1_10_7/src/mod/languages/mod_python3 下執行了

編譯后,會在/usr/lib/python3/dist-packages下產生freeswitch.py
在這里插入圖片描述

有的時候,我們可以直接把freeswitch.py放在對應安裝的python3庫下面,給你們拷貝了一份freeswitch.py

鏈接: https://pan.baidu.com/s/127ok_jI2UnIvFqSBGad6xA?pwd=5n45 提取碼: 5n45 復制這段內容后打開百度網盤手機App,操作更方便哦

也會在編譯后的 /usr/local/freeswitch/mod/產生對應的so和la
在這里插入圖片描述

1.3.3 加載

方法一:
在fs_cli的控制臺執行:load mod_python3
方法二:
在/usr/local/freeswitch/conf/autoload_configs下,每次啟動FS自動加載mod_python3
在這里插入圖片描述

在這里插入圖片描述
重啟FS就可以了

二、如何編寫腳本

2.1 函數的基本框架

  • handler 啟動函數
  • hangup_hook 處理掛機或轉移事件的鉤子函數,需通過session.setHangupHook事先設定。
  • input_callback 處理輸入事件(如DTMF按鍵)的回調函數,需通過session.setInputCallback事先設定。
  • fsapi 處理來自fs_cli、撥號計劃HTTP請求等的API調用
  • runtime 在獨立線程中運行指定函數,通常由fs_cli的pyrun命令觸發。
  • xml_fetch 綁定到FreeSWITCH的XML查找功能,用于動態生成或修改XML配置。
# 導入FreeSWITCH的Python模塊以實現與FreeSWITCH服務器的交互
import freeswitch"""
FreeSWITCH的mod_python使用示例。此模塊使用mod_python默認查找的名稱,
但大多數這些名稱可以通過在從FreeSWITCH調用模塊時使用<modname>::<function>來覆蓋。
"""def handler(session, args):"""'handler'是應用程序的默認函數名。它可以被<modname>::<function>覆蓋。`session`是會話對象,用于控制通話過程。`args`是一個字符串,包含了模塊名之后的所有傳入參數。功能:接聽電話呼叫,記錄日志,設置掛機鉤子,設置輸入回調,并播放音樂。"""freeswitch.consoleLog('info', 'Answering call from Python.\n')  # 記錄接聽電話的日志信息freeswitch.consoleLog('info', 'Arguments: %s\n' % args)         # 打印傳入的參數session.answer()                                                  # 接聽電話session.setHangupHook(hangup_hook)                                # 設置掛機時的回調函數session.setInputCallback(input_callback)                           # 設置輸入(如DTMF)的回調函數session.execute("playback", session.getVariable("hold_music"))     # 播放背景音樂,音樂來源為變量hold_music的值def hangup_hook(session, what, args=''):"""處理掛機或轉移事件的鉤子函數,需通過session.setHangupHook事先設定。`session`: 會話對象。`what`: 字符串,表示觸發事件的類型,如"hangup"(掛斷)或"transfer"(轉移)。`args`: 可選參數,若在設置回調時提供了額外參數,則此處會有值。"""freeswitch.consoleLog("info", "hangup hook for '%s'\n" % what)  # 記錄掛機或轉移的鉤子被觸發的日志信息def input_callback(session, what, obj, args=''):"""處理輸入事件(如DTMF按鍵)的回調函數,需通過session.setInputCallback事先設定。`session`: 會話對象。`what`: 字符串,表示事件類型,如"dtmf"(雙音多頻按鍵)或"event"(其他事件)。`obj`: 對象,根據what的不同,可能是DTMF對象或事件對象。`args`: 可選參數,同hangup_hook。功能:根據輸入類型記錄日志,并根據情況暫停輸入處理。"""if what == "dtmf":                          # 判斷是否為DTMF輸入freeswitch.consoleLog("info", what + " " + obj.digit + "\n")  # 記錄按下的DTMF鍵else:freeswitch.consoleLog("info", what + " " + obj.serialize() + "\n")  # 記錄其他類型的事件return "pause"  # 返回"pause"以暫停輸入處理,等待進一步指令def fsapi(session, stream, env, args):"""處理來自fs_cli、撥號計劃HTTP請求等的API調用。`session`: 當從撥號計劃調用時為會話對象,否則為"na"。`stream`: 輸出流對象,用于向API調用方返回數據。`env`: 環境事件對象,包含調用時的相關環境信息。`args`: 調用該模塊時傳入的所有參數組成的字符串。功能:根據是否有參數,記錄不同日志,并返回環境事件的序列化數據。"""if args:stream.write("fsapi called with no arguments.\n")  # 若有參數,提示無參數調用(這里可能是注釋錯誤,應為有參數)else:stream.write("fsapi called with these arguments: %s\n" % args)  # 記錄傳入的參數stream.write(env.serialize())  # 將環境事件對象序列化后返回給調用者def runtime(args):"""在獨立線程中運行指定函數,通常由fs_cli的`pyrun`命令觸發。`args`: 從命令行傳遞給此函數的參數字符串。功能:簡單打印傳入的參數。"""print(args + "\n")  # 打印參數并換行def xml_fetch(params):"""綁定到FreeSWITCH的XML查找功能,用于動態生成或修改XML配置。`params`: 包含查找請求詳情的事件對象。功能:返回一個示例XML配置,定義了一個簡單的撥號計劃上下文,用于接聽電話并播放音樂。"""xml = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?><document type="freeswitch/xml"><section name="dialplan" description="RE Dial Plan For FreeSWITCH"><context name="default"><extension name="generated"><condition><action application="answer"/><action application="playback" data="${hold_music}"/></condition></extension></context></section></document>'''return xml  # 返回生成的XML配置

2.2 基本使用

2.2.1 觸發條件

在這里插入圖片描述

2.2.2 默認腳本位置

默認的腳本位置一般在/usr/local/freeswitch/scripts

  1. ??如果你有很多腳本,建議在這個文件夾下面在建文件夾;比如說你建立了一個腳本路徑為/usr/local/freeswitch/scripts/tests/t1.py
    你的調用方式是tests.t1
  2. 如果tests.t1里面引用了自己定義的包,這個包也在同目錄下,是會報找不到這個包的
    解決方式:找到你安裝python的位置,然后找dist-packages或者site-packages下面,比如我通過pip install -yq python3-dev python3-pip安裝的python3.9,所以我的操作如下

方法一:添加軟連接

cd /usr/lib/python3/dist-packages
ln -s /usr/local/freeswitch/scripts/tests .

然后就會找到這個方法了,
方法二:硬核操作,直接添加復制
把/usr/local/freeswitch/scripts/tests/下面引用的包放在/usr/lib/python3/dist-packages下面,不過這樣會顯得特別臃腫,不建議

方法三:以下內容添加到系統環境啟動中

export PYTHONPATH=$PYTHONPATH:/usr/local/freeswitch/scripts/tests

不要忘記,tests 包目錄將需要一個 init.py。

在啟動 freeswitch 的 shell 中,需要定義這個環境變量。

export 設置的環境變量只在當前 Shell 會話中有效。一旦你退出當前 Shell(例如關閉終端窗口),這些環境變量的設置就會丟失。因此,相對于寫入諸如 /.bashrc、/.profile 或 /etc/profile 等配置文件從而實現持久化環境變量設置的方式,直接使用 export 命令所做的設置確實是臨時的

2.2.3 回調參數如何使用參數

2.2.3.1 handler回調函數參數怎么用

前面已經介紹了如何handler是撥號計劃的回調函數,那么回調函數 handler(session, args)里面有個args參數,這個其實就是額外參數,這里args就是一個字符串。

在這里插入圖片描述
只要在里面用空格拼接就可以了,然后使用則會功能則表達式處理下就可以用了

def handler(session, args):"""'handler'是應用程序的默認函數名。它可以被<modname>::<function>覆蓋。`session`是會話對象,用于控制通話過程。`args`是一個字符串,包含了模塊名之后的所有傳入參數。"""freeswitch.consoleLog('info', 'Answering call from Python.\n')  # 記錄接聽電話的日志信息freeswitch.consoleLog('info', 'Arguments: %s\n' % args)  # 打印傳入的參數pairs = re.findall(r'(\w+)=(\S+)', args)# 將匹配到的鍵值對轉換為字典dialplan_args = dict(pairs)# 獲取參數ws= dialplan_args.get('ws', None)model=dialplan_args.get('model', "qwen")
2.2.3.2 set事件回調函數參數怎么用

我們通常在handler里面設置一些事件

  • setHangupHook 掛斷事件
  • setInputCallback 輸入事件

在這里插入圖片描述
在這里插入圖片描述
這里的回調函數一定要有這些參數,但是args默認是字符串,我們可以把=''刪掉。我們來穿一個對象或者多個對象,這里我們就可以用利用字典的方式進行傳,然后獲取

    # 創建主線程 QueueManager對象main_qm = QueueManager()# 客戶說話類speaker = SpeakerStatus()input_callback_args = {'main_qm': main_qm, 'speaker': speaker}session.setInputCallback(input_callback, input_callback_args)hangup_hook_args = {'speaker': speaker}session.setHangupHook(hangup_hook, hangup_hook_args)  # 設置掛機時的回調函數

在這里插入圖片描述

三、致謝

寫到這里,大家應該就入了門,后面的修行就要看自己了。歡迎討論微信手機同號18956043585

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14173.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14173.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14173.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pycharm更改遠程編輯器設置

pycharm的遠程編輯器可以分為兩個部分&#xff1a;SFTP服務器(用于傳輸文件&#xff09;和命令行&#xff08;用于控制linux&#xff09;系統。那么當創建完成后&#xff0c;如何才能更改其設置呢&#xff1f; 一、遠程SFTP服務器設置 找到導航欄依次點擊tools-deployment-co…

運行vue2項目基本過程

目錄 步驟1 步驟2 步驟3 補充&#xff1a; 解決方法&#xff1a; node-scss安裝失敗解決辦法 步驟1 安裝npm 步驟2 切換淘寶鏡像 #最新地址 淘寶 NPM 鏡像站喊你切換新域名啦! npm config set registry https://registry.npmmirror.com 步驟3 安裝vue-cli npm install…

取消頁面按鈕回車事件

html頁面登錄按鈕 <button class"btn btn-success btn-block" id"btnSubmit" data-loading"正在驗證登錄&#xff0c;請稍候...">登 錄</button>js部分 在回車鍵按下時&#xff0c;阻止默認行為 $(document).keyup(function (event…

采用偽代碼及C代碼演示如何解決脫機最小值問題

采用偽代碼及C代碼演示如何解決脫機最小值問題 問題背景算法設計偽代碼實現C代碼實現證明數組正確性使用不相交集合數據結構最壞情況運行時間的緊確界 問題背景 脫機最小值問題涉及到一個動態集合 &#xff08; T &#xff09; &#xff08;T&#xff09; &#xff08;T&…

并網逆變器學習筆記9---VSG控制

參考文獻&#xff1a;《新型電力系統主動構網機理與技術路徑》 “構網技術一般包含下垂控制&#xff0c;功率同步控制&#xff0c;虛擬同步機控制&#xff0c;直接功率控制&#xff0c;虛擬振蕩器控制 等。其中&#xff0c;虛擬同步機技術&#xff0c;即 VSG&#xff0c;因其物…

藍牙(2):BR/EDR的連接過程;查詢(發現)=》尋呼(連接)=》安全建立=》認證=》pair成功;類比WiFi連接過程。

4.2.1 BR/EDR 流程&#xff1a; 查詢&#xff08;發現&#xff09;》尋呼&#xff08;連接&#xff09;》安全建立》認證》pair成功 4.2.1.1 查詢&#xff08;發現&#xff09;流程Inquiry (discovering) 類比WiFi的probe request/response 藍牙設備使用查詢流程來發現附近的…

Github 2024-05-24 Java開源項目日報 Top10

根據Github Trendings的統計,今日(2024-05-24統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Java項目10Java設計模式:提高開發效率的正規化實踐 創建周期:3572 天開發語言:Java協議類型:OtherStar數量:86766 個Fork數量:25959 次關…

探數API統計分享-1949年-2021年中國歷年夏糧產量統計報告

????????中國歷年夏糧產量?&#xff0c;為1949年到2021年我國每年的夏糧產量數據。2021年&#xff0c;我國夏糧產量為14596萬噸&#xff0c;比上年增長2.2%。 數據統計單位為&#xff1a;萬噸 。 我國夏糧產量有多少&#xff1f; 2021年&#xff0c;我國夏糧產量為1…

在Juniper SRX系列防火墻上配置DNS

SRX# set system name-server 17.20.0.11 SRX# show system name-server

vue中v-for的key值怎么使用?如何選擇?

在 Vue 中&#xff0c;v-for 指令用于渲染列表數據。當使用 v-for 時&#xff0c;強烈建議為每一項提供一個唯一的 key 屬性。這個 key 不僅是 Vue 區分節點的標識&#xff0c;也是 Vue 實現列表高效更新的一種機制。 如何使用 key 在 v-for 中&#xff0c;key 應該綁定到列表…

202206青少年軟件編程(Python)等級考試試卷(三級)

第 1 題 【單選題】 下圖所示, 有一個名為"書目.csv"的文件。 小明針對這個文件編寫了 5 行代碼,請問, 代碼運行到最后打印在屏幕上的結果是? ( ) with open(書目.csv, r, encoding=utf-8) as f:for line in f.readlines

適配arm架構國產服務器(銀河麒麟、中科方德)依賴下載

在計算機硬件領域&#xff0c;兩種主流的CPU架構分別是X86和ARM。X86架構&#xff0c;也稱為CISC&#xff08;復雜指令集計算機&#xff09;&#xff0c;主要服務于PC和服務器行業。而ARM架構&#xff0c;代表RISC&#xff08;精簡指令集計算機&#xff09;&#xff0c;則在移動…

利用Axure模板快速設計,可視化大屏信息大屏,含近200例資源和各類部件

模板類別&#xff1a; **通用模板&#xff1a;**提供基礎的布局和設計元素&#xff0c;適用于各種場景。 **行業特定模板&#xff1a;**如農業、醫院、銷售、能源、物流、政府機關等&#xff0c;針對不同行業提供專業模板。 **數據展示模板&#xff1a;**包括大數據駕駛艙、統…

1.1 什么是internet?

什么是Internet&#xff1a;從具體構成角度 節點 主機及其上運行的應用程序路由器、交換機等網絡交換設備 ? 邊&#xff1a;通信鏈路接入網鏈路&#xff1a;主機連接到互聯網的鏈路主干鏈路&#xff1a;路由器間的鏈路 ? 協議 ? 數以億計的、互聯的計算設備: ? 主機 端系…

webgl開發家居設計軟件

WebGL是一種在網頁瀏覽器中渲染3D圖形的JavaScript API&#xff0c;它基于OpenGL ES標準&#xff0c;允許開發者創建和顯示交互式的3D圖形。開發基于WebGL的家居設計軟件可以為用戶提供一種全新的、沉浸式的家居設計體驗。以下是開發此類軟件的一些關鍵步驟和特點。北京木奇移動…

2024 Google I/O 宣布正式支持 Kotlin Multiplatform ,那 KMP 是什么?它的未來在哪里?

基于最近一直有人和我提 KMP &#xff0c;那就簡單聊聊。 2024 Google I/O 正式官宣了支持 KMP &#xff0c;而一般意義上的 KMP 指的就是 Kotlin Multiplatform &#xff0c;它是 Google Workspace 團隊的一項長期「投資」項目&#xff0c;這里有個重點&#xff0c;那就是 Ko…

Nginx配置文件

當然&#xff0c;讓我們一步步來了解Nginx配置文件&#xff0c;即使你是完全的初學者也能輕松跟上。想象一下Nginx是一個超級聰明的接待員&#xff0c;它知道如何處理各種各樣的訪客請求&#xff0c;而這些規則&#xff0c;我們就寫在一個叫做nginx.conf的文件里。 1. 找到配置…

AJAX(JavaScript版本)

目錄 一.AJAX簡介 二.XMLHttpRequests對象 2.1XMLHttpRequests對象簡介 2.2創建XMLHttpRequests對象 2.3定義回調函數 2.4發送請求 2.5XMLHttpRequests對象方法介紹 2.6XMLHttpRequests對象屬性 三.向服務器發送請求 3.1發送請求 3.2使用GET還是POST 3.3使用GET來發…

前端nvm、nodejs、npm、cnpm、yarn安裝教程(超詳細圖文,含卸載舊的nodejs,安裝及環境變量配置)

最近換了新電腦&#xff0c;一開始在網上找了一個教程讓下載nvm-noinstall.zip 壓縮包解壓使用&#xff0c;踩坑了&#xff0c;過程復雜最后報錯無法用。 后來搜到下文教程&#xff0c;直接使用nvm。exe進行安裝&#xff0c;方便快捷。下面這個文章寫的很詳細&#xff0c;從如何…

谷歌快速收錄怎么做?

快速收錄顧名思義&#xff0c;就是讓新的的網頁內容能夠迅速被谷歌搜索引擎抓取、索引和顯示在搜索結果中&#xff0c;這對于做seo來說非常重要&#xff0c;因為它有助于新發布的內容盡快出現在谷歌的搜索結果中&#xff0c;從而增加網站的流量 想做谷歌快速收錄谷歌推薦了幾種…