webrtc-to-freeswitch:一个浏览器软电话的架构、流程与协议全解

Posted on 一 14 9月 2026 in Tech • Tagged with tech, webrtc, sip, freeswitch, vue, fastapi

上一篇讲清了 SIP.js 怎么打进 FreeSWITCH,这次把它做成了一个完整项目——webrtc-to-freeswitch。这篇从整体架构、信令与媒体的完整流程、协议分层三个层面把它讲透:它是什么、有什么用、怎么用;浏览器到 FreeSWITCH 之间一次通话到底发生了什么;以及最容易被忽略、却最容易踩坑的 FreeSWITCH 侧配置——WSS binding、candidate ACL、ext-rtp-ip。


Continue reading

用 SIP.js 从浏览器打电话到 FreeSWITCH

Posted on 五 11 9月 2026 in Tech • Tagged with tech, webrtc, sip, freeswitch, javascript

SIP.js 官方 demo 一键就能打通电话,但那是因为对端是一台匿名公共服务器。想让浏览器真正打进自己的 FreeSWITCH,绕不开三件 demo 帮你藏起来的事:注册、鉴权、还有一座 WSS 到 SIP 的桥。这篇拆掉 demo-1,把这三件事补齐。


Continue reading

给 FreeSWITCH 写测试:从单元测试到集成测试,用一个真 bug 串起来

Posted on 四 10 9月 2026 in Tech • Tagged with tech, freeswitch, testing, unit-test, integration-test, c, pcre2, sipp

给 FreeSWITCH 写测试有两条路:一条是自带的 FST 框架,起一个真 core、真 session,在进程内测 switch_* 函数;另一条是拉起整个服务、用 SIPp 打真呼叫、看 ESL 事件的集成测试。本文用我修的一个 mod_dialplan_xml use-after-free bug(PR #3151)串起前者,再讲清后者什么时候非用不可、怎么搭、坑在哪,最后给一张"这个 bug 该写哪种测试"的决策表和检查清单。


Continue reading

C 语言的动态加载、依赖注入与服务注册:把 FreeSWITCH 的模块机制拆到底

Posted on 一 07 9月 2026 in Tech • Tagged with tech, C, freeswitch, dlopen, plugin, dependency-injection, service-registry, abi

C 没有反射,凭什么能用字符串 "answer" 找到一个函数?把 FreeSWITCH 的模块系统从 dlopen 拆到函数指针派发,四层结构讲透:动态加载、依赖注入、服务注册、运行时查找。所有结论都在 FreeSWITCH 1.11.3-dev 上实测过,包括亲手写一个 50 行模块热加载进跑着的进程,以及三个实测出来的坑。


Continue reading

APR 入门:一个 30 年前的答案,为什么还在你的代码库里

Posted on 日 06 9月 2026 in Tech • Tagged with tech, C, APR, apache, freeswitch, memory-pool, portability

APR(Apache Portable Runtime)是 C 语言事实上的"缺失标准库",它的核心是内存池——不追踪每个对象的释放,而是按生命周期批量丢弃。这篇讲清 APR 的设计理念、常用模块、快速上手路径、以及 FreeSWITCH 为什么要把它 fork 出来改名。所有代码在 APR 1.7.6 上实测。


Continue reading