Odoo – Asterisk电话连接器

介绍

Asterisk是一款用于电话的OpenSource软件。该软件通常用于在公司内部运行IP PBX系统,并结合每个员工的IP电话和xDSL上的SIP中继或光纤链路或传统ISDN线路来访问公共电话网络。Asterisk根据GNU通用公共许可证提供,由美国公司Digium编辑。如果您想了解有关Asterisk的更多信息,请阅读其Wikipedia页面

连接器的描述

Odoo-Asterisk连接器有三个主要功能。第一个主要功能是click2dial。下面是它的工作原理 :

  1. 在Odoo中,在具有电话/移动字段的表单视图中,用户单击电话号码(在v10及更低版本,他必须单击电话号码字段旁边的拨号按钮)。
  2. Asterisk使用户的电话响铃。
  3. 用户回答他自己的电话(如果他没有,则此过程在此处停止)。
  4. Asterisk拨打Odoo中的电话号码代替用户。
  5. 如果远程方应答,则用户可以与其通信方通话。

第二个主要功能是:如果电话号码出现在Odoo的合作伙伴,潜在客户或员工中,它会增加在来电和拨出电话上显示对应人姓名的功能。下面是它的工作原理 :

  1. 在拨入和拨出电话时,Asterisk拨号方案执行脚本。
  2. 此脚本将向Odoo服务器发出XML-RPC或JSON-RPC请求,以尝试查找与远程方的电话号码对应的人员的姓名。
  3. 如果找到名称,则更新呼叫信息,以便在用户的SIP电话上显示。

第三个主要特征是:只需点击一下即可获得与主叫方对应的合作伙伴/领导/员工/候选人。下面是它的工作原理 :

  1. 有人打电话给你。在接听电话之前或之后,您点击屏幕右上角的电话标识,在您的用户名旁边:Odoo向Asterisk Manager界面发送查询以获取当前电话呼叫的列表(振铃或通话) 。
  2. 如果发现涉及用户电话的电话,则会获得主叫方的电话号码
  3. 它搜索Odoo合作伙伴中主叫方的电话号码。如果记录匹配,则显示相关合作伙伴的名称并建议打开它,或打开其相关的销售订单或发票。如果没有匹配的记录,则建议创建一个新的联系人,其中显示的电话号码为“电话”或“移动”号码或更新现有合作伙伴。

其他可能性(独立于Asterisk,使用base_phone_popup模块):

  1. 当来电到达时,Asterisk会执行一个AGI脚本,其中包含有关应该接收弹出窗口的Odoo用户登录信息。此AGI脚本向Odoo发送XML-RPC或JSON-RPC请求。
  2. Odoo收到请求,其中包含应通知的Odoo用户的登录信息以及主叫方的电话号码。如果电话号码在Odoo中可用,则Odoo会显示一个通知弹出窗口,其中包含指向主叫合作伙伴/潜在客户/员工/候选人的表单视图的链接(或者,如果电话号码未知,则链接指向该号码找不到巫师)。

Akretion服务提供

部署Asterisk-Odoo连接器需要具备Odoo和Asterisk的专业知识。由于ERP和IP PBX系统是贵公司的两个关键组件,您可能更愿意将连接器的安装和配置委派给有经验的顾问。

作为Asterisk-Odoo连接器的作者,Akretion是寻找这种专业知识的最佳选择。Akretion为Asterisk-Odoo连接器提供服务包,其中包括:

  • 如有必要,更新Asterisk-Odoo模块的模块代码,使其适用于您正在使用的Odoo版本,
  • 如有必要,更新Asterisk端脚本的代码,使它们适用于您正在使用的Asterisk版本,
  • 相关模块的安装和配置,
  • 更新现有Asterisk IPBX的配置,使其与Odoo-Asterisk连接器配合使用,
  • 关于模块的使用,
  • 自安装模块之日起2个月内通过电子邮件提供技术支持并提供错误修复保修。此保修是对错误的错误修复保证,这些错误会改变Asterisk-Odoo连接器的行为,如本文档中所述。此保修要求远程访问Odoo和Asterisk服务器,或者客户应向Akretion提供在Akretion办公室重现该问题的方法。

此服务套餐的建议价格为400欧元,不含税。

此服务包不包括:

  • 增强请求,
  • 额外的Asterisk设置和配置,不需要使Odoo-Asterisk连接器工作,
  • 自模块安装之日起2个月后的技术支持和错误修复保修,
  • Odoo模块的技术支持和错误修复保证不属于Odoo-Asterisk连接器,也不属于不属于Odoo-Asterisk连接器的Asterisk端脚本。

安装模块

Odoo-Asterisk连接器由几个模块组成; 其中一些与Asterisk无关(所有名称中没有星号的模块都与Asterisk无关:base_phonebase_phone_popupcrm_phonehr_phone等等),其中一个特定于Asterisk(asterisk_click2dial)。

这些模块应该像任何Odoo模块一样安装在Odoo上。该模块的源代码可在github上的Odoo社区协会(OCA)的连接器电话项目中找到。确保根据您的Odoo版本选择正确的分支。

这些模块需要两个额外的Python库:phonenumberspy-Asterisk。要安装这些库,请运行:

  % sudo pip install phonenumbers
  % sudo pip install py-Asterisk

PIP命令是安装Python库的官方工具。如果您的系统上没有此工具,请安装相应的软件包(Debian / Ubuntu系统上的软件包python-pip)。

设置click2dial功能

配置星号

对于click2dial功能,Odoo将通过Asterisk Manager Interface(AMI)与Asterisk通信。

所以第一步是配置AMI:

  • 为Odoo创建一个新的AMI帐户
  • 配置AMI接受来自Odoo的click2dial请求。

AMI的配置文件是/etc/asterisk/manager.conf(根据您的Linux发行版,目录可能不同)。这是一个示例配置文件,其中我的注释内联:

  ; manager.conf file for the Asterisk Manager Interface (AMI)
  ; It starts with the “general” section first
[general]
 ; You must enable the AMI feature
  enabled=yes
  ; TCP Port on which AMI will listen
  port = 5038
  ; I suppose Asterisk and Odoo are on two different machines,
  ; so you must bind AMI on 0.0.0.0
  bindaddr = 0.0.0.0
 ; We don’t need to activate the HTTP AMI interface : the module uses the native interface
  webenabled = no
  ; Then, we create an AMI account for Odoo
  [click2dial]  ; This is the AMI login
  secret = mypassword ; This is the AMI password
  ; We deny AMI access for everybody
  deny = 0.0.0.0/0.0.0.0
  ; We accept AMI access for Odoo server (192.168.0.42)
  permit = 192.168.0.42/255.255.255.255
  ; We give the minimum access rights required for the click2dial feature
  ; For Asterisk 1.4.x, you need the “call” rights (for both click2dial and the 'open calling party' feature)
  ;read =
  ;write = call
  ; For Asterisk 1.6.x and 1.8.x, you need the “originate” rights (for click2dial)
  ; and the 'reporting' rights (for the 'open calling party' feature)
  read =
  write = originate,reporting

警告:在较旧版本的Asterisk上,您需要重新启动Asterisk(检查手机上是否有人,因为重启Asterisk会停止所有正在进行的电话呼叫)。在较新版本的Asterisk上,只需在Asterisk CLI中键入manager reload即可

现在检查您是否可以从Odoo服务器访问AMI:

  % nc <asterisk_server_IP_address> 5038

它应该显示:

  Asterisk Call Manager/<version of AMI>

配置Odoo

在Odoo上以管理员身份登录。

配置Asterisk服务器

首先,您必须创建一个或多个Asterisk服务器。该click2dial模块支持多种的Asterisk服务器(每个Odoo用户,您将配置他所连接的Asterisk服务器上)。

进入菜单设置>技术>电话>星号服务器。创建一个或多个Asterisk服务器。所有字段都有详细的上下文帮助,因此您应该能够通过阅读帮助了解如何设置每个参数。

一些参数需要额外的解释:

  • Alert-Info SIP标题:您可以在下面的Aastra IP电话的Click2dial 安静click2dial自动应答部分找到更多关于它的解释。你现在可以把它留空,这不是问题。
截图Asterisk服务器配置

配置用户

进入菜单设置>用户>用户。对于需要click2dial功能的每个用户,您需要在Telephony选项卡中设置asterisk_click2dial模块添加的一些参数:

  • 星号通道类型:用户手机的通道类型(如果用户有常规IP电话,请选择SIP
  • 资源名称:这是您选择的渠道类型的资源名称。如果通道类型为SIP,则资源名称是您在其中定义的实体的名称/etc/asterisk/sip.conf。例如,如果您使用[alexis] in 定义了实体sip.conf,则资源名称为alexis(这也意味着您使用Dial(SIP / alexis)在Asterisk拨号方案中调用此用户)。对于SIP电话,内部电话号码通常用作资源名称。
  • 内部号码:用户的内部电话号码
  • 来电显示:此字段很重要。如果您不知道呼叫者ID是什么,您应该阅读有关Asterisk的更多文档。简而言之,它与提供给远程方的姓名和电话号码有关。当您通过click2dial呼叫某人时,将不会使用您所定义的IP电话的callerid参数/etc/asterisk/sip.conf(如果您有SIP电话); 将改为使用Odoo中定义的来电显示字段。您应该在Odoo中使用与调用者ID字段相同的语法,而不是Asterisk中的调用者字段,例如:Alexis de Lattre <141981242>
  • 警报信息SIP标头:这与Asterisk服务器的参数相同,但与用户相关。你现在可以把它留空。
  • 变量:此参数仅适用于高级Asterisk用户。暂时把它留空。
  • 建议在click2dial之后在CRM中创建一个调用:仅当您安装了asterisk_click2dial_crm模块时,此选项才可用; 它默认激活。它也可以通过用户的首选项进行修改(这意味着用户可以自己修改此选项)。
  • 星号服务器:选择用户IP电话注册的Asterisk服务器。如果您的公司只有一个Asterisk服务器,您可以将此字段留空:Odoo将使用在Odoo中创建的唯一Asterisk服务器。
截图用户配置
截图用户首选项

就是这样,配置完成后,你就可以开始玩click2dial了!

使用click2dial功能

在Odoo中,转到任何可以访问合作伙伴并打开您要呼叫的合作伙伴的菜单。在v10上,在“ 电话”和“ 移动”字段旁边,您应该看到“ 拨号”按钮; 在v11 / 12上,只需使用电话号码本身的链接即可。

截图合作伙伴表格

重要提示:Odoo中的电话号码应采用国际格式(E.164格式),例如: +33 1 41 98 12 42

以下是click2dial功能的完整使用方案:

  1. 单击要拨打的电话号码旁边的“ 拨号”按钮。
  2. Odoo重新格式化电话号码并连接到Asterisk Manager Interface并发送请求。
  3. Asterisk使用户的电话响铃。
  4. 用户回答他自己的电话。如果他没有接听电话,则此过程在此处停止,后续步骤不会执行。
  5. Asterisk拨打已重新格式化的电话号码,拨号后立即将用户的电话连接到呼叫(用户听到呼叫等待音,就像他自己拨打了电话号码一样)。
  6. 用户完全控制呼叫。
  7. 如果您未在用户表单上的click2dial或用户首选项禁用“ 在CRM中创建呼叫 ”选项,则会出现一个建议在CRM中创建电话的弹出窗口:
在CRM弹出窗口中创建电话呼叫

安静的click2dial

想象一下,您与其他同事共享同一个工作室。当您的一位同事拨打电话时,工作室会保持安静,直到通话开始。现在,如果同事使用Odoo的click2dial功能,他的手机会在对话开始之前响起并打扰每个人!我认为这是一个重要的缺点。

希望有一个解决方案:当Asterisk“呼叫”用户时(在呼叫远程方之前),他应该告诉手机不要响铃。事实上,当我说“告诉手机不要响”时,我的意思是“告诉手机使用无声铃声”。SIP电话通常可以实现这一点。在SIP协议中,您可以使用Alert-Info标头告诉电话选择特定的铃声。此功能通常称为“特殊振铃”或“优先警报”。大多数SIP电话都支持Alert-Info标头,但是:

  • 标题内容的确切语法可能因SIP电话制造商而异,
  • 铃声的名称也可能因SIP电话制造商而异。

我已经与两个不同的手机制造商测试了这个功能:Technicolor,即Thomson的新名称(ST2030型号,它可能与其他型号的工作方式相同)和Aastra(6731i型号,我相信其他型号的工作方式相同)。我在下面详细说明; 如果您对其他手机有一些经验,请不要犹豫,发送电子邮件(akretion.com 上的 alexis.delattre)并分享您的知识。

Technicolor ST2030 IP电话

ST2030 IP电话

我想你用TFTP来配置手机。如果你编辑调用的系统旋律的默认配置文件Tone-RG.txt,你会看到一个铃声静默定义如下:

  Silent:d=32,o=5,b=160:8P,2D

使用这种配置,它是一种“安静”的铃声,但不是完全无声的铃声。要使其完全静音,请将此铃声的定义更改为:

  Silent:d=32,o=5,b=160:P

注意:要使更改生效,请不要忘记更改铃声文件的名称并更新文件参数system_melodies中的<MAC_address>.inf文件名。

然后,在Odoo中,在Asterisk服务器的配置中,您应该为Alert-info SIP标头提供以下值:

  info=<Silent>

Aastra IP电话

Aastra IP电话

根据Aastra文档,存在无声铃声,但它不能用于独特的铃声。我找到了一个解决方法:选择一个未使用但是默认的铃声,例如Bellcore-dr5(这是一个“安静”的铃声,但不是一个完全无声的铃声),并在配置文件中重新定义它(aastra.cfg到为所有Aastra手机<MAC_address>.cfg更改它,或仅为一部手机更改它:

   bellcore cadence dr5: 0,-1

这会将铃声Bellcore-dr5转换为完全无声的铃声。

然后,在Odoo中Asterisk服务器的配置中,您应该为Alert-info SIP标头提供以下值:

  info=<Bellcore-dr5>

注意:如果您混合使用Aastra和Technicolor手机,您可以使用用户表单上提供的用户特定的Alert-info SIP标头,或使用服务器范围的Alert-info SIP标头参数并重命名为Silent Thechnicolor IP电话铃声到Bellcore-dr5

使用Aastra IP电话自动应答click2dial

如果您希望Aastra IP电话(其他IP电话也支持此功能)在click2dial上自动应答,请按以下步骤操作。

首先,您需要在Aastra IP电话上配置* Incoming intercom calls。以下是您应在Aastra配置文件中使用的参数:

  sip allow auto answer: 1   # Allow auto-answer on incoming intercom calls
  sip intercom warning tone: 1   # Activate warning tone on incoming intercom calls
  sip intercom mute mic: 0   #   Enable microphone on incoming intercom calls

然后,在Alert-info SIP标头中,输入:

  info=alert-autoanswer

如果Alert-info SIP标头已有值,请注意,如果将它们与“;”分隔,则可以在此字段中放置多个值,例如:

 info=<Bellcore-dr5>;info=alert-autoanswer

如果您希望自动应答是特定于用户的,请使用用户表单的Alert-info SIP标头 ; 如果您希望它适用于Asterisk服务器的所有用户,请使用Asterisk服务器表单的Alert-info SIP标头。设置用户表单的Alert-info SIP标头后,将忽略服务器表单上的等效字段。

现在,当您执行click2dial时,您的Aastra IP电话将自动应答呼叫并默认使用扬声器。

在来电时获取主叫方的姓名

技术介绍

这是一个解释该功能如何工作的场景:

  1. 在来电时,Asterisk拨号方案执行AGI set_name_incoming_timeout.sh
  2. set_name_incoming_timeout.sh脚本set_name_agi.py使用短暂超时调用脚本。
  3. set_name_agi.py脚本将在Odoo服务器上发出XML-RPC或JSON-RPC请求,以尝试查找与主叫方提供的电话号码对应的人员的姓名。
  4. 如果它在Odoo中找到该名称,则该名称将用作呼叫的CallerID名称,以便用户可以在其IP电话的屏幕上看到该名称。如果在Odoo中找不到任何匹配项,它可以将电话号码地理定位并将国家和城市名称显示为CallerID(如果您激活了特定选项)。

在Odoo方面设置

我建议在Odoo上创建一个新用户; 例如,我们将其称为星号。此星号用户将专用于此功能,并且只具有使用该功能所需的最低访问权限。为此,请将此星号用户添加到Asterisk CallerID组(该组仅具有使用该功能所需的最低访问权限)。

在星号侧设置

首先,确保您可以从Asterisk服务器访问Odoo的HTTP或HTTPS端口; 如果它不起作用,请检查您的网络设置和防火墙规则。

其次,检查timeout您的Asterisk服务器上是否有shell命令:

  • Debian Lenny或更低版本和Ubuntu Lucid 10.04或更低版本下,你必须安装超时包,
  • Debian Squeeze或更高版本以及Ubuntu Maverick 10.10或更高版本下,此shell命令由默认安装的软件包coreutils提供。

然后,复制这两个文件set_name_agi.py并复制到Asterisk服务器set_name_incoming_timeout.sh的目录/usr/local/bin/中。确保这两个脚本具有执行权限。您将在下面找到有关这两个脚本的一些详细信息。

安装pyst2库:

sudo pip install pyst2

该脚本set_name_agi.py是用Python编写的,它是“完成工作” 的脚本:

  • 它在标准输入上接收Asterisk给出的参数,特别是电话号码,
  • 它向Odoo发送XML-RPC或JSON-RPC请求,询问它是否可以在合作伙伴地址中找到电话号码,
  • 它在其标准输出上写了一些Asterisk的指令,特别是更改CallerID名称。

此脚本有一些选项:

  • Odoo服务器的DNS或IP地址,
  • Odoo服务器的端口,
  • 通过SSL使用XML-RPC,JSON-RPC或XML-RPC的选项,
  • 要使用的Odoo数据库的名称,
  • 如果您使用XML-RPC ,则Odoo用户的ID(在我们的示例中,写入我们在上一节中创建的用户星号的ID ); 如果你使用JSON-RPC,Odoo用户的登录,
  • 它的密码,

运行set_name_agi.py -h以获得这些选项的语法。

然后,脚本set_name_incoming_timeout.sh是一行shell脚本。这是从Asterisk拨号方案调用的脚本set_name_agi.py,它使用适当的选项调用脚本。为什么我们需要这个中间脚本?set_name_agi.py默认情况下,此中间脚本调用脚本的短暂超时为2秒; 如果脚本set_name_agi.py在2秒后没有完成它的工作,它将被杀死。设置这样的超时非常重要,因为Asterisk会在每次拨打电话时调用脚本; 脚本卡住,电话也会卡住,你会错过电话!

编辑脚本set_name_incoming_timeout.sh并输入正确的选项。

修改星号拨号方案,以便在接到外部电话时调用脚本。如果您自己编写了Asterisk拨号方案,请编辑拨号方案(通常/etc/asterisk/extensions.conf),并在专用于接收外部电话呼叫的上下文中插入一个扩展,该扩展将执行AGI功能,并将脚本(/usr/local/bin/set_name_incoming_timeout.sh)的位置作为参数。当然,此扩展必须放在拨打用户IP电话的Dial()功能之前。例如 :

  [from-extern]
  exten = _141981242,1,AGI(/usr/local/bin/set_name_incoming_timeout.sh)
  same = n,Dial(SIP/10, 30)
  same = n,141981242,n,Answer()
  same = n,Voicemail(10@default,u)
  same = n,Hangup()

然后,重新加载Asterisk diaplan:

  asterisk*CLI> extensions reload

如果您没有自己编写Asterisk拨号方案,这是使用FreePBX或Wazo或Asterisk的任何其他管理界面的用户的情况,您需要弄清楚如何在管理的拨号方案功能中插入带有AGI脚本的扩展名接听外部电话。如果您需要帮助,请考虑Akretion的服务。

您现在已准备好在Odoo中使用CallerID名称查找接收您的第一个电话!

拨打电话也可以做同样的事情; 设置非常相似,您需要set_name_outgoing_timeout.sh在拨号方案中使用脚本和一些额外的行。您将在脚本开头的注释中找到一个示例set_name_agi.py

设置“开放主叫方”功能

建立

此功能需要与click2dial功能相同的配置,如上所述。

警告:如果您已经部署了click2dial功能并升级了模块以获得新的开放主叫方功能,则应更新/etc/asterisk/manager.conf文件以向AMI用户添加一些权限,cf click2dial以上部分。

使用“开放主叫方”功能

这是一个典型的场景:

  1. 你的手机响了
  2. 您单击屏幕右上角的电话徽标。
  3. Odoo向Asterisk Manager Interface(AMI)发送状态请求以获取所有当前电话呼叫的列表。它将获得涉及您的电话号码的第一个电话,并检索所显示的电话号码。
  4. Odoo在合作伙伴/潜在客户/员工/候选人/活动参与者上搜索所呈现的电话。如果找到匹配项,则会打开合作伙伴/潜在客户/员工/候选人/事件参与者的表单视图。

如果找不到匹配项,则会打开一个弹出窗口,显示所显示的电话号码,并建议创建新的合作伙伴/潜在客户或更新现有合作伙伴/潜在客户。

创建或更新合作伙伴联系人

故障排除

如果您对模块有一些问题:

  • 使用命令行选项启动odoo-bin--log-level=debug:您将获得有关电话号码重新格式化过程和与Asterisk Manager界面的连接的有用消息。
  • 还要检查Asterisk端的日志:在Asterisk服务器上,运行:% asterisk -rvvvvvvvvvvvv
  • 如果Odoo服务器和Asterisk不通信,请使用tcpdumpwireshark等工具检查两台计算机之间的网络流量。运行例如:% tcpdump -n -i eth0 -A -s 0 port 5038
  • 对于“在来电时调用Odoo中的CallerID名称”功能,您可以通过在Asterisk控制台中运行此命令来获取有关AGI脚本执行的更多日志:asterisk*CLI> agi set debug on 要禁用它:asterisk*CLI> agi set debug off

具体请参考原文链接:https://akretion.com/en/open-source-contributions/odoo-asterisk-voip-connector

Odoo-Asterisk connector插件地址下载:https://www.odoo.com/apps/modules/12.0/asterisk_click2dial/

滚动至顶部