版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学校代码:10128学 号:201120201023力拾t7于夫孳嵌入式系统综合设计说明书题 目:智能车系统一mp流放器设计与实现学生姓名:杜继凤组员:王嘉敏杜继凤学院:信息工程学院班级:计算机11 -2班指导教师:庄旭菲王晓强蒋贵良刘志强2014年3月15日摘要嵌入式项目 t-car 智能小车是嵌入式技术和物联网技术结合的产物。 tcar以三星高端微处理器为主控实现主要控制工作,将wifi 无线通信与zigbee 近距离无线组网通信相结合实现近距离和远程无线控制、信息采集等功能。 t-car即可作为互联网终端、 物联网网关, 也可以和工业控制、 智能家居等系统融合使用。本课题目的是在 arm
2、-linux 嵌入式环境下实现网络功能,系统主要由硬件层、内核层、应用层三部分构成。由于 linux 具有可移植度高、自由、免费等特性, 最近几年, 它在移动设备和个人电脑领域的应用也越来越广泛, 因此我们选择 linux 操作系统, 鉴于以上应用领域对用户界面友好性方面的要求, 几乎所有的此类应用都是采用图形用户界面。播放界面采用 qt 设计, qt 是创造图形用户界面的最流行的跨平台gui工具箱之一。这里将通过一个使用qt技术的简单mp3播放器的实现,详细描述linux 环境下的图形界面编程技术。本实训课程是嵌入式应用开发方向的实训课程, 主要介绍嵌入式应用程序的开发技术, 课程内容涉及c
3、 语法及核心库、 嵌入式 linux 开发环境、 嵌入式 linux应用开发流程。 在内容组织上, 以案例贯穿课程的始终。 通过一系列案例的学习使学员能基本掌握嵌入式linux 应用程序开发的基本技术,能开发出有图形界面,可交互,具有一定业务逻辑的嵌入式linux 应用程序。关键字 : 嵌入式; qt ; mp3 播放器;目录前言 1第一章概述 21.1 课程设计目的 21.2 课程背景与要求 21.2.1 课程设计背景 21.2.2 课程设计要求 31.3 课程设计环境 3第二章设计方案 42.1 设计功能 42.2 设计思路 4第三章软件设计 53.1 模块流程图 53.2 madplay
4、 移植 63.3 程序清单 63.3.1 音乐播放器服务器程序实现 63.3.2 音乐播放器客户端程序实现 19第四章调试过程 244.1 硬件连接 244.2 软件连接 244.2.1 操作系统 244.2.2 系统软件 244.2.3 工具软件 244.2.4 文档和资源 254.3 实验步骤 254.4 出现的问题和解决方法 254.5 运行结果截屏 26第五章总结 28参考文献 29前言随着社会的日益信息化, 计算机和网络已经全面渗透到日常生活的每一个角落。 对于我们每个人来说, 需要的已经不再仅仅是那种放在桌上处理文档、 进行 工作管理和生产控制的计算机机器。 任何一个普通人都可能拥
5、有从小到大的各种使用嵌入式技术的电子产品,小到mp3 pda等微型数字化产品,大到网络家电、 智能家电、 车载电子设备等。 目前, 各种各样的新型嵌入式系统设备在应用数量上已经远远超过了通用计算机。 在工业和服务领域中, 使用嵌入式技术的数字机床、 智能工具、 工业机器人、 服务机器人正在逐渐改变着传统的工业生产和服务 方式。mp31嵌入式的最主要应用之一,高端的mp3已经不仅仅着眼于实现音乐播 放这一简单功能, 而是同时具备了文本浏览、 图片浏览、 甚至视频播放等强大功 能。本文重点讨论了基于 wifi智能车的控制系统为主其中 mp的功能的实现, 包括开发环境建立、内核配置与编译、 qt 开
6、发等一系列详细过程。近几年,嵌入式系统技术得到了广泛的应用,普适计算、无线传感器网络、可重构计算等新兴技术的出现又为嵌入式系统技术的研究与应用注入了新的活力。 智能手机、 信息家电、 汽车电子、 家用机器人, 嵌入式系统已 “无处不在” 。嵌入式系统是当今最热门的概念之一。作为一个系统, 往往是在硬件和软件双螺旋式交替发展的支撑下逐渐趋于稳 定和成熟,嵌入式系统也不例外。29第一章 概述嵌入式项目 t-car 智能小车是嵌入式技术和物联网技术结合的产物。 tcar以三星高端微处理器为主控实现主要控制工作,将wifi 无线通信与zigbee 近距离无线组网通信相结合实现近距离和远程无线控制、信息
7、采集等功能。 t-car即可作为互联网终端、 物联网网关, 也可以和工业控制、 智能家居等系统融合使用。1.1 课程设计目的嵌入式系统设计与实践课程设计介绍基本设计与实现方法, 是为计算机科学与技术专业本科生开设的一门重要的专业课程。 是对以前所学很多知识的汇总和深化。 通过三周的设计, 能把以前很多所学的理论联系实际, 培养学生的实验动手能力和创新意识, 使学生对嵌入式系统有更全面的认识, 掌握嵌入式系统的设计与开发的方法,为将来进行嵌入式应用系统的设计与开发奠定基础。1.2 课程背景与要求1.2.1 课程设计背景物联网是一个基于互联网、 传统电信网等信息承载体, 让所有能够被独立寻址的普通
8、物理对象实现互联互通的网络。 物联网通过智能感知、 识别技术与普适计算、 泛在网络的融合应用, 被称为继计算机、 互联网之后世界信息产业发展的第三次浪潮。 物联网被视为互联网的应用拓展, 应用创新是物联网发展的核心,以用户体验为核心的创新2.0 是物联网发展的灵魂。随着物联网的发展,越来越多的物联网控制终端将涌现, 对于相关技术的学习需求和基于该领域的就业机会将大增,本智能车就是在此前提下诞生的。该智能车具有很强的操控性、 可玩性, 同时融入嵌入式物联网相关技术, 使学员可在相对轻松愉悦的环境中学习各种技术, 让嵌入式技术的学习变得不在枯燥。本车设计之初既考虑了可产品化空间, 也考虑了技术知识
9、点的涵盖, 使学习更能明确目标; 同时本项目在选材上也考虑了项目的手工打造的可能性, 意在锻炼学员的动手实践能力, 只要学习者有兴趣, 即可按所提供的材料清单和学习的相关技术自行打造,我们更希望能培养学习者的创客精神和创业欲望与意识。1.2.2 课程设计要求要求采用 c/s 架构,完成对网络音乐播放器软件的分析、设计、编码、测试等工作。音乐播放器功能说明: 服务器实现完整的音乐播放器功能, 客户端通过网络实现控制操作。包括如下:1、 madplay 音乐播放器移植。2、音乐播放器服务器设计,通过网络接收客户端请求并执行对应动作,实现音乐播放、暂停、上一首、下一首、播放列表、停止等功能;3、 q
10、t 客户端界面设计,要求利用 qt 设计控制客户端界面,实现通过网络向服务器发送命令请求等功能。1.3 课程设计环境环境要求:操作系统: windows 7+ubuntu 虚拟系统平台:vim编辑器,gnut具链,qtcreator集成开发环境开发语言:c/c+文档环境:windows office第二章 设计方案2.1 设计功能音乐播放器功能说明: 服务器实现完整的音乐播放器功能, 客户端通过网络 实现控制操作。包括如下:1、 madplay 音乐播放器移植;2、音乐播放器服务器设计,通过网络接收客户端请求并执行对应动作,实现音乐播放、暂停、上一首、下一首、播放列表、停止等功能;3、 qt
11、客户端界面设计,要求利用 qt 设计控制客户端界面,实现通过网络 向服务器发送命令请求等功能。2.2 设计思路1、开发环境搭建,虚拟机配置相关vim 编辑器,gcc 编译器等相关软件配置。2、 madplay 音乐播放器移植,包括libmad 音频解码库的使用,所以首先需要移植madplay,具体方法如下:1)创建安装库的路径sudo mkdir /opt/arm/madplay/lib2)进入madplay 源码目录 执行 ./build3 ) 测试将 madplay 和库文件复制到根文件系统, 配置 ld_library_path, 执行 madplay xxx.mp3 。3、服务器端程序
12、设计,采用 c语言在linux环境在完成音乐播放器功能。4、利用qtcreator 设计客户端界面,实现向服务器发送控制命令等功能第三章软件设计3.1模块流程图图1.1模块流程图3.2 madplay 移植(1) 首先建立一个mp3 文件夹, 进入到 mp3 文件夹后再建立两个文件夹, 一个存放源码,一个存放安装文件。在home 下, mkdir 两个文件夹: madplay-src 、madplay。依次解压四个源码包到 madplay目录下:tar zxvf xxx.tar.gz(2) 编译 zlib-1.1.4进入 zlib 源文件目录,依此执行./configure9 / 26make
13、 make install(3) 编译libid3tag进入tag 源码目录,依此执行./configure make make install(4) 编译libmad进入 libmad 源码,依此执行./configuremake注:使用的是高版本的arm-linux-gcc口 4.4.6 编译器,make时可能会出现“ ccl:error:unrecognized command line optfonrcemem ” 错误, 这是因为这个高版本的gccs有 -fforcemem数,解决的办法是在libmad 文件中的makefile里面查找 -fforcemem ,将其删除即可 make
14、 install(5) 编译madplay进入 madplay 源码目录,依止匕执行./configure - -with alsa makemakeinstall(6) 测试madplay执行命令 ( 配置环境变量) : export ld_library_path=$ld_library_path/usr/local/lib运行: madplay xx.mp33.3 程序清单3.3.1 音乐播放器服务器程序实现1.player.c#include common.h#include socket.h#include player.h/* 孙子进程 id 号*/pid_t gradchild;
15、/* 子进程 id 号*/pid_t pid;/*共享内存描述标记*/int shmid;char *p_addr;/* 共享内存内容格式*/*|gradchild( 孙子进程pid) |+ |空一个 字节|+ currentsong(当前播放列表的节点指针) |*/*listhead for music*/struct song* head;/*创建歌曲名的双向循环链表*/struct song *creat_song_list(void)file *fd;ssize_t size;size_t len;char *line = null;struct song *p1;struct son
16、g *p2;int res=system(ls ./song song_list);if(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);printf(= =n);size = getline(&line,&len,fd);strncpy(p1
17、-songname,line,strlen(line);head = p1;int n=strlen(line);(head-songname)n=0;从文件中读取一行,直到while(size = getline(&line,&len,fd) != -1) /出错或者到文件尾eof 返回 -1 p2 = p1;p1 = (struct song *)malloc(sizeof(struct song);strncpy(p1-songname,line,strlen(line);p2-next = p1;p1-prev = p2;int n=strlen(line);(p1-songname)
18、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 音乐播放器- 播放音乐函数*/void play(struct song *currentsong)pid_t newfd;char *c_addr;void *tempaddr;char *p;int len;char my_song2048=./song/;while(currentsong)printf(currentsong siz
19、e=%dn,strlen(currentsong-songname);/*子进程创建孙子进程*/ newfd = fork();if(newfd = -1) perror(fork);孙子进程exit(1);else if(newfd = 0) /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
20、,strlen(my_song);/* 运行 madplay 播放器,播放mp3*/execl(/usr/local/sbin/madplay,madplay,my_song,null);/播放 当前列表mp3音乐 printf(nnn);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,&curr
21、entsong,4);/* 使用 wait 阻塞子进程,直到孙子进程播放完才能被唤醒;当被唤醒时,表示播放mp3期间没有按键按下,则继续顺序播放下一首mp3*/if(newfd = wait(null) currentsong = currentsong-next; printf(the next song is %sn,currentsong-songname);/*mp3 音乐播放器- 调用 play 函数播放音乐 */void startplay(pid_t *childpid,struct song *my_song) pid_t pid;/ 如果没有音乐正在播放并且不是处于暂停状态i
22、f(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); else if(0 = pid) / 子进程/*子进程播放mp3函数*/ play(my_song);/如
23、果没有音乐正在播放并处于暂停状态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 to continue=n);kill(pid,sigstop); /对孙子进程发送 sigstop号play_pause
24、_flag = 1;play_flag = 0;elsereturn;/*mp3音乐播放器- 继续播放*/void conti_play(pid_t pid)printf(=continue= =n);kill(pid,sigcont); /对孙子进程发送 sigcontw号/*mp3音乐播放器- 播放下一首*/*只有正在播放音乐的状态下,上一首和下一首才有作用*/void next(pid_t next_pid)int res;if(play_flag = 0)return;elsestruct song *nextsong;printf(=nextmp3= =n);/*从共享内存获得孙子进
25、程播放歌曲的节点指针*/memcpy(&nextsong,p_addr + sizeof(pid_t)+1,4);/*指向下首歌曲的节点*/nextsong = nextsong-next;/*杀死当前歌曲播放的子进程,孙子进程*/res = kill(pid,sigkill);if(res = -1)perror(kill next pid error);return;res = kill(next_pid,sigkill);if(res = -1)perror(kill next next_pid error);res=system(killall madplay);if(res = -1
26、) 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;/*从共享内存获得孙子进程播放歌曲的节点指针*/printf(=priormp3=n);memcpy(&prevsong,p_addr + sizeof(pid_t)+1,4);/* 指向上首歌曲的节点 */prevsong = prevsong-prev;
27、/* 杀死当前歌曲播放的子进程,孙子进程*/res = kill(pid,sigkill);if(res = -1)perror(kill prev pid error);return;res = kill(prev_pid,sigkill);if(res = -1)perror(kill prev prev_pid error);res=system(killall madplay);if(res = -1) perror(system);/wait(null);play_flag = 0;startplay(&pid,prevsong);/*mp3 音乐播放器- 停止播放 */void m
28、y_stop(pid_t g_pid)int res;if(play_stop_flag = 1)/ 如果已经停止,直接返回return;if(play_flag = 1) | (play_pause_flag = 1)printf(=stop!press play to start=n);res = kill(pid,sigkill); / 对子进程发送sigkill 信号if(res = -1)perror(stop pid error);return;res = kill(g_pid,sigkill); / 对孙子进程发送sigkill 信号if(res = -1)perror(stop
29、 g_pid error);res=system(killall madplay);if(res = -1) perror(system);play_flag = 0;play_stop_flag = 1;play_pause_flag = 0;elsereturn;/*mp3 音乐播放器- 播放列表 */* 搜索列表音乐名字与歌曲相匹配, 并杀死正在播放歌曲进程而播放对应列表音乐*/void playlist(pid_t childpid,char *listsong)int res;play_flag = 0;if(strncmp(head-songname,listsong,4) = 0
30、) 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(null);startplay(&pid,head);return ;struct song *nextsong=head-next;doif(strncmp(next
31、song-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(null);startplay(&pid,nextsong);return;nextsong=nextsong-n
32、ext;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,(struct sockaddr*)&server_addr,&sin_size);if(len0)printf(recv listbuf = %sn,buf); playlist(gradchild,buf); break;default:puts(not find the cmd!);b
33、reak; int main() /* 创建播放列表*/head=creat_song_list();/* 共享内存:用于存放子进程id ,播放列表位置*/void *tempaddr;if(shmid = shmget(ipc_private,5,perm)= -1) perror(shmget);tempaddr = shmat(shmid,0,0);if(tempaddr = (void *)-1) perror(shmat);p_addr = (char *)tempaddr; memset(p_addr,0,1024);/*初始化mp3播放停止标志*/play_flag=0;play
34、_stop_flag=0;play_pause_flag=0;/ 初始化网络int res=create_socket();if(res0)perror(create_socket);/ 接收控制命令(死循环);recvcmd();return 0;2.play.h#ifndef player_h#define player_h/* 共享内存申请标记*/#define perm s_irusr|s_iwusr#define size 1024struct songchar songname1024;struct song *prev;struct song *next;char *playso
35、ng;/* 播放标记 */int play_flag;int play_stop_flag;int play_pause_flag;*/* 保存接收到的字符串(推送过来的消息)char temp_str100;unsigned int 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);
36、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(pid_t prev_pid);extern void playlist(pid_t childpid,char *listsong);#endif3.socket.c#include socket.hint server_sockfd;socklen_t sin_size;struct sockaddr_in server_addr;struct sockadd
37、r_in client_addr;int create_socket()memset(&server_addr, 0, sizeof(server_addr);/* 初始化网络信息 */server_addr.sin_family = af_inet; / 设置为 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_s
38、ockfd, (struct sockaddr *)&server_addr,sizeof(struct sockaddr) 0) return -1;return 1;sin_size = 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 18ext
39、ern int server_sockfd;extern socklen_t sin_size;extern struct sockaddr_in server_addr;extern struct sockaddr_in client_addr;extern int create_socket();#mon.h#ifndef _common_h#define _common_h#include #include #include #include #include #include #include #include #include #include #include
40、#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define error -1#endif6.makefilename=*.cbin=playerflags=-g -o2 -walldefault:gcc $(flags) $(name) -o $(bin)3.3.2 音乐播放器客户端程序实现1, player.cpp#include player.h#i
41、nclude ui_player.h#include listmusic.h#include socket.hplayer:player(qwidget *parent) :qdialog(parent),ui(new ui:player)ui-setupui(this);init_socket();player:player()delete ui;void player:on_play_clicked()int cmd = 0;int len;cmd = play;len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr *)&client_
42、addr, sin_size);if (len 0) qmessagebox:question(this, tr(结果 ),qstring(tr( 发送网络数据失败);return;void player:on_pause_clicked()int cmd = pause;int len=sendto(client_sockfd,&cmd,4,0,(struct sockaddr*)&client_addr,sin_size);if(len0)qmessagebox:question(this,tr( 结 ),qstring(tr( 发送网络数据失败 );return ;void player
43、:on_next_clicked()int cmd = next;int len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr*)&client_addr, sin_size);if (len 0) qmessagebox:question(this, tr(结),qstring(tr( 发送网络数据失败);return;void player:on_prev_clicked()int cmd = prev;int len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr*)&client_
44、addr, sin_size);if (len 0) qmessagebox:question(this, tr(结果 ),qstring(tr( 发送网络数据失败);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
45、 = stop;int len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr*)&client_addr, sin_size);发送if (len 0) qmessagebox:question(this, tr(结果 ),qstring(tr(网络数据失败);return;2.play.h#ifndef player_h#define player_h#include #include #include #include #include #include #include #include #include socket.hnamesp
46、ace ui class player;class player : public qdialogq_objectpublic:explicit player(qwidget *parent = 0);player();private slots:void on_play_clicked();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 /
47、player_h3.socket.cpp#include socket.h/* 网络通信变量*/int client_sockfd;int len;int sin_size;struct sockaddr_in client_addr;void init_socket()/* 创建 socket 跟设备进行通信*/client_addr.sin_family = af_inet;client_addr.sin_addr.s_addr = inet_addr(); /服务器 ip/client_addr.sin_addr.s_addr = inet_addr(192.168.1
48、.6);client_addr.sin_port = htons(8000);if (client_sockfd = socket(pf_inet,sock_dgram,0) 0) printf(socket errorn);exit(-1);sin_size = sizeof(struct sockaddr_in);#ifndef socket_h#define socket_h4.socket.h/* 网络数据头文件*/#include #include /* see notes */#include #include #include #include #include #include
49、 #include #include # 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_size;extern struct sockaddr_in client_addr;# endif / socket_h第四章 调试过程4.1 硬件连接实训机器的硬件配置要求如下:硬件类型 主讲机器 学员机器cpu:(主讲机器)基本intel pentium ?系列2.0ghz以上,推荐intel pentium? 系列
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 普阳电工考试题库及答案
- 2025年现代农业行业现代农业发展模式研究报告及未来发展趋势预测
- 产品市场分析SWOT矩阵模板
- 2025年数字化金融服务创新模式研究报告及未来发展趋势预测
- 跨行业合同管理工具风险控制辅助
- 岗位技能标准定义文件标准化工作流程模板
- 2025年物流行业物流科技创新对物流行业影响分析报告
- 恪守学术诚信声明书(5篇)
- 行政文件归档模板机关工作工作版
- 企业知识管理体系建设方案模版
- 钢厂机械回收合同范本
- 废旧轮胎回收利用综合汇报
- 2026步步高六册同步物理必修3-第十二章 3 第2课时 伏阻法和安阻法测电池的电动势和内阻
- 全国大学生职业规划大赛《土木工程》专业生涯发展展示
- 2023年同等学力申硕英语3000核心词汇
- 舞蹈老师职业介绍
- 临时起降点管理办法
- 心理健康教育自我成长报告
- 附件:佛山市房屋市政工程生产安全重大事故隐患排查、判定、治理、处罚工作指引
- 蛋品冷链物流配送服务创新创业项目商业计划书
- 货代操作标准化流程
评论
0/150
提交评论