EDXL เป็นรูปแบบข้อมูลสำหรับภัยพิบัติ ใช้ในโครงการ OpenCARE บล็อกอันนี้จะเป็นการแปลสเปก EDXL ของ OASIS ในส่วน Distribution Element (DE) ตามที่ผมเข้าใจ
เป้าหมายจริงๆ ก็เอาไว้อ่านเองกันลืม แต่ก็เผยแพร่ไว้ที่นี่ด้วยเผื่อจะมีใครนำไปใช้ประโยชน์
ลิงก์ที่เกี่ยวข้อง
หมายเหตุ: ควรมีความรู้ XML พื้นฐานในการอ่าน ส่วนชนิด datatype ใช้ตาม W3C XML Schema (ไม่ใช่ Relax NG :P)
Overview
EDXL Distribution Element (ต่อไปจะเรียก EDXL-DE) เปรียบเทียบง่ายๆ คือเป็นเหมือน header ของแพกเกต IP ที่บอกว่าข้อมูลทั้งหมดจะส่งไปที่ไหน เมื่อไร เป็น wrapper ครอบตัวเนื้อหาจริงๆ อีกที ซึ่งเนื้อหาในนั้นจะเป็นอะไรก็ได้ ตัว EDXL-DE จะไม่สนใจ
<EDXLDistribution> (Root Element)
element ระดับบนสุดของ EDXL-DE คือ <EDXLDistribution> ซึ่งในนี้จะมีลูกได้ 3 แบบใหญ่ๆ
- ข้อมูลทั่วไปเกี่ยวกับ DE นั้นๆ เช่น ID, ผู้ส่ง, เวลาส่ง เป็นต้น พวกนี้ส่วนมากบังคับว่าต้องมี (เป็น REQUIRED ตามภาษา XML) และมีได้อันเดียว
- <targetArea> - บอกพื้นที่ที่เกี่ยวข้องกับข้อมูลก้อนนี้ สามารถระบุเป็นพิกัดภูมิศาสตร์ หรือจะเป็นรหัสประเทศ รหัสจังหวัดก็ได้เช่นกัน เจ้านี่เป็น OPTIONAL และก็มีได้หลายอัน (เวลามีภัยอาจเกิดได้หลายพื้นที่)
- <contentObject> - ตัวเนื้อหาจริงๆ ที่ DE นี้รับภาระขนมา เป็น OPTIONAL และมีได้หลายอันเช่นกัน (อาจเป็นข้อความประกอบรูปภาพ อะไรเงี้ย)
ทีนี้เรามาดูแต่ละตัวกันแบบละเอียดขึ้นมาอีกนิด
EDXLDistribution Sub-Element
ตามข้อ 1. ข้างต้น พวกนี้เป็นลูกของ EXDLDistribution ที่ให้ข้อมูลของตัว DE เอง
หมายเหตุ: ในวงเล็บคือ OPTIONAL ส่วน * หมายถึงมีหลายอันได้
- distributionID — ID ของ DE อันนั้นๆ เป็น string (ส่วนจะเป็นเลขอะไรนั้น เข้าใจว่ากำหนดกันเอง)
- senderID — ID ผู้ส่ง เป็น string ในรูปแบบ actor@domain-name เหมือนอีเมล
- dateTimeSent — เวลาส่ง เป็น dateTime (ตัวอย่าง: 2004-08-01T16:49:00-07:00)
- distributionStatus — สถานะของ DE ว่าเป็นของจริงหรือส่งซ้อม มี 4 แบบ คือ Actual, Excercise, System และ Test
- distributionType — ชนิดของ DE ที่ละเอียดขึ้นมาจาก Status อีกขั้น บอกว่าเป็นข้อมูลใหม่, แก้ข้อมูลของ DE เดิม หรือยกเลิกข้อมูล DE เก่า เป็นต้น
- combindedConfidentiality — ระบุว่าข้อมูลใน contentObject ที่แนบมาด้วยเป็นความลับแค่ไหน ค่าตรงนี้ต้องลับมากกว่าหรือเท่ากับ contentObject ที่ลับที่สุด
- (language) — ภาษาของข้อมูลที่แนบมา
- (senderRole) * — สถานะ/บทบาทของผู้ส่ง อาจใช้ประกอบการ route ตัว DE
- (recipientRole) * — สถานะ/บทบาทของผู้รับ อาจใช้ประกอบการ route ตัว DE
- (keyword) * — ก็คีย์เวิร์ด :D (ของ DE) อาจใช้ประกอบการ route เหมือนกัน
[สามตัวนี้เป็นชนิด List and Associated Value แปลเป็นภาษา Python มันคือ Dictionary]
- (distributionReference) * — ในกรณีที่อ้าง DE เก่า ก็ต้องระบุว่า DE เก่าอันไหน โดยใช้ฟอร์แมต "distributionID,senderID,dateTimeSent" (แน่นอนว่าเป็น string) ตัวอย่างเช่น msgID0074,actor@domain-name,2004-08-01T16:49:00-07:00 น่าจะเห็นภาพ
- (explicitAddress) * — ที่อยู่ของผู้รับข้อความในฟอร์แมตอื่นๆ ที่สามารถเป็นไปได้ ชนิดเป็น XML ซ้อนอีกที (แปลว่าต้องไปกำหนด Schema ของที่อยู่กันอีกรอบ)
<targetArea>
ตามข้อ 2. สามารถกำหนดได้ 2 แบบคือ
- กำหนดเป็นพื้นที่โดยระบุ latitude/longitude ซึ่งเขียนในรูปจุดทศนิยม (41.2197) จะมาใส่เป็นลิปดา ฟิลิปดา (41 13' 11") ไม่ได้ พื้นที่มีสองแบบ
- circle — วงกลม ระบุจุดศูนย์กลาง,รัศมีด้วยฟอร์แมต "latitude, longitude, radius"
- polygon — ใส่เป็น coordinate ฟอร์แมตนี้ "lat1,long1 lat2,long2 lat3,long3 lat1,long1" สังเกตว่าคู่ลำดับตัวแรกกับตัวสุดท้ายต้องเหมือนกัน
- เป็นชื่อหรือตัวย่อประเทศ ใช้โค้ดมาตรฐาน ISO 3166-1 (ประเทศไทยก็ TH) แต่ก็มี variant ได้หลายแบบอีกเหมือนกัน
- country — เฉพาะรหัสประเทศ
- subdivision — รหัสประเทศตามด้วยรหัสพื้นที่อีก 3 ตัว เช่น DK-025 (ซักที่ในเดนมาร์ค) ตรงนี้ผมคิดว่าของไทยน่าจะใช้รหัสไปรษณีย์ 3 ตัวแรก?
- locCodeUN — รหัสประเทศตามด้วย UN/LOCODE อีก 3 ตัว (UN/LOCODE ใน Wikipedia) อันนี้ตัวอย่างของแถวบ้าน TH PKR (ปากเกร็ด)
ผู้รับสามารถรับข้อมูลมาดู targetArea ถ้าไม่ตรงกับตัวเองก็ discard ทิ้งไปได้
<contentObject>
หลักใหญ่ใจความของ contentObject คือต้องบอกว่าข้างในเป็นข้อมูลชนิดอะไร ซึ่งตรงนี้เรามีทางเลือกแค่ 2 อย่างคือเป็น XML หรือไม่เป็น
- ถ้าเป็น XML ก็ต้องใส่ wrapper เป็น element ย่อยอีกชั้นว่า <xmlContent> แล้วค่อยยัด XML ลงในนี้อีกที
- ถ้าไม่เป็น XML ก็ทำแบบเดียวกัน เพียงแต่ใส่ element ย่อยชื่อ <nonXMLContent> แทน (สังเกตตัวเล็กใหญ่ของ XML ไม่เหมือนกัน) ที่เพิ่มพิเศษมาคือระบุชนิดของเนื้อหาใน mimeType อีกทีหนึ่ง
นอกจาก xmlContent กับ nonXMLContent สองตัวนี้แล้ว ใน contentObject ยังมี element แบบอื่นๆ ที่ใช้ประกอบ เช่น description หรือการระบุความลับ ตรงนี้คงไม่ลงรายละเอียด ถ้าสนใจก็อ่านในสเปกฉบับเต็มได้
ป.ล. ผมสังเกตว่า EDXL-DE แทบจะไม่ใช้ attribute เลย ใช้เป็น element เกือบหมด
Comments
พี่ไท้
7 November, 2006 - 13:06
Permalink
อืม ๆ ยาก ๆ
อืม ๆ ยาก ๆ แฮะ
PaePae
8 November, 2006 - 08:29
Permalink
ขอบคุณครั
ขอบคุณครับ กำลังขี้เกียจเข้าไปอ่านฉบับภาษาอังกฤษอยู่พอดีเลย :-P
sugree
9 November, 2006 - 09:30
Permalink
ตอนนี้อยา
ตอนนี้อยากรู้ว่า ActiveMQ มัน route EDXL ยังไงกันแน่ เหมือนว่าขั้นตอนการ route ทั้งหมดมันไม่ได้อยู่ใน EDXL เลยซักนิด แปลว่าต้องมีอะไรครอบ EDXL อีกทีละซิ
Conductor
10 November, 2006 - 05:20
Permalink
EDXL-DE เป็น data
EDXL-DE เป็น data ที่จะถูกส่ง; การ route ทำโดย ActiveMQ
ที่จริง จะเรียกว่า route ก็ไม่เชิง เพราะว่า ActiveMQ เป็น MOM/Message Bus "producer" ส่งอะไรลงมา "consumer" (plug-in) อื่นๆก็ได้หมด; นอกจากวิธี pub/sub ซึ่งก็เหมือนกับการมี queue หลายๆ queue แล้ว ยังมีวิธีการพิสดารอื่นๆที่ใช้ได้อีก
เมื่อ plug-in รับ EDXL-DE มา ก็ตัดสินใจได้เอง มีทางเลือกสองทาง คือตัดสินใจส่งออกไปยังระบบภายนอกเองโดยดูจาก <targetArea> หรือ <explicitAddress> หรือ tag อื่นๆ อีกทางเลือกหนึ่งคือ plug-in รับ EDXL-DE มาก็ไม่สนใจอะไรทั้งนั้น เปลี่ยน format แล้วส่งออกไปข้างนอกเลย ให้ระบบภายนอกตัดสินใจเองว่าจะเอาไปใช้หรือไม่ -- ข้อดีข้อเสียทั้งสองแบบคงชัดอยู่แล้วครับ
nontster
23 April, 2007 - 10:12
Permalink
กระบวนการ
กระบวนการ route จะทำโดย plug-in ครับ ส่วน ข้อมูลที่จะเอามาตัดสินในก็อยู่ใน EDXL นั่นล่ะ อยู่ที่ว่าจะ route ด้วยอะไร อันนี้คงต้องมาคุยในรายละเอียดว่าจะเอาแบบไหน ในสภาวะปกติที่ไม่มีการปิดบังข้อมูลหรื่อต้องการส่งให้ใครโดยเฉพาะก็ไม่ต้อง route ครับ public อย่างเดียว
Add new comment