论文部分内容阅读
摘要:文章介绍了多种基于嵌入式linux操作系统的服务器模型。结合健康监测系统中使用的zigbee网络,详细讨论了各种服务器模型的优缺点。研究的主机对象是装有嵌入式linux系统的S3C2440,客户机采用的是自带zigbee模块的CC2450单片机。
关键词:服务器模型;嵌入式;zigbee
zigbee网络具有低功耗、抗干扰性强、成本低、网络容量大等优点,在现代健康监控系统中应用广泛。为尽可能降低成本,在实际中一般充分发挥它网络容量大的优点,这要求网关服务器要拥有很好的稳定性和实时处理基本数据的能力。针对这一要求我们对嵌入式linux下的各种服务器模型进行了详细的研究,在数据处理问题上我们使用嵌入式数据库sqlite进行实时的处理。
一、嵌入式系统开发
S3C2440处理器是基于ARM920T内核的32位RISC嵌入式芯片。该ARM内核的CPU主频最高可达533MHz,此处使用499MHz,它除了集成3个串口、SD卡控制器、USB Host控制器、LCD控制器、Nand Flash控制器以及实时时钟外,还增添了工业控制总线(CAN)、Camera控制器(数码摄像机接口)、PCMCIA接口(可接无线网卡或调制解调器及其他外设)。另外,用1个96针总线插槽引出CPU的局部总线,可外接其他总线设备并与多方通信。
在众多嵌入式操作系统中,我们选则发展最快应用最广的嵌入式linux操作系统。它的内核因为实现了的TCP/IP协议,所以可以很方便的进行各种服务器模型的编程与实现。同时它具有内核开放、方便裁剪等优点,非常适合应用于嵌入式网关服务器。
二、服务器模型的分析与设计
由于对进行的传输的数据的准确率要求很高,所以选择TCP服务器。Linux服务器主要分为两大类:循环服务器和并发服务器。服务器程序在bind()、listen()之后直接进入循环,在循环内完成accept()、recv()、send()等操作。而并发服务器可以同时和多个客户端进行通信。由于健康监测系统的zigbee节点很多,并且节点发送数据时实时的。所以只能采用并发服务器模式与各个节点进行通信。并发服务器又分为多进程并发服务器、多线程并发服务器、IO复用服务器等3中类型。下面对这3中服务器进行分析。
多进程并发服务器在linten()之后的核心代码如下:
for(i=0;i {
pid[i]=fork();
if(pid[i]==0)
{
handle(s);
}
}
close(s);
它的思想是创建子进程处理同时到来的客户端请求,即同时有多少个节点请求就创建多少个进程。
多线程并发服务器在listen()之后的核心代码如下:
for(;;)
{
sc=accept(s,(struct sockaddr*)&client_addr,&len);
if(sc<0)
{
continue;
}
else
{
pthread_create(&thread1,NULL,handle,(void*)&sc);
}
}
close(s);
它的思想是创建线程处理同时到来的客户端请求,即同时有多少个节点请求就创建多少个线程。相比创建进程,创建线程拥有很多优点。系统创建进程需要完全的复制一份代码,分配另一份空间,而线程只有很少的私有资源,比如线程ID等。实践证明创建线程比创建进程快10到100倍。
IO复用模型的核心思想是使用select函数进行描述符表的匹配,在linsten()之后的核心代码如下:
if (!(select(MAX_SOCK_FD, &tmp_inset, NULL, NULL, NULL) > 0))
{
perror("select");
close(sockfd);
exit(1);
}
printf("after select\n");
for (fd = 0; fd < MAX_SOCK_FD; fd++)
{
if (FD_ISSET(fd, &tmp_inset) > 0)
{
if (fd == sockfd)
{ /* 服务端接收客户端的连接请求 : 监听套接字*/
if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size))== -1)
{
perror("accept");
exit(1);
}
FD_SET(client_fd, &inset);
// online();
printf("New connection from %d(socket)\n", client_fd);
}
else /* 处理从客户端发来的消息: 连接套接字 */
{
if ((count = recv(fd, buf, BUFFER_SIZE, 0)) > 0)
{ printf("Received a message from %d: %s\n", fd, buf);
// trans();
}
else // recv 返回0 代表连接套接字被客户端关闭
{
close(fd);
FD_CLR(fd, &inset);
// left();
printf("Client %d(socket) has left\n", fd);
} }
close(sockfd);
IO复用模型既没有创建进程,也没有创建线程,每来一个客户连接都有一个不同的连接套接字相对应,通过不同的连接套接字,可以应对不同客户端的同时请求。
综上所述IO复用模型,最节省系统资源,并且满足设计需求。
为了能对被监测者的的生理指标进行快速的处理,我们把接收的数据直接放入嵌入式数据库sqlite。 Sqlite是一款开源的微型数据库,非常适合于嵌入式系统,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。正是因为这样,我们可以直接调用API进行编程,直接通过sqlite3_exec()函数可以方便的进行数据处理。并且整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
最后我们通过sqlitebrowser可以方便的显示接收的信息。
本嵌入式网关服务器使用IO复用和嵌入式数据库相结合,很好的完成了健康监控系统的zigbee网络数据的传输和处理,达到了目的。
参考文献:
[1]韦东山. 嵌入式linux开发完全手册[M]. 北京:人民邮电出版社,2008.
[2]Robert Love. linux系统编程[M]. 南京:东南大学出版社,2009.
[3]周立功. ARM微控制器基础与实践. 北京:北京航空航天大学出版社,2005.
作者简介:
刘俊龙(1988.12- ),男,湖北仙桃人,西藏大学12级计算机系研究生,计算机系统结构专业,研究方向:嵌入式。
关键词:服务器模型;嵌入式;zigbee
zigbee网络具有低功耗、抗干扰性强、成本低、网络容量大等优点,在现代健康监控系统中应用广泛。为尽可能降低成本,在实际中一般充分发挥它网络容量大的优点,这要求网关服务器要拥有很好的稳定性和实时处理基本数据的能力。针对这一要求我们对嵌入式linux下的各种服务器模型进行了详细的研究,在数据处理问题上我们使用嵌入式数据库sqlite进行实时的处理。
一、嵌入式系统开发
S3C2440处理器是基于ARM920T内核的32位RISC嵌入式芯片。该ARM内核的CPU主频最高可达533MHz,此处使用499MHz,它除了集成3个串口、SD卡控制器、USB Host控制器、LCD控制器、Nand Flash控制器以及实时时钟外,还增添了工业控制总线(CAN)、Camera控制器(数码摄像机接口)、PCMCIA接口(可接无线网卡或调制解调器及其他外设)。另外,用1个96针总线插槽引出CPU的局部总线,可外接其他总线设备并与多方通信。
在众多嵌入式操作系统中,我们选则发展最快应用最广的嵌入式linux操作系统。它的内核因为实现了的TCP/IP协议,所以可以很方便的进行各种服务器模型的编程与实现。同时它具有内核开放、方便裁剪等优点,非常适合应用于嵌入式网关服务器。
二、服务器模型的分析与设计
由于对进行的传输的数据的准确率要求很高,所以选择TCP服务器。Linux服务器主要分为两大类:循环服务器和并发服务器。服务器程序在bind()、listen()之后直接进入循环,在循环内完成accept()、recv()、send()等操作。而并发服务器可以同时和多个客户端进行通信。由于健康监测系统的zigbee节点很多,并且节点发送数据时实时的。所以只能采用并发服务器模式与各个节点进行通信。并发服务器又分为多进程并发服务器、多线程并发服务器、IO复用服务器等3中类型。下面对这3中服务器进行分析。
多进程并发服务器在linten()之后的核心代码如下:
for(i=0;i
pid[i]=fork();
if(pid[i]==0)
{
handle(s);
}
}
close(s);
它的思想是创建子进程处理同时到来的客户端请求,即同时有多少个节点请求就创建多少个进程。
多线程并发服务器在listen()之后的核心代码如下:
for(;;)
{
sc=accept(s,(struct sockaddr*)&client_addr,&len);
if(sc<0)
{
continue;
}
else
{
pthread_create(&thread1,NULL,handle,(void*)&sc);
}
}
close(s);
它的思想是创建线程处理同时到来的客户端请求,即同时有多少个节点请求就创建多少个线程。相比创建进程,创建线程拥有很多优点。系统创建进程需要完全的复制一份代码,分配另一份空间,而线程只有很少的私有资源,比如线程ID等。实践证明创建线程比创建进程快10到100倍。
IO复用模型的核心思想是使用select函数进行描述符表的匹配,在linsten()之后的核心代码如下:
if (!(select(MAX_SOCK_FD, &tmp_inset, NULL, NULL, NULL) > 0))
{
perror("select");
close(sockfd);
exit(1);
}
printf("after select\n");
for (fd = 0; fd < MAX_SOCK_FD; fd++)
{
if (FD_ISSET(fd, &tmp_inset) > 0)
{
if (fd == sockfd)
{ /* 服务端接收客户端的连接请求 : 监听套接字*/
if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size))== -1)
{
perror("accept");
exit(1);
}
FD_SET(client_fd, &inset);
// online();
printf("New connection from %d(socket)\n", client_fd);
}
else /* 处理从客户端发来的消息: 连接套接字 */
{
if ((count = recv(fd, buf, BUFFER_SIZE, 0)) > 0)
{ printf("Received a message from %d: %s\n", fd, buf);
// trans();
}
else // recv 返回0 代表连接套接字被客户端关闭
{
close(fd);
FD_CLR(fd, &inset);
// left();
printf("Client %d(socket) has left\n", fd);
} }
close(sockfd);
IO复用模型既没有创建进程,也没有创建线程,每来一个客户连接都有一个不同的连接套接字相对应,通过不同的连接套接字,可以应对不同客户端的同时请求。
综上所述IO复用模型,最节省系统资源,并且满足设计需求。
为了能对被监测者的的生理指标进行快速的处理,我们把接收的数据直接放入嵌入式数据库sqlite。 Sqlite是一款开源的微型数据库,非常适合于嵌入式系统,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。正是因为这样,我们可以直接调用API进行编程,直接通过sqlite3_exec()函数可以方便的进行数据处理。并且整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
最后我们通过sqlitebrowser可以方便的显示接收的信息。
本嵌入式网关服务器使用IO复用和嵌入式数据库相结合,很好的完成了健康监控系统的zigbee网络数据的传输和处理,达到了目的。
参考文献:
[1]韦东山. 嵌入式linux开发完全手册[M]. 北京:人民邮电出版社,2008.
[2]Robert Love. linux系统编程[M]. 南京:东南大学出版社,2009.
[3]周立功. ARM微控制器基础与实践. 北京:北京航空航天大学出版社,2005.
作者简介:
刘俊龙(1988.12- ),男,湖北仙桃人,西藏大学12级计算机系研究生,计算机系统结构专业,研究方向:嵌入式。