Chinaunix首页 | 论坛 | 博客

nas

  • 博客访问: 634561
  • 博文数量: 456
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 6400
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-08 16:08
文章分类

全部博文(456)

文章存档

2008年(456)

我的朋友

分类: 服务器与存储

2008-05-14 17:03:44

本文阐述在一个基于 Linux 的 Media NAS 系统中,如何使用了 Sqlite 数据库作为 NAS 系统中 Media 数据的存储数据库,来完成 Media 文件的共享,从而能使 Digital Media Player 播放设备通过 UPnP AV Server 服务对NAS 上的 Media 文件进行播放。

Sqlite数据库在基于Linux 的Media NAS系统中的应用

  用 Sqlite 实现此 Media NAS 系统后,系统运行性能高,而且程序也具有很好的跨平台性。

  此 Media NAS 服务系统是基于通用即插即用(UPnP)协议的系统。

  网络附属存储(NAS:Network Attached Storage)设备是一种专用数据存储设备,它以数据为中心,其上存储了大量的视频、音频、图象文件。NAS 服务器本身对数据有较好存储、保护机制,从而保证其提供多媒体服务的稳定性。为了便于对其上的海量媒体文件的有效共享,我们使用了 UpnP 协议来作为网络访问协议。

  UpnP 网络系统是针对智能家电、无线设备以及个人电脑网络连接而设计的一种架构。它旨在为家庭、小型企业、公共场所中的网络提供易于使用、灵活且基于标准的连接。UpnP 是一个充分利用 TCP/IP 和 Web 技术的分布式开放型网络体系结构,除能够在家中、办公室和公共场所联网设备之间的完整控制和数据传输之外,还可建立无缝紧密的连接网络。

  UpnP 设备的特点是它不需要使用设备驱动程序,取而代之的是通用协议,一个设备就是一个完整的小系统,直接通过网口将其接入 UpnP 网络中即可。UpnP 网络不依赖于任何特定的操作系统、编程语言或物理媒体。UPnP 并未指定应用程序应该使用哪种 API(应用程序接口),UpnP 装置开发者可以按用户的需求创建自己的 API。UpnP 设备可以在任何操作系统上采用任何编程语言来实现。这就意味着,一台设备能够动态加入一个网络,获取一个 IP 地址,"零"配置,即插即用,它自动通报其能提供的功能服务,以及了解其它设备的存在和功能。在 UpnP 网络中的设备都向外提供自身服务的描述,外部其他设备通过调用这些服务来控制这些 UpnP 设备。UpnP 充分利用了包括 IP、TCP、UDP、HTTP 和 XML 在内的互联网组件。它以 XML 来表达内容,并通过HTTP 进行传输。在 UpnP 网络中的消息通过采用简单服务发现协议(SSDP)、通用事件通知架构(GENA)和简单对象访问协议(SOAP)来进行格式化。然后消息通过运行于 UDP 上的多播或单播类 HTTP,或是运行于TCP 上的标准 HTTP 进行传输。最终,所有消息均通过 IP 进行传输。

  UpnP 的可应用范围非常广,可被应用于诸如家庭自动化、打印和图像处理、音频/视频娱乐、厨房设备、汽车网络等各种各样的应用场合。

  Digital Media Player 播放器是连接电脑、电视或音响系统的无线桥梁,它也是基于 UpnP 协议的设备。它使用标准的音频/视频线缆连接电视和立体声音响系统,可通过无线网络与电脑进行通讯,将电脑处理后的数字信息传输到电视和音响系统上。这样你的数字文件就不再是只能在电脑上播放,而是可以和电视、音响系统连接,可以想象,这样的播放效果将是 PC 电脑所无法比拟的。

  为什么选择 Sqlite?

  通常我们采用各种数据库来实现对数据的存储、检索等功能,例如,Oracle,SQL Server,MySQL 等等。这些产品除提供基本的查询,删除,添加等功能外,也提供了很多高级特性,如触发器,存储过程,数据备份恢复,全文检索功能等。但实际上,很多的应用,仅仅利用到了这些数据库产品的基本特性而已。而且在某些特殊场合的应用,这些数据库明显有一些臃肿。

  而 Sqlite 是一个轻量级别数据库, 具有很多不错的特点:

  Sqlite 的设计目标是嵌入式的 SQL 数据库引擎,它是基于纯 C 代码的,已经应用到了非常广泛的领域;

  Sqlite 是直接读写硬盘上数据库文件的,从而不需要额外的 server 服务端进程,即 Sqlite 是无须独立运行的数据库引擎;

开放源代码, 整个代码少于 3 万行,有良好的注释并且有着 90% 以上的测试覆盖率;

  少于 250KB 的内存占用(gcc);

  支持视图, 触发器, 事务, 支持嵌套 SQL 功能;

  它提供了虚拟机用于处理 sql 语句,这是一个很有趣的东西;

  不需要配置,不需要安装,也不需要管理员;

  支持大部分 ANSI SQL92;

  简单易用的 API;

  一个完整的数据库就对应磁盘上面一个文件,它是一种具备了基本数据库特性的数据文件;

  同一个数据库文件可以在不同机器上面使用, 可以在不同字节顺序的机器间自由的共享;

  最大支持数据库到 2TB,而且性能仅会受限于系统可用的内存;

  大部分应用比目前常见的客户端/服务端的数据库快,在一些简单语句的处理性能与 mysql 和 postgreSQL 的比较,除了一些不常用的语句外,比其它两个都快;

  没有其它依赖,可以使用在多种操作系统平台上;

  以下为 Sqlite 的代码架构图,它由核、后端、SQL 编译器、辅助工具组成。

  你可以看出 Sqlite 非常简单,Sqlite 的设计思想就是简单:

  1、简单的在程序中使用它

  2、简单的管理

  3、简单的操作

  4、简单的维护和定制

  Sqlite 的代码架构图

Sqlite数据库在基于Linux 的Media NAS系统中的应用

  数据库结构的设计

  在 Media NAS 系统中涉及的媒体文件类型有三类:Video,Audio,Image。基于这三类文件,我们对数据库做了结构设计。

  VideoTable 的设计:

  显示标题(100字节),Video 时长(整数型),Video 长、宽(整数型),文件全路径名(1024 字节),所在目录名(260 字节);

 AudioTable 的设计:

  显示标题(100 字节),Audio 时长(整数型),流派(100 字节),歌唱者(100 字节),专辑(100字节),文件全路径名(1024 字节),所在目录名(260 字节);

  ImageTable 的设计:

  显示标题(100 字节),Image 长、宽(整数型),专辑(100 字节),文件全路径名(1024 字节),所在目录名(260 字节);

  对应的 sqlite 操作命令为:

CREATE TABLE VideoTable (titlename VARCHAR(100), time INTEGER,
videowidth INTEGER, videoheight INTEGER, filename VARCHAR(1024),
dir VARCHAR(260));
CREATE TABLE AudioTable(titlename VARCHAR(100), time INTEGER,
genre VARCHAR(100), artist VARCHAR(100), album VARCHAR(100),
filename VARCHAR(1024), dir VARCHAR(260));
CREATE TABLE ImageTable (titlename VARCHAR(100), time INTEGER,
imagewidth INTEGER, imageheight INTEGER, genre VARCHAR(100),
filename VARCHAR(1024), dir VARCHAR(260));

  需要说明的几点:

  1、存储在 Sqlite 中的记录内容,最好采用 UTF8 编码的文本内容。这样就不会丢失记录信息,否则的话,有些多国语言的内容做了 Unicode 转换后将会丢失。

  2、在设计中要考虑到播放请求时,并不是一次请求全部的数据,而是请求一部分,即从某位置开始,请 求若干条记录,并且是需要按一定的规则排序。对记录中某项的查询语句,如: select * from AudioTable order by titlename limit startindex, requestcount ;其中需要 加上查询时启始位置与需要查询的个数。还要包括以 titlename 作为排序的依据。 AudioTable 的设计:

  显示标题(100 字节),Audio 时长(整数型),流派(100 字节),歌唱者(100 字节),专辑(100字节),文件全路径名(1024 字节),所在目录名(260 字节);

  ImageTable 的设计:

  显示标题(100 字节),Image 长、宽(整数型),专辑(100 字节),文件全路径名(1024 字节),所在目录名(260 字节);

  对应的 sqlite 操作命令为:

CREATE TABLE VideoTable (titlename VARCHAR(100), time INTEGER,
videowidth INTEGER, videoheight INTEGER, filename VARCHAR(1024),
dir VARCHAR(260));
CREATE TABLE AudioTable(titlename VARCHAR(100), time INTEGER,
genre VARCHAR(100), artist VARCHAR(100), album VARCHAR(100),
filename VARCHAR(1024), dir VARCHAR(260));
CREATE TABLE ImageTable (titlename VARCHAR(100), time INTEGER,
imagewidth INTEGER, imageheight INTEGER, genre VARCHAR(100),
filename VARCHAR(1024), dir VARCHAR(260));

  需要说明的几点:

  1、存储在 Sqlite 中的记录内容,最好采用 UTF8 编码的文本内容。这样就不会丢失记录信息,否则的话,有些多国语言的内容做了 Unicode 转换后将会丢失。

  2、在设计中要考虑到播放请求时,并不是一次请求全部的数据,而是请求一部分,即从某位置开始,请 求若干条记录,并且是需要按一定的规则排序。对记录中某项的查询语句,如: select * from AudioTable order by titlename limit startindex, requestcount ;其中需要 加上查询时启始位置与需要查询的个数。还要包括以 titlename 作为排序的依据。

阅读(464) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~