据笔者了解,由于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("--------