#twilio
#twilio
Вопрос:
Я пытаюсь заставить Twilio отвечать на звонки по номеру телефона PSTN, а затем попытаться позвонить на SIP-устройство.
Если SIP-устройство недоступно, занято или не отвечает; затем запишите сообщение и отправьте его по электронной почте.
Если SIP-устройство отвечает, подключите две стороны и отключите вызов, когда любая из сторон повесит трубку.
Для этого я использую функции Twilio.
Но по какой-то причине я не могу заставить Twilio прервать вызов, когда SIP-устройство вешает трубку. Он также не отключает SIP-сегмент, если абонент PSTN вешает трубку.
// /handle_incoming_call
exports.handler = function(context, event, callback) {
console.log('running handle_incoming_call')
console.log(context,event)
const twiml = new Twilio.twiml.VoiceResponse();
const dialOptions = {
action: "https://example.twil.io/record_voicemail",
ringTone: 'ch',
}
const dialString = `sip:${context.MY_CLIENT}`
try {
twiml.dial(dialOptions).sip(`${dialString};region=de1;transport=tls`);
console.log(`Calling '${dialString}'.`);
return callback(null, twiml);
} catch(e) {
console.error("Something went wrong while handling incoming call.", e);
return callback(e);
}
};
// /record_voicemail
exports.handler = function(context, event, callback) {
console.log('Running /record_voicemail')
console.log('c,e', context,event)
console.log('dial call status: ', event.DialCallStatus)
let twiml = new Twilio.twiml.VoiceResponse();
if(event.DialCallStatus === "busy" ||
event.DialCallStatus === "failed" ||
event.DialCallStatus === "no-answer" ||
event.DialCallStatus === "canceled") {
const recordOptions = {
action: "https://example.twil.io/forward_vm_via_email",
transcribe: false,
maxLength: 120, // seconds
playBeep: true,
trim: "trim-silence",
}
try {
twiml.play("https://example.twil.io/greeting_en.mp3");
twiml.play("https://example.twil.io/greeting_fr.mp3");
twiml.record(recordOptions);
return callback(null, twiml);
} catch(e) {
console.error("Something went wrong while recording voicemail.", e);
twiml.hangup();
return callback(e, twiml);
}
}
};
// /forward_vm_via_email
const sgMail = require('@sendgrid/mail');
exports.handler = function(context, event, callback) {
console.log('running forward_vm_via_email')
sgMail.setApiKey(context.SENDGRID_API_KEY);
const msg = {
to: context.TO_EMAIL_ADDRESS,
from: context.FROM_EMAIL_ADDRESS,
html: `<p><strong>New Voicemail from:</strong> ${event.From}</p>
<p><a href=${event.RecordingUrl}>Click here to listen (${event.RecordingDuration} seconds)</a></p>`,
subject: `New Voicemail from: ${event.From}`,
};
sgMail.send(msg)
.then(response => {
console.log("Voicemail successfully forwarded.")
return callback();
})
.catch(err => {
console.error("Something went wrong while forwarding voicemail.")
return callback(err);
});
};
Этот код работает для записи голосовой почты при занятости, сбое, отсутствии ответа. Но если SIP-устройство отвечает, а затем вешает трубку, вызов остается подключенным на стороне ТСОП и просто зависает навсегда.
Я также попытался добавить a twiml.hangup()
/record_voicemail
вне if
цикла, чтобы перехватить случаи, когда вызов был успешно завершен, но он ничего не делает. То же самое с добавлением twiml.hangup()
/handle_incoming_call
ввода, после twiml.dial().sip()
но, опять же, ничего не происходит.
Почему весь вызов не зависает, когда SIP-набор отключен?
Комментарии:
1. Евангелист-разработчик Twilio здесь. Я думаю, что ваш код верен, и вызов должен зависнуть. Итак, этот вопрос лучше всего задать службе поддержки Twilio . Отправьте им несколько идентификаторов вызовов, где это произошло, и они должны иметь возможность проверить, что произошло и почему вызов не повесил трубку.