View a markdown version of this page

更新 Amazon Chime SDK PTSN 音訊的進行中呼叫 - Amazon Chime SDK

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

更新 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 並傳遞呼叫的 transactionIdJoinToken 作為其引數的一部分。此 API 呼叫會再次觸發 Lambda 函數,現在使用 CALL_UPDATE_REQUESTED事件。MyMeetingService 會將 傳遞JoinToken至 Lambda 函數做為事件的一部分,並使用字符將JoinChimeMeeting動作傳回至 SIP 媒體應用程式,這會中斷PlayAudio動作並將發起人連線至會議。

顯示 UpdateSipMediaApplicationCall API 中資料流程的圖表。
注意

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

    • 參數 – 動作的參數

      • 引數 – 做為 UpdateSipMediaApplicationCall API 請求的一部分傳遞的引數

  • CallDetails – 目前呼叫狀態的相關資訊

了解可中斷和不可中斷的動作

當 Lambda 函數在現有動作執行時傳回動作的新清單時,所有追蹤進行中動作的動作都會取代為新的動作。在某些情況下,Lambda 函數會中斷進行中的動作,以立即執行新的動作。

下圖顯示典型的範例。圖表下方的文字說明邏輯。

顯示如何在進行中的 SIP 媒體應用程式呼叫期間取代動作的圖表。

如果動作 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(); } }