Enviar y recibir DTMF
Visión general
Dual Tone Multi Frequency (DTMF), es una forma de señalización utilizada por los sistemas telefónicos para transmitir los dígitos 0-9 y el * y # caracteres. Normalmente, la persona que llama pulsa estos botones en el teclado del teléfono y éste genera un tono compuesto por dos frecuencias que se reproducen simultáneamente (de ahí lo de Dual Tone).
El DTMF se utiliza tanto para marcar un destino en un teléfono fijo como para señalar al extremo remoto una vez contestada la llamada. Suele utilizarse para implementar un sistema de respuesta vocal interactiva (IVR) o para introducir información como un número PIN o un pin de multiconferencia.
Con los SDKs de cliente puedes tanto recoger una entrada DTMF del usuario de tu aplicación, como escuchar la entrada DTMF enviada por otro miembro.
Antes de empezar, asegúrese de que ha añadido el SDK a su aplicación y eres capaz de escriba a o reciba llamadas.
Enviar DTMF
Para enviar tonos DTMF desde su aplicación al backend, utilice este método:
call.conversation.media.sendDTMF('3212333,222,399,3212333,32232,1')
val callListener = object : NexmoRequestListener<NexmoCall> {
override fun onSuccess(nexmoCall: NexmoCall?) {
Log.d("TAG", "Call started: " + nexmoCall.toString())
nexmoCall.sendDTMF("123456")
}
override fun onError(apiError: NexmoApiError) {
Log.d("TAG", "Error: Unable to start a call ${apiError.message}")
}
}
nexmoClient.call("123456", NexmoCallHandler.SERVER, callListener)
NexmoRequestListener<NexmoCall> callListener = new NexmoRequestListener<NexmoCall>() {
@Override
public void onSuccess(@Nullable NexmoCall nexmoCall) {
Log.d("TAG", "Call started: " + nexmoCall.toString());
nexmoCall.sendDTMF("123456");
}
@Override
public void onError(@NonNull NexmoApiError apiError) {
Log.d("TAG", "Error: Unable to start a call " + apiError.getMessage());
}
};
nexmoClient.call("123456", NexmoCallHandler.SERVER, callListener);
nexmoCall.sendDTMF("3212333,222,399,3212333,32232,1")
[ongoingCall sendDTMF:@"3212333,222,399,3212333,32232,1"];
Durante una llamada en curso, en la que tu backend implementó un NCCO con una acción de entradaEl envío de un DTMF activará la función definida "eventUrl".
Recibir DTMF
Siempre que un miembro de una Conversation o un Call envía un DTMF, todos los demás miembros reciben una notificación sobre ese evento.
call.conversation.on("audio:dtmf",(from, event)=>{
event.digit // the dtmf digit(s) received
event.from //id of the user who sent the dtmf
event.timestamp //timestamp of the event
event.cid // conversation id the event was sent to
event.body // additional context about the dtmf
});
Los eventos DTMF se recibirán en su implementación de NexmoCallEventListener.onDTMF() en el NexmoCallEventListener que se adjunta al NexmoCall.
val callListener = object : NexmoRequestListener<NexmoCall> {
override fun onSuccess(nexmoCall: NexmoCall?) {
Log.d("TAG", "Call started: " + nexmoCall.toString())
nexmoCall?.addCallEventListener(callEventListener)
}
override fun onError(apiError: NexmoApiError) {
Log.d("TAG", "Error: Unable to start a call ${apiError.message}")
}
}
val callEventListener = object : NexmoCallEventListener {
override fun onDTMF(digit: String?, callMember: NexmoCallMember?) {
Log.d("TAG", "v: digit: $digit, callMember: $callMember")
}
override fun onMemberStatusUpdated(memberStatus: NexmoCallMemberStatus?, callMember: NexmoCallMember?) {
Log.d("TAG", "onMemberStatusUpdated: status: $memberStatus, callMember: $callMember")
}
override fun onMuteChanged(muteState: NexmoMediaActionState?, callMember: NexmoCallMember?) {
Log.d("TAG", "onMuteChanged: muteState: $muteState, callMember: $callMember")
}
override fun onEarmuffChanged(earmuffState: NexmoMediaActionState?, callMember: NexmoCallMember?) {
Log.d("TAG", "onEarmuffChanged: earmuffState: $earmuffState, callMember: $callMember")
}
}
nexmoClient.call("123456", NexmoCallHandler.SERVER, callListener)
NexmoRequestListener<NexmoCall> callListener = new NexmoRequestListener<NexmoCall>() {
@Override
public void onSuccess(@Nullable NexmoCall nexmoCall) {
Log.d("TAG", "Call started: " + nexmoCall.toString());
nexmoCall.addCallEventListener(callEventListener);
}
@Override
public void onError(@NonNull NexmoApiError apiError) {
Log.d("TAG", "Error: Unable to start a call " + apiError.getMessage());
}
};
NexmoCallEventListener callEventListener = new NexmoCallEventListener() {
@Override
public void onMemberStatusUpdated(NexmoCallMemberStatus $memberStatus, NexmoMember nexmoMember) {}
@Override
public void onMuteChanged(NexmoMediaActionState muteState, NexmoMember nexmoMember) {}
@Override
public void onEarmuffChanged(NexmoMediaActionState earmuffState, NexmoMember nexmoMember) {}
@Override
public void onDTMF(String digit, NexmoMember nexmoMember) {
Log.d("TAG", "onDTMF(): digit:" + digit + ", nexmoMember: " + nexmoMember);
}
};
nexmoClient.call("123456", NexmoCallHandler.SERVER, callListener);
Los eventos DTMF se recibirán en la aplicación del dtmfReceived(_, callMember) método opcional para su NXMCallDelegate:
func call(_ call: NXMCall, didReceive dtmf: String, from member: NXMMember?) {
print("DTMF received:`\(dtmf)` from `\(String(describing: member?.user.name))`")
}
Los eventos DTMF se recibirán en la aplicación del DTMFReceived:callMember: método opcional para su NXMCallDelegate:
- (void)call:(NXMCall *)call didReceive:(NSString *)dtmf fromMember:(NXMMember *)member {
NSLog(@"DTMF received: `%@` from `%@`", dtmf, member.user.name);
}