mp3播放系统毕业设计.doc

上传人:仙人指路1688 文档编号:2392520 上传时间:2023-02-17 格式:DOC 页数:39 大小:1.48MB
返回 下载 相关 举报
mp3播放系统毕业设计.doc_第1页
第1页 / 共39页
mp3播放系统毕业设计.doc_第2页
第2页 / 共39页
mp3播放系统毕业设计.doc_第3页
第3页 / 共39页
mp3播放系统毕业设计.doc_第4页
第4页 / 共39页
mp3播放系统毕业设计.doc_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《mp3播放系统毕业设计.doc》由会员分享,可在线阅读,更多相关《mp3播放系统毕业设计.doc(39页珍藏版)》请在三一办公上搜索。

1、 设计题目: 基于arm-linux的mp3播放系统 学 院: 计算机与信息学院 专业年级: 2008级电子信息工程 学 号: 081151077 学生姓名: 陈立臣 指导教师、职称: 罗超助教 2011年 5 月 10 日The newsstand management system College: Computer and Information Science Specialty and Grade: Electronic Information Engineering, 2007 Number: 081151077 Name: ChenLichen Advisor: Assistan

2、t Professor LuoChao Submitted Time: May 10,2012 目 录摘要IABSTRACTII1 引言- 1 -1.1目的和意义- 1 -1.2 研究现状- 1 -1.3课题研究的内容及目标- 1 -2 二次开发平台的构建- 3 -2.1 开发平台介绍- 3 -2.2 XDK2使用指南- 13 - 2.2.1运行环境.- 13 2.2.2终端概述.- 13 2.2.3XDK2的安装- 13 3基于MINIGUI用户界面设计-16 -3.1嵌入式MiniGUI介绍-16 -3.2用户界面设计-16 -3.2.1 菜单级别- 16 -4 报刊亭数据库管理- 21

3、-4.1 SQLite介绍- 21 -4.2数据结构跟数据库操作函数封装- 22 -5 终端与平台的数据通信- 25 -5.1 HTTP协议介绍- 25 -5.2平台与终端的通信的编程实现- 27 -6 结束语-32 -参考文献-33 -致谢-34 -摘要随着报刊亭在各个城市迅速发展,极大的方便了现代人们对于报刊购买的需求,通过报刊亭人们可以更加便利的购买到书籍和报刊。但是,传统的报刊亭的人工管理报刊进销存业务,由于报刊进销存管理工作量大,易出错,已经不能满足人们日益增长的需求。因此,报刊亭的智能化管理系统对于报刊亭管理人员进行对报刊进销存业务管理具有十分重要的意义,极大地提高工作效率。本文设

4、计并实现了基于XDK2二次开发平台的报刊管理系统。针对本课题所采用二次开发平台,详细介绍了XDK2开发平台的使用指南,接着在终端实现基于MiniGUI的系统用户界面的设计,数据库的创建和操作,最后介绍了终端与平台通讯协议,最后根据通讯协议,实现平台与终端的通信。报刊管理系统采用了MiniGUI作为管理系统的图形用户界面支持系统,数据库则采用SQLite,应用程序完全基于插件的形式实现,具有高度的灵活和可配置性。用户可以很方便的通过配置,设置需要实现的各个插件以及相应功能,有利于功能扩展。 关键词:MiniGUI;二次开发;XDK2;嵌入式系统AbstractWith the rapid dev

5、elopment of the newsstands located in different cities,they brings great convenience to the modern people for purchasing the newspaper. people can be more convenient to buy the newspaper and books through the newsstands .However, the traditional artificial management of the newsstand invoicing needs

6、 so much workload and is prone to errors.It can not meet the growing needs of people.Therefore,the newsstands intelligent management system has the very vital significance for the people to manage the newsstandss invoicing and can improve the work efficiency.This paper designed and realized the news

7、stand management system based on the XDK2 second development software system. According to the second development platform I adopted in the topic,I particluarly introduce the development platforms user manual, then I realize the design of user interface on the terminal based on MiniGUI and the creat

8、ion and operation. At last, the paper introduces the communication protocol between terminal and platform .According to communication protocol, I realize the communication between the platform and the terminal.The newsstand management system uses the MiniGUI as the the graphical user interface suppo

9、rt system, and the database used the SQLite.The applications are completely based on the form of the plugin ,so it have a high degree of flexibility and can be easily configured. The users can easily make the configurations and set the need to implement various plug-ins and the corresponding functio

10、ns, benefiting to function expansion.Keywords : MiniGUI; Secondary development; XDK2;Embedded system 1 引言1.1目的和意义近几年来,报刊亭在各个城市遍地开花,已成为城市的公共设施,极大的满足了现代社会对于报刊的购买需求。传统的报刊亭采用人工管理报刊进销存业务,工作量大,易出错,极大的限制了报刊书籍零售的发展,已不能完全满足现代信息社会的需要,人们对报刊亭采用智能化和信息化管理产生了需求,针对现状开发了本系统。本系统是采用嵌入式系统作为开发终端进行的二次软件开发,采用MiniGUI作为本系统的

11、图形用户界面支持系统,数据库采用SQLite3。嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可以剪裁,对功能,可靠性,成本,体积和功耗有严格要求的专用计算机系统1。通过在终端进行软件二次开发实现本系统的功能,能很好满足报刊亭管理人员对于书籍和报刊的管理,有效的提高效率。1.2 研究现状MiniGUI是由北京飞漫软件技术有限公司创办的开源Linux图形用户界面支持系统,经过近些年的发展,MiniGUI已经发展成为比较成熟的性能优良的、功能丰富的跨操作系统的嵌入式图形界面支持系统。它目前已经广泛应用于通讯、医疗、工控、电子、机顶盒、多媒体等领域。SQLite,是一款轻型的数据库,是遵守A

12、CID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。1.3课题研究的内容及目标1) 课题研究内容(1) XDK2二次开发平台的搭建;(2) 基于MiniGUI的图形用户界面设计;(3) SQLite数据库常用操作函数封装;(4) 终端

13、与平台通信的实现;2) 课题研究目标实现报刊管理系统,有效管理进销存业务,即用户可以通过本系统进行报刊的零售结算,并能查询销售记录,并通过与平台的通信实现报刊的进货请求,实现进货功能,并能通过本系统对于报刊亭存货的统计与查找。2 二次开发平台的构建2.1 开发平台介绍XDK2,是福建实达电脑设备有限公司开发的针对某些终端产品在Windows平台下的二次开发软件。它作为一个插件,集成于Visual Studio 2008,结合Visual Studio 2008强大的IDE编程环境,提供了应用程序向导模板、工程设置、终端程序编译、程序下载以及应用程序模拟器等功能,为开发终端产品应用程序提供了一个

14、高效、易用的二次开发平台,大大缩短了开发周期和难度。1) 程序结构XDK的程序结构包括三个主要部分:附加库,插件库和应用程序。XDK生成的应用程序,完全基于插件的形式实现。使用插件的好处在于高度灵活和可配置性。用户可以很方便的通过配置,设置需要实现的各个插件以及相应功能。实质上,XDK提供的二次开发功能,即是用户可以自行编写其中的一个功能插件。 2) 主要程序库介绍(1) LibCommon LibCommon公用函数库。Common将系统需要的常用函数,内码转换等接口统一到Common库中。主要包含有以下几个功能。 编码转换:Base64, Unicode编码转换,MD5加密算法实现。 压缩

15、解压:Zip压缩,解压算法实现。 XML解析:TinyXML进行XMLDom解析。 其他杂项:字符串处理,链表处理,文件操作,ini 操作等相关使用函数。 (2) OSLayer OSLayer,系统适配层。将系统相关的函数进行封装后调用。 提供的接口有以下几个方面: Semaphore相关接口:信号量封装实现 Event相关接口:系统事件接口的实现。 Thread相关接口:线程相关接口封装。 Timer相关接口:定时器相关接口。 Mutex相关接口:信号互斥锁实现。 Trace模块:对程序的调试信息可以过滤,并设置优先级后,按需输出。 (3) LibNet Sock相关接口:对TCP端口的打

16、开,关闭,发送,接收数据等接口进行了二次封装。 PPP相关接口:建立PPP连接相关操作接口3) 程序插件架构LINUX的程序很大程度上依赖插件实现功能。有了插件功能,给予了LINUX应用程序高度的灵活和可扩展性。新功能的添加不需要编译整个应用程序。只需添加入相应的功能插件即可。插件模块通过插件加载器加载插件,并从插件中获取插件信息。一般在插件加载的初始化工作中,还会向服务管理器注册服务接口,并提供给插件模块获取。 要将插件配置进应用程序,首先配置插件配置文件addins_conf.ini。 插件配置文件结构: AddIns modules=插件一,插件二 插件一 name=插件名称 comma

17、nd=插件模块 插件参数一 desc=插件描述 depends=依赖插件一 依赖插件二 state=插件状态0/1 一个配置文件的例子如下:AddIns modules=MainMenu,AddIns2 MainMenu name=菜单插件 command=MainMenu.dll desc=提供菜单的创建等功能 depend= state=1 AddIns2 name=插件示例二 command=Modules.dll desc=插件示例二,用于检验及演示插件系统的插件集成方案的可行性 depend= state=enable插件程序加载和获取接口代码示例: 下面以XDK的modules示例

18、程序为例,首先需要继承IPlugin类,并派生出继承类。主要继承OnLoad,OnUnLoad,GetDllVer三个虚函数,给插件模块加载调用。 在实例化插件类的时候,需要注意一点:新的插件类的类名,尽量避免重复,不同插件间重复的类名,有可能造成插件载入出错的情况。TestPlugin.hpp class CTestPlugin: public IPlugin public: virtual int APICC OnLoad(int nArgc, char * ppcArgv); virtual int APICC OnUnLoad(); virtual int APICC GetDllVe

19、r(); ;将类实例化后,需要实现接口GetInterface。这个接口是插件模块找到插件实例化类的桥梁。通过这个借口,将实例化之后的接口类指针传给插件模块。实现代码如下: extern C DLL_API IRoot * APICC GetInterface(char* pcInterfaceName) if (strcmp(pcInterfaceName, IPlugin) = 0) return new CTestPlugin; return NULL; OnLoad函数主要负责实现首页显示插件加载信息,注册服务池接口,主菜单,暗码等工作。具体的代码将在后面的章节讲述。4) 服务池服务池

20、实质上是一个服务链表,为其他插件提供添加服务及获取服务的接口,服务池是插件与系统,插件与插件之间交互的一个中间站,各插件既可以从这里获取其他插件的服务,也可以通过这里为其他插件提供服务。服务池使用示例: 注册服务接口。 IServicePool * piServicePool = (IServicePool *)OSL_GetServicePool(); piServicePool-AddService(AppFrame_IStartPage, new CStartPage(); 获取服务接口。 IServicePool * piServicePool = (IServicePool *)OS

21、L_GetServicePool(); IDesktop*piDesktop=(IDesktop*)piServicePool-GetService(AppFrame_IDesktop);5) MainMenu 插件MainMenu插件创建和管理一个动态菜单树,这棵树可以动态的添加,删除,修改菜单项及子菜单树,每个子菜单也跟其父菜单具有同样的性质,即这是一棵级数不受限制的菜单树,可以根据用户的需要,随意的在菜单树中扩展菜单及子菜单。菜单插件使用示例: /获取根菜单 HMAINMENU hRoot = piMainMenu-GetRootMenu(); /获取第一级子菜单 HMAINMENUIT

22、EM hMenuItem = piMainMenu-GetMenuItem(hRoot, MainMenu.MainMenu); /在第一级子菜单加入菜单项 piMainMenu-InsertItem2(hMenuItem, 100, TestMenuId, 测试菜单, CardManage.bmp, NULL); /获取TestMenuId二级子菜单 hMenuItem = piMainMenu-GetMenuItem(hRoot, TestMenuId); if ( hMenuItem != 0 ) /在TestMenuId二级子菜单加入菜单项 piMainMenu-InsertItem2

23、(hMenuItem, 0, List, 测试1, ContactList.bmp, NULL); piMainMenu-InsertItem2(hMenuItem, 1, Find, 测试2, ContactFind.bmp, NULL); piMainMenu-InsertItem2(hMenuItem, 2, Add, 测试3, ContactAdd.bmp, NULL); piMainMenu-InsertItem2(hMenuItem, 3, Del, 测试4, ContactDele.bmp, NULL); piMainMenu-InsertItem2(hMenuItem, 4,

24、Group, 测试5, ContactGroup.bmp, NULL); piMainMenu-InsertItem2(hMenuItem, 5, ShowStore, 测试6, ContactSize.bmp, NULL); 6) 插件初始化一个典型的插件初始化流程,即是将菜单注册,服务池注册和暗码注册等初始化工作合并的过程。实际上,也就是将以上章节所说的功能揉合起来罢了。 插件的功能,可以不仅限于嵌入菜单,进行可视化操作的功能的添加。也可以不带任何操作的,没有任何界面提示,仅仅是建立一个线程,后台监控使用。在插件使用时,可以思路更加灵活一些。 结合实例程序,我们来看看,OnLoad接口是如

25、何实现初始化功能的。int CTestPlugin:OnLoad(int nArgc, char * ppcArgv) /获取服务池指针 IServicePool * piServicePool = (IServicePool *)OSL_GetServicePool(); /获取桌面组件指针 IDesktop * piDesktop = (IDesktop *)piServicePool-GetService(AppFrame_IDesktop); /获取首页指针 IStartPage * piStartPage = (IStartPage *)piServicePool-GetServic

26、e(AppFrame_IStartPage); /首页显示插件加载信息。 if ( piStartPage != NULL) piStartPage-SetTipTitle(工程测试); piStartPage-SetTipText(工程测试); /对桌面窗口注册过程函数 piDesktop-RegDialogProc(TestDesktopProc); if ( piServicePool != NULL) IMainMenu *piMainMenu = (IMainMenu *)piServicePool-GetService(MAINMENU_IMainMenu); if ( piMai

27、nMenu != NULL) /获取根菜单 HMAINMENU hRoot = piMainMenu-GetRootMenu(); /获取第一级子菜单 HMAINMENUITEM hMenuItem = piMainMenu-GetMenuItem(hRoot, MainMenu.MainMenu); /在第一级子菜单加入菜单项 piMainMenu-InsertItem2(hMenuItem, 100, TestMenuId,测试菜单,CM.bmp, NULL); /获取TestMenuId二级子菜单 hMenuItem = piMainMenu-GetMenuItem(hRoot, Tes

28、tMenuId); if ( hMenuItem != 0 ) /在TestMenuId二级子菜单加入菜单项 piMainMenu-InsertItem2(hMenuItem, 0, List, 测试1, CL.bmp, NULL); piMainMenu-InsertItem2(hMenuItem, 1, Find, 测试2, CF.bmp, NULL); piMainMenu-InsertItem2(hMenuItem, 2, Add, 测试3, CA.bmp, NULL); piMainMenu-InsertItem2(hMenuItem, 3, Del, 测试4, CD.bmp, NU

29、LL); piMainMenu-InsertItem2(hMenuItem, 4, Group, 测试5, CG.bmp, NULL); piMainMenu-InsertItem2(hMenuItem, 5, Show, 测试6, CS.bmp, NULL); return 0; 7) 调用自己的动态组件库函数XDK2环境允许用户装载自定义组件库,支持模拟器和终端两种环境 创建自定义组件库 与普通的XDK2工程一样,可以通过工程向导来创建 只是在代码中需要加入接口定义的文件接口定义头文件:#ifndef _CLIBDYNAMICCTRL_HPP_#define _CLIBDYNAMICCTR

30、L_HPP_#ifdef _cplusplusextern C #endif#include #include AppFrame/inc/af_idesktop.hpp#define LibDynamic_ILibCtrlLibDynamic.ILibCtrlclass ILibDynamicCtrl :public IRootpublic:virtual int APICC ToSayHello(HWND hParent) = 0;class CLibDynamicCtrl :public ILibDynamicCtrlpublic:virtual int APICC ToSayHello(

31、HWND hParent);#ifdef _cplusplus#endif#endif /_CLIBXDKDEMOCTRL_HPP_实现接口文件:#include CLibDynamicCtrl.hpp#include LibMiniGui_ExtincEXTC_MsgBox.hextern int OpenHelloPage(HWND hParent);int APICC CLibDynamicCtrl:ToSayHello(HWND hParent)EXTC_MessageBoxEx(hParent, Hello,XdkDemo!, XdkDemo, MB_OK);return 1;在另一

32、个主程序中,调用该动态组件库函数,方法如下:#include OSLayer/inc/OSL_Inc.h#include OSLayer/inc/OSL_ServicePool.hpp#include ././LibDynamic/inc/ClibDynamicCtrl.hppstatic int Test2Fun(char *pcMenuId)ILibDynamicCtrl *piCtrl = (ILibDynamicCtrl*)OSL_GetService(LibDynamic_ILibCtrl);if (piCtrl)return piCtrl-ToSayHello(GetActiveW

33、indow();return 0;同时需要对工程选项进行设置,加入自定义组件,指定其名称、描述、文件路径等图2-1自定义组件设置 图2-2自定义组件设置确认无误后,dll/so文件将被自动复制到主应用程序的work目录上,用于模拟器调试 在下载程序选项页中,必须选择“下载自定义组件”,否则将无法找到函数,导致加载失败。 图2-3下载程序设置这样下载程序时,XDK2将自动打包自定义组件文件,一起下载到终端上。2.2 XKD2使用指南2.2.1 运行环境运行于Microsoft Windows系统平台,推荐WindowsXP SP2/WIN7 (32位) ,Cygwin for windows S

34、ourcery G+ Lite for windows ,Visual Studio 2008中文版2.2.2 终端概述终端使用嵌入式Linux操作系统。Linux内核版本2.6.35,使用GCC编译,版本4.3.3,内存64M,128M NandFlash存储数据。终端内置TD-SCDMA/GPRS模块,配备USB高速数据传输接口,通讯端口使用RS-232串行端口,可以连接金融POS终端,IC 卡,RFID卡,磁条卡等读卡设备主要技术参数如下表: 表2-1终端主要技术参数2.2.3 XKD2安装双击setup.exe,根据向导提示进行安装即可,安装时,务必请关闭所有Visual studio

35、 2008应用程序(IDE 环境)。安装完成后,如图: 图2-4 XKD2工具栏运行VS2008,” 运行VS2008,“文件”-“新建项目” 图2-5 新建XDK2项目 图2-6选择设备平台点击“完成”,生成工程。模拟器 解压工程目录上的work.zip文件,到work目录中。3 基于MiniGUI用户界面设计3.1嵌入式MiniGUI介绍6MiniGUI是由北京飞漫软件技术有限公司主持的一个自由软件项目(遵循GPL条款),其目标是为基于Linux的实时嵌入式系统提供一个轻量级的图形用户界面支持系统。 MiniGUI为应用程序定义了一组轻量级的窗口和图形设备接口。利用这些接口,每个应用程序可

36、以建立多个窗口,而且可以在这些窗口中绘制图形。用户也可以利用MiniGUI建立菜单、按钮、列表框等常见的GUI元素。用户可以将MiniGUI配置成“MiniGUI-Threads”或者“MiniGUI-Lite。运行在MiniGUI-Threads上的程序可以在不同的线程中建立多个窗口,但所有的窗口在一个进程中运行。相反,运行在MiniGUI-Lite上的每个程序是单独的进程,每个进程也可以建立多个窗口。本章根据实际的应用需求,设计了报刊亭管理系统的界面。 3.2用户界面设计3.2.1菜单级别 表3-1 菜单级别一级菜单二级菜单说明商品管理进货进入进货处理界面销售进入销售处理界面 返回查询查询

37、销售记录同步同步平台和终端商品信息返回返回上一级界面菜单如下图:图3-1 一级界面图3-2 二级界面相关代码如下:创建一级菜单:int CreateAppMainMenu(void)piMainMenu =(IMainMenu*)OSL_GetService(MAINMENU_IMainMenu);assert(piMainMenu != NULL);HMAINMENU hRoot = piMainMenu-GetRootMenu();hMenuItem=piMainMenu-GetMenuItem(hRoot,MainMenu.MainMenu;assert(hMenuItem != NUL

38、L);piMainMenu-InsertItem2(hMenuItem, 0, MenuSysItem6, 商品管理, PersonSet.bmp, NULL)Sale_Menu(MenuSysItem6); return 1;创建二级菜单:static int Sale_Menu(char * pcMenuId)hMenuItem=piMainMenu-GetMenuItem(piMainMenu-GetRootMenu(), pcMenuId);piMainMenu-InsertItem2(hMenuItem, 0, SaleMenuItem0, 进货, Suggest.bmp, bkt_

39、shop_page_ent);piMainMenu-InsertItem2(hMenuItem, 1, SaleMenuItem1, 销售, SystemInfo.bmp, SMY_CreateMainMenu);piMainMenu-InsertItem2(hMenuItem, 2, SaleMenuItem2, 查询, FileManage.bmp, NULL);piMainMenu-InsertItem2(hMenuItem, 3, SaleMenuItem1, 同步, pic7.bmp, NULL);return 1;进货子菜单相关界面: 图3-3 进货录入编辑界面 图3-4 进货列表

40、 图3-5 货单操作销售子菜单相关界面: 图3-6 销售录入编辑界面 图3-7 结算操作 图3-8 销售编辑界面查询子菜单相关界面:图3-9查询销售记录具体实现代码见附录代码:bkt_sale_page.cpp;bkt_shop_page.cpp;4 报刊亭数据库管理4.1 SQLite介绍7SQLite是一个很小的C语言链接库。这个链接库本身就完全包含数据库引擎的功能,而且可以嵌入至其它程序中,完全不用额外的设定。其特性如下:* 支持ACID (Atomic, Consistent, Isolated, Durable) 交易。* 零组态设定(Zero-configuration),无须管理

41、者的设定及管理。* 支持大部分SQL92的语法。* 数据库存在于一个单一的文件中。* 数据库系统所在机器的字节顺序(Byte order)无关。* 支援大小至2 TB (241 bytes)。* 极小的内存需求:小于3万行的C语言程序代码。小于250KB的程序空间。* 大部分的数据库操作皆快于一般流行的数据库系统。* 简单易用的API。* 支援TCL。也有其它语言的支持可用。* 注释详细的程序代码,以及超过90%的测试。* 链接库自己包含完整的功能,无须其它额外的程序或链接库。* 程序代码版权为public domain。任何用途皆可免费使用。该数据库人在效率上完全超越微软的Access,即使

42、是MySQL的速度也不能和它相比,可以用在一般的单机版程序开发中,它的发布也非常简单,只需要带一个动态库即可,唯一美中不足的是它并不是强类型数据库,估计以后可能变成强类型数据库该数据库是纯C语言的代码,几乎可以在所有平台上运行,而且作者完全放弃版权,你可以在你的程序中自由使用它的代码而不必但心版权问题。 它的代码结构清晰,并带有详细的注释,只要有C语言基础的人都可以看懂,是学习编写数据库的很好参考资料!SQLite的设计思想就是简单:1.简单的管理2.简单的操作3.简单的在程序中使用它4.简单的维护和客制化因为简单所以它快速, 但虽然简单, 却仍非常可靠. 适合SQLite的应用场所有, 网站,嵌入式设备和应用, 应用程序文件格式, 代替特别的文件, 内部或临时数据库, 命令行数据集分析工具, 在演示或测试中代替企业级数据库, 数据库教学, 试验SQL语言扩展等. 但并不是所有都合适, 比如在使用Server/Client结构的时候,高负荷的网站,高并发等情况下并不建议使用SQLite.SQLite SQL SQLite的SQL从很大程度上实现了ANSI SQL92标准. 特别的SQLite支持视图, 触发器, 事务, 支持嵌套SQL

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号