说起enum
,千万不要跟C语言里的枚举类型(enum
)混了。ENUM是E.164
Number to URI
Mapping的缩写,即E.164号码到URI的映射关系。如果说到这里你还不理解的话,想象一下域名到IP地址的映射关系吧。当你在Internet上访问一个域名(网址)时,如www.freeeswitch.org.cn
,将先由DNS服务器将该域名翻译成一个IP地址,进而,你的注册品会访问该IP地址以获取它想要的网页内容。ENUM也是一样,它只不过是使用了类似DNS的技术,将一个E.164的电话号码(也就是我们常用的电话号码)映射为一个相应的VoIP地址(可以是SIP、H323或Jabber的地址),这样,我们就可以通过拨打一个普通的电话号码来访问一个VoIP地址。
提供这个号码映射关系的网站有e164.org和freenum.org等,有兴趣读者可以试一下。
如果读者比较仔细的话,可以看到在FreeSWITCH默认的Dialplan中有如下的设置:
<extension name="enum">
<condition field="${module_exists`mod_enum`)}" expression="true"/>
<condition field="destination_number" expression="^(.*)$">
<action application="transfer" data="$1 enum"/>
</condition>
</extension>
上述设置的意思是,如果以上所有Dialplan都没有相应的匹配规则的话,那么Dialplan的匹配将进入这里,该Extension将匹配所有被叫号码,并最终通过transfer
App转入enum
Dialplan进行进一步的路由查找
enum
Dialplan会根据相应的配置查找相应的enum服务器查找是否有匹配的号码,如果能找到与被叫号码相匹配的项(无论是SIP地址还是其它VoIP地址),电话将进而桥接到相应的地址。