EDXL Distribution Element

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 แบบใหญ่ๆ

  1. ข้อมูลทั่วไปเกี่ยวกับ DE นั้นๆ เช่น ID, ผู้ส่ง, เวลาส่ง เป็นต้น พวกนี้ส่วนมากบังคับว่าต้องมี (เป็น REQUIRED ตามภาษา XML) และมีได้อันเดียว
  2. <targetArea> - บอกพื้นที่ที่เกี่ยวข้องกับข้อมูลก้อนนี้ สามารถระบุเป็นพิกัดภูมิศาสตร์ หรือจะเป็นรหัสประเทศ รหัสจังหวัดก็ได้เช่นกัน เจ้านี่เป็น OPTIONAL และก็มีได้หลายอัน (เวลามีภัยอาจเกิดได้หลายพื้นที่)
  3. <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 แบบคือ

  1. กำหนดเป็นพื้นที่โดยระบุ latitude/longitude ซึ่งเขียนในรูปจุดทศนิยม (41.2197) จะมาใส่เป็นลิปดา ฟิลิปดา (41 13' 11") ไม่ได้ พื้นที่มีสองแบบ
    • circle — วงกลม ระบุจุดศูนย์กลาง,รัศมีด้วยฟอร์แมต "latitude, longitude, radius"
    • polygon — ใส่เป็น coordinate ฟอร์แมตนี้ "lat1,long1 lat2,long2 lat3,long3 lat1,long1" สังเกตว่าคู่ลำดับตัวแรกกับตัวสุดท้ายต้องเหมือนกัน
  2. เป็นชื่อหรือตัวย่อประเทศ ใช้โค้ดมาตรฐาน 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 เกือบหมด

อืม ๆ ยาก ๆ แฮะ

ขอบคุณครับ กำลังขี้เกียจเข้าไปอ่านฉบับภาษาอังกฤษอยู่พอดีเลย :-P

ตอนนี้อยากรู้ว่า ActiveMQ มัน route EDXL ยังไงกันแน่ เหมือนว่าขั้นตอนการ route ทั้งหมดมันไม่ได้อยู่ใน EDXL เลยซักนิด แปลว่าต้องมีอะไรครอบ EDXL อีกทีละซิ

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 แล้วส่งออกไปข้างนอกเลย ให้ระบบภายนอกตัดสินใจเองว่าจะเอาไปใช้หรือไม่ -- ข้อดีข้อเสียทั้งสองแบบคงชัดอยู่แล้วครับ

กระบวนการ route จะทำโดย plug-in ครับ ส่วน ข้อมูลที่จะเอามาตัดสินในก็อยู่ใน EDXL นั่นล่ะ อยู่ที่ว่าจะ route ด้วยอะไร อันนี้คงต้องมาคุยในรายละเอียดว่าจะเอาแบบไหน ในสภาวะปกติที่ไม่มีการปิดบังข้อมูลหรื่อต้องการส่งให้ใครโดยเฉพาะก็ไม่ต้อง route ครับ public อย่างเดียว

Post new comment

The content of this field is kept private and will not be shown publicly.