Pjsip/pjsua 超时错误并解决从 Raspberry Pi 向 voip.ms 注册后调用 phone 号码的错误

Pjsip/pjsua timeout errors and resolve errors calling phone numbers after registering with voip.ms from Raspberry Pi

目标

我正在尝试拨打电话 phone 号码。我希望能够从 raspberry pi 拨打电话,也能拨打我的 voip.ms phone 号码,并且能够接听或自动接听并播放一些通用的.wav 文件。

我目前对事物的理解

这也许应该命名为 "My current misunderstanding of things"。我是 sip 和 pjsip 的新手,我想我一定是遗漏了一些我不明白的过程。我的印象是,如果我在 voip.ms 注册,当我打电话时,它会路由到 voip.ms,他们会在 number/address 上进行查找,然后用一个然后我将开始与之通信的地址。

到目前为止我做了什么

已编译

据我所知,我已经在 Raspberry Pi 3B+ 上正确编译了 Pjsip。我可以在我的 C++ 应用程序中包含 pjsua2.hpp。我大致关注了 this tutorial

使用 pjsua 二进制测试编译 && demo.cpp

我 运行 遇到了相同的问题 运行 修改后的 pjsua2_demo.cpp 和包含在 pjsip 构建中的二进制文件。为了简单起见,我将询问位于(对我而言)位于 <project-path>/pjproject-2.8/pjsip-apps/bin/pjsua-armv7l-unknown-linux-gnueabihf.

的二进制文件

注册成功voip.ms

我有一个帐户和 phone 号码 Voip.ms,可以通过执行以下脚本在 voip.ms 注册:

call_and_auto_answer.sh

./pjsua2-cpp/pjproject-2.8/pjsip-apps/bin/pjsua-armv7l-unknown-linux-gnueabihf \
    --play-file ~/CantinaBand60.wav \
    --local-port=5060 \
    --auto-answer 200 \
    --auto-play \
    --auto-loop \
    --max-calls 5 \
    --config-file ./sip.cfg

配置如下:

sip.cfg

#
# Logging options:
#
--log-level 5
--app-log-level 4

#
# Account 0:
#
--id sip:<my-subaccount-username>@sip.voip.ms
--registrar sip:<server-location>.voip.ms
--reg-timeout 300
--realm *
--username <my-subaccount-username>
--password <my-subaccount-password>
--use-timer 1

#
# Network settings:
#
--local-port 5060

#
# Media settings:
#
--srtp-keying 0
--auto-play
--auto-loop
--play-file /home/pi/CantinaBand60.wav
--snd-auto-close 1
#using default --clock-rate 16000
#using default --quality 8
#using default --ec-tail 200
#using default --ilbc-mode 30
--rtp-port 4000

#
# User agent:
#
--auto-answer 200
--max-calls 5

#
# SIP extensions:
#
--use-timer 1

当我进入 cli 时,我看到我的帐户列表:

Account list:
  [ 0] <sip:192.168.1.49:5060>: does not register
       Online status: Online
  [ 1] <sip:192.168.1.49:5060;transport=TCP>: does not register
       Online status: Online
 *[ 2] sip:<my-subaccount-username>@sip.voip.ms: 200/OK (expires=285)
       Online status: Online
Buddy list:
 -none-

Voip.ms 表明我已经在他们的网站上注册了。

问题

我正在尝试通过我的 pi 拨打我的个人手机 phone(我假设使用注册的 voip.ms phone 号码),并通过我的个人手机拨打我的 pi phone。在呼唤时,我通常会收到 408 Request Timeout 错误或 502 gethostbyname 错误。

不同的目的地,不同的错误

根据我从 pi 调用的目的地,大多数时候我会遇到两种不同的错误之一

超时错误

我收到一个错误提示,

18:19:19.757    pjsua_app.c  ....Call 4 is DISCONNECTED [reason=408 (Request Timeout)]
18:19:19.757 pjsua_app_comm  ....
  [DISCONNCTD] To: <destination-sip-address>

以下任何一项在哪里:

和 phone 数字的格式如下:3035551234,尽管我尝试在前面加上 1+1 只是为了检查。

查找错误

我收到一个错误提示,

19:09:45.435  sip_resolve.c  ....Failed to resolve '<destination-sip-address>'. Err=70018 (gethostbyname() has returned error (PJ_ERESOLVE))
19:09:45.435   tsx0x18520dc  ....Failed to send Request msg INVITE/cseq=10722 (tdta0x185012c)! err=70018 (gethostbyname() has returned error (PJ_ERESOLVE))
19:09:45.435    pjsua_app.c  .......Call 4 is DISCONNECTED [reason=502 (gethostbyname() has returned error (PJ_ERESOLVE))]
19:09:45.435 pjsua_app_comm  .......
  [DISCONNCTD] To: sip:<destination-sip-address>

以下任何一项在哪里:

可能的成功

我在调用时看起来很成功:

它确认呼叫并有一堆消息,值得注意的包括:

19:16:17.550   pjsua_core.c  ....TX 1300 bytes Request msg INVITE/cseq=13899 (tdta0x15c263c) to UDP 208.97.25.11:5060:
...
19:16:17.551    pjsua_app.c  .......Call 4 state changed to CALLING
...
>>> 19:16:17.606   pjsua_core.c  .RX 575 bytes Response msg 100/INVITE/cseq=13899 (rdata0x6d7008a4) from UDP 208.97.25.11:5060:
...
19:16:17.609   pjsua_core.c  .RX 946 bytes Response msg 200/INVITE/cseq=13899 (rdata0x6d7008a4) from UDP 208.97.25.11:5060:
...
19:16:17.609    pjsua_app.c  .....Call 4 state changed to CONNECTING
...
19:16:17.610    pjsua_app.c  .....Call 4 state changed to CONFIRMED
...
19:16:17.676   pjsua_core.c  .RX 594 bytes Response msg 100/INVITE/cseq=13900 (rdata0x6d7008a4) from UDP 208.97.25.11:5060:
...
19:16:17.678   conference.c  ......Port 5 (sip:**12340@ideasip.com) transmitting to port 5 (sip:**12340@ideasip.com)
...
19:16:17.678   conference.c  ......Port 1 (/home/pi/CantinaBand60.wav) transmitting to port 5 (sip:**12340@ideasip.com)
...
19:16:36.931    pjsua_app.c  ......Call 4 is DISCONNECTED [reason=200 (Normal call clearing)]

同一网络

此外,如果我在同一网络上设置第二个 pjsip 客户端,我可以从 pi1 调用它并在 pi2 上接听电话。

来电

当我注册 voip.ms,然后尝试从我的个人手机 phone 拨打我的 voip.ms phone 号码时,通话失败并在我的 iPhone 即 User Busy。这让我觉得我在注册时搞砸了,或者我错过了一些组件,比如订阅或 link 与那个 voip.ms 帐户。

最后的想法

我不确定我在这里遗漏了什么。我已经阅读了大量的 pjsip 和 pjsua 文档,但我找不到任何我遗漏的东西。有人知道如何拨打 phone 号码并允许接听电话吗?这几天辛苦了。

所以我找到了问题的答案。这是瘦子:

Voip.ms 注册

我在 voip.ms 上的注册配置不正确。一位同事向我提供了凭据,但在进一步检查 sip 端点后,我发现为该帐户购买的 DiD 号码与我的同事为我创建的子帐户没有关联。因此,根据收件人的 phone 运营商,我收到了不同的错误。此外,当我测试呼入电话并收到错误 User Busy 时,这是因为我注册的帐户未与 phone 号码相关联。

为了解决这个问题,在 voip.ms 我将 DiD 号码关联到我的子账户,然后转到我的子账户信息并将 callerId 号码设置为我的 DiD 号码,不过我认为你可以覆盖这个值通过 pjsip.

出站 sip 呼叫

其次,要拨打phone号码,外拨电话应遵循以下格式:

sip:<phoneNumber>@<endpoint>

所以对我来说,这看起来非常像:

sip:5551234567@newyork.voip.ms