问题描述:
使用X-Litet通过freeSwitch中的ESL对用户1000进行语音呼叫,在1000接通后播放预先设定的录音。
此时有两个地方小弟不明白:
1.1000分机接听后 通过什么事件得知1000正在说话的状态?
2.如何在1000分机说话的时候开始录音,1000分机停止说话的时候终止录音?
相关测试代码:
1.SpringBoot
2.ESL-Java
package iven.FreeSwitch.bean;
import org.freeswitch.esl.client.IEslEventListener;
import org.freeswitch.esl.client.inbound.Client;
import org.freeswitch.esl.client.inbound.InboundConnectionFailure;
import org.freeswitch.esl.client.transport.event.EslEvent;
import org.freeswitch.esl.client.transport.message.EslMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
public class EventEslInboundTest implements Serializable {
private static final Logger log = LoggerFactory.getLogger(EventEslInboundTest.class);
private static String host = "192.168.108.193";
private static int port = 8021;
private static String password = "ClueCon";
private static Client client = null;
private static boolean bConnected = false;
private static EventEslInboundTest eventEslInboundTest = null;
private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss:SSS");
public static void ConsoleLog(String strInfo){
System.out.println( formatter.format(new Date(System.currentTimeMillis()))+"["+strInfo+"]" );
}
public static EventEslInboundTest getInstance( ) {
if(eventEslInboundTest == null)
{
eventEslInboundTest = new EventEslInboundTest();
}
return eventEslInboundTest;
}
private static void initSocket(){
if( client==null ) {
client = new Client();
}
if( bConnected )
return ;
try
{
client.connect( host, port, password, 10 );
bConnected = true;
}
catch ( InboundConnectionFailure e )
{
log.error("Connect failed",e);
return;
}
}
public static void inBand()
{
initSocket();
System.out.println("event_socket_test".toUpperCase());
client.setEventSubscriptions("plain", "ALL");//"all"
//注册事件处理程序
client.addEventListener( new IEslEventListener()
{
public void eventReceived( EslEvent event )
{
if(event.getEventName().equals("CHANNEL_ANSWER")){
String callId = event.getEventHeaders().get("variable_uuid");
ConsoleLog("["+callId+"]"+"CHANNEL_ANSWER:"+event.getEventBodyLines().toString());
String param = callId + " playback::" + "1.wav" + " both";
EslMessage result = client.sendSyncApiCommand("uuid_broadcast", param);
ConsoleLog("uuidBroadcastNuance result " + result.toString());
}
if(event.getEventName().equals("CHANNEL_EXECUTE_COMPLETE")) {
String callId = event.getEventHeaders().get("variable_uuid");
ConsoleLog("["+callId+"]"+"CHANNEL_EXECUTE_COMPLETE");
}
if (event.getEventName().equals("CHANNEL_PARK")) {
String callId = event.getEventHeaders().get("variable_uuid");
ConsoleLog("["+callId+"]"+"CHANNEL_PARK");
String param = callId + " playback::" + "2.wav" + " both";
String result = client.sendAsyncApiCommand("uuid_broadcast", param);
ConsoleLog("uuidBroadcastNuance result " + result);
}
if(event.getEventName().equals("HEARTBEAT")){
String callId = event.getEventHeaders().get("variable_uuid");
//System.out.println("recieved Hearbeat event !" + event.getEventBodyLines());
}
if(event.getEventName().equals("CHANNEL_DESTROY")){
String callId = event.getEventHeaders().get("variable_uuid");
ConsoleLog("["+callId+"]"+"CHANNEL_DESTROY");
client.close( );
client = null;
bConnected = false;
}
if(event.getEventName().equals("CHANNEL_HANGUP_COMPLETE")){
//挂断
String callId = event.getEventHeaders().get("variable_uuid");
ConsoleLog("["+callId+"]"+"CHANNEL_HANGUP_COMPLETE");
// client.sendSyncApiCommand( "uuid_record ",callId+" stop record::333.wav" );
// ConsoleLog("["+callId+"]"+"uuid_record stop record 333.wav");
}
if (event.getEventName().equals("DETECTED_SPEECH")) {
String callId = event.getEventHeaders().get("variable_uuid");
ConsoleLog("["+callId+"]"+"DETECTED_SPEECH");
String asrStatus = (String) event.getEventHeaders().get("Speech-Type");
ConsoleLog("["+callId+"]"+asrStatus);
}
if(event.getEventName().equals("CHANNEL_EXECUTE_PBX"))
{
ConsoleLog("CHANNEL_EXECUTE_PBX");
}
if(event.getEventName().equals("CHANNEL_BRIDGE"))
{
ConsoleLog("CHANNEL_BRIDGE");
}
if(event.getEventName().equals("CHANNEL_APPLICATION"))
{
ConsoleLog("CHANNEL_APPLICATION");
}
if(event.getEventName().equals("CHANNEL_HOLD"))
{
ConsoleLog("CHANNEL_HOLD");
}
if(event.getEventName().equals("CHANNEL_STATE"))
{
ConsoleLog("CHANNEL_STATE:" + event.getEventHeaders().get("Channel-State"));
}
if(event.getEventName().equals("CHANNEL_CALLSTATE"))
{
ConsoleLog("CHANNEL_CALLSTATE:" + event.getEventHeaders().get("Channel-Call-State"));
}
if(event.getEventName().equals("CALL_UPDATE"))
{
ConsoleLog("CALL_UPDATE");
}
if(event.getEventName().equals("CUSTOM"))
{
ConsoleLog("收到:"+"CUSTOM ="+event.getEventBodyLines().toString());
}
}
public void backgroundJobResultReceived( EslEvent event )
{
String uuid= event.getEventHeaders().get("Job-UUID");
//log.info("Background job result received+:"+event.getEventName()+"/"+event.getEventHeaders());// +"/"+JoinString(event.getEventHeaders())+"/"+JoinString(event.getEventBodyLines()));
ConsoleLog("Background job result received+:"+event.getEventName()+"/"+event.getEventHeaders());// +"/"+JoinString(event.getEventHeaders())+"/"+JoinString(event.getEventBodyLines()));
}
});
}
public static void dialPhone( String mobile ) {
//初始化FreeSwitch socket对象
initSocket();
//注册事件
inBand();
//呼叫接通后播放语音
//client.sendAsyncApiCommand("originate", "{ignore_early_media=true}user/1004 &playback(1.wav) ");
client.sendAsyncApiCommand("originate", "user/1004 &hold()"); //&echo() &park()
log.debug("client.sendAsyncApiCommand");
//1000接通后将1000转接到1002
//EslMessage response = client.sendSyncApiCommand("originate", "user/1000 &bridge(user/1003) default zhang");
//System.out.println("body_string"+response.toString());
}
}
头发都要掉光了,请大神解答。