版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、學(xué)校代碼: 10128學(xué) 號:201120201023嵌入式系統(tǒng)綜合設(shè)計說明書題 目:智能車系統(tǒng)MP3播放器設(shè)計與實(shí)現(xiàn)學(xué)生姓名:杜繼鳳 組 員:王嘉敏 杜繼鳳學(xué) 院:信息工程學(xué)院班 級:計算機(jī)11-2班指導(dǎo)教師:莊旭菲 王曉強(qiáng) 蔣貴良 劉志強(qiáng) 2014 年 3 月 15 日 摘要嵌入式項目T-CAR 智能小車是嵌入式技術(shù)和物聯(lián)網(wǎng)技術(shù)結(jié)合的產(chǎn)物。TCAR以三星高端微處理器為主控實(shí)現(xiàn)主要控制工作,將WIFI 無線通信與ZIGBEE 近距離無線組網(wǎng)通信相結(jié)合實(shí)現(xiàn)近距離和遠(yuǎn)程無線控制、信息采集等功能。T-CAR 即可作為互聯(lián)網(wǎng)終端、物聯(lián)網(wǎng)網(wǎng)關(guān),也可以和工業(yè)控制、智能家居等系統(tǒng)融合使用。本課題目的是在A
2、RM-Linux嵌入式環(huán)境下實(shí)現(xiàn)網(wǎng)絡(luò)功能,系統(tǒng)主要由硬件層、內(nèi)核層、應(yīng)用層三部分構(gòu)成。由于Linux具有可移植度高、自由、免費(fèi)等特性,最近幾年,它在移動設(shè)備和個人電腦領(lǐng)域的應(yīng)用也越來越廣泛,因此我們選擇Linux操作系統(tǒng),鑒于以上應(yīng)用領(lǐng)域?qū)τ脩艚缑嬗押眯苑矫娴囊?,幾乎所有的此類?yīng)用都是采用圖形用戶界面。播放界面采用Qt設(shè)計,Qt是創(chuàng)造圖形用戶界面的最流行的跨平臺GUI工具箱之一。這里將通過一個使用Qt技術(shù)的簡單mp3播放器的實(shí)現(xiàn),詳細(xì)描述Linux環(huán)境下的圖形界面編程技術(shù)。本實(shí)訓(xùn)課程是嵌入式應(yīng)用開發(fā)方向的實(shí)訓(xùn)課程,主要介紹嵌入式應(yīng)用程序的開發(fā)技術(shù),課程內(nèi)容涉及C 語法及核心庫、嵌入式Linu
3、x 開發(fā)環(huán)境、嵌入式Linux應(yīng)用開發(fā)流程。在內(nèi)容組織上,以案例貫穿課程的始終。通過一系列案例的學(xué)習(xí)使學(xué)員能基本掌握嵌入式Linux 應(yīng)用程序開發(fā)的基本技術(shù),能開發(fā)出有圖形界面,可交互,具有一定業(yè)務(wù)邏輯的嵌入式Linux 應(yīng)用程序。關(guān)鍵字:嵌入式;QT;mp3播放器;目錄前言1第一章概述21.1課程設(shè)計目的21.2課程背景與要求21.2.1課程設(shè)計背景21.2.2課程設(shè)計要求31.3課程設(shè)計環(huán)境3第二章設(shè)計方案42.1設(shè)計功能42.2 設(shè)計思路4第三章 軟件設(shè)計53.1模塊流程圖53.2 Madplay 移植63.3程序清單63.3.1音樂播放器服務(wù)器程序?qū)崿F(xiàn)63.3.2音樂播放器客戶端程序?qū)?/p>
4、現(xiàn)19第四章 調(diào)試過程244.1硬件連接244.2軟件連接244.2.1 操作系統(tǒng)244.2.2 系統(tǒng)軟件244.2.3 工具軟件244.2.4 文檔和資源254.3實(shí)驗(yàn)步驟254.4 出現(xiàn)的問題和解決方法254.5運(yùn)行結(jié)果截屏26第五章 總結(jié)28參考文獻(xiàn)29前言隨著社會的日益信息化,計算機(jī)和網(wǎng)絡(luò)已經(jīng)全面滲透到日常生活的每一個角落。對于我們每個人來說,需要的已經(jīng)不再僅僅是那種放在桌上處理文檔、進(jìn)行工作管理和生產(chǎn)控制的計算機(jī)機(jī)器。任何一個普通人都可能擁有從小到大的各種使用嵌入式技術(shù)的電子產(chǎn)品,小到MP3、PDA等微型數(shù)字化產(chǎn)品,大到網(wǎng)絡(luò)家電、智能家電、車載電子設(shè)備等。目前,各種各樣的新型嵌入式系
5、統(tǒng)設(shè)備在應(yīng)用數(shù)量上已經(jīng)遠(yuǎn)遠(yuǎn)超過了通用計算機(jī)。在工業(yè)和服務(wù)領(lǐng)域中,使用嵌入式技術(shù)的數(shù)字機(jī)床、智能工具、工業(yè)機(jī)器人、服務(wù)機(jī)器人正在逐漸改變著傳統(tǒng)的工業(yè)生產(chǎn)和服務(wù)方式。MP3是嵌入式的最主要應(yīng)用之一,高端的MP3已經(jīng)不僅僅著眼于實(shí)現(xiàn)音樂播放這一簡單功能,而是同時具備了文本瀏覽、圖片瀏覽、甚至視頻播放等強(qiáng)大功能。本文重點(diǎn)討論了基于WIFI 智能車的控制系統(tǒng)為主其中MP3的功能的實(shí)現(xiàn),包括開發(fā)環(huán)境建立、內(nèi)核配置與編譯、Qt開發(fā)等一系列詳細(xì)過程。近幾年,嵌入式系統(tǒng)技術(shù)得到了廣泛的應(yīng)用,普適計算、無線傳感器網(wǎng)絡(luò)、可重構(gòu)計算等新興技術(shù)的出現(xiàn)又為嵌入式系統(tǒng)技術(shù)的研究與應(yīng)用注入了新的活力。智能手機(jī)、信息家電、汽車
6、電子、家用機(jī)器人嵌入式系統(tǒng)已“無處不在”。嵌入式系統(tǒng)是當(dāng)今最熱門的概念之一。作為一個系統(tǒng),往往是在硬件和軟件雙螺旋式交替發(fā)展的支撐下逐漸趨于穩(wěn)定和成熟,嵌入式系統(tǒng)也不例外。第一章 概述嵌入式項目T-CAR 智能小車是嵌入式技術(shù)和物聯(lián)網(wǎng)技術(shù)結(jié)合的產(chǎn)物。TCAR以三星高端微處理器為主控實(shí)現(xiàn)主要控制工作,將WIFI 無線通信與ZIGBEE 近距離無線組網(wǎng)通信相結(jié)合實(shí)現(xiàn)近距離和遠(yuǎn)程無線控制、信息采集等功能。T-CAR 即可作為互聯(lián)網(wǎng)終端、物聯(lián)網(wǎng)網(wǎng)關(guān),也可以和工業(yè)控制、智能家居等系統(tǒng)融合使用。1.1課程設(shè)計目的嵌入式系統(tǒng)設(shè)計與實(shí)踐課程設(shè)計介紹基本設(shè)計與實(shí)現(xiàn)方法,是為計算機(jī)科學(xué)與技術(shù)專業(yè)本科生開設(shè)的一門重
7、要的專業(yè)課程。是對以前所學(xué)很多知識的匯總和深化。通過三周的設(shè)計,能把以前很多所學(xué)的理論聯(lián)系實(shí)際,培養(yǎng)學(xué)生的實(shí)驗(yàn)動手能力和創(chuàng)新意識,使學(xué)生對嵌入式系統(tǒng)有更全面的認(rèn)識,掌握嵌入式系統(tǒng)的設(shè)計與開發(fā)的方法,為將來進(jìn)行嵌入式應(yīng)用系統(tǒng)的設(shè)計與開發(fā)奠定基礎(chǔ)。1.2課程背景與要求1.2.1課程設(shè)計背景物聯(lián)網(wǎng)是一個基于互聯(lián)網(wǎng)、 傳統(tǒng)電信網(wǎng)等信息承載體, 讓所有能夠被獨(dú)立尋址的普通物理對象實(shí)現(xiàn)互聯(lián)互通的網(wǎng)絡(luò)。物聯(lián)網(wǎng)通過智能感知、識別技術(shù)與普適計算、泛在網(wǎng)絡(luò)的融合應(yīng)用,被稱為繼計算機(jī)、互聯(lián)網(wǎng)之后世界信息產(chǎn)業(yè)發(fā)展的第三次浪潮。物聯(lián)網(wǎng)被視為互聯(lián)網(wǎng)的應(yīng)用拓展,應(yīng)用創(chuàng)新是物聯(lián)網(wǎng)發(fā)展的核心,以用戶體驗(yàn)為核心的創(chuàng)新 2.0 是
8、物聯(lián)網(wǎng)發(fā)展的靈魂。隨著物聯(lián)網(wǎng)的發(fā)展,越來越多的物聯(lián)網(wǎng)控制終端將涌現(xiàn),對于相關(guān)技術(shù)的學(xué)習(xí)需求和基于該領(lǐng)域的就業(yè)機(jī)會將大增,本智能車就是在此前提下誕生的。該智能車具有很強(qiáng)的操控性、可玩性,同時融入嵌入式物聯(lián)網(wǎng)相關(guān)技術(shù),使學(xué)員可在相對輕松愉悅的環(huán)境中學(xué)習(xí)各種技術(shù),讓嵌入式技術(shù)的學(xué)習(xí)變得不在枯燥。本車設(shè)計之初既考慮了可產(chǎn)品化空間,也考慮了技術(shù)知識點(diǎn)的涵蓋,使學(xué)習(xí)更能明確目標(biāo);同時本項目在選材上也考慮了項目的手工打造的可能性,意在鍛煉學(xué)員的動手實(shí)踐能力,只要學(xué)習(xí)者有興趣,即可按所提供的材料清單和學(xué)習(xí)的相關(guān)技術(shù)自行打造,我們更希望能培養(yǎng)學(xué)習(xí)者的創(chuàng)客精神和創(chuàng)業(yè)欲望與意識。1.2.2課程設(shè)計要求要求采用C/S
9、架構(gòu),完成對網(wǎng)絡(luò)音樂播放器軟件的分析、設(shè)計、編碼、測試等工作。音樂播放器功能說明:服務(wù)器實(shí)現(xiàn)完整的音樂播放器功能,客戶端通過網(wǎng)絡(luò)實(shí)現(xiàn)控制操作。包括如下:1、Madplay音樂播放器移植。2、音樂播放器服務(wù)器設(shè)計,通過網(wǎng)絡(luò)接收客戶端請求并執(zhí)行對應(yīng)動作,實(shí)現(xiàn)音樂播放、暫停、上一首、下一首、播放列表、停止等功能;3、QT客戶端界面設(shè)計,要求利用qt設(shè)計控制客戶端界面,實(shí)現(xiàn)通過網(wǎng)絡(luò)向服務(wù)器發(fā)送命令請求等功能。1.3課程設(shè)計環(huán)境環(huán)境要求:操作系統(tǒng):windows 7+ubuntu虛擬系統(tǒng) 平臺:vim編輯器,GNU工具鏈,Qtcreator集成開發(fā)環(huán)境開發(fā)語言:C/C+文檔環(huán)境:windows offi
10、ce第二章 設(shè)計方案2.1設(shè)計功能音樂播放器功能說明:服務(wù)器實(shí)現(xiàn)完整的音樂播放器功能,客戶端通過網(wǎng)絡(luò)實(shí)現(xiàn)控制操作。包括如下:1、Madplay音樂播放器移植;2、音樂播放器服務(wù)器設(shè)計,通過網(wǎng)絡(luò)接收客戶端請求并執(zhí)行對應(yīng)動作,實(shí)現(xiàn)音樂播放、暫停、上一首、下一首、播放列表、停止等功能;3、QT客戶端界面設(shè)計,要求利用qt設(shè)計控制客戶端界面,實(shí)現(xiàn)通過網(wǎng)絡(luò)向服務(wù)器發(fā)送命令請求等功能。2.2 設(shè)計思路1、開發(fā)環(huán)境搭建,虛擬機(jī)配置相關(guān)vim編輯器,gcc編譯器等相關(guān)軟件配置。2、madplay音樂播放器移植,包括libmad音頻解碼庫的使用,所以首先需要移植madplay,具體方法如下:1)創(chuàng)建安裝庫的路徑
11、 sudo mkdir /opt/arm/madplay/lib2)進(jìn)入madplay 源碼目錄 執(zhí)行./build3 ) 測試將madplay 和庫文件復(fù)制到根文件系統(tǒng), 配置LD_LIBRARY_PATH,執(zhí)行madplay xxx.mp3。3、服務(wù)器端程序設(shè)計,采用C語言在Linux環(huán)境在完成音樂播放器功能。4、利用Qtcreator設(shè)計客戶端界面,實(shí)現(xiàn)向服務(wù)器發(fā)送控制命令等功能第三章 軟件設(shè)計3.1模塊流程圖播放Filename是否為空獲取播放文件信息:播放歌曲、當(dāng)前播放位置等。開始播放激活進(jìn)度條TimeSlider顯示時間長度、當(dāng)前播放位置及文件名稱是否停止播放是否暫停停止播放暫停播
12、放圖1.1模塊流程圖3.2 Madplay 移植1) 首先建立一個mp3 文件夾,進(jìn)入到mp3 文件夾后再建立兩個文件夾,一個存放源碼,一個存放安裝文件。在home 下,mkdir 兩個文件夾:madplay-src、madplay。依次解壓四個源碼包到madplay 目錄下:tar zxvf XXX.tar.gz(2) 編譯zlib-1.1.4進(jìn)入zlib 源文件目錄,依此執(zhí)行./configure9 / 26make make install(3) 編譯libid3tag進(jìn)入tag 源碼目錄,依此執(zhí)行./configure make make install(4) 編譯libmad進(jìn)入li
13、bmad 源碼,依此執(zhí)行./configuremake注:使用的是高版本的ARM-LINUX-GCC 如4.4.6 編譯器,MAKE 時可能會出現(xiàn)”CCL:ERROR:UNRECOGNIZED COMMAND LINE OPTION “-FFORCE-MEM”錯誤,這是因?yàn)檫@個高版本的GCC 沒有”-FFORCEMEM”參數(shù),解決的辦法是在LIBMAD 文件中的MAKEFILE 里面查找”-FFORCE-MEM”,將其刪除即可 make install(5) 編譯madplay進(jìn)入madplay 源碼目錄,依此執(zhí)行./configure -with alsa make make install
14、(6) 測試madplay執(zhí)行命令(配置環(huán)境變量):export LD_LIBRARY_PATH=$LD_LIBRARY_PATH/usr/local/lib運(yùn)行:madplay xx.mp33.3程序清單3.3.1音樂播放器服務(wù)器程序?qū)崿F(xiàn)1.player.c#include "common.h"#include "socket.h"#include "player.h"/*孫子進(jìn)程id 號*/pid_t gradchild;/*子進(jìn)程id 號*/pid_t pid;/*共享內(nèi)存描述標(biāo)記*/int shmid;char *p_addr
15、;/*共享內(nèi)存內(nèi)容格式*/*|gradchild(孫子進(jìn)程PID) |+ |空一個字節(jié)|+ currentsong(當(dāng)前播放列表的節(jié)點(diǎn)指針)|*/*listhead for music*/struct song* head;/*創(chuàng)建歌曲名的雙向循環(huán)鏈表*/struct song *creat_song_list(void)FILE *fd;ssize_t size;size_t len;char *line = NULL;struct song *p1;struct song *p2;int res=system("ls ./song > song_list");if
16、(res = -1) perror("system");fd = fopen("song_list","rb");if(fd=NULL)perror("fopen");p1 = (struct song *)malloc(sizeof(struct song);printf("=songlist=n");res=system("ls ./song");if(res = -1) perror("system");printf("n");p
17、rintf("=n");size = getline(&line,&len,fd);strncpy(p1->songname,line,strlen(line);head = p1;int n=strlen(line);(head->songname)n='0'while(size = getline(&line,&len,fd) != -1) /從文件中讀取一行,直到出錯或者到文件尾EOF 返回-1p2 = p1;p1 = (struct song *)malloc(sizeof(struct song);str
18、ncpy(p1->songname,line,strlen(line);p2->next = p1;p1->prev = p2;int n=strlen(line);(p1->songname)n='0'p1->next = head;head->prev = p1;p1 = NULL;p2 = NULL;res=system("rm -rf song_list");if(res = -1) perror("system");return head;/*MP3 音樂播放器->播放音樂函數(shù)*/voi
19、d play(struct song *currentsong)pid_t newfd;char *c_addr;void *tempaddr;char *p;int len;char my_song2048="./song/"while(currentsong)printf("currentsong size=%dn",strlen(currentsong->songname);/*子進(jìn)程創(chuàng)建孫子進(jìn)程*/newfd = fork();if(newfd = -1)perror("fork");exit(1);else if(ne
20、wfd = 0) /孫子進(jìn)程printf("play fork success!n");/*把歌曲名加上根路徑*/strcat(my_song,currentsong->songname);p = my_song;len = strlen(p);/*去掉文件名最后的'0'*/my_songlen-1='0'printf("THIS SONG IS %s size=%dn",my_song,strlen(my_song);/*運(yùn)行madplay 播放器,播放MP3*/execl("/usr/local/sbi
21、n/madplay","madplay",my_song,NULL);/播放當(dāng)前列表MP3 音樂printf("nnn");else /子進(jìn)程/*內(nèi)存映射*/tempaddr = shmat(shmid,0,0);c_addr = (char *)tempaddr;/*把孫子進(jìn)程的id 和當(dāng)前播放歌曲的節(jié)點(diǎn)指針傳入共享內(nèi)存*/memcpy(c_addr,&newfd,sizeof(pid_t);memcpy(c_addr + sizeof(pid_t)+1,¤tsong,4);/*使用wait 阻塞子進(jìn)程,直到孫子進(jìn)
22、程播放完才能被喚醒;當(dāng)被喚醒時,表示播放MP3 期間沒有按鍵按下,則繼續(xù)順序播放下一首MP3*/if(newfd = wait(NULL)currentsong = currentsong->next;printf("THE NEXT SONG IS %sn",currentsong->songname);/*MP3 音樂播放器->調(diào)用play 函數(shù)播放音樂*/void startplay(pid_t *childpid,struct song *my_song)pid_t pid;/如果沒有音樂正在播放并且不是處于暫停狀態(tài)if(play_flag = 0
23、) && (play_pause_flag != 1)play_flag = 1;play_stop_flag = 0;/*創(chuàng)建子進(jìn)程*/pid = fork();if(pid > 0) /父進(jìn)程*childpid = pid; /子進(jìn)程PID 初始化sleep(1);/*讀取共享內(nèi)存保存的pid,初始化孫子進(jìn)程的pid*/*p_addr 指向共享內(nèi)存,保存的是孫子進(jìn)程的ID*/memcpy(&gradchild,p_addr,sizeof(pid_t);else if(0 = pid) /子進(jìn)程/*子進(jìn)程播放MP3 函數(shù)*/play(my_song);/如果沒有
24、音樂正在播放并處于暫停狀態(tài)else if(play_flag = 0) && (play_pause_flag = 1)play_flag = 1;play_pause_flag = 0;conti_play(gradchild);elsereturn;/*MP3 音樂播放器->暫停播放*/void my_pause(pid_t pid)if(play_flag = 1) && (play_pause_flag = 0)printf("=PAUSE!PRESS PLAY TOCONTINUE=n");kill(pid,SIGSTOP);
25、 /對孫子進(jìn)程發(fā)送SIGSTOP 信號play_pause_flag = 1;play_flag = 0;elsereturn;/*MP3 音樂播放器->繼續(xù)播放*/void conti_play(pid_t pid)printf("=CONTINUE=n");kill(pid,SIGCONT); /對孫子進(jìn)程發(fā)送SIGCONT 信號/*MP3 音樂播放器->播放下一首*/*只有正在播放音樂的狀態(tài)下,上一首和下一首才有作用*/void next(pid_t next_pid)int res;if(play_flag = 0)return;elsestruct s
26、ong *nextsong;printf("=NEXTMP3=n");/*從共享內(nèi)存獲得孫子進(jìn)程播放歌曲的節(jié)點(diǎn)指針*/memcpy(&nextsong,p_addr + sizeof(pid_t)+1,4);/*指向下首歌曲的節(jié)點(diǎn)*/nextsong = nextsong->next;/*殺死當(dāng)前歌曲播放的子進(jìn)程,孫子進(jìn)程*/res = kill(pid,SIGKILL);if(res = -1)perror("kill next pid error");return;res = kill(next_pid,SIGKILL);if(res
27、= -1)perror("kill next next_pid error");res=system("killall madplay");if(res = -1) perror("system");/wait(NULL);play_flag = 0;startplay(&pid,nextsong);/*MP3 音樂播放器->播放上一首*/void prev(pid_t prev_pid)int res;if(play_flag = 0)return;else struct song *prevsong;/*從共享內(nèi)存獲
28、得孫子進(jìn)程播放歌曲的節(jié)點(diǎn)指針*/printf("=PRIORMP3=n");memcpy(&prevsong,p_addr + sizeof(pid_t)+1,4);/*指向上首歌曲的節(jié)點(diǎn)*/prevsong = prevsong->prev;/*殺死當(dāng)前歌曲播放的子進(jìn)程,孫子進(jìn)程*/res = kill(pid,SIGKILL);if(res = -1)perror("kill prev pid error");return;res = kill(prev_pid,SIGKILL);if(res = -1)perror("kil
29、l prev prev_pid error");res=system("killall madplay");if(res = -1) perror("system");/wait(NULL);play_flag = 0;startplay(&pid,prevsong);/*MP3 音樂播放器->停止播放*/void my_stop(pid_t g_pid)int res;if(play_stop_flag = 1)/如果已經(jīng)停止,直接返回return;if(play_flag = 1) | (play_pause_flag = 1
30、)printf("=STOP!PRESS PLAY TOSTART=n");res = kill(pid,SIGKILL); /對子進(jìn)程發(fā)送SIGKILL 信號if(res = -1)perror("stop pid error");return;res = kill(g_pid,SIGKILL); /對孫子進(jìn)程發(fā)送SIGKILL 信號if(res = -1)perror("stop g_pid error");res=system("killall madplay");if(res = -1) perror(&q
31、uot;system");play_flag = 0;play_stop_flag = 1;play_pause_flag = 0;elsereturn;/*MP3 音樂播放器->播放列表*/*搜索列表音樂名字與歌曲相匹配,并殺死正在播放歌曲進(jìn)程而播放對應(yīng)列表音樂*/void playlist(pid_t childpid,char *listsong)int res;play_flag = 0;if(strncmp(head->songname,listsong,4) = 0)res = kill(pid,SIGKILL);if(res = -1)perror(&quo
32、t;playlist kill pid error");return;res = kill(childpid,SIGKILL);if(res = -1)perror("playlist kill childpid error");res=system("killall madplay");if(res = -1) perror("system");wait(NULL);startplay(&pid,head);return ;struct song *nextsong=head->next;doif(strnc
33、mp(nextsong->songname,listsong,4)=0)res = kill(pid,SIGKILL);if(res = -1)perror("playlist kill pid error");return;res = kill(childpid,SIGKILL);if(res = -1)perror("playlist kill childpid error");res=system("killall madplay");if(res = -1) perror("system");wait
34、(NULL);startplay(&pid,nextsong);return;nextsong=nextsong->next;while(nextsong!=head);/*接收客戶端命令*/void recvcmd(void)int cmd=0;char bufSIZE;memset(buf,0,sizeof(buf);while(1)int len = recvfrom(server_sockfd,&cmd,4,0,(structsockaddr*)&server_addr,&sin_size);if(len<0)continue;switch
35、(cmd)case PLAY:startplay(&pid,head);break;case PAUSE:my_pause(gradchild);break;case STOP:my_stop(gradchild);break;case NEXT:next(gradchild);break;case PREV:prev(gradchild);break;case LISTSONG:memset(buf,0,sizeof(buf);len=recvfrom(server_sockfd,buf,sizeof(buf),0,(structsockaddr*)&client_addr,
36、&sin_size);if(len>0)printf("recv listbuf = %sn",buf);playlist(gradchild,buf);break;default:puts("not find the cmd!");break;int main()/*創(chuàng)建播放列表*/head=creat_song_list();/*共享內(nèi)存:用于存放子進(jìn)程ID,播放列表位置*/void *tempaddr;if(shmid = shmget(IPC_PRIVATE,5,PERM)= -1)perror("shmget"
37、);tempaddr = shmat(shmid,0,0);if(tempaddr = (void *)-1)perror("shmat");p_addr = (char *)tempaddr;memset(p_addr,'0',1024);/*初始化MP3 播放停止標(biāo)志*/play_flag=0;play_stop_flag=0;play_pause_flag=0;/初始化網(wǎng)絡(luò)int res=create_socket();if(res<0)perror("create_socket");/接收控制命令(死循環(huán));recvcmd(
38、);return 0;2.play.h#ifndef PLAYER_H#define PLAYER_H/*共享內(nèi)存申請標(biāo)記*/#define PERM S_IRUSR|S_IWUSR#define SIZE 1024struct songchar songname1024;struct song *prev;struct song *next;char *playsong;/*播放標(biāo)記*/int play_flag;int play_stop_flag;int play_pause_flag;/*保存接收到的字符串(推送過來的消息)*/char temp_str100;unsigned int
39、 pos;extern void play(struct song *currentsong);extern struct song *creat_song_list(void);extern void startplay(pid_t *childpid,struct song *my_song);extern void my_pause(pid_t pid);extern void my_stop(pid_t g_pid);extern void conti_play(pid_t pid);extern void next(pid_t next_pid);extern void prev(p
40、id_t prev_pid);extern void playlist(pid_t childpid,char *listsong);#endif3.socket.c#include "socket.h"int server_sockfd;socklen_t sin_size;struct sockaddr_in server_addr;struct sockaddr_in client_addr;int create_socket()memset(&server_addr, 0, sizeof(server_addr);/* 初始化網(wǎng)絡(luò)信息*/server_add
41、r.sin_family = AF_INET; /設(shè)置為IP 通信server_addr.sin_addr.s_addr = INADDR_ANY; /無限制server_addr.sin_port = htons(8000);if (server_sockfd = socket(PF_INET,SOCK_DGRAM,0) < 0) return -1;if(bind(server_sockfd, (struct sockaddr *)&server_addr,sizeof(struct sockaddr) < 0) return -1;return 1;sin_size
42、= sizeof(struct sockaddr_in);4.socket.h#ifndef SOCKET_H#define SOCKET_H#include "common.h"#define PLAY 11#define PAUSE 12#define STOP 13#define CONTINUE 14#define NEXT 15#define PREV 16#define LISTSONG 18extern int server_sockfd;extern socklen_t sin_size;extern struct sockaddr_in server_ad
43、dr;extern struct sockaddr_in client_addr;extern int create_socket();#endifmon.h#ifndef _COMMON_H#define _COMMON_H#include <stdio.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#includ
44、e <string.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include <linux/input.h>#include <termios.h>#include <signal.h>#include <sys/select.h>#include <errno.h>#include <sys/wait.h>#include <string.h>#include <sys
45、/ipc.h>#include <sys/shm.h>#include <fcntl.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <signal.h>#define ERROR -1#endif6.makefilename=*.cBIN=playerFLAGS=-g -O2 -Walldefau
46、lt:gcc $(FLAGS) $(name) -o $(BIN)_3.3.2音樂播放器客戶端程序?qū)崿F(xiàn)1,player.cpp#include "player.h"#include "ui_player.h"#include "listmusic.h"#include "socket.h"player:player(QWidget *parent) :QDialog(parent),ui(new Ui:player)ui->setupUi(this);init_socket();player:player()
47、delete ui;void player:on_play_clicked()int cmd = 0;int len;cmd = PLAY;len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr *)&client_addr,sin_size);if (len < 0) QMessageBox:question(this, tr("結(jié)果"),QString(tr("發(fā)送網(wǎng)絡(luò)數(shù)據(jù)失敗");return;void player:on_pause_clicked()int cmd = P
48、AUSE;int len=sendto(client_sockfd,&cmd,4,0,(struct sockaddr*)&client_addr,sin_size);if(len<0)QMessageBox:question(this,tr("結(jié)"),QString(tr("發(fā)送網(wǎng)絡(luò)數(shù)據(jù)失敗");return ;void player:on_next_clicked()int cmd = NEXT;int len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr*)&
49、;client_addr, sin_size);if (len < 0) QMessageBox:question(this, tr("結(jié)"),QString(tr("發(fā)送網(wǎng)絡(luò)數(shù)據(jù)失敗");return;void player:on_prev_clicked()int cmd = PREV;int len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr*)&client_addr, sin_size);if (len < 0) QMessageBox:question(thi
50、s, tr("結(jié)果"),QString(tr("發(fā)送網(wǎng)絡(luò)數(shù)據(jù)失敗");return;void player:on_listbutton_clicked()player xy3;listmusic l;/l.setWindowFlags(Qt:FramelessWindowHint);l.setGeometry(850,250,250,350);/l.show();if(l.exec()=Accepted)xy3.show();void player:on_stop_clicked()int cmd = STOP;int len=sendto(client
51、_sockfd, &cmd, 4,0, (struct sockaddr*)&client_addr, sin_size);if (len < 0) QMessageBox:question(this, tr("結(jié)果"),QString(tr("發(fā)送網(wǎng)絡(luò)數(shù)據(jù)失敗");return;2.play.h#ifndef PLAYER_H#define PLAYER_H#include <QDialog>#include <QtDebug>#include <QTimer>#include <QMes
52、sageBox>#include <QFileDialog>#include <QTextCodec>#include <QDateTime>#include <QProgressDialog>#include "socket.h"namespace Ui class player;class player : public QDialogQ_OBJECTpublic:explicit player(QWidget *parent = 0);player();private slots:void on_play_clic
53、ked();void on_pause_clicked();void on_next_clicked();void on_prev_clicked();void on_listbutton_clicked();void on_stop_clicked();private:Ui:player *ui;#endif / PLAYER_H3.socket.cpp#include "socket.h"/* 網(wǎng)絡(luò)通信變量*/int client_sockfd;int len;int sin_size;struct sockaddr_in client_addr;void init_s
54、ocket()/* 創(chuàng)建socket 跟設(shè)備進(jìn)行通信*/client_addr.sin_family = AF_INET;client_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); /服務(wù)器IP/client_addr.sin_addr.s_addr = inet_addr("192.168.1.6");client_addr.sin_port = htons(8000);if (client_sockfd = socket(PF_INET,SOCK_DGRAM,0) < 0) printf(&quo
55、t;socket errorn");exit(-1);sin_size = sizeof(struct sockaddr_in);#ifndef SOCKET_H#define SOCKET_H4.socket.h/* 網(wǎng)絡(luò)數(shù)據(jù)頭文件*/#include <stdio.h>#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h&
56、gt;#include <sys/stat.h>#include <fcntl.h>#include <sys/time.h>#include <stdlib.h>#define PLAY 11#define PAUSE 12#define STOP 13#define CONTINUE 14#define NEXT 15#define PREV 16#define LISTSONG 18extern void init_socket();extern int client_sockfd;extern int len;extern int sin
57、_size;extern struct sockaddr_in client_addr;#endif / SOCKET_H第四章 調(diào)試過程4.1硬件連接實(shí)訓(xùn)機(jī)器的硬件配置要求如下:硬件類型 主講機(jī)器 學(xué)員機(jī)器CPU:(主講機(jī)器)基本 Intel Pentium® 系列2.0GHz 以上,推薦Intel Pentium® 系列雙核;(學(xué)員機(jī)器)Intel Pentium® 系列1.6GHz 以上,推薦Intel Pentium® 系列2.0GHz 以上。內(nèi)存:(主講機(jī)器)基本 DDR3 系列內(nèi)存2GB 容量 DDR3 系列內(nèi)存2 容量,推薦 DDR3 系列內(nèi)存4GB 容量 DDR3 系列內(nèi)存4GB 容量
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報參考:明代戲曲的少數(shù)民族書寫研究
- 二零二五年度智慧城市人工費(fèi)承包合同協(xié)議2篇
- 二零二五年度民房租賃合同終止協(xié)議范本
- 2025年度建筑模板施工班組質(zhì)量保修服務(wù)合同
- 2025年度個人在線教育平臺會員貸款合同(含課程更新)4篇
- 河南省鄭州市智林學(xué)校高三上學(xué)期期末考試語文試題(含答案)
- 二零二五年度抹灰施工安全教育培訓(xùn)資源共享合同4篇
- 二零二五年度新型木門安裝與綠色建材采購合同4篇
- 2025年度企業(yè)內(nèi)部培訓(xùn)項目合同書范本4篇
- 2025年度苗木養(yǎng)護(hù)與生態(tài)園林景觀改造合同4篇
- CONSORT2010流程圖(FlowDiagram)【模板】文檔
- 腦電信號處理與特征提取
- 游戲綜合YY頻道設(shè)計模板
- 高中數(shù)學(xué)知識點(diǎn)全總結(jié)(電子版)
- GB/T 10322.7-2004鐵礦石粒度分布的篩分測定
- 2023新譯林版新教材高中英語必修一重點(diǎn)詞組歸納總結(jié)
- 蘇教版四年級數(shù)學(xué)下冊第3單元第2課時“常見的數(shù)量關(guān)系”教案
- 弘揚(yáng)中華傳統(tǒng)文化課件
- 基于協(xié)同過濾算法的電影推薦系統(tǒng)設(shè)計
- 消防應(yīng)急預(yù)案流程圖
- 人教統(tǒng)編版高中語文必修下冊第六單元(單元總結(jié))
評論
0/150
提交評論