新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于Windows CE的SIP软件电话的设计与实现

基于Windows CE的SIP软件电话的设计与实现

作者:时间:2012-03-22来源:网络收藏

1 引言

VOIP的迅速普及,出现了越来越多的VOIP的固定电话终端。随着VOIP的进一步发展,为了满足移动用户VOIP通信的需要,无线VOIP通讯将是未来的发展趋势。

现在手持PDA用户越来越多,都具有无线上网功能,如果能开发一个在PDA上运行的VOIP,就可以满足这些PDA用户的无线VOIP通信的需求,具有非常重要的实际意义。由于嵌入式Windows CE(WinCE)是PDA最流行的操作系统,而目前大多数VOIP终端都采用,因此,本文提出了一种Windows CE平台下基于的VOIP解决方案。该方案以嵌入式Windows CE为平台,eMbedded C++ 4.0为开发工具,中间件采用开源的栈oSIP/eXosip,通过进行协议栈的移植和在协议栈之上应用程序的开发,实现了SIP

2 设计方案

软件结构如图1所示。

图1软件结构


SIP的结构包括呼叫控制和语音通信两大模块。呼叫控制由SIP信令来完成, 主要实现呼叫的建立、修改和拆除;语音通信模块由音频数据接口,音频编解码和RTP传输三个子模块组成,实现语音的采集,编码,传输和播放。

音频数据接口模块实现语音的采集和播放, 采用Windows CE的低层音频服务, 因为低层音频服务中的回调机制为其提供了很大的方便;音频编解码采用的是G.729A 语音压缩技术,它属于低比特率话音编码,适合语音在IP 网络传输;语音采用RTP包传输。

对呼叫控制模块,直接移植开源oSIP/eXosip协议栈到WinCE上,通过调用协议栈的API函数,实现对呼叫的控制。RTP传输用开源JRTPLIB,JRTPLIB也需要在WinCE进行移植。

3 具体实现

基于上述方案,具体实现包括协议栈移植、呼叫控制和语音通信三部分。

3.1 协议栈移植

oSIP/eXosip主要支持Win32及Linux、VxWorks等一些嵌入式系统,将oSIP/eXosip移植到 WinCE上,可以在Win32基础上进行。WinCE可以兼容大部分的Win32 API,在WinCE上移植oSIP/eXosip主要有3种情况:与Win32兼容的API,与Win32不兼容API和不同的头文件支持和预定义。与 Win32兼容的API只要修改条件编译选项,与Win32不兼容API可以用其他的WinCE上的API来代替并作相关修改,另外,WinCE和Win32的某些头文件和预定义也不同,也需要进行相关修改工作。表1给出了移植的一些示例。

在WinCE上对JRTPLIB进行移植与SIP协议栈的移植类似,注意WinCE下的RTP装载数据包最大2K,和PC上的64K不同。

表1 oSIP/eXosip移植示例

Win32

WinCE

兼容

#if defined WIN32 (如Win32用_snprintf 函数,其他支持的系统用snprintf函数)

#if !defined WIN32 (如 除Win32外,其他支持的系统用strcasecmp函数,Win32用_stricmp 函数)

条件编译改成 #if (defined WIN32 || defined _WIN32_WCE) (WinCE也支持_snprintf 函数)

条件编译改成#if (!defined WIN32 !defined _WIN32_WCE) (WinCE支持_stricmp 函数)

不兼容

time函数

不支持time函数,用GetSystemTime函数加一些计算来代替。

头文件和预定义

#include process.h>

#include sys/types.h>

#define HAVE_SYS_TYPES_H 1

等等

#include "Winbase.h"

#define _beginthreadex CreateThread

等等

3.2 呼叫控制模块

呼叫控制模块用来向代理服务器注册以及进行会话的建立、修改和终止,实现对呼叫的控制。因此呼叫控制模块分为注册和呼叫两部分,都是通过底层的 SIP协议栈来完成的。上层应用程序调用SIP协议栈提供的API函数,通知协议栈进行相应的操作,协议栈将底层检测到的事件以消息的形式报告给应用层,应用层收到SIP事件后作相应处理。

c++相关文章:c++教程



上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭