据笔者了解,由于Android的源码对外开放,可供开发商自由发展,同各家的云端系统相结合,因此大部分国内电视厂商所推出的智能电视都以Android平台为主,而随着各厂商均搭载Android平台的表现下,用户接受度也更高。
同时,据业内众多专家介绍,基于android操作系统的智能电视,未来还将会有更多令人振奋的新功能与新应用推出,如3D游戏、扩展实镜、面部识别、电视支付、OTT、社交视频电话以及与其他家电连接的家庭自动化应用,这些都给广大消费者带来了无限遐想。
康佳集团多媒体全球研发中心技术部经理仪海波也表示,在国内市场,Android平台由于开放性好,推广厂家多,占有明显优势。不过,也正因为Android的原始码是开放的,同智能手机市场曾经出现过的情况一样,各家推出的产品品质和应用参差不齐,完全依赖各家的技术水平决定。
其中,康佳基于Android操作系统推出的智能电视,高效利用双核CPU运算、双核GPU渲染、双核Scaler缩放、双路音频处理、1080P硬解码的硬件平台,同步处理两路不同的视频、音频信号,达成“双通道,同步享”的震撼效果。
另外,还有来自国内的TCL,其推出的智能电视在基于Android系统的表现下,搭载了全球首个电视专用点读教育系统,可以实现书本内容在电视上的实时高清显示、发声朗读,带给家庭新颖的亲情互动云教育体验,让孩子学习娱乐两不误,全面引领全球家庭教育潮流。
而除了具备电视专用的点读教育系统外,基于Android系统,该系列产品还搭载了人脸识别、多屏互动2.0、自由交互、3D专区、视频通讯等多项全球领先的智能云功能和云应用。此外,TCL E5390系列更是独家率先通过“六星智能”认证,集合了3D智能云电视领域中的最高端技术。
笔者认为,Android系统作为开放式的操作系统,已经在智能电视上得到了广泛认可和出色应用,未来随着开发商针对于Android系统开发出的更多应用,将促使智能电视更受大众青睐。
Android开发环境搭建所需资源、安装步骤图解 Android海量源码、教程与资料
数字电视接口规范大全(行业标准) 程序员必备:英语口语学习教程大全
20本Linux电子书学习教程 2013年25家IT高科技公司薪酬排行榜
2013年Android平台8大预测 优秀Android开发人员必须注意的10个误区
Android开发应该掌握的28大内容和10大建议 成为“Android高手”的6个境界
90后就业“钱景”分析:IT行业仍是最佳选择 90后就业“钱景”:IT仍是最佳选择
--------------------------------------------------------------------------------------------------------------
终生受益的43个健康常识--值得珍藏 面试如何着装:不同职位穿着大不同
2013年国内就业率最高的50个本科专业排名 女生面试如何着装及禁忌
50个“最有钱景专业”的毕业生年薪一览表 毕业后头5年决定你的一生
千万别熬夜:身体器官晚上工作时间表一览 90后就业“钱景”:IT仍是最佳选择
--------------------------------------------------------------------------------------------------------------
211工程大学最新名单(共112所) 985工程大学最新名单(共39所)
中国
DTD简介:DTD实际上是一个语法文件,用来定义XML文件的结构,可以放在专门的DTD文件中,也可以直接写在XML文件中。对于XML文件来说DTD是可选的,即不是必须的。DTD规定了XML文件中的一些列的规则,如同名标签的数量,出现的先后顺序等等。DTD文件同样具有使用范围,如果将DTD文件定义为System则该文件仅限于在本系统中使用,如果想要将DTD文件进行推广,则应将DTD文件定义成public类型的。本文中我们将介绍如何在xml文件中使用DTD。
DTD的使用:
1. 直接在XML中内置DTD内容。我们可以直接将DTD规定的语法规则写入XML文件中,这样XML文件中的标签会自动遵守该语法规则。如:
<?xml version="1.0"encoding="gb2312"?>
<!DOCTYPE 书籍列表[
<!ELEMENT书籍列表(计算机书籍)>
<!ELEMENT计算机书籍(书名,价格,简要介绍)>
<!ELEMENT书名(#PCDATA)>
<!ELEMENT价格(#PCDATA)>
<!ELEMENT简要介绍(#PCDATA)>
]>
<书籍列表>
<计算机书籍>
<书名>XML的今生今世</书名>
<价格>4.5元</价格>
<简要介绍>概述详细介绍了DTD</简要介绍>
</计算机书籍>
</书籍列表>
2. 使用dtd文件。需要在xml文件中引入dtd文件,导入方式为在第一句下面添加:<!DOCTYPE 商品系列 SYSTEM "X.dtd">。这种方式需要将xml文件和dtd文件放在同一个目录下(也可以使用网络上的DTD文件)。如:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE 商品系列 SYSTEM "X.dtd">
<书籍列表>
<计算机书籍>
<书名>XML的今生今世</书名>
<价格>4.5元</价格>
<简要介绍>概述详细介绍了DTD</简要介绍>
</计算机书籍>
</书籍列表>
DTD中元素出现次数规定:
出现次数
符号
例子
只出现一次
无符号
<!ELEMENT 书籍列表(计算机书籍)>
至少出现一次
+
<!ELEMENT 书籍列表(计算机书籍+)>
出现零次或多次
*
<!ELEMENT 书籍列表(计算机书籍)*>
出现零次或一次
?
<!ELEMENT 书籍列表(计算机书籍)?>
声明或
|
<!ELEMENT 书籍列表(计算机书籍)|文学书籍>
声明混合型内容
<!ELEMENT 书籍列表(#PCDATA|计算机书籍)*>表示书籍列表下既可以是文本内容也可以是子元素
并
,
<!ELEMENT 书籍列表(计算机书籍,文学书籍)>有严格的顺序,必须先出现计算机数据,后出现文学书籍
一组要共同匹配的表达式
()
<!ELEMENT 书籍列表(计算机书籍,文学书籍)*>表示计算机书籍和文学书籍必须组合出现0次或多次
DTD中属性的类型:在DTD中属性通过ATTLIST来进行声明,<!ATTLIST 元素名称 属性名称 属性类型 默认值>,<ATTLIST payment type CDATA “cash”>。
属性类型
描述
CDATA
值为字符数据
(en1|en2|…)
此值是枚举列表中的一个值
ID
值为唯一的id
IDREF
值为另外一个元素的id
IDREFS
值为其他id的列表
NMTOKEN
值为合法的XML名称
ENTITY
值是一个实体
ENTITIES
值是一个实体列表
NOTATION
此值是符号的名称
Xml
值是一个预定义的XML值
DTD属性的默认值
值
解释
值
属性的默认值
#REQUIRED
属性值是必须的
#IMPLIED
属性不是必须的(隐含的)
#FIXED value
属性值是固定的
先将代码贴出来,然后慢慢再解释.
@Makefile
OBJS := server client all: $(OBJS) server: msg_svr.c msg.h gcc -o $@ $^ -D_DEBUG client: msg_client.c msg.h gcc -o $@ $^ -lpthread clean: $(RM) $(OBJS)
@msg.h
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <time.h>
#include <sys/msg.h>
#define MSG_FILE "/tmp/msg_server"
#define BUFFER 255
#define PERM S_IRUSR | S_IWUSR
#define OK 1
#define ERR 0
// msg type
#define TYPE_SERVER 1000
#define TYPE_SERVER_STR "1000"
// msg target string
#define SERVER_STR "SERVER"
#define TO_ALL_STR "ALL"
// send cmd
// L, I, O is send to server
#define CMD_LIST 'L'
#define CMD_LOGIN 'I'
#define CMD_LOGOUT 'O'
#define CMD_TOALL 'A'
// C, F send to others
#define CMD_CHAT 'C'
#define CMD_SEND_FILE 'F'
// CMD:FROM:TIME:DATA
#define DATA_LEN 4
#define OFT_CMD 0
#define OFT_FRM 1
#define OFT_TIM 2
#define OFT_DAT 3
#define DATA_TOK ":"
// USR_ID:USR_NAME:TIME
#define USER_DATA_LEN 3
#define OFT_USR_ID 0
#define OFT_USR_NM 1
#define OFT_LOGIN_TM 2
#define USER_DATA_TOK "#"
// id admin
#define START_ID 1
//-------------------------------------+
// List operations
struct list_head {
struct list_head *next;
};
// init a new list named name
#define LIST_INIT(name) \
struct list_head name = {NULL}
static inline int list_add(struct list_head * head, struct list_head* new){
new->next = head->next;
head->next = new;
}
static inline int list_delete(struct list_head * head, struct list_head* target){
while(head){
if(head->next == target){
head->next = target->next;
return 0;
}
head = head->next;
}
return -1;
}
//-------------------------------------+
// online status
enum status{ online, offline, invisible };
// available id
int available_id = START_ID;
// user struct to save user informations
struct user{
struct list_head list;
int id;
char name[32];
enum status status;;
long login_time;
};
// message struct
struct message
{
long mtype;
char buffer[BUFFER+1];
}msg_snd, msg_rcv;
int msgid = 0;
// send a format message to client
// CMD:FROM:TIME:DATA
int send_msg(long type, int cmd, int from_id, char * data){
sprintf(msg_snd.buffer, "%c:%d:%d:%s", cmd, from_id, time(NULL), data);
msg_snd.mtype = type;
if(msgsnd(msgid, &msg_snd, strlen(msg_snd.buffer)+1, 0) < 0)
return ERR;
else
return OK;
}
inline char *time2str(long time, char* buf){
struct tm *t = localtime(&time);
strftime(buf, 32, "%Y-%m-%d-%H:%M:%S", t);
return buf;
}
int init_msg_queue(){
key_t key;
if((key = ftok(MSG_FILE, 'a')) == -1){
perror("ftok");
exit(1);
}
printf("Key:%d\n", key);
if((msgid = msgget(key, PERM | IPC_CREAT)) == -1)
{
perror("msgget");
exit(1);
}
printf("msgid = %d\n", msgid);
return msgid;
}
int process_msg(char* buffer);
/* msg_svr.c */
#include "msg.h"
LIST_INIT(msg_list_head);
int main()
{
msgid = init_msg_queue();
while(1)
{
if(msgrcv(msgid, &msg_rcv, sizeof(struct message), TYPE_SERVER, 0) == -1)
perror("msgrcv");
else
printf("Get: %s\n", msg_rcv.buffer);
// process message
process_msg(msg_rcv.buffer);
}
exit(0);
}
// process message received from message queue
// message format:
// CMD:TARGET:FROM:TIME:DATA
int process_msg(char* buffer){
char * data[DATA_LEN];
char * str, *subtoken;
int i;
memset(data, NULL, sizeof(data));
for(str = buffer, i = 0; ; str = NULL, i++){
subtoken = strtok(str, DATA_TOK);
if(subtoken == NULL)
break;
data[i] = subtoken;
#ifdef _DEBUG
printf("> data[%d] = %s\n", i, subtoken);
#endif
}
// data format error
if(i != DATA_LEN)
return ERR;
char info[256];
char buf[256];
struct user* u ;
struct list_head* p;
// send to server cmd
switch(data[OFT_CMD][0]){
case CMD_LIST:
bzero(buf, sizeof(buf));
p = (&msg_list_head)->next;
while(p){
u= (struct user*)p;
sprintf(info, "%d#%s#%ld#", u->id, u->name, u->login_time);
#ifdef _DEUBG
printf("u->name = %s\n", u->name);
#endif
strcat(buf, info);
p = p->next;
}
if(p != msg_list_head.next){
// delete the end '#'
buf[strlen(buf) - 1] = 0;
}
send_msg(atol(data[OFT_FRM]), CMD_LIST, TYPE_SERVER, buf);
break;
case CMD_LOGIN:
u = (struct user *)malloc(sizeof(struct user));
if(NULL == u){
perror("malloc");
return ERR;
}
// add to list
list_add(&msg_list_head, &(u->list));
u->id = available_id++;
strcpy(u->name, data[OFT_FRM]);
u->status = online;
u->login_time = atol(data[OFT_TIM]);
// login ok echo msg
msg_snd.mtype = atol(data[OFT_DAT]);
sprintf(msg_snd.buffer, "%d", u->id);
msgsnd(msgid, &msg_snd, strlen(buf)+1, 0);
break;
case CMD_LOGOUT:
p = (&msg_list_head)->next;
while(p){
u= (struct user*)p;
// find the user who request logout
if(u->id == atoi(data[OFT_FRM])){
if(send_msg(u->id, CMD_LOGOUT, TYPE_SERVER, "Logout OK!") == OK){
list_delete(&msg_list_head, p);
free(p);
}else{
return ERR;
}
break;
}
p = p->next;
}
break;
case CMD_TOALL:
// send to all online client
p = (&msg_list_head)->next;
while(p){
u= (struct user*)p;
send_msg(u->id, CMD_CHAT, data[OFT_FRM], data[OFT_DAT]);
p = p->next;
}
break;
default:
return ERR;
}
return OK;
}
@msg_client.c
/* msg_client.c */
#include "msg.h"
int userid = 0;
char name[32] = "";
void print_menu(void){
printf("\t+----------------------------------+\n");
printf("\t+ Chat Room V1.0 2013.01.08 +\n");
printf("\t+----------------------------------+\n");
printf("\t+ User Commands as follows: +\n");
printf("\t+ +\n");
printf("\t+ l: list all online user +\n");
printf("\t+ i: Login +\n");
printf("\t+ o: logOut +\n");
printf("\t+ c: Chat with other online user +\n");
printf("\t+ a: Chat with all online user +\n");
printf("\t+ f: transfer a File to others +\n");
printf("\t+ h: Help +\n");
printf("\t+----------------------------------+\n");
}
int get_choice(){
printf("%s# ", name);
int answer = getchar(); // eat <Enter>
while(getchar() != '\n'); // eat <Enter>
//putchar(answer);
return answer;
}
void func(int sig){
printf("\n%s# ", name);
fflush(stdout);
}
int send_to(int target, int cmd, char *data){
return send_msg(target, cmd, userid, data);
}
int send_server(int cmd, char *data){
return send_msg(TYPE_SERVER, cmd, userid, data);
}
int chat(){
if(strlen(name) == 0){
printf("You are not login!\n");
return ERR;
}
char id[32];
char data[256];
char buf[256];
printf("To: [USR_ID] ");
fflush(stdout);
if(fgets(id, sizeof(id), stdin) == NULL){
perror("fgets");
return ERR;
}
sprintf(data, " %s > ", name);
id[strlen(id) - 1] = 0;
printf(">> ");
fflush(stdout);
if(fgets(buf, sizeof(buf), stdin) == NULL){
perror("fgets");
return ERR;
}
strcat(data, buf);
data[strlen(data) - 1] = 0;
send_to(atoi(id), CMD_CHAT, data);
}
int chat_all(){
if(strlen(name) == 0){
printf("You are not login!\n");
return ERR;
}
char data[256];
char buf[256];
sprintf(data, " %s To all > ", name);
printf("To all >> ");
fflush(stdout);
if(fgets(buf, sizeof(buf), stdin) == NULL){
perror("fgets");
return ERR;
}
strcat(data, buf);
data[strlen(data) - 1] = 0;
send_to(TYPE_SERVER, CMD_TOALL, data);
}
int login(){
printf("username: \n");
if(fgets(name, sizeof(name), stdin) == NULL){
perror("fgets");
return ERR;
}
name[strlen(name) - 1] = 0;
int rand_type = random();
time_t t;
time(&t);
sprintf(msg_snd.buffer, "%c:%s:%ld:%d", CMD_LOGIN, name, t, rand_type);
#ifdef _DEBUG
printf("%s\n", msg_snd.buffer);
#endif
// get a random type to login server
msg_snd.mtype = TYPE_SERVER;
if(msgsnd(msgid, &msg_snd, strlen(msg_snd.buffer)+1, 0) < 0){
perror("msgsnd");
return ERR;
}
// wait server response
if(msgrcv(msgid, &msg_rcv, sizeof(msg_rcv), rand_type, 0) < 0){
return ERR;
} else{
userid = atol(msg_rcv.buffer);
printf("Login OK id = %d\n", userid);
return OK;
}
}
int logout(){
if(strlen(name) == 0){
return ERR;
}
send_server(CMD_LOGOUT, "Logout");
// wait server response
if(msgrcv(msgid, &msg_rcv, sizeof(msg_rcv), userid, 0) < 0){
return ERR;
}else{
userid = 0;
printf("Logout OK\n");
return OK;
}
}
void format_user_list(char * buffer){
char * data[USER_DATA_LEN];
char * str, *subtoken;
char time_buf[24];
int i, n;
memset(data, NULL, sizeof(data));
printf("--------