了解 Amazon Chime SDK PSTN 音频服务的端到端呼叫
此使用案例提供示例代码,用于接听 PSTN 呼叫者的电话、用音频消息向呼叫者打招呼、从呼叫者那里获取会议 PIN 码、播放音频以及让呼叫者加入会议。
调用事件和操作
音频服务将调用事件作为 JSON 对象传递给 AWS Lambda 函数。这些对象包括调用事件类型和任何相关的元数据。AWS Lambda 函数还以 JSON 对象的形式返回 SIP 媒体应用程序操作,这些对象包括操作类型和任何相关的元数据。
下表列出了您收到调用事件时的调用事件以及可能的 ActionData.Type
。
调用事件 | ActionData.Type |
---|---|
ACTION_SUCCESSFUL |
CallAndBridge ReceiveDigits PlayAudio PlayAudioAndGetDigits JoinChimeMeeting ModifyChimeMeetingAttendees RecordMeeting |
ACTION_FAILED |
CallAndBridge PlayAudio PlayAudioAndGetDigits ModifyChimeMeetingAttendees RecordMeeting |
挂断 |
HangUp |
DIGITS_RECEIVED |
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 账户。此外,您必须向 Amazon Chime SDK 语音连接器服务主体
voiceconnector.chime.amazonaws.com
授予s3:GetObject
权限。您可以使用 S3 控制台或命令行界面 (CLI) 完成此操作。 -
您必须使用大小不超过 50 MB 的 PCM WAV 文件。Amazon Chime SDK 推荐 8kHz 单声道。
-
每个 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 正确,您可以使用 CreateMeeting 和 CreateAttendee API 创建 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 媒体服务 (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
显示 Connected
的 Status
,则 SIP 媒体应用程序将忽略该操作。