当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]基于Linux 的嵌入式浏览器的研究

随着信息技术与网络技术的快速发展, 以及人们日常生活对网络信息的需求的不断增加。掌上电脑、上网本、手机、导航仪器、智能电视、智能家电等对嵌入式系统提出了更多更高的要求。在嵌入式系统中利用嵌入式浏览器获取网络信息是必不可少的, 因此嵌入式浏览器技术成为现如今的技术热点之一。而且Linux 操作系统完全开源, 可以降低产品开发成本, 因此对基于Linux 操作系统的嵌入式浏览器开发技术的研究有着重要意义。

1 嵌入式浏览器的结构

根据嵌入式浏览器的特点, 分析嵌入式浏览器的各个部分功能。下面介绍嵌入式浏览器的主要功能:

(1) 词法分析, 主要是对HTML 语言进行词法分析, 并且要求HTML 词法分析可以兼容XML 等其他标签语言,达到只需更换语言的元素名称就可以进行词法分析的效果;(2) 语法分析与布局, 在非嵌入式浏览器中语法分析是独立的一个模块, 但是在嵌入式浏览器中不作为一个独立模块, 简化系统结构, 即实现语法分析与布局同步化, 节省了语法分析数据存储的内存空间; (3) 嵌入式浏览器的用户界面, 设计高效快捷的用户界面是应用软件的重要部分;(4) 嵌入式浏览器JavaScript 支持,JavaScript 在浏览器里主要是用于操纵界面元素并与浏览器内部命令进行结合;(5)I/O 端, 主要是通过HTTP 协议和文本系统来读取页面信息;(6) 控制机制, 负责命令响应和消息处理。嵌入式浏览器功能结构如图1 所示。

图1 嵌入式浏览器功能结构图

2 HTML 词法分析

2.1 组成及功能

HTML 词法分析是嵌入式浏览器开发的基础, 是整个嵌入式浏览器整体设计的最前端部分,HTML 词法分析的数据结构是语法分析与布局的重要依据。HTML词法分析的效率、准确率以及容错率的高低在一定程度上决定了整个嵌入式浏览器的工作效率。下面对HTML词法分析的组成和功能进行解析。

HTML 词法分析的功能主要是负责接收从I/O 端读取到的HTML 代码并进行词法分析, 提取网页中HTML代码中的各元素信息, 按照定义的数据结构保存元素的属性和名称等, 实现数据的结构化。

根据HTML 词法分析的功能可以解析为几个组成部分:(1) 初始化。完成对数据结构的初始化, 主要是分配内存, 变量赋初值; (2) 主体的数据流分析, 逐字符地进行判断, 确定数据的归属类型; (3) 元素的分析, 提取元素的名称、属性和值域; (4) 释放, 主要是对数据内存空间的释放。

2.2 算法

根据HTML 词法分析的功能以及组成部分, 可以很清晰地得到一个简单的算法。其算法过程具体如下:

(1)从I/O 端读取的字符串流中,顺序读取一个字符;(2) 如果遇到< , 表示将遇到元素, 处理该元素( 使用元素处理函数来处理该元素) , 元素处理结束后, 指针指向该元素的尾部;(3) 如果遇到空格或回车, 则跳过;(4) 如果遇到>, 则跳过(因为不可能存在<>这种不包含任何元素的情况, 只是为了增强程序的容错性);(5) 如果遇到的不是上述几种情况, 则遇到的是文字( 使用文字处理函数来处理该文字) , 文字处理结束后,指针指向下一个元素的首部;(6) 循环(1)~(5 ) 步骤, 直到I/O 端读取的字符串流全部分析完。

根据上述词法分析算法过程可以得到相应的流程图, 如图2 所示。

图2 词法分析算法流程图

2.3 词法分析的设计

根据上述提出的词法分析的算法, 通过扫描I/O 端读取的字符串, 来检测字符是否为标签元素、提取标签元素属性等。设计词法分析的基础要定义数据结构, 为词法分析算法的实现提供基础。根据功能需要设计基本的数据结构, 定义如下:

  char token[]; // 标签元素表

  char * tokenPointer; //指向标签元素表的指针

  char chText[]; // 字符表

  char *chPointer; // 字符表指针

  char text[]; // 字符串表

  char *textPointer; // 字符串表指针

  char textRead[]; //存放待识别的源程序字符串

  char *textReadPointer; //读取字符串指针

  char ch; //存放最读取的源程序字符

  char STrToken[]; //存放构成单词符号的字符串

  bool flag=false; //是否扫描过一次

3 浏览器JavaScript 支持

3.1 JavaScript 简介

JavaScript 是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。它的一个重要功能就是面向对象的功能, 通过基于对象的程序设计, 可以用更直观、模块化和可重复使用的方式进行程序开发。一组包含数据的属性和对属性中包含数据进行操作的方法, 称为对象。用户与网页交互时产生的操作, 称为事件。事件可以由用户引发, 也可能是页面发生改变, 甚至还有看不见的事件( 如Ajax 的交互进度改变) 。绝大部分事件都由用户的动作所引发, 例如用户按鼠标的按键, 就产生click 事件, 若鼠标的指针在链接上移动, 就产生MouseOver 事件等。在JavaScript 中, 事件与事件处理程序配套使用。而对事件的处理用addEventListener() 函数, 它有3 个参数: 事件、引发的函数以及是否使用事件捕捉。

为了保障安全性, 将第三个参数始终设置为false。

JavaScript 具有几个特性: 能使网页增加互动性; 能使有规律地重复的HTML 源代码简化, 减少下载时间;能及时响应用户的操作, 对提交表单做即时的检查, 无需浪费额外的验证时间。

3.2 JavaScript 引擎

JavaScript 引擎一般作为共享库使用, 应用程序调用引擎提供的API 函数。引擎API 函数大致分为以下几种: 数据类型操作、RunTime 控制、类与对象的创建和维护、函数与脚本执行、字符串操作、错误处理、安全控制、Debug 支持。一般情况下, 在应用程序中只需使用某几类函数。例如, 在进行JavaScript 调用之前必须调用JS_NewRuntime 函数来创建并初始化JavaScript 引擎。有些类型的函数(像安全控制类)提供可选择的特征。

JavaScript 引擎是系统上的一个共享资源。通过将引擎API 调用嵌入到应用程序中, 可以请求JavaScript 引擎进行操作。引擎处理请求, 并将结果或状态信息返回给应用程序。例如, 假定使用JavaScript 引擎自动化应用程序, 脚本应用程序鉴别用户并设置权限。首先, 应用程序创建JavaScript 对象, 该对象描述用户信息, 包括姓名、ID、权限和可用的函数列表。在这种情况下, 应用程序首先调用JS_NewObject 创建对象。当JavaScript 引擎创建对象后, 返回一个指针给应用程序。应用程序再调用JavaScript 引擎执行脚本。在创建用户对象后, 应用程序即刻传递脚本给JS_EvaluateScript 以便编译和运行。脚本获许取得并校验用户信息, 然后建立用户存取的权利。

JavaScript 引擎收到初始化请求后,给JavaScript Run-Time 分配内存, 应用程序使用的变量、对象和上下文都保存在RunTime 中。一个上下文是脚本的执行状态(JavaScript 引擎使用的) 。每个同时存在的脚本或线程都必须有自己的上下文。单个的JavaScript RunTime 可以包含多个上下文、对象和变量。几乎所有的JavaScript 引擎调用都需要一个上下文变量, 应用程序在创建RunTime后, 首先应调用至少一次JS_NewCONtext 来创建一个上下文。上下文的实际数量依赖于程序中同时使用的脚本数。程序中每个同时存在的脚本都需要一个上下文。另一方面, 如果某个时刻只有一个脚本编译和运行, 则只需一个上下文给每个脚本重复使用即可。

3.3 JavaScript 与浏览器结合

3.3.1 直接加入方式

绝大部分含有JavaScript 代码的网页都采用直接加入的方式。

  <script type="test/javascript">

  document.write("This is Javascript! ");

  </script>

其中,<script> </script> 是JavaScript 的标签。<scripttype = "test/javascript" > 用来提示浏览器该程序采用JavaScript 语言编写, 需要调动相应的解释程序进行解释。

除此之外, 还有一个更高版本的嵌入脚本, 使用HTML 中的CDATA 语法, 就是把CDATA 中的文本全部当作纯文本处理, 当遇到CDATA 时结束。

  <script language="javascript" type="test/javascript">

  <! CDATA[[>

  <! ]]>

  </script>

3.3.2 引用方式

如果已经存在一个JavaScript 源文件(以js 为扩展名),则可以采用引用的方式提高程序代码的利用率。其基本格式如下:

  <script src="url" type="test/javascript">

  </script>

其中url 就是程序文件的地址。

同样地, 这样的JavaScript 程序语句可以放在HTML文档头部或主体的任何部分。如果要实现直接加入JavaScript 程序代码, 可以首先创建一个JavaScript 源代码文件“javascript.js ” , 其代码为document.write ("This isJavascript! ") 。在网页中调用程序的方法, 如:

  <script src="javascript.js" type="test/javascript">

  </script>

也可以同时在导入文件时指定JavaScript 的版本,如:

  <script src = "javascript.js" type = "test/javascript; version =2.0">

  </script>

本文对Linux 操作系统的嵌入式浏览器进行了研究与分析。分析了嵌入式浏览器的结构, 并对嵌入式浏览器的各部分功能进行阐述, 其中包括词法分析、语法分析与布局、浏览器JavaScript 支持、I/O 端等部分。其中,在嵌入式浏览器的研究过程中, 词法分析的算法是开发技术的核心。在后续研究工作中, 可以对词法分析算法做进一步的研究, 提高词法分析的效率, 完善嵌入式浏览器功能实现的效果。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭