-
Notifications
You must be signed in to change notification settings - Fork 692
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
VOIP 例程,sip 多次注册过程,有没有接口或者方法固定端口号? (AUD-5852) #1314
Comments
Register每次注册使用随机的port是出于安全考虑,在RTP连接的过程中重新register对RTP没啥影响,不过register之后服务器还用之前的port发送BYE应该是server有问题,用了缓存的port,我一会改一个版本让在RTP连接的过程中如果发送过期重新Register的动作就用之前的port,你再试试看有没有改善。 |
试一下attach的库看看, 库本身支持过期之后自动register的之前代码有bug应该导致RTP连接之后不能register了。 |
好的,非常感谢您及时回复。我这边先测试下 |
您好,请问一下这边实现的是在esp32 上面吗,我这边的硬件是esp32s3(ESP32-S3-Korvo-2),idf 是4.4.7 adf 2.7。现在覆盖文件到C:\Espressif\frameworks\esp-adf-v2.7\components\esp-adf-libs\esp_media_protocols\lib\esp32s3,编译报错。 |
或者您告知你这边的编译环境版本是那个版本。我试试 |
你可以更新ADF到最新试试,IDF不动 |
另外还有一个问题,如果在有电话打进来INCOMING,还没有建立通话RTP连接时,在这个时间点重新register会使用新的端口号,这个时候是不能正常接听的。 抓包文件 |
目前我的改动是只有RTP 建立成功的时候,过期重新register才会复用port 否则用random的port。 |
RTP连接,通话中重新register是沿用了老的port |
把expire改小用我提供的库抓个log我看下呢,我一会编译一个inviting之后bye之前重新register复用port的库你再确认下看。 |
现在expire的时间是300s,大概150s会重新register,需要改到多少? |
需要在 发送或接收 到inviting之后,bye 或者 canceling 之前 都沿用之前的port |
附件是expire改为30秒的日志 81089 收到invite报文 I (81266) SIP: 开始振铃 I (84061) SIP: 重新注册 I (84484) MP3_DECODER: Closed 振铃音停止 |
附件是expire改为120秒的日志 I (1119059) SIP: 收的invite报文 I (1119238) SIP: W (1157378) SIP: Expire on state 16 I (1158585) SIP: W (1158934) SIP: Reuse last sock cleared................... I (1158992) MP3_DECODER: Closed |
主叫外呼通话过程中,重新register的port会变化 port从49389,变化为 49391 W (77868) SIP: Expire on state 96 W (144855) SIP: Expire on state 2 |
Update lib. 我本地测试了下本地挂断是OK的,可以再确认下看。 |
感谢! 测试1的log I (5664366) SIP: I (5724078) SIP: I (5724128) SIP_SERVICE: ESP_RTC_EVENT_ERROR 测试2的log I (1856702) SIP: I (1921004) SIP: I (1921070) SIP: [1970-01-01/00:32:00]<<====================== |
上面提到的两个event没有做特殊处理,所以期望用户可以当作error然后调用bye挂断,我做了一个临时的版本加入上面两个的处理,然后回ACK你可以测试下看效果 |
刚刚测试了 在收到408报文没有回复ACK报文 以下是log I (221469) SIP: [1970-01-01/00:03:20]<<=====READ 0393 bytes== SIP/2.0 408 Request Timeout I (221503) SIP: [1970-01-01/00:03:20]<<====================== 以下是收到404 报文的log SIP/2.0 404 Not Found I (58926) SIP: [1970-01-01/00:00:28]<<====================== I (58972) AFE_VC: afe task destroy finished I (58980) AFE_VC: exit function: afe_destory I (58983) AV_STREAM: _audio_dec task stoped ACK sip:[email protected]:5070 SIP/2.0 I (59055) SIP: [1970-01-01/00:00:29]=======================>> |
详细的log发我看下,目前代码已经合并处理了。只是W (221519) SIP: Not current session method! 说明seqno不匹配,要看下log看是否server回的seqno是否不匹配 |
I (1242259) SIP: |
这个你调的register的expire时间过短导致的,容易在invite的中间触发,可以调大试试看。我再Enhance下这部分的逻辑。 |
我们设置这个expire时间断时间,是为了网络的keepalive,是有些IP PBX不回复 options报文。 |
问题原因基本上找到了,只要在呼叫振铃过程中,重新register就会出现异常,那逻辑上在呼叫过程中,只发options包来做keepalive,不发register报文。 |
目前的逻辑也是这样的,option参数用keepalive的设定来配置, register是在expire时间达到一半的时候触发。register expire改大,keepalive设定上就可以解决你现在的问题应该 |
在振铃过程中还会有发送register报文的可能性,改大expire的值只会降低概率 |
是的,正常配置register timeout为1个小时碰到的概率应该会小很多。可以用附件的lib再确认下看是否OK了。 |
这个版本已经可以正常回复ACK报文了,我们再多测试一下,有问题再请教,多谢! |
目前有小概率出现设备主呼后,对方接听,设备端收不到 ESP_RTC_EVENT_AUDIO_SESSION_BEGIN 状态。 E (3104484) VoIP_EXAMPLE: [ * ] [PLAY] input key event (设备拨号) SIP/2.0 180 Ringing I (3108663) SIP: [2024-11-16/16:57:20]<<====================== SIP/2.0 183 Session Progress I (3134728) AFE_VC: afe_se_task quit (未正常收到AFE_VC: afe interface for voice communication) I (3134747) SIP_SERVICE: ESP_RTC_EVENT_HANGUP |
这是正常的主呼,对方接听,设备收到的状态; SIP/2.0 180 Ringing I (460805) SIP: [2024-11-16/17:15:18]<<====================== I (460820) SIP: Remote RTP addr=220.196.190.61 I (463980) SIP: [2024-11-16/17:15:20]<<====================== I (464069) SIP_SERVICE: ESP_RTC_EVENT_HANGUP |
帮忙看看底层库文件是基于什么逻辑产生 ESP_RTC_EVENT_AUDIO_SESSION_BEGIN 这个event |
1 similar comment
帮忙看看底层库文件是基于什么逻辑产生 ESP_RTC_EVENT_AUDIO_SESSION_BEGIN 这个event |
Log可以提供全一点的,我看前面register fail了导致的,这里没有stop RTP 的操作导致后续重启起来跳过了。你用下面修改的版本再确认下看: |
目前还是会出现通话无法挂断的现象。 |
上传的日志重现了此现象。设备第一次主呼出去,等待超时,对方不接听;然后设备再主呼出去,对方接听,然后设备按挂断键,RTP 无法正常挂断; E (192486) VoIP_EXAMPLE: [ * ] [PLAY] input key event (设备第一次主呼出去) I (260145) SIP_SERVICE: ESP_RTC_EVENT_AUDIO_SESSION_END (不接听,等待超时) E (260147) VoIP_EXAMPLE: [ * ] [PLAY] input key event (设备第二次主呼出去) I (263320) AFE_VC: afe interface for voice communication ( 对方接听,rtp过程中) E (267216) VoIP_EXAMPLE: [ * ] [PLAY] input key eventv (设备按下挂机键...但是后面没有正常结束rtp) 这是不是在第一次等待超时后,太快按下拨打键造成sip通话过程的异常 |
目前从log看,协议层已经没啥问题,这个比较像是应用层的问题。我再细看下 |
[ √] I have read the documentation Espressif Audio Development Guide and the issue is not addressed there.
[ √] I have updated my ADF and IDF branch (master or release) to the latest version and checked that the issue is present there.
[ √] I have searched the issue tracker for a similar issue and not found a similar issue.
Environment
Audio development kit: ESP32-S3-Korvo-2
Audio kit version (ESP32-S3-Korvo-2): v3
[Required] Module or chip used: ESP32-S3-WROOM-1
[Required] IDF version v4.47
[Required] ADF version v2.6-183-gce64fea5
Build system: [idf.py]
[Required] Running log: All logs from power-on to problem recurrence
Operating system: [Windows]
(Windows only) Environment type: [ESP Command Prompt]
Using an IDE?: vscode
Power supply: USB
Problem Description
sip在运行过程中,由于网络波动以及配置的注册保护时长,存在多次注册的情况,目前固件每次注册的使用的端口号都是随机的,这样造成SIP 服务器对上一次端口的连接清理掉(如果此时在通话过程中,服务端无法获知这条旧端口链接通话的状态),通话会有问题。
The text was updated successfully, but these errors were encountered: