本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
作為 PSTN 音訊服務的一部分,SIP 媒體應用程式可讓您根據呼叫事件 (例如來電或 DTMF 位數) 叫用使用者定義的 Lambda 函數,來設定在呼叫上執行的動作。UpdateSipMediaApplicationCallAPI 可讓您在呼叫作用中時隨時觸發 Lambda 函數,並以叫用傳回的新動作取代目前的動作。
工作流程
您可以在各種情況下使用 UpdateSipMediaApplicationCallAPI,例如將參與者新增至會議、將使用者靜音和取消靜音、中斷他們的連線等。下列使用案例說明典型的工作流程。
當 Amazon Chime SDK 設定會議時,使用者會撥打電話和聆聽音樂。安裝完成後,Amazon Chime SDK 會停止音訊,並允許來電者加入會議。接下來,假設使用管理會議的單獨系統。MyMeetingService
每個來電都應該被擱置。Chime 會通知有 MyMeetingService 關來電的資訊, MyMeetingService 然後為每個通話建立出席者,並且當準備好開始會議時,它會通知 SIP 媒體應用程式,並提供加入會議的權杖。 MyMeetingService
若要處理這種情況,Lambda 函數必須實作下列邏輯。
當新來電到達時,Lambda 會以
NEW_INBOUND_CALL
事件叫用。Lambda 會呼叫MyMeetingService
並傳遞transactionId
識別目前呼叫的,並傳回PlayAudio
動作。-
當準備好將呼叫者新增至會議時,服務會呼叫 UpdateSipMediaApplicationCallAPI 並傳遞呼叫的 API,
transactionId
並JoinToken
作為其引數的一部分傳遞。MyMeetingService
此 API 呼叫會再次觸發 Lambda 函數,現在會隨CALL_UPDATE_REQUESTED
事件發生。會將作為事件的一部分 MyMeetingService 傳遞JoinToken
至 Lambda 函數,而該權杖會用來將JoinChimeMeeting
動作傳回 SIP 媒體應用程式,這會中斷PlayAudio
動作並將呼叫者連線至會議。
注意
UpdateSipMediaApplicationCallAPI 會傳回 HTTP 202 (已接受)。SIP 媒體應用程式會確認呼叫正在進行中且可以更新,因此它會嘗試叫用 Lambda 函數。呼叫是以非同步方式執行,因此 API 的成功回應並不保證 Lambda 函數已啟動或完成。
下面的例子顯示了請求語法。
{
"SipMediaApplicationId": "string
",
"TransactionId": "string
",
"Arguments": {
"string": "string
"
}
}
請求參數
SipMediaApplicationId
— 處理呼叫之 SIP 媒體應用程式的識別碼。TransactionId
— 呼叫交易的 ID。對於輸入呼叫,TransactionId
可以在第一次叫用時從傳遞至 Lambda 函數的NEW_INCOMING_CALL
事件中取得。對於輸出呼TransactionId
叫,會在的回應中傳回CreateSipMediaApplicationCall。引數 —
CallUpdateRequest
作為動作資料的一部分,提供給 Lambda 函數的自訂引數。可以包含 0 到 20 個鍵值對。
下面的例子顯示了一個典型的請求。
aws chime update-sip-media-application-call --sip-media-application-id feb37a7e-2b66-49fb-b2dd-30f4780dc36d --transaction-id 1322a4e7-c106-4e70-aaaf-a8fa4c77c0cb --arguments '{"JoinToken": "
abc123
"}'
回應語法
{ "SipMediaApplicationCall": { "TransactionId": "
string
" } }
回應元素
TransactionId— 呼叫交易的 ID,與要求相同的 ID。
下列範例顯示CALL_UPDATE_REQUESTED
呼叫事件。
{ "SchemaVersion": "1.0", "Sequence":
2
, "InvocationEventType": "CALL_UPDATE_REQUESTED", "ActionData": { "Type": "CallUpdateRequest", "Parameters": { "Arguments": { "string
": "string
" } } }, "CallDetails": { ... } }
事件元素
SchemaVersion— JSON 結構描述的版本 (1.0)
序列 — 呼叫中事件的序號
InvocationEventType-Lambda 調用事件的類型,在這種情況下,
CALL_UPDATE_REQUESTED
-
ActionData— 與
CallUpdateRequest
動作相關聯的資料。類型-操作的類型,在這種情況下,
CallUpdateRequest
-
參數 — 動作的參數
引數 — 作為
UpdateSipMediaApplicationCall
API 請求一部分傳遞的引數
CallDetails— 有關當前呼叫狀態的信息
了解可中斷和不可中斷的動作
當 Lambda 函數在現有動作執行時傳回新的動作清單時,執行中動作的所有動作都會取代為新動作。在某些情況下,Lambda 函數會中斷進行中的動作,以便立即執行新動作。
下圖顯示了一個典型的例子。雙向圖下方的文字解釋了邏輯。
如果「動作 2」可中斷,我們將其停止並改為執行新的動作 1。
如果「動作 2」未中斷,則會在新「動作 1」開始之前完成。
在這兩種情況下,動作 3 都不會執行。
如果某些事件中斷動作,則會使用ACTION_INTERRUPTED
事件叫用 Lambda 函數。此活動僅供參考用途。SIP 媒體應用程式會忽略此叫用傳回的所有動作。
中斷動作的類型:
PlayAudio
RecordAudio
Pause
Lambda 函數範例
此範例顯示典型的 Lambda 函數,該函數會播放音訊檔案、傳遞聯結權杖,以及更新呼叫。
const MMS = require('my-meeting-service'); const myMeetingServiceClient = new MMS.Client(); exports.handler = async (event) => { console.log('Request: ' + JSON.stringify(event)); const playAudio = () => { return { Type: 'PlayAudio', Parameters: { ParticipantTag: 'LEG-A', AudioSource: { Type: 'S3', BucketName: '
chime-meetings-audio-files-bucket-name
', Key: 'welcome.wav
' } } } } const joinChimeMeeting = (joinToken) => { return { Type: 'JoinChimeMeeting', Parameters: { JoinToken:joinToken
} } } const response = (...actions) => { const r = { SchemaVersion: '1.0', Actions: actions }; console.log('Response: ' + JSON.stringify(r)); return r; }; switch (event.InvocationEventType) { case 'NEW_INBOUND_CALL': myMeetingServiceClient.addPendingCall(event.CallDetails.TransactionId); return response(playAudio()); case 'CALL_UPDATE_REQUESTED': const joinToken = event.ActionData.Parameters.Arguments['JoinToken
'] return response(joinChimeMeeting(joinToken)); default: return response(); } }