

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

# 了解叫用 Amazon Chime SDK PSTN 音訊服務 AWS Lambda 函數的電話語音事件
<a name="invoking-Lambda"></a>

Audio Service 會叫用 AWS Lambda 函數以回應不同的事件。每個調用都會指定調用事件類型，並在適用時提供呼叫詳細資訊，包括其參與者。下列主題說明叫用 AWS Lambda 函數的 Audio Service 事件。

# 使用 Amazon Chime SDK PSTN 音訊服務進行外撥通話
<a name="use-create-call-api"></a>

若要建立外撥通話，請使用 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html) API。API 會叫用指定 的端點`SIP media application ID`。客戶可以透過提供與端點不同的訊號和[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_SipMediaApplication.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_SipMediaApplication.html)動作來控制通話流程。

如果成功回應，API 會傳回 202 http 狀態碼與 transactionId，您可以將其與 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API 搭配使用，以更新進行中的呼叫。

下圖顯示對傳出呼叫的 AWS Lambda 函數端點發出的呼叫。

![\[圖表顯示對 AWS Lambda 端點發出的調用程式設計流程。\]](http://docs.aws.amazon.com/zh_tw/chime-sdk/latest/dg/images/sip-api-1.png)


針對 SIP 媒體應用程式設定的端點會針對撥出通話的不同狀態叫用。當客戶起始呼叫時，Amazon Chime SDK 會使用`NEW_OUTBOUND_CALL`呼叫事件類型叫用端點。

此範例顯示 的典型調用事件`NEW_OUTBOUND_CALL`。

```
{
    "SchemaVersion": "1.0",
        "Sequence": 1,
        "InvocationEventType": "NEW_OUTBOUND_CALL",
        "CallDetails": {
            "TransactionId": "transaction-id",
            "AwsAccountId": "aws-account-id",
            "AwsRegion": "us-east-1",
            "SipApplicationId": "sip-application-id",
            "Participants": [
                {
                    "CallId": "call-id-1",
                    "ParticipantTag": "LEG-A",
                    "To": "+1xxxx",
                    "From": "+1xxxxxxx",
                    "Direction": "Outbound",
                    "StartTimeInMilliseconds": "159700958834234"
                }
            ]
    }
}
```

會忽略事件相關調 AWS Lambda 用的任何回應。

當我們從接收者收到`RINGING`通知時，Amazon Chime SDK 會再次叫用設定的端點。

此範例顯示 的典型調用事件`RINGING`。

```
{
    "SchemaVersion": "1.0",
        "Sequence": 1,
        "InvocationEventType": "RINGING",
        "CallDetails": {
            "TransactionId": "transaction-id",
            "AwsAccountId": "aws-account-id",
            "AwsRegion": "us-east-1",
            "SipApplicationId": "sip-application-id",
            "Participants": [
                {
                    "CallId": "call-id-1",
                    "ParticipantTag": "LEG-A",
                    "To": "+1xxxx",
                    "From": "+1xxxxxxx",
                    "Direction": "Outbound",
                    "StartTimeInMilliseconds": "159700958834234"
                }
           ]
    }
}
```

會忽略事件相關調 AWS Lambda 用的任何回應。

如果接收者未接聽通話，或通話因錯誤而失敗，Chime 會中斷通話，並使用`Hangup`事件類型叫用端點。如需`Hangup`事件類型的詳細資訊，請參閱 [使用 Amazon Chime SDK PSTN 音訊服務結束通話](case-5.md)。

如果通話已接聽，Chime 會使用 `CALL_ANSWERED`動作叫用端點。此範例顯示典型的調用事件。

```
{
  "SchemaVersion": "1.0",
    "Sequence": 1,
    "InvocationEventType": "CALL_ANSWERED",
    "CallDetails": {
        ""TransactionId": "transaction-id",
            "AwsAccountId": "aws-account-id",
            "AwsRegion": "us-east-1",
            "SipApplicationId": "sip-application-id",
            "Participants": [
                {
                    "CallId": "call-id-1",
                    "ParticipantTag": "LEG-A",
                    "To": "+1xxxx",
                    "From": "+1xxxxxxx",
                    "Direction": "Outbound",
                    "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

此時，您可以使用動作清單回應調用，以傳回動作。如果您不想執行任何動作，請以空白清單回應。您每次 AWS Lambda 呼叫最多可以回應 10 個動作，而且每次呼叫可以叫用 Lambda 函數 1，000 次。如需使用一組動作回應的詳細資訊，請參閱 [使用 Amazon Chime SDK PSTN 音訊服務以動作清單回應調用](invoke-on-call-leg.md)。

# 使用 Amazon Chime SDK PSTN 音訊服務接聽來電
<a name="case-1"></a>

`NEW_INCOMING_CALL` 事件發生時，Audio Service 會建立唯一`TransactionID`且唯一的 `CallID`，持續到`HANGUP`事件發生為止。

您可以透過多種方式回應`NEW_INCOMING_CALL`事件。例如：
+ 傳送 `PlayAudio` 或 `RecordAudio`動作並自動接聽通話。
+ 傳送`Pause`動作。
+ 傳送`Hangup`動作，在這種情況下，通話不會接聽，也不會向客戶收費。
+ 傳送`CallAndBridge`動作，並將其他使用者新增至通話。
+ 不採取任何動作，呼叫嘗試會在 30 秒後逾時。

收到新的傳入呼叫時，SIP 媒體應用程式會呼叫具有此承載的 AWS Lambda 函數。

```
{
    "SchemaVersion": "1.0",
    "Sequence": 2,
    "InvocationEventType": "NEW_INBOUND_CALL"
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

# 指定動作以回應 Amazon Chime SDK PSTN 音訊服務的電話語音事件
<a name="use-case-2"></a>

在音訊服務中，SIP 媒體應用程式會叫用 AWS Lambda 函數。反之，Lambda 函數可以傳回稱為*動作*的指示清單。動作是您想要在通話中執行的項目，例如傳送或接收數字、加入會議等。如需 PSTN 音訊服務調用之動作的詳細資訊，請參閱 [了解 Amazon Chime SDK PSTN 音訊服務的電話語音事件](pstn-invocations.md)。

當 SIP 媒體應用程式成功執行動作清單時，應用程式會呼叫叫用事件類型為 的 AWS Lambda 函數`ACTION_SUCCESSFUL`。如果有任何動作無法完成，SIP 媒體應用程式會使用 `ACTION_FAILED`事件呼叫 AWS Lambda 函數。

只有當清單中的所有動作都成功`ACTION_SUCCESSFUL`時，SIP 媒體應用程式才會傳回 。如果清單中的任何動作失敗，SIP 媒體應用程式會使用 `ACTION_FAILED`事件叫用 AWS Lambda 函數，並在失敗之後清除清單中的剩餘動作。然後，SIP 媒體應用程式會執行 AWS Lambda 函數傳回的下一個動作。您可以使用 `ActionData`金鑰來識別叫用函數的呼叫。

下列事件顯示`PlayAudioAndGetDigits`動作後`ACTION_SUCCESSFUL`調用事件類型的範例承載。

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type": "PlayAudioAndGetDigits",
        "Parameters" : {
            "CallId": "call-id-1",
            "AudioSource": {
                "Type": "S3",
                "BucketName": "bucket-name",
                "Key": "failure-audio-file.wav"
            },
            "FailureAudioSource": {
                "Type": "S3",
                "BucketName": "bucket-name",
                "Key": "failure-audio-file.wav"
            },
            "MinNumberOfDigits": 3,
            "MaxNumberOfDigits": 5,
            "TerminatorDigits": ["#"],
            "InBetweenDigitsDurationInMilliseconds": 5000,
            "Repeat": 3,
            "RepeatDurationInMilliseconds": 10000
        },
        "ReceivedDigits": "123"
    }
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
                }
            ]
        }
    }
}
```

當清單中的任何動作無法成功完成時，SIP 媒體應用程式會叫用 AWS Lambda 函數來通知您失敗，並取得要在該呼叫上執行的新動作集。下列事件顯示`PlayAudio`動作後`ACTION_FAILED`調用事件類型的範例承載。

```
{
    "SchemaVersion": "1.0",
    "Sequence": 4,
    "InvocationEventType": "ACTION_FAILED",
    "ActionData": {
        "Type": "PlayAudio",
        "Parameters" : {
            "CallId": "call-id-1",
            "AudioSource": {
                "Type": "S3",
                "BucketName": "bucket-name",
                "Key": "audio-file.wav"            
            }
        },
        "ErrorType": "InvalidAudioSource",
        "ErrorMessage": "Audio Source parameter value is invalid."
    }
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
}
```

# 接收 Amazon Chime SDK PSTN 音訊服務的來電者輸入
<a name="case-4"></a>

您可以使用 `ReceiveDigits`動作來收集傳入 DTMF 數字，並將其與規則表達式比對。當 SIP 媒體應用程式收到符合規則表達式的數字時，它會呼叫具有 `ACTION_SUCCESSFUL`事件的 AWS Lambda 函數。收集的數字會出現在 `ActionData` 物件中的 `ReceivedDigits`值中。

例如：

```
{
    "SchemaVersion": "1.0",
    "Sequence": 4,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "ReceivedDigits": "",
        "Type": "ReceiveDigits",
        "Parameters": {
            "CallId": "call-id-1",
            "InputDigitsRegex": "^\d{2}#$",
            "InBetweenDigitsDurationInMilliseconds": 5000,
            "FlushDigitsDurationInMilliseconds": 10000
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

呼叫者輸入符合您規則表達式模式的數字後，SIP 媒體應用程式會叫用 AWS Lambda 函數，傳回下列類型的承載：

```
{
    "SchemaVersion": "1.0",
    "Sequence": 5,
    "InvocationEventType": "DIGITS_RECEIVED",
    "ActionData": {
        "ReceivedDigits": "11#",
        "Type": "ReceiveDigits",
        "Parameters": {
            "CallId": "call-id-1",
            "InputDigitsRegex": "^\d{2}#$",
            "InBetweenDigitsDurationInMilliseconds": 5000,
            "FlushDigitsDurationInMilliseconds": 10000
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

請參閱 GitHub 上的工作範例：https：//[https://github.com/aws-samples/amazon-chime-sma-on-demand-recording](https://github.com/aws-samples/amazon-chime-sma-on-demand-recording)

# 更新 Amazon Chime SDK PTSN 音訊的進行中呼叫
<a name="update-sip-call"></a>

作為 PSTN 音訊服務的一部分，SIP 媒體應用程式可讓您根據呼叫事件叫用使用者定義的 Lambda 函數，例如傳入呼叫或 DTMF 數字，來設定在呼叫上執行的動作。[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API 可讓您在呼叫作用中時隨時觸發 Lambda 函數，以調用傳回的新動作取代目前的動作。

**工作流程**  
您可以在各種情況下使用 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API，例如將參與者新增至會議、將使用者靜音和解除靜音、中斷連線等。下列使用案例說明典型的工作流程。

使用者在 Amazon Chime SDK 設定會議時呼叫和聆聽音樂。設定完成後，Amazon Chime SDK 會停止音訊，並將發起人加入會議。接著，假設使用管理會議的個別系統 `MyMeetingService`。每個傳入呼叫都應保留。Chime 會通知 MyMeetingService 有關傳入呼叫，然後 MyMeetingService 會為每個呼叫建立出席者，當 MyMeetingService 準備好開始會議時，它會通知 SIP 媒體應用程式，並提供加入會議的權杖。

若要處理此案例，Lambda 函數必須實作下列邏輯。
+ 當新的來電送達時，Lambda 會與`NEW_INBOUND_CALL`事件一起叫用。Lambda 會呼叫 `MyMeetingService`並傳遞可識別目前呼叫`transactionId`的 ，然後傳回 `PlayAudio`動作。
+ 當 `MyMeetingService` 準備好將發起人新增至會議時，服務會呼叫 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API，並傳遞呼叫的 `transactionId`和 `JoinToken` 作為其引數的一部分。此 API 呼叫會再次觸發 Lambda 函數，現在使用 `CALL_UPDATE_REQUESTED`事件。MyMeetingService 會將 傳遞`JoinToken`至 Lambda 函數，做為事件的一部分，並使用權杖將`JoinChimeMeeting`動作傳回至 SIP 媒體應用程式，這會中斷`PlayAudio`動作並將呼叫者連線至會議。

![\[顯示 UpdateSipMediaApplicationCall API 中資料流程的圖表。\]](http://docs.aws.amazon.com/zh_tw/chime-sdk/latest/dg/images/update-sip-call-flow3.png)


**注意**  
[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) 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` 會在 的回應中傳回[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html)。
+ **引數** – 作為`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 媒體應用程式呼叫期間取代動作的圖表。\]](http://docs.aws.amazon.com/zh_tw/chime-sdk/latest/dg/images/update-sip-actions.png)


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

# 使用 Amazon Chime SDK PSTN 音訊服務結束通話
<a name="case-5"></a>

您可以使用 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html) API 來結束外撥通話。API 會叫用指定 **SIP 媒體應用程式 ID** 的端點。客戶可以透過將動作傳回 SIP 媒體應用程式來控制通話的流程。

如果成功回應，API 會傳回 202 http 狀態碼與 `transactionId`，您可以將其與 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API 搭配使用，以更新進行中的呼叫。

下圖顯示對傳出呼叫的 AWS Lambda 函數端點發出的呼叫。

![\[叫用 CreateSipMediaApplicationCall API 時的資料流程。當外撥通話的狀態變更時，API 會叫用不同的端點。\]](http://docs.aws.amazon.com/zh_tw/chime-sdk/latest/dg/images/sip-api-1.png)


針對 SIP 媒體應用程式設定的端點會針對撥出通話的不同狀態叫用。當客戶和 呼叫時，Amazon Chime SDK 會使用`HANGUP`呼叫事件類型叫用端點。

此範例顯示 的典型調用事件`HANGUP`。

```
{
    "SchemaVersion": "1.0",
    "Sequence": 6,
    "InvocationEventType": "HANGUP",
    "ActionData": {
        "Type": "Hangup",
        "Parameters": {
            "CallId": "call-id-1",
            "ParticipantTag": "LEG-A"
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "Direction": "Inbound",
                 "To": "+12065551212",
                "From": "+15105550101",
                "StartTimeInMilliseconds": "1597009588",
                "Status": "Disconnected"
            }
        ]
    }
}

// if LEG-B receives a hangup in a bridged call, such as a meeting ending
{
    "SchemaVersion": "1.0",
    "Sequence": 6,
    "InvocationEventType": "HANGUP",
    "ActionData": {
        "Type": "ReceiveDigits",
        "Parameters": {
            "CallId": "call-id-2",
            "ParticipantTag": "LEG-B"
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "Leg-A",
                 "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "1597009588",
                "Status": "Connected"
            },
            {
                "CallId": "call-id-2",
                "ParticipantTag": "Leg-B",
                "To": "+17035550122",
                "From": "SMA",
                "Direction": "Outbound",
                "StartTimeInMilliseconds": "15010595",
                "Status": "Disconnected"
            }
        ]
    }
}
```

# 了解 end-to-end呼叫
<a name="use-cases"></a>

此使用案例提供從 PSTN 來電者接聽電話、以音訊訊息問候來電者、從來電者取得會議 PIN 碼、播放音訊，以及將來電者加入會議的範例代碼。

**呼叫事件和動作**  
Audio Service 會將調用事件傳遞給 做為 JSON 物件 AWS Lambda 。物件包含調用事件類型和任何相關的中繼資料。此 AWS Lambda 函數也會將 SIP 媒體應用程式動作傳回為 JSON 物件，而這些物件包含動作類型和任何相關的中繼資料。

當您收到呼叫事件時，下表列出呼叫事件`ActionData.Type`，以及可能的 。


|  調用事件  |  ActionData.Type  | 
| --- | --- | 
|  ACTION\$1SUCCESSFUL  |  CallAndBridge ReceiveDigits PlayAudio PlayAudioAndGetDigits  JoinChimeMeeting ModifyChimeMeetingAttendees RecordMeeting  | 
|  ACTION\$1FAILED  |  CallAndBridge PlayAudio PlayAudioAndGetDigits ModifyChimeMeetingAttendees RecordMeeting  | 
| HANGUP |  HangUp  | 
|  DIGITS\$1RECEIVED  | ReceiveDigits | 

**注意**  
若要實作下列使用案例，您的 Amazon Chime SDK 庫存中至少需要一個電話號碼、使用 Amazon Resource Name (ARN) 函數 AWS Lambda 的 SIP 媒體應用程式受管物件，以及使用電話號碼做為其觸發條件的 SIP 規則。

當 Amazon Chime SDK 收到對規則中指定電話號碼的呼叫時，PSTN 音訊服務會叫用具有`NEW_INBOUND_CALL`叫用事件類型的 AWS Lambda 函數。

```
{
    "SchemaVersion": "1.0",
    "Sequence": 1,
    "InvocationEventType": "NEW_INBOUND_CALL",
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+11234567890",
                "From": "+19876543210",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

您可以編寫 AWS Lambda 函數以驗證呼叫詳細資訊，並存放以供日後使用。對於`NEW_INBOUND_CALL`事件， AWS Lambda 函數會回應一組動作，播放歡迎提示並要求會議 PIN 碼。

音訊檔案有下列需求：
+ 您必須從 Amazon Simple Storage Service (S3) 儲存貯體播放音訊檔案。S3 儲存貯體必須屬於與 SIP 媒體應用程式相同的 AWS 帳戶。此外，您必須將 `s3:GetObject`許可授予 Amazon Chime SDK Voice Connector 服務主體：`voiceconnector.chime.amazonaws.com`。您可以使用 S3 主控台或命令列界面 (CLI) 來執行此操作。
+ 您必須使用大小不超過 50 MB 的 PCM WAV 檔案。Amazon Chime SDK 建議 8 KHz 單機。
+ 每個 WAV 檔案的 S3 中繼資料必須包含 `{'ContentType': 'audio/wav'}`。

```
{
    "SchemaVersion": "1.0",
    "Actions": [
        {
            "Type" : "PlayAudio",    
            "Parameters" : {
                "CallId": "call-id-1",
                
                "AudioSource": {
                    "Type": "S3",
                    "BucketName": "chime-meetings-audio-files-bucket-name",
                    "Key": "welcome-to-meetings.wav"
                }
            }
        },
        {
            "Type": "PlayAudioAndGetDigits",
            "Parameters" : {
                "ParticipantTag": "LEG-A",
                
                "AudioSource": {
                    "Type": "S3",
                    "BucketName": "chime-meetings-audio-files-bucket-name",
                    "Key": "enter-meeting-pin.wav"
                },
                "FailureAudioSource": {
                    "Type": "S3",
                    "BucketName": "chime-meetings-audio-files-bucket-name",
                    "Key": "invalid-meeting-pin.wav"
                },
                "MinNumberOfDigits": 3,
                "MaxNumberOfDigits": 5,
                "TerminatorDigits": ["#"],
                "InBetweenDigitsDurationInMilliseconds": 5000,
                "Repeat": 3,
                "RepeatDurationInMilliseconds": 10000
            }
        }
    ]
}
```

SIP 媒體應用程式會在呼叫分支 A 上執行這些動作。假設`PlayAudioAndGetDigits`動作接收數字，則 SIP 媒體應用程式會使用`ACTION_SUCCESSFUL`事件類型叫用 AWS Lambda 函數。

```
{
    "SchemaVersion": "1.0",
    "Sequence": 2,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type": "PlayAudioAndGetDigits",
        "Parameters" : {
            "ParticipantTag": "LEG-A",
            "AudioSource": {
                "Type": "S3",
                "BucketName": "chime-meetings-audio-files-bucket-name",
                "Key": "enter-meeting-pin.wav"
            },
            "FailureAudioSource": {
                "Type": "S3",
                "BucketName": "chime-meetings-audio-files-bucket-name",
                "Key": "invalid-meeting-pin.wav"
            },
            "MinNumberOfDigits": 3,
            "MaxNumberOfDigits": 5,
            "TerminatorDigits": ["#"],
            "InBetweenDigitsDurationInMilliseconds": 5000,
            "Repeat": 3,
            "RepeatDurationInMilliseconds": 10000
        },
        "ReceivedDigits": "12345" // meeting PIN
    },
    "CallDetails": {
        ... // same as in previous event
    }
}
}
```

您可以編寫 AWS Lambda 函數的程式，根據`CallDetails`資料識別發起人。您也可以驗證先前收到的會議 PIN 碼。假設 PIN 碼正確，然後使用 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateMeeting.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateMeeting.html)和 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateAttendee.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateAttendee.html) APIs 來建立 Amazon Chime SDK 會議，並產生會議出席者使用的聯結字符。 AWS Lambda 函數會以 動作回應，以加入 Amazon Chime SDK 會議。

```
{
    "SchemaVersion": "1.0",
    "Actions": [
        {
            "Type": "JoinChimeMeeting",
            "Parameters": {
                "JoinToken": "meeting-attendee-join-token"
            }
        }
    ]
}
```

假設 `JoinToken` 有效，則 SIP 媒體應用程式會加入 Amazon Chime SDK 會議，並使用 `ACTION_SUCCESSFUL`事件叫用 AWS Lambda 函數，其中 `CallDetails`包含來自 SIP 媒體應用程式和 Chime Media 服務 (`LEG-B`) 的資料 

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type" : "JoinChimeMeeting",
        "Parameters" : {
            "JoinToken": "meeting-attendee-join-token"
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id", 
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+11234567890",
                "From": "+19876543210",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            },
            {
                "CallId": "call-id-2",
                "ParticipantTag": "LEG-B",
                "To": "SMA",
                "From": "+17035550122",
                "Direction": "Outbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

如果此時想要停止對通話或通話分支執行動作，您可以使用空的動作集來回應。

```
{
    "SchemaVersion": "1.0"
    "Actions": []
}
```

呼叫者掛斷後，SIP 媒體應用程式會使用 `HANGUP`事件叫用 AWS Lambda 函數。

```
{
    "SchemaVersion": "1.0",
    "Sequence": 4,
    "InvocationEventType": "HANGUP",
    "ActionData": {
        "Type": "Hangup",
        "Parameters": {
            "CallId": "call-id-1",
            "ParticipantTag": "LEG-A"
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id", 
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+11234567890",
                "From": "+19876543210",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Disconnected"
            },
            {
                "CallId": "call-id-2",
                "ParticipantTag": "LEG-B",
                "To": "SMA",
                "From": "+17035550122",
                "Direction": "Outbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Disconnected"
            }
        ]
    }
}
```

如果您使用 動作回應`Hangup`事件，如果沒有其他 `Participants` 顯示 ，則 SIP 媒體應用程式會忽略`Status`該動作`Connected`。