当前位置: 首页 > article >正文

【原创首发】开源基于AT32 SIP/VOIP电话

前言

本次为了反馈各位粉丝的关注,特此分享 AT32_VOIP 工程,此功能其实跟我之前发过的《STM32F429的VOIP功能》是一样的,只是用了AT32F437。

其实那个工程是一个比较Demo中的Demo,很多功能和硬件依赖性太大了。后面项目中发现AT32F437单芯片就能完成这个功能,就选择了AT32F437来实现这个功能。

有很多朋友会问,为什么不用ESP32呢?当然我们实际上也用的ESP32S3,因为更方便。但是我发现很多关注我的朋友,更喜欢用MCU来玩这个网络会议电话。所以算是宠粉吧。

这次分享会从0到编译,到运行都说清楚。

喂到嘴里的鸡汤。

让我们开始吧 😄.

本次开源地址:

https://gitee.com/seliverwang/at32_voip.git


硬件

我使用的一块AT32F437ZMT7的开发板,它有4MB的Flash,512KB的RAM.

参数描述
CPUAT32F437ZITx
主频288MHz
Flash4MB
RAM512KB
音频接口I2S2
音频配置I2C1
LOGUART1
CODECWM8978
以太网RMII
引脚分配
  • 音频接口使用的I2S2.
引脚描述
PB12I2S_WS / I2S_FS
PC6I2S_MCLK
PB13I2S_CK / I2S_SCLK / I2S_BCK
PC2I2S_EXT_SD / I2S_SIN
PC3I2S_SD / I2S_SOUT
  • WM8978配置使用 I2C1.
引脚描述
PB6I2C_SCL
PB7I2C_SDA
  • LOG输出使用UART1.
引脚描述
PA9UART_TX
PA10UART_RX
  • 以太网配置使用RMII.
引脚描述
PA1RMII_REF_CLK
PA2RMII_MDIO
PC1RMII_MDC
PD8RMII_CRS_DV
PD9RMII_RXD0
PD10RMII_RXD1
PG11RMII_TXEN
PG13RMII_TXD0
PG14RMII_TXD1
附加

由于我之前功能里面有用SPI NOR FLASH 并且和USB,所以我把它也加上了。

引脚描述
PF6QSPI1_D3
PF7QSPI1_D2
PF8QSPI1_D0
PF9QSPI1_D1
PF10QSPI1_CLK
PG6QSPI1_CS

备注: 硬件就是用的AT32_START_F437 这个板子,杜邦线跳了个WM8978而已。


编译工程

准备前提

下载 RT-Thread Studio 开发工具,并安装。

https://www.rt-thread.org/download.html#download-rt-thread-studio


导入工程

打开 RT-Thread Studio, 导入 Clone 好的工程.


安装工具链.

导入完成之后,需要选择编译工具链, 如果你是第一次打开会提示让你安装工具链, 我们选择 10.2.1 版本的工具链(别问为什么,我用的这个版本而已 😄 ):


编译前提

恭喜你,已经成功导入工程了,接下来就是编译了。正常来说我的这个仓库很多都本地化了,不需要在安装其他的库,只要点击编译应该都是:编译不过的,因为还差了一个步骤。可以看到,由于RT-Thread的 Pthread和 libc 库冲突了,所以编译不过。

我们在需要在 修改安装路径下的这个文件内容,这个路径是RT-Thread Studio安装路径下的RT-ThreadStudio\repo\Extract\ToolChain_Support_Packages\ARM\GNU_Tools_for_ARM_Embedded_Processors\10.2.1\arm-none-eabi\include\sys\types.h 文件。

请将原来第 223行 添加一个跟我一模一样的修改。

编译完成

编译完成之后,我们可以看到编译成功了。

那么有同学会问了,你这不都改了SDK了吗,不合格啊!
我哭死,我也不想改SDK,但是目前只想到了这个办法。有什么好办法,欢迎在Gitee上提交,或者留言。


软件介绍

功能介绍

源代码目录结构如下图所示:

名称描述
main.c主要为一些测试 音频流回环的功能
pjsip.c最主要的SIP实现协议栈
filefs.c配合USB做了一些录音文件存储数据读取功能。
wav.h此文件为上位机生成了一个人声测试数组,测试Codec是否能够正常播放声音。
debug.h测试Codec时序是否是20ms。

测试软件
准备工作

如果你想很快的测试软件,你可以使用AT32F437按照最开始的硬件接线图 连接好音频接口、CODEC、LOG保留,然后把 filefs.c 的执行函数注释掉,避免使用文件系统。

下载SIP 服务器工具和客户端工具

服务器

下载 miniSIPServer 安装完成之后打开软件,点击分机,添加2个分机,一个用于板子,一个用于手机。

客户端

  • 如果你没有另一台电脑,可以在安卓手机上安装 MizuDroid 软件, 按照一下步骤添加,如果没有注册成功,需要检查是否在同一网段,或者 服务器电脑开启了防火墙。

那又有朋友会说,我有2台电脑,该怎么办啊?
那你就下 MicroSIP ,安装之后一样只需要配置上面的参数就好了。


配置板子的账号信息

板子配置的参数,主要有:

  1. SIP服务器的IP地址、端口号、用户名、密码。

  1. SIP服务器的 认证域、认证方案,不过这些我用的是通配的,如果你的服务器有单独的配置,需要跟服务器配合着修改。

修改完成以上信息之后,在硬件接好的情况下,下载固件

别问我为什么不是截图,忘了截图了。


演示视频

视频地址:

https://www.bilibili.com/video/BV1wbXsY1EsX/


后话

非常感谢大家的关注,让我觉得我的分享是有意义的,够得到这么多人的认可。以后还会分享一些更高级的一些东西,😄。

之前好像有粉丝要求添加 3A算法,不过由于没时间,就没有加

有兴趣的同学,可以看看软件,直接将一些3A的宏打开,然后看看能不能正常运行,如果能那么就能跑,因为288Mhz主频还是应该可以跑起来的。

相关文章:

【原创首发】开源基于AT32 SIP/VOIP电话

前言 本次为了反馈各位粉丝的关注,特此分享 AT32_VOIP 工程,此功能其实跟我之前发过的《STM32F429的VOIP功能》是一样的,只是用了AT32F437。 其实那个工程是一个比较Demo中的Demo,很多功能和硬件依赖性太大了。后面项目中发现AT…...

本地部署 LangManus

本地部署 LangManus 0. 引言1. 部署 LangManus2. 部署 LangManus Web UI 0. 引言 LangManus 是一个社区驱动的 AI 自动化框架,它建立在开源社区的卓越工作基础之上。我们的目标是将语言模型与专业工具(如网络搜索、爬虫和 Python 代码执行)相…...

一篇文章入门Python Flask框架前后端数据库开发实践(pycharm在anaconda环境下)

Python Flask 是一个轻量级的 Web 应用框架,也被称为微框架。它以简洁、灵活和易于上手的特点而受到开发者的喜爱。 核心特点 轻量级:Flask 核心代码简洁,仅包含 Web 开发的基本功能,不强制使用特定的数据库、模板引擎等&#xf…...

SpringBoot分布式定时任务实战:告别重复执行的烦恼

场景再现:你刚部署完基于SpringBoot的集群服务,凌晨3点突然收到监控告警——优惠券发放量超出预算两倍!检查日志发现,两个节点同时执行了定时任务。这种分布式环境下的定时任务难题,该如何彻底解决? 本文将…...

AI+金融 应用 使用DeepSeek、Qwen等大模型输入自然语言,得到通达信等行情软件公式代码,导入后使用

AI金融 应用 使用DeepSeek、Qwen等大模型输入自然语言,得到通达信等行情软件公式代码,导入后使用。不会编程,也能行情软件中实现个性化条件选股,个性化技术指标。 AIbxm低估值趋势选股策略,参考提示词: 编…...

C++20 中的同步输出流:`std::basic_osyncstream` 深入解析与应用实践

文章目录 一、std::basic_osyncstream 的背景与动机二、std::basic_osyncstream 的基本原理三、std::basic_osyncstream 的使用方法(一)基本用法(二)多线程环境下的使用(三)与文件流的结合 四、std::basic_…...

Android 关于compose的一些坑和理解

** 1.如何在 WindowManager.addView 中使用 Jetpack Compose** 一、引出问题 Android 开发中,很常见的一个场景,通过 WindowManager.addView() 添加一个 View 到屏幕上。Android 最新的视图框架 Jetpack Compose,如何应用进来。这个被添加的…...

LeetCode 30 —— 30.串联所有单词的子串

题目: 给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。 注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。 示例 1&#xff…...

go语言中的strings库

strings库 func EqualFold func EqualFold(s, t string) bool判断两个utf-8编码字符串(将unicode大写、小写、标题三种格式字符视为相同)是否相同。 func main() {fmt.Println(strings.EqualFold("hello", "hello")) //truefmt.…...

【嵌入式硬件】三款DCDC调试笔记

关于开关电源芯片,重点关注输入电源范围、输出电流、最低压降。 1.MP9943: 以MP9943为例,输入电压范围4-36V,输出最大电流3A,最低压降为0.3V 调整FB使正常输出为5.06V 给定6V空载、5V空载、5V带2A负载的情况: 6V带2A…...

Cannot find module @rollup/rollup-win32-x64-msvc

方法1 在package.json中添加postinstall: "scripts": {"postinstall": "node -e \"const { platform } process; if (platform win32) { require(child_process).execSync(npm install rollup/rollup-win32-x64-msvc, { stdio: inherit });…...

Linux中修改文件的权限用什么命令?

一、核心语法 chmod [选项] [权限模式] 文件名二、权限模式详解 1. 数字模式(推荐使用) 通过rwx权限对应的数值组合: r(读)→ 4w(写)→ 2x(执行)→ 1无权限 → 0 组合规…...

【FPGA开发】FPGA点亮LED灯(增加按键暂停恢复/复位操作)

目录 一、VScode下载安装 1.1 官网下载 1.2 安装插件 二、LED流水灯点亮 2.1 任务说明 2.2 新建项目 2.3 创建Verilog文件添加至顶层实体 2.4 引脚分配 2.5 选择烧录器 2.6 添加烧录文件&下载 2.7 烧录结果 三、增加按键操作 3.1 按键暂停和恢复功能&…...

companion object和object 从kotlin转java分析

说明 companion object 中 companion类中的方法是普通的方法 在外部类中生成静态变量,静态companion 对象 object MyClass2 中 类中方法是普通方法 在MyClass2中生成静态变量,静态MyClass2对象, 一 companion object 使用 kotlin转java pa…...

Spring MVC 执行流程:一个请求在 Spring MVC 中是如何执行的?

当用户发送一个 HTTP 向 Spring MVC 应用,该请求在 Spring MVC 的执行流程如下: 当用户向 Spring MVC 发起一个 HTTP 请求,该请求会被 Dispatcher Servlet(前端控制器)拦截;DispatcherServlet 调用 Handler…...

三主热备架构

1.要求 角色主机名软件IP地址用户client192.168.72.90keepalivedvip192.168.72.100masterserverAkeepalived, nginx192.168.72.30backupserverBkeepalived, nginx192.168.72.31backupserverCkeepalived, nginx192.168.72.32webtomcat1tomcat192.168.72.41webtomcat2tomcat192.1…...

HTML 表单处理进阶:验证与提交机制的学习心得与进度(二)

步步为营:表单提交机制全面解析 提交方式详解 GET 与 POST 对比 在 HTML 表单提交中,GET 和 POST 是最为常用的两种提交方式,它们在诸多方面存在显著差异。 安全性:GET 方式将表单数据附加在 URL 的查询字符串中,数…...

JavaScript | 爬虫逆向 | 语法基础| 01

一、摘要 实践是最好的导师 二、环境配置 在开始之前,需要确保你的计算机上已经安装了 Node.js。Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,它允许你在服务器端运行 JavaScript 代码。 1. 下载 安装地址:https://nodejs.org…...

python解决多个矢量点图层合并为一个点图层

1、解决矢量点图层的合并 2、解决多个点图层分别合并为不同图层(一个文件夹下所有点图层合并为一个图层,以下代码为两个文件夹,分别合并为两个总的图层) import geopandas as gpd import os import pandas as pddef merge_shapef…...

VL开源模型实现文本生成图片

一、 基础知识 根据描述生成图片的视觉-语言模型(Vision-Language Models, VL 模型)是近年来多模态生成领域的热点研究方向。这些模型能够根据自然语言描述生成高质量的图像,广泛应用于艺术创作、设计辅助、虚拟场景构建等领域。 1 根据描述…...

字节跳动实习生主导开发强化学习算法,助力大语言模型性能突破

目录 禹棋赢的背景与成就 主要成就 DAPO算法的技术细节 算法优势 禹棋赢的研究历程 关键时间节点 字节跳动的“Top Seed人才计划” 计划特点 小编总结 在大模型时代,经验不再是唯一的衡量标准,好奇心、执行力和对新技术的敏锐洞察力成为推动技术…...

九、JavaScript作用域、预解析

一、JavaScript作用域 1.JavaScript作用域 ①代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突 ②js的作用域(es6)之前:全局作用域 局部作用域 ③全局作用域:整…...

前后端+数据库的项目实战:hbu迎新网-较复杂(下)javaweb

目录 十一、实现对内容的富文本编辑(换行、图片颜色等等样式) (1)下载富文本编辑器,引入资源 (2)将原项目的内容部分替换为富文本编辑器 1、替换添加页面 2、替换修改页面(和添…...

Java-模块二-2

整数类型 byte:在 Java 中占用8位(1字节),因此它的取值范围是从 -128 到 127。这是最小的整数类型,适合用于节省空间的情况。 short:这种类型的大小是16位(2字节),允许的…...

Redis、Memcached应用场景对比

环境 Redis官方网站: Redis - The Real-time Data Platform Redis社区版本下载地址:Install Redis | Docs Memcached官方网站:memcached - a distributed memory object caching system Memcached下载地址:memcached - a dis…...

【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用

一、液晶显示技术简介 1.RGB信号线 RGB是一种色彩模式,是工业界的一种颜色标准,是通过红(R)、绿(G)、蓝(B)三个颜色通道的变化,以及它们相互之间的叠加来得到各式各样的…...

MySQL颠覆版系列————MySQL新特性(开启数据库的新纪元)上篇

文章目录 前言一、窗口函数(Window Functions)1.1 窗口函数概念1.2 常见的窗口函数 二、公用表表达式(Common Table Expressions, CTEs)2.1 公用表表达式的概念2.2 常见的公用表表达式 三、JSON增强3.1 JSON增强的概念3.2 常见的J…...

MySQL 调优:查询慢除了索引还能因为什么?

文章目录 情况一:连接数过小情况二:Buffer Pool 太小 MySQL 查询慢除了索引还能因为什么?MySQL 查询慢,我们一般也会想到是因为索引,但除了索引还有哪些原因会导致数据库查询变慢呢? 以下以 MySQL 中一条 S…...

Java实习生面试题(2025.3.23 be)

一、v-if与v-show的区别 v-show 和 v-if 都是 Vue 中的条件渲染指令,它们的主要区别在于渲染策略:v-if 会根据条件决定是否编译元素,而 v-show 则始终编译元素,只是通过改变 CSS 的 display 属性来控制显示与隐藏。 二、mybatis-…...

如何在百度搜索上删除与自己名字相关的资料

个人信息的网络足迹如同一张无形的网,将我们与世界的每一个角落紧密相连。然而,当某些与自己名字相关的资料不再希望被公众轻易检索到时,如何在百度搜索中有效“隐身”,成为了一个亟待解决的问题。面对复杂多变的网络环境&#xf…...