最近需要在esl中设置某些通道变量。然后由其他的esl客户端程序读取这些通道变量。
一开始以为通道变量都会出现在事件的header中,但是测试中发现并非如此,比如 CHANNEL_CALLSTATE事件中就不会包含用户自己设置的channel variable, 不过这些变量实际上已经设置成功了,可以通过 uuid_gervar 这个api命令来获取。
编码验证,在收到事件的时候,使用下面的代码:
string uuid=getevtparam(eslEvt, "Caller-Unique-ID");
char cmdbuff[2048];
sprintf(cmdbuff,"api uuid_getvar %s desc_msg\n\n",uuid.c_str());
esl_send_recv(&m_fsHandle,cmdbuff);
if(m_fsHandle.last_sr_event && m_fsHandle.last_sr_event->body)
{
printf("last reply=%s\n",m_fsHandle.last_sr_event->body);
}
else
{
printf("last reply=%s\n",m_fsHandle.last_sr_reply);
}
得到的输出如下:
last reply=desc_msg_test54321
与设置的通道变量值一致,说明该变量已经存在,并且可以获取,只不过在CHANNEL_CALLSTATE事件的header中没有打包这个变量而已。 这也说明freeswitch的事件处理的比较随意,在 CHANNEL_EXECUTE_COMPLETE
事件和CHANNEL_HANGUP_COMPLETE
事件中就打包了这些通道变量。