时间:2024-05-04
陈先财+孙俊杰+张久鹏+张伟
摘 要:物联网是新一代信息技术的重要组成部分,语音的实时通话在物联网时代中更加体现出科技的不断应用与创新。文章主要介绍了物联网下的音频实时通信技术。具体阐述了系统方案的分析与技术,以及系统平台的搭建和实现方法,同时结合病房信息管理系统项目的实例,分析了语音通话的设计和实现方法。
关键词:物联网;嵌入式;实时;语音;病房信息管理系统
中图分类号:TP393 文献标识码:A 文章编号:2095-1302(2014)02-0075-03
0 引 言
在物联网的时代中信息技术和网络技术发展迅速,多媒体的应用越来越广泛,随着物联网的概念不断深入人心,可寻址、可通信、可控制、泛在化与开放模式正逐渐成为物联网发展的演进目标。对物联网的多媒体的通信的要求越来越高,需求越来越多,就急需针对物联网下的应用及其开发,以达到良好的实时通话的性能。
1 系统方案的分析与设计
在物联网中系统方案有很多,不同的系统体系使设计难易程度也不同。随着技术的不断发展,对系统整体的设计越来越看重。使得选取系统方案成为整个设计与实现的重点。
1.1 Linux系统
嵌入式系统一般指非PC系统,把微处理器(CPU)或者微控制器(MCU)的系统电路与专用软件相互结合,以应用为中心、计算机为基础、软硬件可裁剪、适用于应用系统,对功能、性能等特殊处理的专用系统。
嵌入式系统是将先进的电子技术应用相结合后的产物,决定了该行业是一个技术密集型、资金密集型、不断创新的集成电路系统。例如风河的Vxworks之所以在火星车上得以应用,则是因为其高实时性和高可靠性。
嵌入式系统必须根据应用需求对软硬件进行裁剪,满足应用系统的功能、可靠性、成本、体积等要求。所以,建立类似的软硬件基础,然后在此基础上开发出各种应用需要的系统。目前的嵌入式系统的核心往往是一个只有几KB到几十KB的微内核,需要根据实际的应用进行功能扩展或者裁减,但是由于微内核的存在,使得这种扩展能够非常顺利的进行。为此本文选用的是Linux系统。
Linux系统的前身基于Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。
Linux的基本思想:所有的都是文件;每个文件都有特定的功能。包括命令、硬软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特点的文件。
Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。
完全兼容POSIX 1.0标准使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。是用户从Windows转到Linux奠定了基础。
Linux支持多用户性,各个用户对于自己的文件设备有自己特殊的权限,保证了各用户之间互不影响。
Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在电脑、手机等上。
1.2 ARM处理器
作为一种嵌入式处理器,ARM处理器以低成本、高性能。得到了广大公司及个人的喜爱。目前,ARM处理器已广泛应用于工业控制、消费电子产品、通信等领域。
ARM处理器的主要特点如下:
(1)体积小、低功耗、低成本、高性能;
(2)支持Thumb(16)/ARM(32位)双指令集,能很好地处理兼容性;
(3)大量使用寄存器,指令执行速度更快;
(4)大多数数据操作都在寄存器中完成;
(5)寻址方式灵活简单,执行效率高;
(6)指令长度固定。
ARM提供一系列内核、体系扩展、微处理器和系统芯片方案。目前非常流行的ARM芯核有ARM7 TDMI,ARM720T,ARM9 TDMI,ARM922T,ARM940T,ARM946T,ARM966T,ARM10 TDMI等。本文所选用是ARM11系列,其内核时钟频率为350~500 MHZ,ARM11处理器的功耗可以低至0.4 mW/MHz。ARM11处理器采用了易于综合的流水线结构,并和常用的综合工具以及ARM compiler良好结合,多媒体处理扩展使MPEG4编码/解码加快一倍,音频处理加快一倍,增强的异常和中断处理使实时任务的处理更加迅速。
1.3 OSS与CSS
在声卡的驱动有两种;OSS(开放声音系统);ALSA(先进Linux声音架构)。Kernel 2.6内核支持ALSA了,但是OSS编程是比较容易上手的,也比较符合Linux的编程框架,而且ALSA配置的时候也可选择OSS支持,这样OSS应用程序无需更改就可使用ALSA驱动。为此本文选用OSS类型。
2 系统实现平台的搭建
2.1 软件搭建
2.1.1 Linux环境的配置
首先是要安装Ubuntu 10.04.04 。Ubuntu是一个以桌面应用为主的Linux操作系统。其次是应当设置Ubuntu网络参数,以实现PC机与开发板通信。然后就是安装交叉编译器:
# cd /forlinx (进入/forlinx目录)
# mkdri /usr/local/arm
#tar zxvf arm-linux-gcc-4.3.2.tgz -C /
把交叉编译器路径添加到系统环境变量中,以后就可以直接在终端窗口中输入arm-linux-gcc命令来编译程序。接着是在终端中执行:vi /etc/profie
再就是添加以下4行到该文件中:
export PATH=/usr/local/arm/4.3.2/bin:$PATH
export TOOLCHAIN=/usr/local/arm/4.3.2
export TB_CC_PREFIX=arm-linuxexport
PKG_CONFIG_PREFIX=$TOOLCHAIN/arm-none-linux-gnueabi
最后保存并退出。重新启动系统,在终端里面执行arm-linux-gcc 并回车。
2.1.2 内核移植及根文件系统的制作
内核移植的方法如下:
(1) 编译 Linux-3.0.1
即将压缩包‘FORLINX_linux-3.0.1.tar.gz 拷贝到工作目录下,然后解压缩:
#tar zxf FORLINX_linux-3.0.1.tar.gz
(2) 配置内核
配置内核需要先安装‘libncurses5,以方便使用‘make menuconfig 命令:
#sudo apt-get install libncurses5-dev
如果执行命令后无法找到libncurses5-dev 安装包,那就需要先执行#sudo apt-get update,再执行#sudo apt-get install libncurses5-dev
(3) 编译内核
编译内核的命令如下:
#make zImage
编译结束后,将在内核源码目录的arch/arm/boot 中得到Linux 内核映像文件:zImage
根文件制作可以分为如下步骤:
(1)创建根文件系统的目录;
(2)创建设备文件;
(3)安装./etc;
(4)编译内核模块; 即进入Linux内核目录 make modules APCH = arm
CROSS_COMPILE = arm-linux-
(5)安装内核模块;
(6)配置busybox; 即进入busybox目录执行 make menuconfig,选中“Bulidbox as a static binary ”,静态链接。
Cross compile prefix(arm-linux-)
Installation Options —>
然后选中“Dont use/usr”,再选中该项可以避免busybox被安装到宿主系统的/usr目录下,破坏宿主系统。
(7)编译、安装busybox;
Make ARCH = arm CROSS_COMPILE = arm-linux- Make install
2.1.3 音频驱动移植
音频驱动移植的程序代码如下:
$ make menuconfig
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> OSS Mixer API
<*> OSS PCM (digital audio) API
[*] OSS PCM (digital audio) API - Include pugin system
<*> ALSA for SoC audio support --->
<*> ASoC support for Samsung
<*> SoC AC97 Audio support for SMDKC100 - WM9713
2.2 硬件搭建
嵌入式系统的硬件一般包括处理器/微处理器、存储器及外设器件和输入输出端口等。图1所示是嵌入式系统的硬件示意图。
图1 嵌入式系统硬件示意图
2.3 Ok6410开发板
S3C6410是由三星公司推出的一款低功耗、高性价比的处理器,它基于ARM11的内核,可应用于移动电话和通用处理等领域;S3C6410为2.5G和3G通信服务提供了优化的硬件性能,内置强大的硬件加速器:包括运动视频处理、音频处理、2D加速、显示处理和缩放等;集成了一个MFC(Multi-Format video Codec)支持MPEG4 /H.263/H.264编解码和VC1的解码,可以提供实时的视频会议以及NRSC和PAL制式的TV输出;除此之外,该处理器内置一个采用最先进技术的3D加速器,支持OpenGL ES 1.1/ 2.0和D3DMAPI, 能实现4M triangles/s的3D加速;同时,S3C6410包含了优化的外部存储器接口,该接口能满足在高端通信服务中的数据带宽要求。由于以上突出的性能表现,著名的苹果公司手机Iphone就是基于S3C6410处理器。
OK6410开发板基于三星公司最新的ARM11处理器S3C6410,拥有强大的内部资源和视频处理能力,可稳定运行在667 MHz主频以上,支持Mobile DDR和多种NAND FLASH。OK6410开发板上集成了多种高端接口,如复合视频信号、摄像头、USB、SD卡、液晶屏、以太网,并配备温度传感器和红外接收头等。
3 实时语言程序的设计
本系统的实时语言程序的设计代码如下:
//初始化声卡
int init_soundcard (int oflag)
{ /* 打开声音设备 */
fd = open("/dev/dsp", oflag);
/* 设置采样时的量化位数 */
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
/* 设置采样时的声道数目 */
status=ioctl(fd,SOUND_PCM_WRITE_CHANNELS, &arg); /* 设置采样时的采样频率 */
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
...
//录音函数
int recorddata(int soundfdr, unsigned char *buf)
{ ...
status=read(soundfdr,buf, (LENGTH*RATE*SIZE*CHANNELS/8000)); // 录音
//close (soundfd);
}
//声音播放程序
int playsound(int soundfdw, unsigned char *buf)
{
status=write(soundfdw,buf, (LENGTH*RATE*SIZE*CHANNELS/8000)); /* 回放 */
}
While(1)
{
...
playsound (soundfdw, buf1);
recorddata (soundfdr , buf1);
playsound (soundfdw, buf2);
recorddata (soundfdr , buf2);
...
}
4 结 语
本文开发的基于Linux 的嵌入式系统应用医院病房管理系统,能满足医院病房、护士站系统提出的语音通信的要求,保证任务完成的实时性、可靠性、实现护士与病人的即时通信。相对于传统的系统更容易实现系统集成和维护。在语音实时通信领域有很好的应用前景。
参 考 文 献
[1]司永卫.实时语言传输系统的设计与软件实现[D].成都:成都理工大学,2011.
[2]飞凌嵌入式.OK6410开发板硬件手册[R].2012.
[3]程昌南.ARM Cortex-A8硬件设计DIY[M].北京:北京航空航天大学出版社.2012.
[4]杨黎明.基于RTP协议的实时语音传输研究与实现[D].武汉:华中科技大学,2007.
[5]史蒂文斯,拉戈,尤晋元,张亚英.UNIX环境高级编程[M].北京:人民邮电出版社,2006.
[6]WALL K.GNU/Linux编程指南(第二版)[M].张辉,译. 北京:清华大学出版社,2002.
[7]刘华,李军红,阳武娇.基于PXA255的VOIP语音传输系统研究[J]. 电子技术,2011(9):79-81.
3 实时语言程序的设计
本系统的实时语言程序的设计代码如下:
//初始化声卡
int init_soundcard (int oflag)
{ /* 打开声音设备 */
fd = open("/dev/dsp", oflag);
/* 设置采样时的量化位数 */
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
/* 设置采样时的声道数目 */
status=ioctl(fd,SOUND_PCM_WRITE_CHANNELS, &arg); /* 设置采样时的采样频率 */
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
...
//录音函数
int recorddata(int soundfdr, unsigned char *buf)
{ ...
status=read(soundfdr,buf, (LENGTH*RATE*SIZE*CHANNELS/8000)); // 录音
//close (soundfd);
}
//声音播放程序
int playsound(int soundfdw, unsigned char *buf)
{
status=write(soundfdw,buf, (LENGTH*RATE*SIZE*CHANNELS/8000)); /* 回放 */
}
While(1)
{
...
playsound (soundfdw, buf1);
recorddata (soundfdr , buf1);
playsound (soundfdw, buf2);
recorddata (soundfdr , buf2);
...
}
4 结 语
本文开发的基于Linux 的嵌入式系统应用医院病房管理系统,能满足医院病房、护士站系统提出的语音通信的要求,保证任务完成的实时性、可靠性、实现护士与病人的即时通信。相对于传统的系统更容易实现系统集成和维护。在语音实时通信领域有很好的应用前景。
参 考 文 献
[1]司永卫.实时语言传输系统的设计与软件实现[D].成都:成都理工大学,2011.
[2]飞凌嵌入式.OK6410开发板硬件手册[R].2012.
[3]程昌南.ARM Cortex-A8硬件设计DIY[M].北京:北京航空航天大学出版社.2012.
[4]杨黎明.基于RTP协议的实时语音传输研究与实现[D].武汉:华中科技大学,2007.
[5]史蒂文斯,拉戈,尤晋元,张亚英.UNIX环境高级编程[M].北京:人民邮电出版社,2006.
[6]WALL K.GNU/Linux编程指南(第二版)[M].张辉,译. 北京:清华大学出版社,2002.
[7]刘华,李军红,阳武娇.基于PXA255的VOIP语音传输系统研究[J]. 电子技术,2011(9):79-81.
3 实时语言程序的设计
本系统的实时语言程序的设计代码如下:
//初始化声卡
int init_soundcard (int oflag)
{ /* 打开声音设备 */
fd = open("/dev/dsp", oflag);
/* 设置采样时的量化位数 */
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
/* 设置采样时的声道数目 */
status=ioctl(fd,SOUND_PCM_WRITE_CHANNELS, &arg); /* 设置采样时的采样频率 */
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
...
//录音函数
int recorddata(int soundfdr, unsigned char *buf)
{ ...
status=read(soundfdr,buf, (LENGTH*RATE*SIZE*CHANNELS/8000)); // 录音
//close (soundfd);
}
//声音播放程序
int playsound(int soundfdw, unsigned char *buf)
{
status=write(soundfdw,buf, (LENGTH*RATE*SIZE*CHANNELS/8000)); /* 回放 */
}
While(1)
{
...
playsound (soundfdw, buf1);
recorddata (soundfdr , buf1);
playsound (soundfdw, buf2);
recorddata (soundfdr , buf2);
...
}
4 结 语
本文开发的基于Linux 的嵌入式系统应用医院病房管理系统,能满足医院病房、护士站系统提出的语音通信的要求,保证任务完成的实时性、可靠性、实现护士与病人的即时通信。相对于传统的系统更容易实现系统集成和维护。在语音实时通信领域有很好的应用前景。
参 考 文 献
[1]司永卫.实时语言传输系统的设计与软件实现[D].成都:成都理工大学,2011.
[2]飞凌嵌入式.OK6410开发板硬件手册[R].2012.
[3]程昌南.ARM Cortex-A8硬件设计DIY[M].北京:北京航空航天大学出版社.2012.
[4]杨黎明.基于RTP协议的实时语音传输研究与实现[D].武汉:华中科技大学,2007.
[5]史蒂文斯,拉戈,尤晋元,张亚英.UNIX环境高级编程[M].北京:人民邮电出版社,2006.
[6]WALL K.GNU/Linux编程指南(第二版)[M].张辉,译. 北京:清华大学出版社,2002.
[7]刘华,李军红,阳武娇.基于PXA255的VOIP语音传输系统研究[J]. 电子技术,2011(9):79-81.
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!