แต่ถ้าเราจะเขียนโปรแกรมภาษาจาวาเพื่อทำการติดต่อข้อมูลกับระบบ sensor network ที่เขียนด้วยภาษา nesC นั้น เราก็จะต้องมีการสร้าง class บนภาษา Java เพื่อมารองรับ message นั้นๆ
ซึ่งใน TinyOS นั้นจะมี tool ที่ช่วยให้เราทำงานนี้ได้สบายขึ้น คือ MIG และ NCG
MIG - Message Interface Generator
ตัวนี้จะเป็นตัวที่ใช้สร้าง class Java เพื่อจะรองรับ message ที่เราสร้างขึ้น
NCG- NesC Constant Generator
ตัวนี้จะทำหน้าที่ดึงค่า constant ต่างๆที่เราประกาศไว้ออกมาใส่ใน class Java
ก่อนอื่นผมขอสมมติว่า ผมทำ nesC app ไว้ที่ /opt/tinyos-1.x/apps/MyApp
โดยใน MyApp มีโฟลเดอร์ชื่่อ types ที่ใช้เก็บ header file ที่ใช้ประกาศประเภทข้อมูล message เอาไว้
และใน types มีไฟล์ชื่อ MyMsg.h ซึ่งภายในไฟล์มีการประกาศค่าคงที่ AM_TYPE และ message ไว้ คือ
// ไฟล์ MyMsg.h
enum AM_TYPE
{
AM_PINGMSG = 20,
AM_PINGREPLYMSG = 21,
};
typedef struct PingMsg
{
uint16_t hostid;
uint16_t seqno;
} PingMsg;
typedef struct PingReplyMsg
{
uint16_t hostid;
uint16_t seqno;
uint16_t origin;
uint16_t parent;
uint16_t depth;
} PingReplyMsg;
คราวนี้เราจะมาสร้าง class java โดยใช้ structure จากค่าเหล่านี้กัน
สมมติว่าเราจะสร้าง class java เอาไว้ใน MyApp/java ให้ทำการสร้างไฟล์ชื่อ Makefile เอาไว้ใน MyApp/java โดยมีเนื้อหาดังนี้ (สำหรับใครที่อ่านแล้วงงๆ ลองศึกษาเรื่องมีวิธีการทำ Makefile http://frank.mtsu.edu/~csdept/FacilitiesAndResources/make.htm)
// ไฟล์ Makefile
TOS = $(shell ncc -print-tosdir)
APPDIR = $(TOS)/../apps/MyApp
MIG = mig java
NCG = ncg java
MSGS = PingMsg.java ReplyPingMsg.java
CONST = PingConst.java
INITIAL_TARGETS = $(MSGS) $(CONST)
OTHER_CLEAN = cleanmig
ROOT = ../../../tools/java
include $(ROOT)/Makefile.include
PingMsg.java:
$(MIG) -java-classname=PingMsg $(APPDIR)/types/MyMsg.h PingMsg -o $@
$(JAVAC) $@
PingReplyMsg.java:
$(MIG) -java-classname=PingReplyMsg $(APPDIR)/types/MyMsg.h PingReplyMsg -o $@
$(JAVAC) $@
PingConst.java:
$(NCG) -java-classname=PingConst $(APPDIR)/types/MyMsg.h AM_PINGMSG AM_PINGREPLYMSG -o $@
$(JAVAC) $@
cleanmig:
rm -f $(MSGS) $(CONST)
โดยมีส่วนที่สำคัญคือ
MIG = mig java
NCG = ncg java
จะเป็นการสร้างค่าเพื่อใช้เรียกคำสั่ง mig และ ncg โดยให้สร้างเป็น class ประเภท java
MSGS = PingMsg.java ReplyPingMsg.java
CONST = PingConst.java
เป็นการระบุว่าเราจะสร้าง class ชื่ออะไรออกมาบ้าง ในที่นี่คือ PingMsg.java, ReplyPingMsg.java และ PingConst.java เพื่อเป็นประโยชน์เวลาสั่ง clean จะได้ตามลบได้หมดทุกตัว นั่นคือมันจะทำการ clean ทุกไฟล์ที่มีการประกาศไว้ใน MSGS และ CONST (ดูในโค้ด makefile ส่วนที่เป็น cleanmig ด้านล่างสุด) เพราะเวลาเราสั่ง make clean มันจะดูที่ค่าคงที่ OTHER_CLEAN ที่ประกาศไว้ ซึ่งในที่นี้เราให้เป็น cleanmig มันก็จะไปทำ cleanmig ซึ่งลบทุกอย่างที่ประกาศไว้ใน MSGS และ CONST นั่นเอง
include $(ROOT)/Makefile.include
ใช้ในการระบุ makefile ที่จะใช้ในการ compile java โดยไฟล์นี้จะชี้ไปที่ /opt/tinyos-1.x/tools/java/Makefile.include
PingMsg.java:
$(MIG) -java-classname=PingMsg $(APPDIR)/types/MyMsg.h PingMsg -o $@
$(JAVAC) $@
ทำการสร้างไฟล์ชื่อ PingMsg.java โดย
-java-classname เป็นการระบุชื่อไฟล์ java
$(APPDIR)/types/MyMsg.h เป็นการระบุ nesC header ไฟล์ที่เราต้องการจะดึงค่าออกมา
PingMsg เป็นชื่อ struct ที่เราประกาศไว้ใน nesC ไฟล์และจะเอามาทำเป็น java class
-o $@ สร้าง output ชื่อว่า PingMsg.java (@ คือชื่อที่เขียนไว้ที่บรรทัด PingMsg.java:)
$(JAVAC) $@ ทำการคอมไพล์ (ข้อควรระวัง เว้นวรรคด้านหน้านั้น ให้ใช้ tab(\t) หนึ่งครั้ง ห้ามเป็นเครื่องหมาย space ต่อกันหลายครั้ง)
ส่วนกรณีของ NCG นั้นก็จะคล้ายกัน แต่เปลียนจาก MIG เป็น NCG และสามารถระบุค่าคงที่ได้หลายตัวว่าจะเอาค่าอะไรออกมาบ้าง
พอสุดท้ายเราก็จะได้ PingMsg.java PingMsg.class PingReplyMsg.java PingReplyMsg.class PingConst.java และ PingConst.class เพื่อเอาไปใช้ในโปรแกรม java ของเราได้
ระบบที่ใช้ทดสอบ
TinyOS: 1.1.15 on cygwin
ไม่มีความคิดเห็น:
แสดงความคิดเห็น