自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

幕天席地的专栏

Talk is cheap.Show me the code.

  • 博客(70)
  • 资源 (10)
  • 收藏
  • 关注

原创 pjsip结构

pjproject主体由pjlib、pjsip和pjmedia组成,其中又以pjsip最为核心,pjproject的媒体模块pjmedia是比较弱的,比不上webrtc,但是sip模块却是相当不错。pjsip目录又有几个子目录,其中pjsip为核心层,向上提供端点endoint、对话dialog,用户代理ua,这些API。pjsip-ua则是会话层,其中我只会分析其中最重要的invite会话。pjsip-ua是低层API,应用可以使用这些低层API进行开发,比较灵活。pjsua-lib则是高层API,里面不

2022-11-24 09:23:54 692

原创 设备驱动开篇

驱动是Linux内核的一大子系统,也是嵌入式BSP工程师花最多时间的地方。个人对驱动的看法是,裸机+封装。要驱动一个硬件,所有要了解芯片寄存器控制逻辑,然后根据Linux的分类驱动框架,填充进去。开篇罗列一下驱动计划表,这里又把驱动分类,比如多媒体音视频类,总线类一、mini2440简单类LED驱动中断驱动PWM蜂鸣器驱动看门狗驱动RTC驱动存储类nand flash驱动网络通信类DM9000网卡驱动多媒体类LCD显示与背光驱动触摸屏驱动

2021-10-14 17:35:10 208

原创 ESP32显示驱动

ESP32有4组的SPI,SPI0和SPI又叫SPI,SPI2又叫HSPI,SPI3又叫VSPI,这里的HSPI和VSPI只是名字不同,并不是high-speed SPI 和Very High-speed SPI。SPI0作为cache访问外部存储接口使用,SPI1一般用作连接外部Flash,应用一般只使用SPI2和SPI3。如果SPI采用GPIO矩阵,则最大频率会限制在26.6MHz,如果采用IOMUX,最高频率会限制在80MHz。因为显示屏是个高速刷数据的硬件,所以我使用IOMUX,如何使用,...

2021-10-07 14:12:52 2191

原创 ESP32游戏机总体设计

1、需求想基于ESP32芯片做一个能玩FC、MD游戏的模拟器游戏机2、硬件设计ESP32通过SPI连接一块3.2寸的TF LCD屏,分辨率320x240ESP32通过IIS连接音频解码模块,音频输出到耳机。ESP32通过SD控制器连接TF卡,TF卡用于存放游戏资源ESP32通过IIC并口扩展输入按键,用于手柄按键输入ESP32通过蓝牙连接PS3手柄,使用PS3手柄作为控制器。3、软件设计软件分为两层,一层为组件sdk,一层为应用层。组件sdk层主要是封..

2021-10-07 12:50:58 1989 1

原创 freeswitch系列32通话流程

呼叫信令流程呼叫的信令交互是比较复杂的,大概分3个阶段:阶段1:A发送invate请求给服务器,服务器发现未认证,回复407; A再次发送invite,带上认证信息,服务器通过。阶段2:服务器向另一方B发送invite请求,B回复180。 服务器向A回复180,A开始响铃。阶段3:B接起电话,发送200OK给服务器 服务器发送200OK给A 阶段1sip协议栈通知应用是通过回调sofia_event_callback,和注册一样,这里会创建session和chan..

2020-05-12 15:52:00 1539

原创 freeswitch系列31注册流程

freeswitch中的sip架构freeswitch的结构图如上,蓝色箭头是调用,绿色箭头是回调。最底层的是第三方库,一个sip协议栈,实现sip信令协议,构造sip当中的各个字段。核心层主要维护跟会话,通路相关的信息,它不依赖于sip,但是会被逻辑层用到。mod_sofia是一个端点模块,它可以理解为逻辑层,实现注册、呼叫等业务,它一方面跟sip协议栈交互,调用sip协议栈去发送信令,提供回调,用于接收信令、状态变化。另一方面,它也通过核心层,构建session和channel,并且还是通..

2020-05-12 15:43:27 2327

原创 freeswitch系列21模块sofia

mod_sofia加载在可加载模块那一章节说过,一个模块的加载,主要是调用load函数,也可以理解为模块初始化函数,下面分析下,mod_sofia加载做了哪些事。 全局结构体mod_sofia_globals mod_sofia.c开头定义了两个全局结构体,其中一个是端点接口,前面也说过,sofia是一类最重要的端口。structmod_sofia_globalsmod_sofia_globals; switch_endpoint_interface_t*sofia_...

2020-05-12 15:29:12 1510

原创 freeswitch系列9 rtp

初始化rtp在switch_rtp.c中实现,里面不仅包括rtp,还包括跟媒体传输相关的几个组件,rtcp、dtmf、 srtp、zrtp,本次先完成rtp部分。在core初始化的时候,同样会进行rtp初始化。SWITCH_DECLARE(void)switch_rtp_init(switch_memory_pool_t*pool) { #ifdefENABLE_ZRTP constchar*zid_string=switch_core_get_varia...

2020-05-12 15:25:28 1924

原创 freeswitch系列8 media

初始化media在switch_core_media.c实现,完成媒体协商的功能。这部分本来是在mod_sofia实现的,后来增加了webrtc支持,就独立出来。还有一个media_bug.c,实现监控媒体。在core初始化的时候,会调用media的初始化。SWITCH_DECLARE(void)switch_core_media_init(void) { switch_core_gen_certs(DTLS_SRTP_FNAME".pem"); ...

2020-05-12 15:23:44 1561

原创 freeswitch系列7 IO

freeswitch的大部分媒体逻辑在switch_ivr_*.c中实现,但是这些是功能逻辑,最后会调用switch_core_io.c中的读写帧函数进行io操作。本章不分析功能,只对读写帧这些底层IO的API进行分析。switch_core_session_read_frame读写帧代码比较长,这里对关键流程进行注解。对一些参数进行判断if(!switch_core_codec_ready(session->read_codec)){从端点读帧...

2020-05-12 15:16:01 981 1

原创 freeswitch系列6数据库

数据库体系freeswitch默认使用sqlite3数据库,但也支持odbc使用其它数据库,或者PostgreSQL这是支持的三类数据库类型,从定义可以看出。typedefenum{ SCDB_TYPE_CORE_DB, SCDB_TYPE_ODBC, SCDB_TYPE_PGSQL }switch_cache_db_handle_type_t;switch_core_db.c实现sqlite核心数据库,switch_odb...

2020-05-12 15:08:12 1806

原创 freeswitch系列5 channel

初始化channel在switch_channel.c实现,在switch_channel.h定义相关数据结构。在第2章节初始化的时候,在核心初始化里会调用channel_global初始化。staticstruct{ switch_memory_pool_t*pool; switch_hash_t*device_hash; switch_mutex_t*device_mutex; switch_device_state_bind...

2020-05-12 15:01:34 2891 1

原创 freeswitch系列4 session

初始化session在switch_core_session.c实现,在switch_core_pvt.h定义相关数据结构。在第2章节初始化的时候,在核心初始化里会调用session初始化。voidswitch_core_session_init(switch_memory_pool_t*pool) { memset(&session_manager,0,sizeof(session_manager)); session_manager.sess...

2020-05-12 14:57:40 1935 2

原创 freeswitch系列3加载模块

可加载模块数据结构可加载模块相关的文件如下switch_loadable_module.hswitch_loadable_module.cswitch_types.hswitch_module_interfaces.h在switch_loadable_module.c定义了可加载模块容器和可加载模块对象:structswitch_loadable_module{ char*key; char*filename; intperm;...

2020-05-12 14:47:51 1405

原创 freeswitch系列2初始化

1、核心头文件freeswitch是服务端程序,它的入口main函数在src/switch.c实现,相关的头文件还有switch.h、private/switch_core_pvt.h。先看下switch.h内容。#include <stdlib.h> #include <stdio.h> #include <stdarg.h> #include...

2020-01-21 14:51:02 848

原创 freeswitch系列1概述

1、PBX与freeswitchPBX是Private Branch eXchange的缩写形式,用户级交换机,即公司内部使用的电话业务网络,系统内部分机用户分享一定数量的外线。FreeSwitch是一个开源的电环交换平台,是一个跨平台的/伸缩性极好的/免费的/多协议的电话软交换平台。从下面两张拓扑图可以看出PBX的作用。图一模式,公司内部只能有7部电话,使用7个运营商号码。图二模式,...

2020-01-20 15:29:14 1263

原创 pjmedia系列之媒体设备pjmedia_snd_port

在simpleua.c文件,当协商成功call_on_media_update中,会创建音频设备对象。static pjmedia_snd_port *g_snd_port; /* Sound device. */static void call_on_media_update( pjsip_inv_session *inv, pj_status_t status){}...

2019-09-30 17:26:10 1954 3

原创 pjmedia系列之媒体流pjmedia_stream

前面讲过,一个会话可以有多个流,比如音频流、视频流,这里讲一个音频流有哪些东西。媒体流struct pjmedia_stream{ pjmedia_endpt *endpt; /**< Media endpoint. */ pjmedia_codec_mgr *codec_mgr; /**< Codec manager...

2019-09-25 20:35:17 2130

原创 pjmedia系列之媒体传输pjmedia_transport

媒体传输封装了网络收发细节,pjmedia_transport可以是udp、srtp、ice等,这里以udp为例。结构体pjmedia_transport/** * This structure declares media transport. A media transport is called * by the stream to transmit a packet, and...

2019-09-19 20:41:41 1798

原创 pjmedia系列之媒体端点pjmedia_endpt

simpleua.c在进行媒体相关初始化时,首先创建媒体端点,看看媒体端点的数据结构和创建流程。#if PJ_HAS_THREADS status = pjmedia_endpt_create(&cp.factory, NULL, 1, &g_med_endpt);#else status = pjmedia_endpt_create(&cp.fac...

2019-09-19 19:57:00 999 1

原创 pjmedia系列开篇

pjlib系列完结后,开始进入pjmedia系列。pjmedia是多媒体栈,可以把它按照抽象的分解大小分解为几个对象,下面通过simpleua.c示例代码解析这些对象和数据流。从对象关系来看:1、 pjmedia_endpt,代表一个媒体端点,端点可以理解为一个节点,可以是服务器或者客户端,一个设备一般只会有唯一一个端点,而且在初始化的时候创建。2、pjmedia_session,代表...

2019-09-17 21:02:40 3173

原创 pjlib系列之数学统计math

之前在看pjmedia的jbuf时,发现里面用到了pjlib中的数学统计,来实现抖动的测量。进去查看,发现方差的实现跟定义完全不一样,非常简洁,推导了1个多小时,终于推导出里面的代码实现原理。果然,程序员都是给数学家打工的。pjlib实现的数学和统计文件是math.h,没有math.c文件,所有实现都内联在头文件。其中统计结构体如下:/** * This structure descr...

2019-09-09 10:47:06 268

原创 pjlib系列之日志log

日志用法使用之前需要初始化日志,但这一步是内部函数pj_init自己调用的,应用程序无需显示调用。/** * Internal function to be called by pj_init() */pj_status_t pj_log_init(void);* PJ_LOG(3, ("main.c", "Starting hello..."));* PJ_LOG...

2019-09-06 11:45:58 814

原创 pjlib系列之网络安全

本文占位,关于加密知识还未整理,先不深入研究,这里从注释知道,使用SSL和TLS的网络加密。

2019-09-05 20:36:08 174

原创 pjlib系列之网络服务质量QoS

本篇文章预占位置,因为QoS目前接触不多。pjlib关于网络服务质量QoS的实现在sock_qos_xx几个文件,从注释大概了解到。实现了3个,其中二层有802.1p和WMM,三层有DSCP,也就是IPv4报文头的那个区分服务(Differentialted Services)。剩下的以后研究再补充。...

2019-09-05 20:33:03 282

原创 pjlib系列之IP地址解析

pjlib中对地址解析的封装在addr_resolv.h定义,实现在addr_resolv_sock.c和sock_common.c根据域名获取ip(仅支持IPv4)struct hostent *gethostbyname(const char *hostname)struct hostent{ char *h_name; //official name char...

2019-09-02 17:49:55 523

原创 pjlib系列之网络ip_helper

本地接口和ip枚举本地接口和ip在ip_helper.h和ip_helper_generic.c/** * Enumerate the local IP interfaces currently active in the host. * * @param af Family of the address to be retrieved. Application * ...

2019-08-30 15:06:25 268

原创 pjlib系列之复用io队列ioqueue

ioqueue是pjlib的一个精华部分,实现基于Proactor模式的IO复用模型,关于Proactor与Reactor模式,可以参考IO模型。简单来讲,Reactor是监控到事件后,应用自己去读写;Proactor模式是检测到事件后,底层去读写,完成后通知应用。其本质区别就是谁去读写数据。ioqueue的实现在ioqueue.h ioqueue_common_abs.c ioqueue_com...

2019-08-30 10:52:19 1227

原创 pjlib系列之数据结构fifobuf

fifobuf是个先进先出的队列,使用结构体pj_fifobuf_t表示。该结构体四个指针,其中first和last表示缓冲区的起始和结束,这两个指针初始化一次就不再改变,ubegin和uend指向数据的开始和结束,入队列时,uend后移,出队列时,ubegin后移,当uend后移到和ubegin相等时,缓冲区被填满了、full标志设1,直到有数据出队列时,才重新设0。struct pj_f...

2019-08-29 14:59:45 340

原创 pjlib系列之错误errno

pjlib提供了一套统一的错误码,都是正数,并且屏蔽各系统的错误码。pjlib的错误在文件errno.h errno.c compat/errno.h os_core_unix.c。错误码范围分段/** * PJ_ERRNO_START is where PJLIB specific error values start. */#define PJ_ERRNO_START 20...

2019-08-29 11:28:58 492

原创 pjlib系列之定时器timer

pjlib的定时器简介pjlib定时器是从ACE网络库移植过来的。实现在timer.h和timer.c,定时器的原理是有个将来的超时时间,这个时间就是现在时间加上定时器时长。pjlib定时器使用1、pj_timer_heap_create()创建定时器堆;2、pj_timer_heap_schedule()来调度定时器,也就是插入到定时器堆中,该函数实现堆的基本操作,一旦一个定时器结...

2019-08-28 16:26:04 806

原创 pjlib系列之时间戳timestamp

时间戳结构体定义在types.h,本质上是两个32位加上一个64位。根据宏PJ_HAS_INT64来决定是用一个64位存储还是用2个32位存储,该结构体存储的单位是系统频率,比如系统频率是纳秒,则pj_timestamp.u32.lo = 10表示经过了10个周期,也就是10ns。/** * This structure represents high resolution (64bit)...

2019-08-28 16:01:51 896

原创 pjlib系列之时间time

Linux下的几种时间1、精确到秒级time_t本质上是一个long型time_t time(time_t *t);//此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t指针所指的内存。struct tm { int tm_sec; /* seconds */ i...

2019-08-27 17:03:15 402

原创 pjlib系列之线程thread及同步对象

操作系统抽象的API可以屏蔽操作系统特有的操作,使业务代码方便在不同平台移植。这部分实现主要是os_开头的几个文件,其中最重要的是os_core_unix.c(这里选择Linux平台)。我把这些分拆3类:1、线程Thread和本地线程存储TLSThread Local Storage;2、线程同步对象;3、时间和高精度定时线程本地存储线程共享进程的数据,访问需要同步,有时线程需要有自己的...

2019-08-27 16:45:43 903

原创 pjlib系列之非动态内存pool

pool简介pjlib的pool实现了内存池,使得可以不必频繁地创建释放内存,避免由此引起的内存碎片。官方文档为pjlib内存池poolpool共有这么几个组件:pool factory内存池工厂:用来管理内存池的policy:管理策略,工厂只是用来管理内存池对象,对于如何分配内存(使用malloc还是new),则由策略组件来实现。pool object:内存池对象,使用内存池...

2019-08-25 16:32:34 1209

原创 pjlib系列开篇

PJLIB是pj项目中最底层的库,也许你不想用pjsip,想使用exosip;不想使用pjmedia,想使用webrtc,但是pjlib作为公共库还是一个不错的选择。PJLIB提供的特性,先翻译一下官方文档的描述,此翻译来源于网友pjlib官方文档1).非动态内存分配[No Dynamic Memory Allocations]实现了内存池,获取内存是从与分配的内存池中获取,高性能程序多会自己...

2019-08-25 15:04:27 797

原创 pjproject开篇

在voip行业多年,知道很多优秀的库,pjproject精致轻量,是一个入门级的学习素材。为了记录自己的学习成果,准备写一系列关于pjproject的相关博客。pjproject的官方地址是pjproject官方网站概述PJSIP 开源库由一系列功能库所组成:PJLIB 是系统抽象层 PPJLIB-UTIL 提供有用的工具函数 PJNATH 解决NAT 穿越问题 P...

2019-08-24 20:31:01 1238

原创 mini2440系统移植篇之init启动流程

1. 启动内核启动应用程序/linuxrcbusybox ini.cinit_main设置信号处理函数初始化控制台parse_inittab解析inittab1.1. 解析inittabfile = open(INITTAB, “r”); //打开配置文件/etc/inittabnew_init_action//1 创建一个init_action结构,填充

2015-05-30 12:28:01 612

原创 mini2440系统移植篇之rootfs制作

1. 制作根文件系统1、创建目录2、创建必要的设备文件3、安装所需的共享库4、安装init文件、shell及各种linux命令,由busybox提供5、创建编辑配置1.1. 创建目录mkdir rootfscd rootfsmkdir bin sbin dev lib etc root usr proc mnt tmpmkdir usr/bin usr/li

2015-05-30 12:27:34 895

原创 mini2440系统移植篇之kernel启动流程

1.1. 第1阶段arch/arm/kernel/vmlinux.lds--------------------Makefile 2.1 arch/arm/boot/compressed/start.S 解压代码 2.2 arch/arm/kernel/head.S2.2.1 __lookup_machine_type 机器ID  àMACH_START

2015-05-23 11:24:51 788

51单片机常用开发软件集合

51单片机常用开发软件集合,这是本人学单片机时收集的大部分常用调试软件,包括波特率初值设定软件,定时器就是,取字模软件等,对初学单片机的朋友绝对有帮助

2011-07-31

linux课件,自学的好资料

linux课程的完整课件,自学的好资料,已经打包好了,专给喜欢linux系统的人

2011-07-31

QT中文参考文档,各种类和函数详解

qt的中文参考文档,适合查阅,学QT的同学用得着

2011-07-31

window2000驱动开发

window 驱动程序开发书籍,适合入门,初学者使用

2011-07-27

VC++6.0 教程

VC++6.0的教程,三级C语言的编译软件,很好用的C语言工具

2010-12-11

计算机三级C语言题库

计算机三级C语言题库,word打印版,详细源码,不是只有一个函数的源码

2010-12-11

51单片机常用芯片资料

51单片机开发板相关的资料,有在学习51单片机的可以下

2010-11-04

09模拟电子技术课件

模拟电子技术,希望对大家有用,想自学的可以下

2010-06-06

protues元件库中英文对照

protues元件库的中英文对照表,应该会有用的

2010-06-06

全新版大学英语综合教程练习答案及课文译文\全新版大学英语第四册综合教程练习答案及课文译文

全新版大学英语综合教程练习答案及课文译文\全新版大学英语第四册综合教程练习答案及课文译文

2010-03-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除