本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
此使用案例提供示例代码,用于接听 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 音频服务会调用具有调用事件类型的 AWS Lambda 函数。NEW_INBOUND_CALL
{
"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 软件开发工具包推荐 8 个 mono 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。假设密码正确,则使用 CreateMeeting 和 CreateAttendee 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 媒体服务的数据 () 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 媒体应用程序使用事件调用该 AWS Lambda 函数。HANGUP
{
"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 媒体应用程序将忽略该操作。