基于嵌入式Linux和MiniGUI的SIP电话设计

发布者:Lianai最新更新时间:2010-12-26 来源: 电子技术关键字:嵌入式Linux  MiniGUI  SIP电话 手机看文章 扫描二维码
随时随地手机看文章

  0 引言

  随着VoIP的迅猛发展,越来越多的个人用户正在使用软件电话、IP电话通过VoIP系统拨打国内和国际长途,IP电话的需求量越来越大,同时,人们对IP电话的要求也越来越高,例如要求IP电话体积小、方便携带、功耗低、待机时间长、漂亮的人机交互界面,功能可扩展等。解决这些需求的可行方案就是用嵌入式系统,具体而言就是采用一款32位嵌入式处理芯片(如arm、Power PC),将Linux操作系统和MiniGUI图形库经过裁减移植到这些嵌入式处理芯片所构建的硬件平台上。由于Linux具有强大的网络功能,而MiniGUI是一款优秀的针对嵌入式Linux的轻量级图形用户界面库,在它们的基础上做应用开发,能够保证IP电话的稳定性和功能扩展,也能开发出漂亮的人机交互界面。

  目前用来实现VoIP系统的协议有三种:SIP、MGCP和H.323,其中SIP协议是应用得最广泛的协议,所谓SIP电话就是支持SIP协议的IP电话。

  1 SIP电话实现方案

  根据IP电话的功能需求,SIP电话应当实现人机界面的交互、呼叫处理、语音的采集和播放、语音的编码和解码、语音的实时传输。本设计人机界面的交互使用嵌入式系统硬件平台上的LCD和功能按键,采用MiniGUI图形库和Linux按键驱动;呼叫处理模块使用硬件平台上的网络接口,采用eXoSIP协议栈;语音的采集与播放使用硬件平台上的音频接口,采用Linux音频设备驱动;语音的编码和解码直接采用开源G.7-29A源代码;语音的实时传输使用RTP协议,采用开源的JRTPLIB库。

  SIP电话软件结构图如图1所示。SIP电话由八个模块组成。每一模块对应一个线程。其中,主线程(线程1)的任务是:a.加载配置文件到内存中;b.初始化音频设备和功能按键设备;c.创建RTP会话实例和初始化eXoSIP协议栈;d.初始化四个数据区缓冲结构;e.创建、管理、撤消子线程;f. 显示SIP配置文件的配置信息和状态信息,处理来自呼叫处理模块子线程的消息。呼叫处理模块子线程(线程2)的任务是:通过调用eXoSIP协议栈的API函数,实现SIP电话的呼叫过程控制。语音采集模块子线程(线程3)的任务是:实现语音的采集并将采集到的语音数据存储到全局数据缓冲区队列1中。语音编码模块子线程(线程4)的任务是:从全局数据缓冲区队列1中读取PCM码流并对其进行编码,将转化过后的G.729码流存储到全局数据缓冲区队列2中。数据发送模块子线程(线程5)的任务是:从全局数据缓冲区队列2中提取G.729码流,打包成RTP数据包发送到出去。数据接收模块子线程(线程6)的任务是:检测接收端口上的RTP语音包,提取G.729码流存储到全局数据缓冲区队列3中。语音解码模块子线程(线程7)的任务是:从全局数据缓冲区队列3中读取G.729码流对其进行解码,将转化过后的PCM码流存储到全局数据缓冲区队列4中。语音播放模块子线程(线程8)的任务是:从全局数据缓冲区队列4中读取PCM码流,通过D/A转换成模拟语音信号。

  2 各线程模块的实现

  主线程模块主要完成系统各个功能模块的初始化工作,也是程序的入口点,MiniGUI程序的入口点为MiniGUIMain()函数;配置文件的加载拟完成从根文件系统到内存的加载,然后进行解析,存放在全局SIP配置参数结构中。配置文件用来存放呼叫处理模块和语音传输模块使用的参数,具体包括:本机IP地址、子网掩码、网关地址、SIP服务器IP地址,SIP端口号、用户名、本机电话号码、密码、RTP端口号、被叫电话号码和注册间隔时间。初始化音频设备拟完成打开音频设备文件,设置音频设备的采样频率,量化位数和声道数目。打开音频设备文件可通过调用Linux系统函数audio_fd=open(“/dev/DSP”,O_RDWR)来实现,调用成功后将返回音频设备的文件描述符。设置音频设备的采样频率,量化位数和声道数目可通过调用ioctl(fd,….)函数来实现。功能按键设备的初始化很简单,直接调用buttons_fd=open“/dev/b-uttons”,O)函数打开按键设备文件即可。创建RTP会话实例,可通过调用JRTPLIB库的RTPSession类来完成,然后调用RTPSession类的Create()方法来对其进行初始化,创建完成后,需设置RTP会话实例的传输参数和会话参数。eXoSIP协议栈的初始化直接调用eXoSIP协议栈所提供的初始化函数。七个子线程的创建可通过调用pthread_create函数来完成。SIP配置信息的显示拟完成配置文件中的信息在MiniGUI主窗口上的显示,主要显示本机的IP地址和端口号、SIP服务器的IP地址、本机号码、本机用户名。SIP状态信息的显示拟完成对整个SIP事务迁移状态的显示。例如,如果收到"180Ringing"消息,则在MiniGUI主窗口上显示“对方正在响铃”,如果收到定时器的超时消息,则在MiniGUI主窗口上显示“无人接听,请稍后再拨”。SIP状态信息的显示是一个消息驱动的动态显示。SIP配置信息和状态信息的显示直接采用MiniGUI的窗口模型和消息处理机制。SIP配置信息的显示直接通过调用MiniGUI提供的TextOut(hdc,O,O,host_ip)将SIP参数结构中的参数显示在MiniGUI主窗口上。SIP状态信息的显示必须为每个SIP事务消息定义相对应的MiniGUI消息,以"180 Ringing"消息和定时器超时消息为例,自定义消息如下:

  #define MSG_180Ringing(MSG_USER+10)

  #define MSG_TImerC(MSG_USER+11)

  当呼叫处理模块子线程收到IP网络上的“180 Ringing”消息和Linux内核的定时器超时消息后,则通过调用SendMessage(hWnd,MSG_180-Ringing,0,0L)向MiniGUI主线程发送MSG_180Ringing消息,主线程通过调用GetMessage()函数获取呼叫处理模块子线程所发过来的消息,通过调用DispatchMessage(&Msg)函数把这些消息发送到窗口过程函数进行处理。窗口过程函数收到相应的消息,首先判断消息的类型,若是MSG_180Ringing消息,然后调用TextOut(hdc,0,0,“对方正在响铃”)函数在窗口上显示“对方正在响铃”字样。

  呼叫处理模块子线程可直接调用eXoSIP协议栈所提供的API函数集,eXoSIP是在oSIP2的基础上对SIP消息的API作了更上层的封装,能够很容易实现SIP电话的呼叫过程控制。呼叫处理模块子线程实现的难点是当呼叫连接成功后,如何启动语音采集、语音编码、数据发送、数据接收、语音解码和语音播放6个子线程。本设计采用Linux线程间通信-管道机制向其它6个子线程发送启动标识,6个子线程接收到启动标识后,唤醒各自的线程,进行相应的语音处理和语音的传输。同样,当呼叫连接释放时,呼叫处理模块子线程向6个子线程发送停止标识,6个子线程接收到停止标识后,停止语音处理和语音的传输,阻塞各自的线程。

  语音采集模块、语音编码模块、数据发送模块、数据接收模块、语音解码模块和语音播放模块6个子线程的过程控制是一样的,首先进入主循环,调用Linux系统函数select()阻塞本线程,侦听本线程与呼叫处理模块子线程之间的管道,若管道中有数据,则调用系统函数read()读取数据,判断数据是否为启动标识,若是,则进入子循环进行相应的处理;若为其它数据,则重新回到新一轮的循环。进入子循环进行相应的处理的同时,将select()设为非阻塞模式,调用select()函数侦听本线程与呼叫处理模块子线程之间的管道,若管道中有数据,则调用系统函数read()读取数据,判断数据是否为停止标识,若为停止标识,则跳出子循环重新回到主循环,线程重新回到阻塞状态;若为其它数据,则不做任何处理,重新回到子循环。

  由于各子线程共享数据缓冲区队列,为了正确读写数据,在设计数据缓冲区队列结构和读写操作函数时,使用了Linux下线程间的同步和互斥机制,保证了对内存资源的安全共享。为了设计出通用的数据缓冲区队列结构和读写操作函数,不妨将向缓冲区写数据的子线程定义为生产者线程,将从缓冲区读取数据的子线程定义为消费者线程。为了保证对数据缓冲区队列进行安全的读写操作,生产者线程和消费者线程必须满足两个条件:

  (1)生产者线程写入缓冲区的数目不能超过缓冲区容量;

  (2)消费者线程读取的数目不能超过生产者线程写入的数目。

  为了实现这两个条件,在程序实现中使用了写指针和读指针来判断缓冲区是空还是满。在初始化时读指针和写指针为0;如果读指针等于写指针,则缓冲区是空的;如果(写指针+1)%N等于读指针,则缓冲区是满的,%表示取余数,N表示缓冲区队列的长度。

  3 结语

  本文提出了基于嵌入式Linux和MiniGUI的SIP电话终端的实现方案,并给出了各线程模块的实现方法,与传统的台式IP网络电话解决方案相比,本方案具有如下突出的特点与创新点:a.体积小、功耗低,由于系统所依赖的硬件平台是嵌入式系统平台,而嵌入式硬件平台本身具有体积小、功耗低特点。b.功能可扩展。由于嵌入式系统软硬件可裁剪,可以方便开发人员进行功能扩展。c.图形界面漂亮。由于系统采用嵌入式图形界面MiniGUI,可以开发出漂亮的图形界面。d.采用多线程机制和缓冲区队列对语音的采集与播放、语音的编码与解码和语音的实时传输进行并行处理,保证了语音通话的连续性。

  对系统进行测试的结果表明,本设计能够对呼叫进行稳键的控制,能够保证语音通话的连续性,对从事相关产品的开发具有一定的参考价值。

关键字:嵌入式Linux  MiniGUI  SIP电话 引用地址:基于嵌入式Linux和MiniGUI的SIP电话设计

上一篇:嵌入式实时操作系统uCOS II的分析
下一篇:嵌入式实时操作系统VxWorks入门

推荐阅读最新更新时间:2024-05-02 21:14

基于嵌入式Linux与S3C2440双USB接口的视频存储
  针对长途客车“三超”(中途超载上人,超时,超速)以及在非正常停靠站私自停车上人导致的客车超载,同时目前市面上视频监控设备由于体积大、成本高等,使其难以推广应用在车辆中等问题,整合USB摄像头低成本、USB存储介质较SD(Secure Digital Memory Card)卡存储速度更快、支持更大容量等优点,提出了基于嵌入式。Linux及S3C2440平台的双USB接口车载视频存储方案。本方案主要利用单片机判别模块采集车辆行驶过程中运动状态信息(是否超速,存在急刹车、中途停车超时等),并结合车门在车速为零时的开闭对长途客车在非正常停靠点超载上人进行主动视频监控,便于以后的责任追究和认定,为监控中心的管理提供辅助。    1
[单片机]
基于嵌入式LINUX的电能量数据采集终端设计
1 引言       随着计算机技术、网络技术和大规模集成电路的高速发展,动态信号分析系统出现了向着网络化方向发展的趋势。以计算机技术、芯片技术和以软件为核心的嵌入式系统(Embedded System)再度成为当前研究和应用的热点。相对于通用计算机系统,嵌入式系统最大的特点是目的性和针对性强,即每一套嵌入式系统的开发设计都有其特殊的应用场合和特定功能,且通常具有实时性高、功耗低、体积小、集成度高、成本低等特点。       远程电能量数据采集终端(ERTU)在电能量计费系统中是介于计量主站与费率装置(电能表)之间的中间设备,主要完成电能量数据采集、处理、存储及转发等功能。嵌入式技术在电力系统中的应用有着悠久的历史,早在
[嵌入式]
基于ARM9和Linux的嵌入式打印终端系统
1 嵌入式打印终端系统 的设计原理 图1 打印终端原理图 嵌入式打印终端原理连接图如图1所示。主要由开发板、主机、打印机和扫描仪四部分组成。主机是一台PC机。开发板采用的是三星公司S3C2410开发板,ARM9的核,跑的是2.4内核版本的嵌入式Linux操作系统。扫描仪为超市等用的手持扫描仪。再加一台微型打印机接在开发板的GPIO口上。 工作流程为:开发板将扫描仪的数据从串口读出,然后通过网口将数据发送给主机进行检索处理。开发板等待直至接收到主机处理完毕的数据后转发给打印机,将信息打印出来。 2 嵌入式打印终端系统的硬件设计 2.1硬件开发平台S3C2410结构 三星公司的S
[单片机]
基于ARM9和Linux的嵌入式打印终端系统
基于嵌入式Linux的智能手机系统设计
摘要:介绍以MotorolaMX1作为中央处理器、Wavecom公司的Q2403A作为无线收发模块、嵌入式Linux作为操作系统的智能手机系统的设计与实现。该设计可以实现GSM语音通信、GPRS上网及PDA相关应用软件等功能,具有结构清晰、易于开发等优点。 关键词:Linux 嵌入式系统 智能手机 随着手持通信设备市场的快速发展,手机的功能逐渐增多。现在手机已经不只是用于语音通信的手持设备,而成为集成了短信、彩信、上网以及移动办公等附加功能的嵌入式通信平台。集成了这些功能的手机被称为智能手机。近年,嵌入式处理器的运行速度和功能都有了很大的提高,使得许多以前只能在PC上实现的应用,现在都可以在手持设备上实现。目前,市面上的智能
[应用]
嵌入式Linux下基于MiniGUI的信息终端软件开发
摘要:嵌入式系统的开发已成为新的行业热点。本文首先概述嵌入式Linux系统开发的特点及其工具,然后具体描述MiniGUI图形系统的移植、使用方法,并举例说明在该系统上开始信息终端软件的过程。该方案有很大的应用前景。 关键词:嵌入式操作系统 Linux MiniGUI 信息终端 引言 近年来,随着软硬件资源的成熟与完善,嵌入式技术越来越和人们的生活紧密相关,功能单一的公用电话也开始向嵌入式多媒体信息终端转型。对嵌入式系统的研究,在全球激起了人们极大的兴趣。 选择开放源码的Linux操作系统开发新一代嵌入式产品已经成为其中新的技术热点。在本系统中,采用了MontaVista Linux系统。它提供了很多处理器、目标板和主机环境
[嵌入式]
基于嵌入式Linux的视频采集编码系统实现三
3. 设置窗口的高度和宽度   编码器输入的是 CIF 格式的YUV420 码流,故将采集窗口的高度设置为 288,宽度为352。   4. 获取视频帧   使用mmap()(内存映射) 方式截取视频,mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。[5]   主要部分介绍如下:   a. 初始化及设置   使用ioctl(camera_fd,VIDIOCGMBUF,&camera_mbuf) 函数初始video_mbuf,获得摄像头存储缓冲区的帧信息,之后修改 video_mmap和帧状态的设置。   b. 实现摄像头设备文件到内存区的映射   调用buf=void *mmap(void *a
[模拟电子]
嵌入式Linux下的LCD驱动程序设计与实现
随着嵌入式Linux的迅速发展,由于其没有昂贵的版权费,完全开放源代码,可裁减性与可移植性,因此是开发嵌入式产品的优秀操作系统平台。设备驱动程序是Linux内核的重要组成部分,运行在Linux内核底层,在内核源代码中占较大比例,驱动程序开发逐渐成为嵌入式软件开发中一项重要工作。应项目设计的需要完成了嵌入式Linux下的LCD驱动程序设计。 1 Linux下设备驱动程序 驱动程序从字面上可以理解为一类程序,这类程序的目的一般是驱动硬件正常工作,所以通常所说的驱动程序都是针对特定的硬件来编写的。Linux设备驱动程序是为特定的硬件提供给用户程序的一组标准化接口,它隐藏了设备工作的细节。Linux系统下驱动程序是运行在内核态的,是和内
[单片机]
<font color='red'>嵌入式Linux</font>下的LCD驱动程序设计与实现
嵌入式linux开发 (十八) 内存管理(2) ARM内存管理
硬件对内存的管理 armv7v8 ARM是统一编址的,也就是外设和(内存A)进行统一的编址,共同形成了4G物理地址空间(32位为例子)。 内存控制器属于外设,内存属于(内存A). 一个soc内部及外扩的内存都属于(内存A). 存储器架构 哈佛架构 cortex-M cortex-A MPU MMU 的概念定义及实现定义 MPU: The memory protection unit (MPU) is used to manage the CPU accesses to memory to prevent one task to accidentally corrupt the memory or resources
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved