﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-小草封山</title><link>http://www.blogjava.net/yingpcao/</link><description>学无止境</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:09:47 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:09:47 GMT</pubDate><ttl>60</ttl><item><title>Grails - 傻瓜式的Web开发</title><link>http://www.blogjava.net/yingpcao/archive/2007/12/17/168137.html</link><dc:creator>硬盘草</dc:creator><author>硬盘草</author><pubDate>Sun, 16 Dec 2007 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/yingpcao/archive/2007/12/17/168137.html</guid><wfw:comment>http://www.blogjava.net/yingpcao/comments/168137.html</wfw:comment><comments>http://www.blogjava.net/yingpcao/archive/2007/12/17/168137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yingpcao/comments/commentRss/168137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yingpcao/services/trackbacks/168137.html</trackback:ping><description><![CDATA[<p>现在的web开发真是越来越简单了</p> <p>1. 敲了几个命令，一个web工程就建好了</p> <p>2.建好一个domain类，把属性定义好，再写了一行代码，就可以直接实现四大金刚的功能 -- CRUB。强悍啊，想想以前的裸写JDBC，到Hibernate繁杂的O/R配置文件，这年头写程序是简单的不行了。</p> <p>3.页面显示也都自动化了。自动生成新建页面，还直接把数据读出来显示，具有字段排序功能，开发真简单啊！重复的体力活没了</p><img src ="http://www.blogjava.net/yingpcao/aggbug/168137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yingpcao/" target="_blank">硬盘草</a> 2007-12-17 00:23 <a href="http://www.blogjava.net/yingpcao/archive/2007/12/17/168137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA I/O 机制浅谈</title><link>http://www.blogjava.net/yingpcao/archive/2007/09/14/145217.html</link><dc:creator>硬盘草</dc:creator><author>硬盘草</author><pubDate>Fri, 14 Sep 2007 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/yingpcao/archive/2007/09/14/145217.html</guid><wfw:comment>http://www.blogjava.net/yingpcao/comments/145217.html</wfw:comment><comments>http://www.blogjava.net/yingpcao/archive/2007/09/14/145217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yingpcao/comments/commentRss/145217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yingpcao/services/trackbacks/145217.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>JAVA的I/O里面一大堆的类，刚开始学的时候，真是狂晕。</p> <p>认真读完Core java之后，才发现这一套机制其实还简单的，只要抓住2条脉络：byte和Char，Decrator模式</p> <p>byte和Char的区别，说起来很简单，一个是8位，一个是16位。为什么在java中要严格区分呢？因为java是unicode的，也就是16位的，而很多系统通用的是ASCII（8bit）。正因为这种差异，在I/O机制中，用stream处理8位，Reader处理16位。在从输入输出角度来考虑，于是就有了InputStream/OutputStream和InputReader/OutputReader。 </p> <p>然而，这些原始流提供的功能太少了，效率也太低了。例如，一次只能读多个字符而不能读一行。为了提高效率，需要对他们进行一层包装，提供缓冲等功能。这个时候就应用包装器（Decrator）模式，设计了buffer... LineNumber...Data...等</p> <p>&nbsp;</p> <p>当然，操作文件的时候，可以简单的用FileReader，FileWriter打开文件，具体操作的时候PrintWriter就可以负责文件写了，而读文件一般需缓冲， 于是用BufferReader就行了</p><img src ="http://www.blogjava.net/yingpcao/aggbug/145217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yingpcao/" target="_blank">硬盘草</a> 2007-09-14 18:25 <a href="http://www.blogjava.net/yingpcao/archive/2007/09/14/145217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RFID 中间件规范 -- ALE 介绍</title><link>http://www.blogjava.net/yingpcao/archive/2007/09/10/144006.html</link><dc:creator>硬盘草</dc:creator><author>硬盘草</author><pubDate>Mon, 10 Sep 2007 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/yingpcao/archive/2007/09/10/144006.html</guid><wfw:comment>http://www.blogjava.net/yingpcao/comments/144006.html</wfw:comment><comments>http://www.blogjava.net/yingpcao/archive/2007/09/10/144006.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/yingpcao/comments/commentRss/144006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yingpcao/services/trackbacks/144006.html</trackback:ping><description><![CDATA[<p>应用层事件（Application Level Event）规范，简称ALE规范，于2005年9月，由EPCglobal组织正式对外发布。它定义出RFID中间件对上层应用系统应该提供的一组标准接口，以及RFID中间件最基本的功能：收集／过滤（Collect/Filter）。 <h5>1. ALE产生的背景 ---- RFID数据的冗余性/业务逻辑</h5> <p>RFID读写器工作时，不停的读取标签；因而，造成同一个标签在一分钟之内可能读取到几十次，这些数据如果直接发送给应用程序，将带来很大的资源浪费，所以需要RFID中间件对这些原始数据（Raw Data）进行一层收集/过滤处理，提供出有意义信息。 <p><b>&#8220;What, when, where&#8221; (</b><b>何时何地发生什么事情) </b>这是ALE向应用系统提供的最典型的信息内容。例如：&#8220;2006-3-20 19:30 门禁处读取到 epc#1&#8221;。此外，在智能货柜（Smart Shelf）之类的应用中，业务流程只关注物品是否增加或减少。此时，ALE就可以向上层汇报&#8220;2006-3-20 19:31 epc#1 在货柜#1区出现/消失&#8221;。<b></b> <p>所以说，ALE的出现主要是为了减少原始数据的冗余性，从大量数据中提炼出有效的业务逻辑而设计。 <h5>2. ALE与应用系统的关系<img height="281" hspace="12" src="http://www.blogjava.net/images/blogjava_net/yingpcao/WindowsLiveWriter/RFIDALE_D538/clip_image002.jpg" width="282" align="left"></h5> <p>ALE层介于应用业务逻辑和原始标签读取层之间，如图1所示。它接收从数据源（一个或多个读写器）中发来的原始标签读取信息，而后，按照时间间隔等条件累计（Accumulate）数据，将重复或不敢兴趣的EPCs剔除过滤(Filter)，同时可以进行计数及组合（Count/Group）等操作，最后，将这些信息对应用系统进行汇报。 <p>在ALE中，应用系统可以定义这些内容：在什么地方（地点可以映射一个或多个读写器及天线）读取标签。在怎样的时间间隔内（决定时间、某个外部事件触发）收集到的数据，如何过滤数据，如何整理数据报告内容（按照公司、商品还是标签分类），标签出现或消失时是否对外报告，以及读取到的标签数目。 <p>ALE规范定义的是一组接口，它不牵涉到具体实现。在EPCglobal组织的规划中，支持ALE规范是RFID中间件的最基本的一个功能；这样，在统一的标准下，应用层上的调用方式就可统一，应用系统也就可以快速部署。 <p>因此，ALE规范定义的是应用系统对RFID中间件的标准访问方式。 <p><b><br></b> <h5>3. ALE 输入（ECSpec）/输出（ECReport）</h5> <p>在ALE模型中，有几个最基本的概念：读周期（Read Cycle），事件周期（Event Cycle）和报告（Report）。 <p>读周期是和读写器交互的最小单位。一个读周期的结果是一组EPCs集合。读周期的时间长短和具体的天线、RF协议有关。读周期的输出就是ALE层的数据来源。如图2所示。 <p>事件周期可以是一个或多个读周期。它是从用户的角度来看待读写器的，可以将一个或多个读写器当作一个整体，是ALE接口和用户交互的最小单位。应用业务逻辑层的客户在ALE中定义好事件周期的边界之后，就可接收相应的数据报告。 <p>报告，则是在前面定义的事件周期的基础上，ALE向应用层析提供的数据结果。 <p><img height="365" src="http://www.blogjava.net/images/blogjava_net/yingpcao/WindowsLiveWriter/RFIDALE_D538/clip_image004.gif" width="560"> <p>图2 事件周期 <p>对于事件周期的定义，在ALE中由ECSpec表达；对于报告的内容，由ECReports负责，如图3。 <p><img height="243" src="http://www.blogjava.net/images/blogjava_net/yingpcao/WindowsLiveWriter/RFIDALE_D538/clip_image006.jpg" width="380"> <h5>4. ECSpec 介绍</h5> <p>ECSpec描述了事件周期以及报告产生的格式。它包括：一组逻辑读写器（logical Readers）内，这些逻辑读写器的读周期在该事件周期内；一份定义事件周期边界的规范；以及在这个事件周期内产生的一组报告（report）的格式规范。如图4所示 <p><img height="163" src="http://www.blogjava.net/images/blogjava_net/yingpcao/WindowsLiveWriter/RFIDALE_D538/clip_image008.jpg" width="553" border="0"> <p>图4 ECSpec <p>在ALE规范中，定义出ECSpec的XSD文件，同时有ECSpec的具体例子，如图5。 <p><img height="532" src="http://www.blogjava.net/images/blogjava_net/yingpcao/WindowsLiveWriter/RFIDALE_D538/clip_image010.jpg" width="553" border="0"> <p>图5 ECSpec示例 <p>从该例子中，我们可以看出，上层应用系统需要逻辑读写器dock_1a和dock_1b，在满足开始及结束的触发事件文件trigger1/trigger2 定义的条件下，重复周期20000MS，间隔3000MS，对外发送3个报表report1/report2/report3，report1报告当前读取到的标签，report2报告每个事件周期内增加的标签及总个数，report3报告每个事件周期内减少的标签及总个数，以及标签进行组合的形式。 <h5>5. ECReports介绍</h5> <p>ECReports是ALE中间件向上层应用系统做出报告，如图6所示。 <p><img height="343" src="http://www.blogjava.net/images/blogjava_net/yingpcao/WindowsLiveWriter/RFIDALE_D538/clip_image012.jpg" width="554" border="0"> <p>Report1汇报当前读取到2个标签。Report2报告当前读取到的标签个数6847。Report3报告EPC为3.0037000.12345类的物品读取到2个，3.0037000.55555类的物品读取到3个，读取到标签数为6842。 <p><b><br></b> <h5>6. 典型ALE调用场景</h5> <p>应用系统与ALE中间件的交互，必须先将事件周期的定义文件（ECSpec）传送至中间件，同时告知中间件将报告发回的地址。在以ALE交互中，有几个最基本的方法：define/undefine，subscribe/unsubscribe, poll/Immediate。 define/undefine是定义/撤销ECSpec的操作，subscribe/unsubscribe是订阅/撤销某个ECSpec的服务。 <p><b>a) </b><b>直接订阅(Direct Subscription)</b> <p>该模式下，ECSpec由客户A定义，得到的报告反馈给A。 <p><img height="544" src="http://www.blogjava.net/images/blogjava_net/yingpcao/WindowsLiveWriter/RFIDALE_D538/clip_image014.jpg" width="528"> <p>首先，Client1将名为ECname1的ECSpec定义给ALE中间件，而后Client1订阅该ECName1的报告，并将它发至地址为notifyURI的接收处。 <p>在时间1内，读写器reader1没有读到标签，所以没有反馈。在时间厄内，读到标签，而后，ALE中间件自动将ECreport发送给Client1。 <p>当Client1不需要RFID信息时，它首先退订notifyURI的ECname1的服务。当ECname1没有订阅者之后，就可以撤销ECname1的时间周期。 <p><b><br></b> <p><b>b) </b><b>间接订阅(InDirect Subscription)</b> <p>该模式与直接订阅的差异是，得到的报告不是反馈给A，而是反馈给B。 <p><img height="528" src="http://www.blogjava.net/images/blogjava_net/yingpcao/WindowsLiveWriter/RFIDALE_D538/clip_image016.jpg" width="576"> <p>该图显示的ECspec边界由触发器来决定。在第6步中，我们可以看到ECreport发至client1，而不是初始的服务定义者。这是由于在第2步中的服务反馈地址notifyURI指向client1。 <p><b>c) </b><b>Poll/Immediate</b> <p>Poll和Immediate可以看成应用系统对ALE中间件的快照。在很多应用中，不需要一直监听ALE，而只要知道当时读到的标签信息，这2种模式就是为满足这些需求而设计的 <p>当ALE中间件中已经有定义好的ECSpec时，同时Client需要这个ECSpec提供的信息，就可以使用Poll方法得到反馈。 <p>当ALE中间件中不存在Client需要的事件周期时，这个时候，可以直接转送这个事件周期的定义ECSpec2，而后得到结果，这就是Immediate。 <p><img height="577" src="http://www.blogjava.net/images/blogjava_net/yingpcao/WindowsLiveWriter/RFIDALE_D538/clip_image018.jpg" width="518"> <h5>7. 参考资料</h5> <p>EPCglobal. The Application Level Events(ALE) Specification, version 1.0, Sept 15, 2005.</p> <img src ="http://www.blogjava.net/yingpcao/aggbug/144006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yingpcao/" target="_blank">硬盘草</a> 2007-09-10 15:13 <a href="http://www.blogjava.net/yingpcao/archive/2007/09/10/144006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>