Askozia。 自动配置即插即用的工作原理

在开发Askozia PBX时,我们面临着自动设置电话并以自己的方式解决问题的任务。

自动配置即插即用 (PnP),许多制造商都支持此技术-Yealink,Snom,Fanvil。

自动电话设置的主要优点:

  • 便于初始设置 -无需转到每个设备的Web界面。 指示设备的MAC地址和自动调整服务器上的帐户的对应关系就足够了。
  • 简化支持 -如果您需要更改设备设置,它将变得更加容易。 我们再次控制服务器上的设置
  • 可以将配置简化为星形代码 “ * 911 * <SIP_ACC>”的集合-在某些情况下,此功能根本不可用。 并非每个上班族都能够配置IP电话,但是拨打数字组合是一项简单的任务。

让我们描述一下自动配置即插即用的工作原理。 在文章结尾,提供了一个小型PHP脚本的源代码的链接,该脚本实现了PnP服务器的功能。

个案研究


当向一个客户介绍电话时,我们遇到了一个有趣的案例。 主要问题是客户在另一个城市。 同时,要求之一是用电话打开包裹并将其插入网络后,电话应立即工作。

这个问题相对简单地解决了。 客户已为我们保留了许多IP地址。 我们在办公室安装了设备并将其包装在盒子中,并通过快递发送。

使用自动设备配置,任务将变得更加简单。

简化的PnP方案


工作开始时的电话机将广播SIP SUBSCRIBE请求发送到地址224.0.1.75多播IP。
阅读有关224.0.1.75的更多信息
224.0.1.75-这是SIP服务器“保留”的多播IP(用于多播)。
请参阅networksorcery.com/Enp/protocol/sip.htm
224.0.1.75 SIP,会话启动协议(所有服务器)。

作为响应,他希望收到带有配置说明的NOTIFY响应。

图片

订阅示例
2019/09/02 09:26:41.543856 172.16.32.148:5059 -> 224.0.1.75:5060 SUBSCRIBE sip:MAC0015657322ff@224.0.1.75 SIP/2.0 Via: SIP/2.0/UDP 172.16.32.148:5059;branch=z9hG4bK42032775 From: <sip:MAC0015657322ff@224.0.1.75>;tag=42032772 To: <sip:MAC0015657322ff@224.0.1.75> Call-ID: 42032772@172.16.32.148 CSeq: 1 SUBSCRIBE Contact: <sip:MAC0015657322ff@172.16.32.148:5059> Max-Forwards: 70 User-Agent: Yealink SIP-T21P 34.72.14.6 Expires: 0 Event: ua-profile;profile-type="device";vendor="Yealink";model="T21D";version="34.72.14.6" Accept: application/url Content-Length: 0 


最重要,最有趣的标题


  • 发件人 -设备的罂粟地址为0015657322ff
  • 事件 -全面描述设备,制造商,型号,固件版本
  • 联系人 -设备地址
  • 呼叫ID-从Yealink配置DECT设备时,此标头很有趣,它传输线路标识符(管序列号),定界符“ _

PnP服务器收到此类请求后,应做出响应

通知示例
 2019/09/02 09:26:41.550125 172.16.32.153:57593 -> 172.16.32.148:5059 NOTIFY sip:172.16.32.148:5059 SIP/2.0 Via: SIP/2.0/UDP 172.16.32.148:5059;branch=z9hG4bK42032775 Max-Forwards: 20 Contact: <sip:172.16.32.148:5059;transport=UDP;handler=dum> From: <sip:MAC0015657322ff@224.0.1.75>;tag=42032772 To: <sip:MAC0015657322ff@224.0.1.75> Call-ID: 42032772@172.16.32.148 CSeq: 3 NOTIFY Content-Type: application/url Subscription-State: terminated;reason=timeout Event: ua-profile;profile-type="device";vendor="MIKO";model="MikoServerPnP";version="1.8" Content-Length: 40 http://172.16.32.153:84/0015657322ff.cfg 


在NOTIFY消息中,最有价值的信息在消息的正文中。 通常,必须在正文中传递一个链接以获取配置文件:

 http://172.16.32.153:84/0015657322ff.cfg 

如果网络上正在运行多个PnP服务器,则第一个对设备做出响应的人将对其进行配置。

一旦收到通知,电话将尝试在指定的地址满足请求。

服务器请求和响应示例
 # curl -i http://172.16.32.153:84/0015657322ff.cfg HTTP/1.0 200 OK Content-type: text/plain Date: Mon, 02 Sep 2019 06:52:23 GMT Connection: close Accept-Ranges: bytes Last-Modified: Mon, 02 Sep 2019 06:25:02 GMT Content-length: 769 #!version:1.0.0.1 account.1.enable = 1 account.1.label = PnP (203) ... 


可以在github https://github.com/boffart/MikoServerPnP上获得服务器的示例实现。

为了使该PnP服务器正常工作,您必须:

  • PHP 7.1.9
  • PHP插座
  • BusyBox v1.26.2
  • 网络上必须允许广播请求

PnP服务器功能


  • 侦听发送到地址' 224.0.1.75:5060 '的请求
  • 启动时,它将启动Web服务器( busybox httpd
  • 允许您创建简化的电话配置
  • 允许您发送到Yealink NOTIFY重新启动

使用PnP服务器允许您使用“一次性链接”。


假设我们通过链接提供文件:

 http://172.16.32.153:84/0015657322ff.cfg 

通常指向文件的直接链接。 显然,这是不安全的。 了解电话的MAC地址和服务器地址后,您可以尝试使用登录名和密码进行配置。

使用PnP服务器时,可以为每个SUBSCRIBE请求提供唯一的链接:

 http://172.16.32.153:84/?mac=0015657322ff&hash=0a67f5290 

用于计算哈希的公式的示例:

 hash = md5(MAC + DATE + PID) 

PID是PnP服务器的进程ID。 只有root可以识别它。
选择这样的哈希实际上是不可能的。

如果通过无效链接提出上诉,那么我们将禁止该害虫。

重启Yealink NOTIFY意味着未经授权


是的,是的, 未经授权
由于这种可能性,我无法从固件的当前版本关闭设备。

只需运行命令

 php -f MikoServerPnP.php socket_client_notify <IP_PBX> <PORT_SIP_PBX> <IP_PHONE> <PORT_PHONE> 

手机将重新启动。 通过将这样的命令挂在cron中,您可以达到可怕的效果。 当然,如果我们知道电话的IP地址和SIP端口,则可以这样做。

发送NOTIFY的示例PHP函数
  public static function socket_client_notify($ip_pbx, $port_pbx, $ip_phone, $port_phone):void { $phone_user = 'autoprovision_user'; $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $msg = "NOTIFY sip:{$phone_user}@{$ip_phone}:{$port_phone};ob SIP/2.0\r\n". "Via: SIP/2.0/UDP {$ip_pbx}:{$port_pbx};branch=z9hG4bK12fd4e5c;rport\r\n". "Max-Forwards: 70\r\n". "From: \"asterisk\" <sip:asterisk@{$ip_pbx}>;tag=as54cd2be9\r\n". "To: <sip:{$phone_user}@{$ip_phone}:{$port_phone};ob>\r\n". "Contact: <sip:asterisk@{$ip_pbx}:{$port_pbx}>\r\n". "Call-ID: 4afab6ce2bff0be11a4af41064340242@{$ip_pbx}:{$port_pbx}\r\n". "CSeq: 102 NOTIFY\r\n". "User-Agent: mikopbx\r\n". "Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE\r\n". "Supported: replaces, timer\r\n". "Subscription-State: terminated\r\n". "Event: check-sync;reboot=true\r\n". "Content-Length: 0\r\n\n"; $len = strlen($msg); socket_sendto($sock, $msg, $len, 0, $ip_phone, $port_phone); socket_close($sock); } 


PnP服务器配置


位于settings / settings.json中

 { "url": "http://<pbx_host>:<http_port>/", "http_port": 84, "pbx_host": "172.16.32.153", "pbx_sip_port": "5060", "vm_extension": "*001", "feature_transfer": "**" } 

MAC白名单


可以在settings / mac_white.conf中描述。 分隔符-换行。

MAC黑名单


可以在settings / mac_black.conf中进行描述。 分隔符-换行。

手机配置文件


必须放置在configs目录中。
使用PnP服务器,您可以为Yeakink和Snom创建最简单的配置:

 php -f MikoServerPnP.php mk_config SIP_ACCAUNT SECRET MAC 

有用的材料


Source: https://habr.com/ru/post/zh-CN471522/


All Articles