本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
更新 Amazon Chime SDK PTSN 音訊的進行中呼叫
作為 PSTN 音訊服務的一部分,SIP 媒體應用程式可讓您根據通話事件叫用使用者定義的 Lambda 函數,例如來電或 DTMF 數字,來設定在通話上執行的動作。UpdateSipMediaApplicationCall API 可讓您在呼叫作用中時隨時觸發 Lambda 函數,以呼叫傳回的新動作取代目前的動作。
工作流程
您可以在各種情況下使用 UpdateSipMediaApplicationCall API,例如將參與者新增至會議、將使用者靜音和解除靜音、中斷連線等。下列使用案例說明典型的工作流程。
當 Amazon Chime SDK 設定會議時,使用者會呼叫和聆聽音樂。設定完成後,Amazon Chime SDK 會停止音訊,並將發起人加入會議。接著,假設使用個別系統 MyMeetingService來管理會議。每個來電都應保留。Chime 會通知 MyMeetingService 有關來電,然後 MyMeetingService 會為每個呼叫建立出席者,當 MyMeetingService 準備好開始會議時,它會通知 SIP 媒體應用程式,並提供加入會議的權杖。
若要處理這種情況,Lambda 函數必須實作下列邏輯。
-
當新的來電送達時,系統會使用
NEW_INBOUND_CALL事件叫用 Lambda。Lambda 會呼叫MyMeetingService並傳遞transactionId可識別目前呼叫的 ,然後傳回PlayAudio動作。 -
當
MyMeetingService準備好將發起人新增至會議時,服務會呼叫 UpdateSipMediaApplicationCall API 並傳遞呼叫的transactionId和JoinToken作為其引數的一部分。此 API 呼叫會再次觸發 Lambda 函數,現在使用CALL_UPDATE_REQUESTED事件。MyMeetingService 會將 傳遞JoinToken至 Lambda 函數做為事件的一部分,並使用字符將JoinChimeMeeting動作傳回至 SIP 媒體應用程式,這會中斷PlayAudio動作並將發起人連線至會議。
注意
UpdateSipMediaApplicationCall API 會傳回 HTTP 202 (已接受)。SIP 媒體應用程式會確認呼叫正在進行中且可更新,因此會嘗試叫用 Lambda 函數。調用會以非同步方式執行,因此 API 的成功回應並不保證 Lambda 函數已啟動或完成。
下列範例顯示請求語法。
{ "SipMediaApplicationId": "string", "TransactionId": "string", "Arguments": { "string": "string" } }
請求參數
-
SipMediaApplicationId– 處理呼叫的 SIP 媒體應用程式的 ID。 -
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 -
參數 – 動作的參數
-
引數 – 做為
UpdateSipMediaApplicationCallAPI 請求的一部分傳遞的引數
-
-
-
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(); } }