目标
我正在尝试拨打一个电话号码。我希望能够从树莓派拨打电话,也可以拨打我的 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 文档,但我找不到任何我遗漏的东西。有没有人了解如何拨打电话号码并允许来电?这已经是扎实的工作了好几天了。