首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在 Web 上发布重要的公共警报(1)

在 Web 上发布重要的公共警报(1)

Common Alerting Protocol(CAP)是一种简单的标准化 XML 数据格式,United States Department of Homeland Security、United States Geological Survey(USGS)、加拿大政府和许多其他组织使用这种格式交换大量警报和紧急事件信息(使用 CAP 的公司和组织的清单见 )。
CAP 标准定义了一种称为警报(alert)的文档类型,这种文档用来交换许多方面的警报和事件,比如地质、气象、公共卫生和安全、营救、执法、环境、交通运输、基础设施和恐怖活动。这种警报可以由事件响应部门手工生成,也可以由监视和传感设备自动生成,而且可以使用多种方式分布它们。Atom 和 RSS 等联合格式为日益流行的 CAP 警报提供了一种发布渠道。
Atom Publishing Protocol(有时称为 Atompub 协议)是一种使用基本的 HTTP GET、POST、PUT 和 DELETE 操作发布和管理资源集合的机制。尽管 Atompub 协议最初被设计为一种向 weblog 软件发布新文章的机制,但是它适合管理几乎任何类型的 Web 内容。在本文中,我将介绍一个示例 Java™ Web 应用程序,这个程序使用 Atom Publishing Protocol 发布和分布 CAP 警报。
Common Alerting Protocol 简介CAP 警报文档的结构由一个 <alert /> 元素组成,其中包含一个或多个 <info /> 元素,这些元素提供事件的详细信息。在每个 <info /> 元素中,包含简单的元数据元素集合以及许多提供额外信息的 <resource /> 和 <area /> 元素,比如照片和文档的链接或者受警报影响的地区的地图坐标。常常需要为一个事件产生许多警报文档,从而跟踪紧急情况的发展。 给出一个 CAP 警报示例。
清单 1. CAP V1.1 规范提供的诱拐儿童警报示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version = "1.0" encoding = "UTF-8"?>
<alert xmlns = "urnasis:names:tc:emergency:cap:1.1">
  <identifier>KAR0-0306112239-SW</identifier>
  <sender>KARO@CLETS.DOJ.CA.GOV</sender>
  <sent>2003-06-11T22:39:00-07:00</sent>
  <status>Actual</status>
  <msgType>Alert</msgType>
  <source>SW</source>
  <scope>ublic</scope>
  <info>
    <category>Rescue</category>
    <event>Child Abduction</event>
    <urgency>Immediate</urgency>
    <severity>Severe</severity>
    <certainty>Likely</certainty>
    <eventCode>
      <valueName>SAME</valueName>
      <value>CAE</value>
    </eventCode>
    <senderName>LOS ANGELES POLICE DEPT - LAPD</senderName>
    <headline>AMBER ALERT</headline>
    <description>DATE/TIME: 06/11/03, 1915 HRS. VICTIM(S): KHAYRI DOE JR.
    M/B BLK/BRO 3'0", 40 LBS. LIGHT COMPLEXION. DOB 06/24/01. WEARING RED
    SHORTS, WHITE T-SHIRT, W/BLUE COLLAR. LOCATION: 5721 DOE ST.,
    LOS ANGELES, CA. SUSPECT(S): KHAYRI DOE SR. DOB 04/18/71 M/B, BLK HAIR,
    BRO EYE. VEHICLE: 81' BUICK 2-DR, BLUE (4XXX000).</description>
    <contact>DET. SMITH, 77TH DIV, LOS ANGELES POLICE
    DEPT-LAPD AT 213 485-2389</contact>
    <area>
      <areaDesc>Los Angeles County</areaDesc>
      <geocode>
        <valueName>SAME</valueName>
        <value>006037</value>
      </geocode>
    </area>
  </info>
</alert>




在这个示例中,可以看到典型 CAP 警报的大多数主要组件。下面是典型警报元素的列表:
  • 惟一的 <identifier />         和 <sender />:这些元素一起惟一地标识每个警报。<identifier> 是否必须是全局惟一,还是只在一个特定 <sender /> 的上下文中惟一,关于这一点当前的 CAP 标准的规定并不明确。但是,有一点非常明确,<sender /> 的值必须是全局惟一的。
  • 发送时间戳:这是发送警报文档的日期和时间,采用 IS0 8601 格式。
  • 描述:<status />、<msgType /> 和 <scope /> 元素描述警报文档的特定性质:
    • 状态:警报文档可以描述一个实际事件、一次演习、系统之间的一次通信、测试或草案。
    • 消息类型:警报文档可以是最初的通知、更新、对以前警报的撤消、对收到以前警报的确认或错误通知(描述以前接收的警报为什么被拒绝了)。
    • 范围:警报文档可以向一般公众发布、向需要了解相关情况的特定受众发布或者只发布给有限的一组非公共人员。
下面是典型的信息元素列表:
  • 类别:每个警报属于几个类别之一,包括地质、气象、公共卫生和安全、营救、执法等等。
  • 描述:这个信息元素包含文本信息,可以描述事件、建议的响应、指示、联系信息、更多信息的链接等等。
  • 倾向:<urgency />、<severity /> 和 <certainty /> 元素提供关于情况的重要性和影响的信息:
    • 紧急性:情况的紧急性可以是立即、预期、过去、未来或未知。
    • 严重性:情况的严重性可以是极端严重、严重、中等、轻微或未知。
    • 确定性:情况的确定性可以是已经观察到、很可能、可能、不可能或未知。
  • 时间戳:警报描述的情况可以有多个时间戳,包括情况发生的时间、信息生效的日期和时间以及信息过期的日期和时间。
资源元素描述情况报告附带的照片、文档和数据等资源。例如,执法警报可能包含嫌疑犯或受害人的照片、嫌疑犯的车辆的照片等等。可以通过 URL 链接资源,资源也可以作为 Base64 编码的文本直接包含在警报中。
区域元素描述受到警报影响的地理区域。这些元素可以包含详细的地理坐标(比如用精确地图坐标表示的圆形或多边形),还可以是简单的一般性文本描述。
为了增加安全性,CAP 警报可以包含 XML 数字签名,还可以使用 XML Encryption 进行加密。
创建和使用 CAP 警报在实现基于 CAP 的应用程序时,第一步是提供一种产生和解析警报文档的方法。可以使用任何 XML 库,以及几个目前用来处理 CAP 警报的 Java 库。在这里的示例中,我使用 Apache Abdera 项目中对数字签名和加密文档的内置支持。Abdera 简化了实现 Atom Publishing Protocol 端点的过程。在后面,我将演示如何使用端点发布和管理警报。可以通过访问 Abdera 的 Web 站点了解更多信息(参见 )。
这个示例提供一组接口和类,它们提供对警报文档内容的完整访问能力。本文提供的可下载 .zip 文件中包含这个 CAP 实现的完整源代码(见本文后面的 )。
演示如何创建一个警报文档,其中只包含一个 <info /> 元素。
清单 2. 用 Apache Abdera 创建 CAP 警报
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Abdera abdera = new Abdera();
Factory factory = abdera.getFactory();

Alert alert = (Alert) factory.newElement(CAP_ALERT);
alert.setIdentifier("ABC123DEF456");
alert.setSender("jasnell@example.org");
alert.setSent(new Date());
alert.setStatus(Alert.Status.Actual);
//...
Info info = alert.addInfo();
info.setCategories(Info.Category.Geo);
info.setEvent("Something happened");
info.setUrgency(Info.Urgency.Past);
info.setSeverity(Info.Severity.Extreme);
//...




演示如何解析 CAP 警报文档并访问它包含的信息。
清单 3. 用 Apache Abdera 解析 CAP 警报
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Abdera abdera = new Abdera();
Parser parser = abdera.getParser();
InputStream in = ... // get the input stream

Document<Alert> doc = parser.parse(in);
Alert alert = doc.getRoot();

System.out.println(alert.getIdentifier());
System.out.println(alert.getSender());
System.out.println(alert.getSent());
System.out.println(alert.getStatus());
//...
for (Info info : alert.getInfo()) {
  System.out.println(info.getEvent());
  //...
}




因为这个 CAP 实现是基于 Abdera 的,所以继承了许多有用的特性,比如可以使用 toString() 和 writeTo(...) 方法直接序列化为 XML,更重要的是,可以支持对警报文档进行 XML 数字签名。
返回列表