1

目标

我正在尝试拨打一个电话号码。我希望能够从树莓派拨打电话,也可以拨打我的 voip.ms 电话号码,并能够接听或自动接听并播放一些通用的 .wav 文件。

我目前对事物的理解

这也许应该标题为“我目前对事物的误解”。我是 sip 和 pjsip 的新手,我想我一定错过了我不理解的过程的某些部分。我的印象是,如果我在 voip.ms 上注册,当我拨打电话时,它会路由到 voip.ms,他们会查找号码/地址,然后回复我将开始的地址与之交流。

到目前为止我所做的

编译

据我所知,我已经在 Raspberry Pi 3B+ 上正确编译了 Pjsip。我可以在我的 c++ 应用程序中包含 pjsua2.hpp。我大致遵循了本教程

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

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

成功注册 voip.ms

我有一个 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 拨打我的个人手机(我假设使用注册的 voip.ms 电话号码),然后从我的个人手机拨打我的 pi。在呼叫时,我通常会遇到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>

以下任何一项在哪里:

  • 啜:
  • 啜:
  • sip:thetestcall@sip2sip.info
  • sip:thetestcall@iptel.org sip:201@ideasip.com

并且电话号码的格式如下:3035551234,尽管我尝试在前面加上 a1和 a+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>

以下任何一项在哪里:

  • 啜:
  • 啜:
  • 小口:abcd1234

可能的成功

我在调用时得到了看起来很成功的东西:

  • 啜饮:**12340@ideasip.com

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

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,然后尝试从我的个人手机拨打我的 voip.ms 电话号码时,通话失败,并在我的 iPhone 上显示一条消息,显示User Busy。这让我觉得我在注册时搞砸了,或者我错过了一些组件,比如订阅或与该 voip.ms 帐户的链接。

最后的想法

我不确定我在这里缺少什么。我已经阅读了大量的 pjsip 和 pjsua 文档,但我找不到任何我遗漏的东西。有没有人了解如何拨打电话号码并允许来电?这已经是扎实的工作了好几天了。

4

1 回答 1

0

所以我想出了我的问题的答案。下面是瘦身:

VoIP.ms 注册

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

为了解决这个问题,我在 voip.ms 上将 DiD 号码与我的子帐户相关联,然后转到我的子帐户信息并将 callerId 号码设置为我的 DiD 号码,尽管我认为您可以通过 pjsip 覆盖此值。

出站 sip 呼叫

其次,拨打电话号码,呼出电话应遵循以下格式:

sip:<phoneNumber>@<endpoint>

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

sip:5551234567@newyork.voip.ms

于 2019-03-22T22:44:59.167 回答