陳先財+孫俊杰+張久鵬+張偉
摘 要:物聯(lián)網(wǎng)是新一代信息技術(shù)的重要組成部分,語音的實時通話在物聯(lián)網(wǎng)時代中更加體現(xiàn)出科技的不斷應(yīng)用與創(chuàng)新。文章主要介紹了物聯(lián)網(wǎng)下的音頻實時通信技術(shù)。具體闡述了系統(tǒng)方案的分析與技術(shù),以及系統(tǒng)平臺的搭建和實現(xiàn)方法,同時結(jié)合病房信息管理系統(tǒng)項目的實例,分析了語音通話的設(shè)計和實現(xiàn)方法。
關(guān)鍵詞:物聯(lián)網(wǎng);嵌入式;實時;語音;病房信息管理系統(tǒng)
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:2095-1302(2014)02-0075-03
0 引 言
在物聯(lián)網(wǎng)的時代中信息技術(shù)和網(wǎng)絡(luò)技術(shù)發(fā)展迅速,多媒體的應(yīng)用越來越廣泛,隨著物聯(lián)網(wǎng)的概念不斷深入人心,可尋址、可通信、可控制、泛在化與開放模式正逐漸成為物聯(lián)網(wǎng)發(fā)展的演進(jìn)目標(biāo)。對物聯(lián)網(wǎng)的多媒體的通信的要求越來越高,需求越來越多,就急需針對物聯(lián)網(wǎng)下的應(yīng)用及其開發(fā),以達(dá)到良好的實時通話的性能。
1 系統(tǒng)方案的分析與設(shè)計
在物聯(lián)網(wǎng)中系統(tǒng)方案有很多,不同的系統(tǒng)體系使設(shè)計難易程度也不同。隨著技術(shù)的不斷發(fā)展,對系統(tǒng)整體的設(shè)計越來越看重。使得選取系統(tǒng)方案成為整個設(shè)計與實現(xiàn)的重點。
1.1 Linux系統(tǒng)
嵌入式系統(tǒng)一般指非PC系統(tǒng),把微處理器(CPU)或者微控制器(MCU)的系統(tǒng)電路與專用軟件相互結(jié)合,以應(yīng)用為中心、計算機為基礎(chǔ)、軟硬件可裁剪、適用于應(yīng)用系統(tǒng),對功能、性能等特殊處理的專用系統(tǒng)。
嵌入式系統(tǒng)是將先進(jìn)的電子技術(shù)應(yīng)用相結(jié)合后的產(chǎn)物,決定了該行業(yè)是一個技術(shù)密集型、資金密集型、不斷創(chuàng)新的集成電路系統(tǒng)。例如風(fēng)河的Vxworks之所以在火星車上得以應(yīng)用,則是因為其高實時性和高可靠性。
嵌入式系統(tǒng)必須根據(jù)應(yīng)用需求對軟硬件進(jìn)行裁剪,滿足應(yīng)用系統(tǒng)的功能、可靠性、成本、體積等要求。所以,建立類似的軟硬件基礎(chǔ),然后在此基礎(chǔ)上開發(fā)出各種應(yīng)用需要的系統(tǒng)。目前的嵌入式系統(tǒng)的核心往往是一個只有幾KB到幾十KB的微內(nèi)核,需要根據(jù)實際的應(yīng)用進(jìn)行功能擴(kuò)展或者裁減,但是由于微內(nèi)核的存在,使得這種擴(kuò)展能夠非常順利的進(jìn)行。為此本文選用的是Linux系統(tǒng)。
Linux系統(tǒng)的前身基于Unix操作系統(tǒng),是一個基于POSIX和Unix的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運行主要的Unix工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。
Linux的基本思想:所有的都是文件;每個文件都有特定的功能。包括命令、硬軟件設(shè)備、操作系統(tǒng)、進(jìn)程等等對于操作系統(tǒng)內(nèi)核而言,都被視為擁有各自特點的文件。
Linux是一款免費的操作系統(tǒng),用戶可以通過網(wǎng)絡(luò)或其他途徑免費獲得,并可以任意修改其源代碼。這是其他操作系統(tǒng)所做不到的。正是由于這一點,來自全世界的無數(shù)程序員參與了Linux的修改、編寫工作,程序員可以根據(jù)自己的興趣和靈感對其進(jìn)行改變,這讓Linux吸收了無數(shù)程序員的精華,不斷壯大。
完全兼容POSIX 1.0標(biāo)準(zhǔn)使得可以在Linux下通過相應(yīng)的模擬器運行常見的DOS、Windows的程序。是用戶從Windows轉(zhuǎn)到Linux奠定了基礎(chǔ)。
Linux支持多用戶性,各個用戶對于自己的文件設(shè)備有自己特殊的權(quán)限,保證了各用戶之間互不影響。
Linux可以運行在多種硬件平臺上,如具有x86、680x0、SPARC、Alpha等處理器的平臺。此外Linux還是一種嵌入式操作系統(tǒng),可以運行在電腦、手機等上。
1.2 ARM處理器
作為一種嵌入式處理器,ARM處理器以低成本、高性能。得到了廣大公司及個人的喜愛。目前,ARM處理器已廣泛應(yīng)用于工業(yè)控制、消費電子產(chǎn)品、通信等領(lǐng)域。
ARM處理器的主要特點如下:
(1)體積小、低功耗、低成本、高性能;
(2)支持Thumb(16)/ARM(32位)雙指令集,能很好地處理兼容性;
(3)大量使用寄存器,指令執(zhí)行速度更快;
(4)大多數(shù)數(shù)據(jù)操作都在寄存器中完成;
(5)尋址方式靈活簡單,執(zhí)行效率高;
(6)指令長度固定。
ARM提供一系列內(nèi)核、體系擴(kuò)展、微處理器和系統(tǒng)芯片方案。目前非常流行的ARM芯核有ARM7 TDMI,ARM720T,ARM9 TDMI,ARM922T,ARM940T,ARM946T,ARM966T,ARM10 TDMI等。本文所選用是ARM11系列,其內(nèi)核時鐘頻率為350~500 MHZ,ARM11處理器的功耗可以低至0.4 mW/MHz。ARM11處理器采用了易于綜合的流水線結(jié)構(gòu),并和常用的綜合工具以及ARM compiler良好結(jié)合,多媒體處理擴(kuò)展使MPEG4編碼/解碼加快一倍,音頻處理加快一倍,增強的異常和中斷處理使實時任務(wù)的處理更加迅速。
1.3 OSS與CSS
在聲卡的驅(qū)動有兩種;OSS(開放聲音系統(tǒng));ALSA(先進(jìn)Linux聲音架構(gòu))。Kernel 2.6內(nèi)核支持ALSA了,但是OSS編程是比較容易上手的,也比較符合Linux的編程框架,而且ALSA配置的時候也可選擇OSS支持,這樣OSS應(yīng)用程序無需更改就可使用ALSA驅(qū)動。為此本文選用OSS類型。
2 系統(tǒng)實現(xiàn)平臺的搭建
2.1 軟件搭建
2.1.1 Linux環(huán)境的配置
首先是要安裝Ubuntu 10.04.04 。Ubuntu是一個以桌面應(yīng)用為主的Linux操作系統(tǒng)。其次是應(yīng)當(dāng)設(shè)置Ubuntu網(wǎng)絡(luò)參數(shù),以實現(xiàn)PC機與開發(fā)板通信。然后就是安裝交叉編譯器:
# cd /forlinx (進(jìn)入/forlinx目錄)
# mkdri /usr/local/arm
#tar zxvf arm-linux-gcc-4.3.2.tgz -C /
把交叉編譯器路徑添加到系統(tǒng)環(huán)境變量中,以后就可以直接在終端窗口中輸入arm-linux-gcc命令來編譯程序。接著是在終端中執(zhí)行: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
最后保存并退出。重新啟動系統(tǒng),在終端里面執(zhí)行arm-linux-gcc 并回車。
2.1.2 內(nèi)核移植及根文件系統(tǒng)的制作
內(nèi)核移植的方法如下:
(1) 編譯 Linux-3.0.1
即將壓縮包‘FORLINX_linux-3.0.1.tar.gz 拷貝到工作目錄下,然后解壓縮:
#tar zxf FORLINX_linux-3.0.1.tar.gz
(2) 配置內(nèi)核
配置內(nèi)核需要先安裝‘libncurses5,以方便使用‘make menuconfig 命令:
#sudo apt-get install libncurses5-dev
如果執(zhí)行命令后無法找到libncurses5-dev 安裝包,那就需要先執(zhí)行#sudo apt-get update,再執(zhí)行#sudo apt-get install libncurses5-dev
(3) 編譯內(nèi)核
編譯內(nèi)核的命令如下:
#make zImage
編譯結(jié)束后,將在內(nèi)核源碼目錄的arch/arm/boot 中得到Linux 內(nèi)核映像文件:zImage
根文件制作可以分為如下步驟:
(1)創(chuàng)建根文件系統(tǒng)的目錄;
(2)創(chuàng)建設(shè)備文件;
(3)安裝./etc;
(4)編譯內(nèi)核模塊; 即進(jìn)入Linux內(nèi)核目錄 make modules APCH = arm
CROSS_COMPILE = arm-linux-
(5)安裝內(nèi)核模塊;
(6)配置busybox; 即進(jìn)入busybox目錄執(zhí)行 make menuconfig,選中“Bulidbox as a static binary ”,靜態(tài)鏈接。
Cross compile prefix(arm-linux-)
Installation Options —>
然后選中“Dont use/usr”,再選中該項可以避免busybox被安裝到宿主系統(tǒng)的/usr目錄下,破壞宿主系統(tǒng)。
(7)編譯、安裝busybox;
Make ARCH = arm CROSS_COMPILE = arm-linux- Make install
2.1.3 音頻驅(qū)動移植
音頻驅(qū)動移植的程序代碼如下:
$ 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 硬件搭建
嵌入式系統(tǒng)的硬件一般包括處理器/微處理器、存儲器及外設(shè)器件和輸入輸出端口等。圖1所示是嵌入式系統(tǒng)的硬件示意圖。
圖1 嵌入式系統(tǒng)硬件示意圖
2.3 Ok6410開發(fā)板
S3C6410是由三星公司推出的一款低功耗、高性價比的處理器,它基于ARM11的內(nèi)核,可應(yīng)用于移動電話和通用處理等領(lǐng)域;S3C6410為2.5G和3G通信服務(wù)提供了優(yōu)化的硬件性能,內(nèi)置強大的硬件加速器:包括運動視頻處理、音頻處理、2D加速、顯示處理和縮放等;集成了一個MFC(Multi-Format video Codec)支持MPEG4 /H.263/H.264編解碼和VC1的解碼,可以提供實時的視頻會議以及NRSC和PAL制式的TV輸出;除此之外,該處理器內(nèi)置一個采用最先進(jìn)技術(shù)的3D加速器,支持OpenGL ES 1.1/ 2.0和D3DMAPI, 能實現(xiàn)4M triangles/s的3D加速;同時,S3C6410包含了優(yōu)化的外部存儲器接口,該接口能滿足在高端通信服務(wù)中的數(shù)據(jù)帶寬要求。由于以上突出的性能表現(xiàn),著名的蘋果公司手機Iphone就是基于S3C6410處理器。
OK6410開發(fā)板基于三星公司最新的ARM11處理器S3C6410,擁有強大的內(nèi)部資源和視頻處理能力,可穩(wěn)定運行在667 MHz主頻以上,支持Mobile DDR和多種NAND FLASH。OK6410開發(fā)板上集成了多種高端接口,如復(fù)合視頻信號、攝像頭、USB、SD卡、液晶屏、以太網(wǎng),并配備溫度傳感器和紅外接收頭等。
3 實時語言程序的設(shè)計
本系統(tǒng)的實時語言程序的設(shè)計代碼如下:
//初始化聲卡
int init_soundcard (int oflag)
{ /* 打開聲音設(shè)備 */
fd = open("/dev/dsp", oflag);
/* 設(shè)置采樣時的量化位數(shù) */
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
/* 設(shè)置采樣時的聲道數(shù)目 */
status=ioctl(fd,SOUND_PCM_WRITE_CHANNELS, &arg); /* 設(shè)置采樣時的采樣頻率 */
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
...
//錄音函數(shù)
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 結(jié) 語
本文開發(fā)的基于Linux 的嵌入式系統(tǒng)應(yīng)用醫(yī)院病房管理系統(tǒng),能滿足醫(yī)院病房、護(hù)士站系統(tǒng)提出的語音通信的要求,保證任務(wù)完成的實時性、可靠性、實現(xiàn)護(hù)士與病人的即時通信。相對于傳統(tǒng)的系統(tǒng)更容易實現(xiàn)系統(tǒng)集成和維護(hù)。在語音實時通信領(lǐng)域有很好的應(yīng)用前景。
參 考 文 獻(xiàn)
[1]司永衛(wèi).實時語言傳輸系統(tǒng)的設(shè)計與軟件實現(xiàn)[D].成都:成都理工大學(xué),2011.
[2]飛凌嵌入式.OK6410開發(fā)板硬件手冊[R].2012.
[3]程昌南.ARM Cortex-A8硬件設(shè)計DIY[M].北京:北京航空航天大學(xué)出版社.2012.
[4]楊黎明.基于RTP協(xié)議的實時語音傳輸研究與實現(xiàn)[D].武漢:華中科技大學(xué),2007.
[5]史蒂文斯,拉戈,尤晉元,張亞英.UNIX環(huán)境高級編程[M].北京:人民郵電出版社,2006.
[6]WALL K.GNU/Linux編程指南(第二版)[M].張輝,譯. 北京:清華大學(xué)出版社,2002.
[7]劉華,李軍紅,陽武嬌.基于PXA255的VOIP語音傳輸系統(tǒng)研究[J]. 電子技術(shù),2011(9):79-81.
3 實時語言程序的設(shè)計
本系統(tǒng)的實時語言程序的設(shè)計代碼如下:
//初始化聲卡
int init_soundcard (int oflag)
{ /* 打開聲音設(shè)備 */
fd = open("/dev/dsp", oflag);
/* 設(shè)置采樣時的量化位數(shù) */
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
/* 設(shè)置采樣時的聲道數(shù)目 */
status=ioctl(fd,SOUND_PCM_WRITE_CHANNELS, &arg); /* 設(shè)置采樣時的采樣頻率 */
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
...
//錄音函數(shù)
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 結(jié) 語
本文開發(fā)的基于Linux 的嵌入式系統(tǒng)應(yīng)用醫(yī)院病房管理系統(tǒng),能滿足醫(yī)院病房、護(hù)士站系統(tǒng)提出的語音通信的要求,保證任務(wù)完成的實時性、可靠性、實現(xiàn)護(hù)士與病人的即時通信。相對于傳統(tǒng)的系統(tǒng)更容易實現(xiàn)系統(tǒng)集成和維護(hù)。在語音實時通信領(lǐng)域有很好的應(yīng)用前景。
參 考 文 獻(xiàn)
[1]司永衛(wèi).實時語言傳輸系統(tǒng)的設(shè)計與軟件實現(xiàn)[D].成都:成都理工大學(xué),2011.
[2]飛凌嵌入式.OK6410開發(fā)板硬件手冊[R].2012.
[3]程昌南.ARM Cortex-A8硬件設(shè)計DIY[M].北京:北京航空航天大學(xué)出版社.2012.
[4]楊黎明.基于RTP協(xié)議的實時語音傳輸研究與實現(xiàn)[D].武漢:華中科技大學(xué),2007.
[5]史蒂文斯,拉戈,尤晉元,張亞英.UNIX環(huán)境高級編程[M].北京:人民郵電出版社,2006.
[6]WALL K.GNU/Linux編程指南(第二版)[M].張輝,譯. 北京:清華大學(xué)出版社,2002.
[7]劉華,李軍紅,陽武嬌.基于PXA255的VOIP語音傳輸系統(tǒng)研究[J]. 電子技術(shù),2011(9):79-81.
3 實時語言程序的設(shè)計
本系統(tǒng)的實時語言程序的設(shè)計代碼如下:
//初始化聲卡
int init_soundcard (int oflag)
{ /* 打開聲音設(shè)備 */
fd = open("/dev/dsp", oflag);
/* 設(shè)置采樣時的量化位數(shù) */
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
/* 設(shè)置采樣時的聲道數(shù)目 */
status=ioctl(fd,SOUND_PCM_WRITE_CHANNELS, &arg); /* 設(shè)置采樣時的采樣頻率 */
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
...
//錄音函數(shù)
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 結(jié) 語
本文開發(fā)的基于Linux 的嵌入式系統(tǒng)應(yīng)用醫(yī)院病房管理系統(tǒng),能滿足醫(yī)院病房、護(hù)士站系統(tǒng)提出的語音通信的要求,保證任務(wù)完成的實時性、可靠性、實現(xiàn)護(hù)士與病人的即時通信。相對于傳統(tǒng)的系統(tǒng)更容易實現(xiàn)系統(tǒng)集成和維護(hù)。在語音實時通信領(lǐng)域有很好的應(yīng)用前景。
參 考 文 獻(xiàn)
[1]司永衛(wèi).實時語言傳輸系統(tǒng)的設(shè)計與軟件實現(xiàn)[D].成都:成都理工大學(xué),2011.
[2]飛凌嵌入式.OK6410開發(fā)板硬件手冊[R].2012.
[3]程昌南.ARM Cortex-A8硬件設(shè)計DIY[M].北京:北京航空航天大學(xué)出版社.2012.
[4]楊黎明.基于RTP協(xié)議的實時語音傳輸研究與實現(xiàn)[D].武漢:華中科技大學(xué),2007.
[5]史蒂文斯,拉戈,尤晉元,張亞英.UNIX環(huán)境高級編程[M].北京:人民郵電出版社,2006.
[6]WALL K.GNU/Linux編程指南(第二版)[M].張輝,譯. 北京:清華大學(xué)出版社,2002.
[7]劉華,李軍紅,陽武嬌.基于PXA255的VOIP語音傳輸系統(tǒng)研究[J]. 電子技術(shù),2011(9):79-81.