GESC通讯中心管理嵌入式软件说明书Word文档下载推荐.docx
- 文档编号:22925275
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:32
- 大小:111.06KB
GESC通讯中心管理嵌入式软件说明书Word文档下载推荐.docx
《GESC通讯中心管理嵌入式软件说明书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《GESC通讯中心管理嵌入式软件说明书Word文档下载推荐.docx(32页珍藏版)》请在冰豆网上搜索。
通过三周的设计,能把以前很多所学的理论联系实际,培养学生的实验动手能力和创新意识,使学生对嵌入式系统有更全面的认识,掌握嵌入式系统的设计与开发的方法,为将来进行嵌入式应用系统的设计与开发奠定基础。
1.2课程背景与要求
1.2.1课程设计背景
物联网是一个基于互联网、传统电信网等信息承载体,让所有能够被独立寻址的普通物理对象实现互联互通的网络。
物联网通过智能感知、识别技术与普适计算、泛在网络的融合应用,被称为继计算机、互联网之后世界信息产业发展的第三次浪潮。
物联网被视为互联网的应用拓展,应用创新是物联网发展的核心,以用户体验为核心的创新2.0是物联网发展的灵魂。
随着物联网的发展,越来越多的物联网控制终端将涌现,对于相关技术的学习需求和基于该领域的就业机会将大增,本智能车就是在此前提下诞生的。
该智能车具有很强的操控性、可玩性,同时融入嵌入式物联网相关技术,使学员可在相对轻松愉悦的环境中学习各种技术,让嵌入式技术的学习变得不在枯燥。
本车设计之初既考虑了可产品化空间,也考虑了技术知识点的涵盖,使学习更能明确目标;
同时本项目在选材上也考虑了项目的手工打造的可能性,意在锻炼学员的动手实践能力,只要学习者有兴趣,即可按所提供的材料清单和学习的相关技术自行打造,我们更希望能培养学习者的创客精神和创业欲望与意识。
1.2.2课程设计要求
要求采用C/S架构,完成对网络音乐播放器软件的分析、设计、编码、测试等工作。
音乐播放器功能说明:
服务器实现完整的音乐播放器功能,客户端通过网络实现控制操作。
包括如下:
1、Madplay音乐播放器移植。
2、音乐播放器服务器设计,通过网络接收客户端请求并执行对应动作,实现音乐播放、暂停、上一首、下一首、播放列表、停止等功能;
3、QT客户端界面设计,要求利用qt设计控制客户端界面,实现通过网络向服务器发送命令请求等功能。
1.3课程设计环境
环境要求:
操作系统:
windows7+ubuntu虚拟系统
平台:
vim编辑器,GNU工具链,Qtcreator集成开发环境
开发语言:
C/C++
文档环境:
windowsoffice
第二章设计方案
2.1设计功能
1、Madplay音乐播放器移植;
2.2设计思路
1、开发环境搭建,虚拟机配置相关vim编辑器,gcc编译器等相关软件配置。
2、madplay音乐播放器移植,包括libmad音频解码库的使用,,所以首先需要移植madplay,具体方法如下:
1)创建安装库的路径sudomkdir/opt/arm/madplay/lib
2)进入madplay源码目录执行./build
3)测试将madplay和库文件复制到根文件系统,配置LD_LIBRARY_PATH,执行madplayxxx.mp3。
3、服务器端程序设计,采用C语言在Linux环境在完成音乐播放器功能。
4、利用Qtcreator设计客户端界面,实现向服务器发送控制命令等功能
第三章软件设计
3.1模块流程图
图1.1模块流程图
3.2Madplay移植
1)首先建立一个mp3文件夹,进入到mp3文件夹后再建立两个文件夹,一个存放源码,一个存放安装文件。
在home下,mkdir两个文件夹:
madplay-src、madplay。
依次解压四个源码包到madplay目录下:
tarzxvfXXX.tar.gz
(2)编译zlib-1.1.4
进入zlib源文件目录,依此执行./configure9/26makemakeinstall
(3)编译libid3tag
进入tag源码目录,依此执行./configuremakemakeinstall
(4)编译libmad
进入libmad源码,依此执行./configuremake
注:
使用的是高版本的ARM-LINUX-GCC如4.4.6编译器,MAKE时可能会出现”CCL:
ERROR:
UNRECOGNIZEDCOMMANDLINEOPTION“-FFORCE-MEM””错误,这是因为这个高版本的GCC没有”-FFORCEMEM”参数,解决的办法是在LIBMAD文件中的MAKEFILE里面查找”-FFORCE-MEM”,将其删除即可makeinstall
(5)编译madplay
进入madplay源码目录,依此执行./configure–-withalsamakemakeinstall
(6)测试madplay
执行命令(配置环境变量):
exportLD_LIBRARY_PATH
=$LD_LIBRARY_PATH/usr/local/lib
运行:
madplayxx.mp3
3.3程序清单
3.3.1音乐播放器服务器程序实现
1.player.c
#include"
common.h"
socket.h"
player.h"
/*孙子进程id号*/
pid_tgradchild;
/*子进程id号*/
pid_tpid;
/*共享内存描述标记*/
intshmid;
char*p_addr;
/*共享内存内容格式*//*|gradchild(孙子进程PID)|+|空一个字节|+currentsong(当前播放列表的节点指针)
|*//*listheadformusic*/
structsong*head;
/*创建歌曲名的双向循环链表*/
structsong*creat_song_list(void)
{FILE*fd;
ssize_tsize;
size_tlen;
char*line=NULL;
structsong*p1;
structsong*p2;
intres=system("
ls./song>
song_list"
);
if(res==-1)perror("
system"
fd=fopen("
song_list"
"
rb"
if(fd==NULL){
perror("
fopen"
}
p1=(structsong*)malloc(sizeof(structsong));
printf("
==================================song
list=====================================\n"
res=system("
ls./song"
\n"
================================================================================\n"
size=getline(&
line,&
len,fd);
strncpy(p1->
songname,line,strlen(line));
head=p1;
intn=strlen(line);
(head->
songname)[n]='
\0'
;
while((size=getline(&
len,fd))!
=-1)//从文件中读取一行,直到出错或者到文件尾EOF返回-1
{p2=p1;
p2->
next=p1;
p1->
prev=p2;
(p1->
next=head;
head->
prev=p1;
p1=NULL;
p2=NULL;
rm-rfsong_list"
returnhead;
}/*MP3音乐播放器-->
播放音乐函数*/
voidplay(structsong*currentsong)
{pid_tnewfd;
char*c_addr;
void*tempaddr;
char*p;
intlen;
charmy_song[2048]="
./song/"
while(currentsong)
{printf("
currentsongsize=%d\n"
strlen(currentsong->
songname));
/*子进程创建孙子进程*/
newfd=fork();
if(newfd==-1)
{perror("
fork"
exit
(1);
elseif(newfd==0)//孙子进程
playforksuccess!
/*把歌曲名加上根路径*/
strcat(my_song,currentsong->
songname);
p=my_song;
len=strlen(p);
/*去掉文件名最后的'
*/
my_song[len-1]='
THISSONGIS%ssize=%d\n"
my_song,strlen(my_song));
/*运行madplay播放器,播放MP3*/
execl("
/usr/local/sbin/madplay"
madplay"
my_song,NULL);
//播放当前列表MP3音乐
\n\n\n"
else//子进程
{/*内存映射*/
tempaddr=shmat(shmid,0,0);
c_addr=(char*)tempaddr;
/*把孙子进程的id和当前播放歌曲的节点指针传入共享内存*/
memcpy(c_addr,&
newfd,sizeof(pid_t));
memcpy(c_addr+sizeof(pid_t)+1,&
currentsong,4);
/*使用wait阻塞子进程,直到孙子进程播放完才能被唤醒;
当被唤醒时,表示播放MP3期间没有按键按下,则继续顺序播放下一首MP3*/
if(newfd==wait(NULL))
{currentsong=currentsong->
next;
THENEXTSONGIS%s\n"
currentsong->
}}}}
/*MP3音乐播放器-->
调用play函数播放音乐*/
voidstartplay(pid_t*childpid,structsong*my_song)
{pid_tpid;
//如果没有音乐正在播放并且不是处于暂停状态
if((play_flag==0)&
&
(play_pause_flag!
=1)){
play_flag=1;
play_stop_flag=0;
/*创建子进程*/
pid=fork();
if(pid>
0){//父进程
*childpid=pid;
//子进程PID初始化
sleep
(1);
/*读取共享内存保存的pid,初始化孙子进程的pid*/
/*p_addr指向共享内存,保存的是孙子进程的ID*/
memcpy(&
gradchild,p_addr,sizeof(pid_t));
elseif(0==pid){//子进程/*子进程播放MP3函数*/
play(my_song);
}}//如果没有音乐正在播放并处于暂停状态
elseif((play_flag==0)&
(play_pause_flag==1)){
play_pause_flag=0;
conti_play(gradchild);
else
return;
暂停播放*/
voidmy_pause(pid_tpid)
{if((play_flag==1)&
(play_pause_flag==0)){
=======================PAUSE!
PRESSPLAYTO
CONTINUE===================\n"
kill(pid,SIGSTOP);
//对孙子进程发送SIGSTOP信号
play_pause_flag=1;
play_flag=0;
继续播放*/
voidconti_play(pid_tpid)
===============================CONTINUE=============================\n"
kill(pid,SIGCONT);
//对孙子进程发送SIGCONT信号}
播放下一首*/
/*只有正在播放音乐的状态下,上一首和下一首才有作用*/
voidnext(pid_tnext_pid)
{intres;
if(play_flag==0){
else{
structsong*nextsong;
===============================NEXTMP3=============================\n"
/*从共享内存获得孙子进程播放歌曲的节点指针*/
nextsong,p_addr+sizeof(pid_t)+1,4);
/*指向下首歌曲的节点*/
nextsong=nextsong->
/*杀死当前歌曲播放的子进程,孙子进程*/
res=kill(pid,SIGKILL);
if(res==-1){
killnextpiderror"
res=kill(next_pid,SIGKILL);
killnextnext_piderror"
killallmadplay"
//wait(NULL);
startplay(&
pid,nextsong);
}}
播放上一首*/
voidprev(pid_tprev_pid)
else{
structsong*prevsong;
===============================PRIORMP3=============================\n"
prevsong,p_addr+sizeof(pid_t)+1,4);
/*指向上首歌曲的节点*/
prevsong=prevsong->
prev;
killprevpiderror"
res=kill(prev_pid,SIGKILL);
killprevprev_piderror"
pid,prevsong);
停止播放*/
voidmy_stop(pid_tg_pid)
if(play_stop_flag==1){//如果已经停止,直接返回
if((play_flag==1)||(play_pause_flag==1)){
=======================STOP!
START===================\n"
//对子进程发送SIGKILL信号
stoppiderror"
res=kill(g_pid,SIGKILL);
//对孙子进程发送SIGKILL信号
stopg_piderror"
play_stop_flag=1;
播放列表*/
/*搜索列表音乐名字与歌曲相匹配,并杀死正在播放歌曲进程而播放对应列表音乐*/
voidplaylist(pid_tchildpid,char*listsong)
if(strncmp(head->
songname,listsong,4)==0){
playlistkillpiderror"
res=kill(childpid,SIGKILL);
playlistkillchildpiderror"
wait(NULL);
pid,head);
return;
structsong*nextsong=head->
do{
if(strncmp(nextsong->
songname,listsong,4)==0){
nextsong=nextso
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GESC 通讯 中心 管理 嵌入式 软件 说明书
![提示](https://static.bdocx.com/images/bang_tan.gif)