OMNet++
Tran
g
1
1. GIỚI THIỆU
1.1.
OMNeT++
là
gì?
OMNeT++
l
à
viế
t
t
ắ
t
của
cụm
t
ừ
Objective
Modular
Network
Testbed
in
C++.
OMNeT++
l
à
mộ
t
ứng
dụng
cung
cấp
cho
ngườ
i
sử
dụng
mô
i
trường
để
ti
ến
hành
mô
phỏng
hoạ
t
động
của
mạng.
Mục
đích
ch
í
nh
của
ứng
dụng
l
à
mô
phỏng
hoạ
t
động
mạng
thông
ti
n,
tuy
nh
i
ên
do
tí
nh
phổ
cập
và
linh
hoạ
t
của
nó,
OMNeT++
còn
được
sử
dụng
trong
nhiều
l
ĩnh
vực
khác
như
mô
phỏng
các
hệ
thống
thông
tin
phức
t
ạp,
các
mạng
k
i
ểu
hàng
đợ
i
(queueing
networks)
hay
các
kiến
t
rúc
phần
cứng
OMNeT++
cung
cấp
sẵn
các
thành
phần
t
ương
ứng
vớ
i
các
mô
hình
thực
t
ế.
Các
thành
phần
này
(còn
được
gọ
i
là
các
modu
l
e)
được
l
ập
trình
theo
ngôn
ngữ
C++,
sau
đó
được
t
ập
hợp
l
ạ
i
thành
những
thành
phần
hay
những
mô
hình
l
ớn
hơn
bằng
mộ
t
ngôn
ngữ
bậc
cao
(NED).
OMNeT++
hỗ
trợ
giao
d
i
ện
đồ
hoạ,
t
ương
ứng
vớ
i
các
mô
hình
cấu
t
rúc
của
nó
đồng
t
hờ
i
phần
nhân
mô
phỏng
(simu
l
ation
kernel)
và
các
module
của
OMNeT++
cũng
rấ
t
dễ
dàng
nhúng
vào
trong
các
ứng
dụng
khác.
1.2.
Các
thành
phần
chính
của
OMNeT++
•
Thư
viện
phần
nhân
mô
phỏng
(simulat
i
on
kerne
l
)
•
Trình
biên
dịch
cho
ngôn
ngữ
mô
t
ả
hình
trạng
(topology
description
language)
-
NED
(nedc)
•
Trình
biên
t
ập
đồ
hoạ
(graphical
ne
t
work
editor)
cho
các
fi
l
e
NED
(GNED)
•
Giao
diện
đồ
hoạ
thực
h
i
ện
mô
phỏng,
các
li
ên
kế
t
bên
trong
các
file
thực
hiện
mô
phỏng
(Tkenv)
•
Giao
diện
dòng
l
ệnh
t
hực
hiện
mô
phỏng
(Cmdenv)
•
Công
cụ
(giao
diện
đồ
hoạ)
vẽ
đồ
thị
kế
t
quả
vec
t
or
ở
đầu
ra
(Plove)
•
Công
cụ
(giao
diện
đồ
hoạ)
mô
t
ả
kế
t
quả
vô
hướng
ở
đầu
ra
(Scalars)
•
Công
cụ
tài
li
ệu
hoá
các
mô
hình
•
Các
ti
ện
ích
khác
•
Các
t
à
i
li
ệu
hướng
dẫn,
các
v
í
dụ
mô
phỏng
1.3.
Ứng
dụng
OMNeT++
l
à
mộ
t
công
cụ
mô
phỏng
các
hoạ
t
động
mạng
bằng
các
module
được
th
i
ế
t
kế
hướng
đố
i
t
ượng.
OMNeT++
thường
được
sử
dụng
trong
các
ứng
dụng
chủ
yếu
như
:
•
Mô
hình
hoạ
t
động
của
các
mạng
thông
tin
OMNet++
Tran
g
2
•
Mô
hình
giao
thức
•
Mô
hình
hoá
các
mạng
k
i
ểu
hàng
đợ
i
•
Mô
h
ì
nh
hoá
các
hệ
thống
đa
bộ
vi
xử
lý
(mu
lti
processer)
hoặc
các
hệ
thống
phần
cứng
theo
mô
h
ì
nh
phân
tán
khác
(distribu
t
ed
hardware
systems)
•
Đánh
giá
kiến
trúc
phần
cứng
•
Đánh
giá
hiệu
quả
hoạ
t
động
của
các
hệ
thống
phức
t
ạp
1.4.
Mô
hình
trong
OMNeT++
Mộ
t
mô
hình
t
rong
OMNeT++
bao
gồm
các
module
l
ồng
nhau
có
cấu
t
rúc
phân
cấp.
Độ
sâu
của
của
các
module
l
ồng
nhau
l
à
không
giớ
i
hạn,
đ
i
ều
này
cho
phép
ngườ
i
sử
dụng
có
t
hể
biểu
diễn
các
cấu
t
rúc
l
ogic
của
các
hệ
thống
trong
t
hực
t
ế
bằng
các
cấu
trúc
mô
hình.
Các
module
trao
đổ
i
thông
ti
n
vớ
i
nhau
thông
qua
việc
gử
i
các
message
(message).
Các
message
này
có
t
hể
có
cấu
trúc
phức
t
ạp
tuỳ
ý.
Các
module
có
thể
gử
i
các
message
này
t
heo
hai
cách,
mộ
t
l
à
gử
i
trực
ti
ếp
t
ớ
i
địa
chỉ
nhận,
ha
i
là
gử
i
đ
i
t
heo
mộ
t
đường
dẫn
được
định
sẵn,
thông
qua
các
cổng
và
các
kế
t
nối.
Các
module
có
thể
có
các
tham
số
của
riêng
nó.
Các
tham
số
này
có
thể
được
sử
dụng
để
chỉnh
sửa
các
thuộc
tính
của
modu
l
e
và
để
biểu
diễn
cho
topo
l
ogy
của
mô
hình.
Các
module
ở
mức
thấp
nhấ
t
trong
cấu
trúc
phân
cấp
đóng
gói
các
thuộc
tính.
Các
module
này
được
co
i
l
à
các
module
đơn
giản,
và
chúng
được
l
ập
trình
trong
ngôn
ngữ
C++
bằng
cách
sử
dụng
các
thư
viện
mô
phỏng.
OMNet++
Tran
g
3
2. TỔNG QUAN
2.1.
Khái
niệm
mô
hình
hoá
OMNeT++
cung
cấp
cho
ngườ
i
sử
dụng
những
công
cụ
hiệu
quả
để
mô
t
ả
cấu
trúc
của
các
hệ
thống
thực
t
ế.
Các
modu
l
e
l
ồng
nhau
có
cấu
trúc
phân
cấp
Các
modu
l
e
là
các
đố
i
t
ượng
cụ
thể
của
các
k
i
ểu
module
Các
modu
l
e
trao
đổ
i
thông
tin
bằng
các
message
qua
các
kênh
Các
tham
số
của
module
li
nh
hoạ
t
Ngôn
ngữ
mô
t
ả
topology
2.1.1.
Cấu
trúc
phân
cấp
của
các
module
Mộ
t
mô
hình
trong
OMNeT++
chứa
các
modu
l
e
l
ồng
nhau
có
cấu
trúc
phân
cấp,
trao
đổ
i
thông
tin
vớ
i
nhau
bằng
cách
gử
i
các
message.
Mỗ
i
mô
h
ì
nh
này
thường
b
i
ểu
d
i
ễn
cho
mộ
t
hệ
thống
mạng.
Modu
l
e
mức
cao
nhấ
t
trong
cấu
trúc
phân
cấp
được
gọ
i
l
à
module
hệ
thống.
Module
này
có
thể
chứa
các
module
con,
các
module
con
cũng
có
thể
chứa
các
module
con
của
riêng
nó.
Độ
sâu
phân
cấp
đố
i
vớ
i
các
module
là
không
giớ
i
hạn,
đ
i
ều
này
cho
phép
ngườ
i
sử
dụng
có
t
hể
dễ
dàng
biểu
diễn
mộ
t
cấu
t
rúc
l
ogic
của
mộ
t
hệ
thống
trong
thực
t
ế
bằng
cấu
trúc
phân
cấp
của
OMNeT++.
Cấu
trúc
của
mô
h
ì
nh
có
thể
được
mô
t
ả
bằng
ngôn
ngữ
NED
của
OMNeT++
module
hệ
thống
module
đơn
g
i
ản
module
kế
t
hợp
Hình
I-2.1
-
Các
module
đơn
g
i
ản
và
kết
hợp
Các
modu
l
e
có
thể
chứa
nhiều
modu
l
e
con
và
được
gọ
i
là
module
kế
t
hợp.
Các
module
đơn
g
i
ản
là
các
module
có
cấp
thấp
nhấ
t
trong
cấu
trúc
phân
cấp.
Các
module
đơn
giản
chứa
các
thuậ
t
toán
của
mô
hình.
Ngườ
i
sử
dụng
triển
khai
các
module
đơn
giản
bằng
ngôn
ngữ
C++,
sử
dụng
các
t
hư
viện
mô
phỏng
của
OMNeT++.
2.1.2.
Kiểu
module
Tấ
t
cả
các
module
dù
là
đơn
g
i
ản
hay
phức
t
ạp
đều
là
các
đố
i
t
ượng
cụ
thể
của
các
kiểu
module.
Trong
khi
mô
t
ả
các
mô
hình,
ngườ
i
sử
dụng
định
nghĩa
ra
các
k
i
ểu
OMNet++
Tran
g
4
module;
các
đố
i
t
ượng
cụ
thể
của
các
kiểu
module
này
được
sử
dụng
như
các
thành
phần
của
các
kiểu
module
phức
t
ạp
hơn.
Cuố
i
cùng,
ngườ
i
sử
dụng
t
ạo
module
hệ
thống
như
mộ
t
đố
i
t
ượng
cụ
thể
của
k
i
ểu
module
đã
được
định
nghĩa
trước
đó,
t
ấ
t
cả
các
module
của
mạng
đều
là
module
con
(hoặc
là
con
của
module
con)
của
module
hệ
thống.
Kh
i
mộ
t
kiểu
module
được
sử
dụng
như
mộ
t
khố
i
dựng
sẵn
(building
block),
sẽ
không
thể
phân
biệ
t
đó
là
mộ
t
module
đơn
g
i
ản
hay
phức
t
ạp.
Đ
i
ều
này
cho
phép
ngườ
i
sử
dụng
có
t
hể
t
ách
các
module
đơn
giản
ra
thành
nhiều
module
đơn
giản
được
nhúng
trong
mộ
t
module
kế
t
hợp,
và
ngược
l
ạ
i
có
thể
t
ập
hợp
các
chức
năng
của
mộ
t
module
kế
t
hợp
trong
mộ
t
module
đơn
g
i
ản
mà
không
ảnh
hưởng
g
ì
đến
các
kiểu
module
đã
được
ngườ
i
sử
dụng
định
nghĩa.
Kiểu
module
có
thể
được
l
ưu
trữ
trong
mộ
t
file
riêng
rẽ.
Đ
i
ều
này
cho
phép
ngườ
i
sử
dụng
có
t
hể
nhóm
các
kiểu
module
l
ạ
i
và
t
ạo
ra
mộ
t
thư
viện
thành
phần
2.1.3.
Message,
cổng,
liên
kết
Các
modu
l
e
trao
đổ
i
thông
ti
n
bằng
việc
gử
i
các
message.
Trong
thực
t
ế,
message
có
dạng
khung
(frame)
hoặc
là
các
gói
ti
n
(packe
t
)
được
truyền
đ
i
t
rong
mạng.
Các
message
có
thể
có
cấu
t
rúc
phức
t
ạp
tuỳ
ý.
Các
module
đơn
giản
có
t
hể
gử
i
các
message
đ
i
mộ
t
cách
trực
ti
ếp
đến
vị
trí
nhận
hoặc
gử
i
đ
i
t
heo
mộ
t
đường
dẫn
định
sẵn
thông
qua
các
cổng
và
các
li
ên
kết.
“Thờ
i
gian
mô
phỏng
địa
phương”
(local
simulation
ti
me)
của
mộ
t
module
t
ăng
lên
khi
module
nhận
được
mộ
t
message.
Message
có
thể
đến
t
ừ
mộ
t
module
khác
hoặc
đến
t
ừ
cùng
mộ
t
module
(message
của
chính
bản
thân
module
-
self-message
được
dùng
để
thực
hiện
bộ
định
t
hời).
Cổng
(gate)
là
các
giao
ti
ếp
vào
ra
của
module.
Message
được
gử
i
đ
i
qua
các
cổng
ra
và
được
nhận
vào
thông
qua
các
cổng
vào.
Mỗ
i
kế
t
nố
i
(connection)
hay
còn
gọ
i
là
li
ên
kế
t
(link)
được
t
ạo
bên
trong
mộ
t
mức
đơn
t
rong
cấu
trúc
phân
cấp
của
các
module:
bên
trong
mộ
t
module
kế
t
hợp,
mộ
t
kế
t
nố
i
có
t
hể
được
t
ạo
ra
g
i
ữa
các
cổng
t
ương
ứng
của
ha
i
module
con,
hoặc
giữa
cổng
của
module
con
vớ
i
cổng
của
module
kế
t
hợp.
module
cha
module
cha
S1
S2
S1
S2
module
con
kế
t
nố
i
vớ
i
nhau
module
con
kế
t
nố
i
vớ
i
module
cha
Hình
I-2.2
-
Các
kết
nố
i
Tương
ứng
vớ
i
cấu
t
rúc
phân
cấp
của
mộ
t
mô
hình,
các
message
thường
di
chuyển
qua
mộ
t
l
oạ
t
các
kế
t
nố
i
vớ
i
đ
i
ểm
bắ
t
đầu
và
kế
t
thúc
là
các
module
đơn
giản.
Tập
các
kế
t
nố
i
đ
i
t
ừ
mộ
t
module
đơn
giản
và
đến
mộ
t
module
đơn
giản
được
gọ
i
là
route.
Các
module
kế
t
hợp
hoạ
t
động
giống
như
các
“cardboard
box”
trong
mô
h
ì
nh,
“trong
suốt”
trong
việc
chuyển
ti
ếp
các
message
giữa
các
thành
phần
bên
trong
và
thế
giớ
i
bên
ngoà
i
.
OMNet++
Tran
g
5
2.1.4.
Mô
hình
truyền
gói
tin
Mộ
t
kế
t
nố
i
có
thể
có
ba
t
ham
số
đặc
trưng.
Những
tham
số
này
rấ
t
thuận
ti
ện
cho
các
mô
h
ì
nh
mô
phỏng
mạng
thông
tin
nhưng
không
hữu
dụng
l
ắm
cho
các
kiểu
mô
hình
khác.
Ba
tham
số
này
bao
gồm:
•
Độ
trễ
đường
t
ruyền
(propagation
delay)
tính
bằng
s
-
giây.
•
Tỉ
số
l
ỗ
i
bit,
được
tính
bằng
số
l
ỗi/bit.
•
Tỉ
số
dữ
li
ệu,
được
tính
bằng
số
bit/s.
Các
tham
số
này
l
à
t
uỳ
chọn.
Giá
t
rị
của
các
tham
số
này
l
à
khác
nhau
t
rên
t
ừng
kế
t
nối,
phụ
thuộc
vào
kiểu
của
li
ên
kế
t
(hay
còn
gọ
i
l
à
k
i
ểu
của
kênh
t
ruyền
-
channe
l
type).
Độ
trễ
đường
t
ruyền
là
t
ổng
thờ
i
gian
đến
của
message
bị
trễ
đ
i
khi
truyền
qua
kênh.
Tỉ
số
l
ỗ
i
b
it
ảnh
hưởng
đến
quá
trình
truyền
message
qua
kênh.
Tỉ
số
này
l
à
xác
suấ
t
các
b
it
bị
truyền
sai.
Do
đó
xác
suấ
t
để
mộ
t
message
độ
dà
i
n
b
it
truyền
đ
i
ch
í
nh
xác
là:
P(message
gử
i
đ
i
được
nhận
chính
xác)
=
(1
-
ber)n
trong
đó
ber
l
à
t
ỉ
số
l
ỗ
i
b
it
và
n
l
à
số
bit
của
message.
Các
message
truyền
đ
i
đều
có
mộ
t
cờ
l
ỗi,
cờ
này
sẽ
được
t
h
i
ế
t
l
ập
kh
i
việc
truyền
message
có
l
ỗi.
Tỉ
số
dữ
li
ệu
được
tính
theo
đơn
vị
bit/s,
và
nó
được
sử
dụng
để
tí
nh
thờ
i
gian
để
truyền
mộ
t
gói
tin.
Kh
i
t
ỉ
số
này
được
sử
dụng,
quá
trình
gử
i
message
đ
i
trong
mô
hình
sẽ
t
ương
ứng
vớ
i
v
i
ệc
truyền
bit
đầu
ti
ên
và
message
được
tính
l
à
đến
nơ
i
sau
kh
i
bên
nhận
đã
nhận
được
b
it
cuố
i
cùng.
A
B
Message
gử
i
đ
i
truyền
bị
trễ
Độ
trễ
đường
t
ruyền
t
A
t
B
Message
nhận
được
Hình
I-2.3
-
Truyền
message
OMNet++
Tran
g
6
2.1.5.
Tham
số
Các
module
có
thể
các
tham
số.Các
tham
số
này
có
thể
được
đặ
t
g
i
á
t
rị
trong
các
f
i
le
NED
hoặc
các
file
cấu
h
ì
nh
ompnetpp.ini.
Các
tham
số
này
có
t
hể
được
dùng
để
thay
đổ
i
các
thuộc
tính
của
các
module
đơn
g
i
ản
hoặc
dùng
để
biểu
d
i
ễn
cho
t
opo
l
ogy
của
mô
h
ì
nh.
Các
tham
số
có
t
hể
có
k
i
ểu
là
chuỗi,
số
học,
giá
t
rị
logic
hoặc
cũng
có
t
hể
chứa
cây
dữ
li
ệu
XML
(XML
data
tree).
Các
biến
kiểu
số
trong
các
biểu
thức
có
thể
nhận
giá
trị
t
ừ
các
tham
số
khác,
gọ
i
hàm,
sử
dụng
các
biến
ngẫu
nhiên
t
ừ
các
nguồn
phân
tán
hoặc
nhận
giá
trị
trực
ti
ếp
được
nhập
vào
bở
i
ngườ
i
sử
dụng.
Các
tham
số
có
k
i
ểu
số
có
t
hể
được
dùng
để
cấu
h
ì
nh
topology
rấ
t
dễ
dàng.
Nằm
t
rong
các
module
kế
t
hợp,
các
tham
số
này
có
t
hể
được
dùng
để
chỉ
ra
số
module
con,
số
cổng
giao
ti
ếp
và
cách
các
kế
t
nố
i
nộ
i
bộ
được
t
ạo
ra.
2.1.6.
Phương
pháp
mô
tả
topology
Ngườ
i
sử
dụng
dùng
ngôn
ngữ
NED
(Network
Descr
i
ption)
để
mô
t
ả
cấu
t
rúc
của
các
mô
hình
2.2.
Lập
trình
thuật
toán
Các
modu
l
e
đơn
giản
có
thể
chứa
các
thuậ
t
toán
như
các
hàm
của
C++.
Sự
li
nh
hoạ
t
và
sức
mạnh
của
C++,
kế
t
hợp
vớ
i
các
thư
viện
mô
phỏng
của
OMNeT++
t
ạo
đ
i
ều
kiện
dễ
dàng
cho
ngườ
i
sử
dụng.
Các
l
ập
trình
viên
mô
phỏng
có
thể
chọn
l
ựa
v
i
ệc
mô
t
ả
theo
sự
kiện
hay
t
heo
ti
ến
t
rình,
có
thể
dễ
dàng
sử
dụng
những
khái
n
i
ệm
của
l
ập
trình
hướng
đố
i
t
ượng
(như
đa
hình,
kế
thừa)
và
thiế
t
kế
các
mẫu
thử
(pattern)
để
mở
rộng
chức
năng
của
quá
trình
mô
phỏng.
Các
đố
i
t
ượng
mô
phỏng
(message,
module,
queue )
được
thể
hiện
qua
các
l
ớp
của
C++.
Mộ
t
số
l
ớp
cơ
bản
trong
thư
viện
mô
phỏng
của
OMNeT++
:
•
Module,
cổng,
li
ên
kết
•
Các
tham
số
•
Message
•
Các
l
ớp
Con
t
ainer
(mảng,
hàng
đợi )
•
Các
l
ớp
Da
t
a
Collection
Các
l
ớp
này
có
t
hể
được
sử
dụng
như
những
công
cụ
cho
phép
ngườ
i
sử
dụng
có
thể
duyệ
t
qua
t
ấ
t
cả
các
đố
i
t
ượng
khi
chạy
t
hử
mô
hình
đồng
thờ
i
h
i
ển
thị
thông
tin
về
chúng
như
tên
của
đố
i
t
ượng,
tên
l
ớp,
các
biến
t
rạng
thái
và
nộ
i
dung
bên
trong.
Đặc
đ
i
ểm
này
cũng
cho
phép
t
ạo
ra
các
mô
h
ì
nh
mô
phỏng
có
giao
diện
đồ
hoạ
(GUI)
vớ
i
phần
cấu
trúc
bên
t
rong
được
che
đi.
OMNet++
Tran
g
7
2.3.
Sử
dụng
OMNeT++
2.3.1.
Xây
dựng
và
chạy
thử
các
mô
hình
mô
phỏng
Mộ
t
mô
hình
OMNeT++
bao
gồm
những
phần
sau:
•
Ngôn
ngữ
mô
t
ả
topology
-
NED
(file
có
phần
mở
rộng
.ned):
mô
t
ả
cấu
trúc
của
module
vớ
i
các
tham
số,
các
cổng
Các
file
.ned
có
thể
được
v
i
ế
t
bằng
bấ
t
kỳ
bộ
soạn
t
hảo
hoặc
sử
dụng
chương
t
r
ì
nh
GNED
có
trong
OMNeT++.
•
Định
nghĩa
cấu
t
rúc
của
các
message
(các
file
có
phần
mở
rộng
.msg):
Ngườ
i
sử
dụng
có
thể
định
nghĩa
rấ
t
nh
i
ều
k
i
ểu
messsage
và
thêm
các
trường
dữ
li
ệu
cho
chúng.
OMNeT++
sẽ
dịch
những
định
nghĩa
này
sang
các
l
ớp
C++
đầy
đủ.
•
Mã
nguồn
của
các
module
đơn
g
i
ản.
Đây
l
à
các
f
il
e
C++
vớ
i
phần
mở
rộng
là
.h
hoặc
.cc.
Hệ
thống
mô
phỏng
cung
cấp
cho
ta
các
thành
phần
sau
:
•
Phần
nhân
mô
phỏng.
Phần
này
chứa
code
để
quản
l
ý
quá
trình
mô
phỏng
và
các
thư
viện
l
ớp
mô
phỏng.
Nó
được
viế
t
bằng
C++,
được
b
i
ên
dịch
và
được
đặ
t
cùng
dạng
vớ
i
các
file
thư
viện
(các
file
có
phần
mở
rộng
là
.a
hoặc
.lib).
•
Giao
diện
ngườ
i
sử
dụng.
Giao
d
i
ện
này
được
sử
dụng
khi
thực
h
i
ện
quá
trình
mô
phỏng,
t
ạo
sự
dễ
dàng
cho
quá
trình
sửa
l
ỗi,
b
i
ểu
diễn
(demons
t
rat
i
on)
hoặc
khi
thực
hiện
mô
phỏng
theo
t
ừng
khố
i
(batch
execu
ti
on
of
simu
l
ations).
Có
mộ
t
vài
kiểu
giao
diện
t
rong
OMNeT++,
t
ấ
t
cả
đều
được
viế
t
bằng
C++,
được
biên
dịch
và
đặ
t
cùng
nhau
trong
các
thư
viện
(các
file
có
phần
mở
rộng
là
.a
hoặc
.lib).
Thực
h
i
ện
mô
phỏng
và
phân
tích
kết
quả
Các
chương
t
r
ì
nh
thực
h
i
ện
mô
phỏng
(the
simulation
executable)
là
các
chương
trình
độc
l
ập,
t
ức
là
nó
có
thể
chạy
trên
các
máy
khác
không
cài
đặ
t
OMNeT++
hay
các
file
mô
hình
t
ương
ứng.
Kh
i
chương
t
rình
khở
i
động,
nó
bắ
t
đầu
đọc
file
cấu
h
ì
nh
(thông
thường
l
à
file
omnetpp.
i
n
i
).
File
này
chứa
các
thiế
t
l
ập
để
đ
i
ều
khiển
quá
t
rình
mô
phỏng
thực
hiện,
các
b
i
ến
cho
các
tham
số
của
mô
h
ì
nh
File
cấu
h
ì
nh
cũng
có
thể
được
sử
dụng
để
đ
i
ều
khiển
nh
i
ều
quá
trình
mô
phỏng,
trong
trường
hợp
đơn
g
i
ản
nhấ
t
là
các
quá
t
rình
mô
phỏng
này
sẽ
được
thực
hiện
l
ần
l
ượ
t
bở
i
mộ
t
chương
trình
mô
phỏng
(simu
l
ation
program).
Đầu
ra
của
quá
trình
mô
phỏng
là
các
file
dữ
li
ệu.
Các
file
này
có
thể
là
các
file
vector,
các
fi
l
e
vô
hướng
hoặc
các
file
của
ngườ
i
sử
dụng.
OMNeT++
cung
cấp
mộ
t
công
cụ
đồ
hoạ
Plove
để
xem
và
vẽ
ra
nộ
i
dung
của
các
file
vector.
Tuy
nhiên
chúng
ta
cũng
nên
hiểu
rằng
khó
mà
có
thể
xử
lý
đầy
đủ
các
f
il
e
kế
t
quả
mà
chỉ
dùng
riêng
OMNeT++
;
các
fi
l
e
này
đều
l
à
các
file
có
định
dạng
để
có
thể
đọc
được
bở
i
các
gó
i
xử
l
ý
t
oán
học
của
các
chương
t
rình
như
Ma
tl
ab
hay
Octave,
hoặc
có
thể
được
đưa
vào
bảng
tính
của
các
chương
trình
như
OpenOff
i
ce
Ca
l
c,
Gnumer
i
c
hay
M
i
crosof
t
Excel.
Tẩ
t
cả
các
chương
t
r
ì
nh
này
đều
có
chức
năng
chuyên
dụng
t
rong
việc
phân
tí
ch
số
hoá,
vẽ
biểu
d
i
ễn
(visualization)
vượ
t
qua
khả
năng
của
OMNeT++.
Các
file
vô
hướng
cũng
có
t
hể
được
biểu
d
i
ễn
bằng
công
cụ
Scalar.
Nó
có
thể
vẽ
được
các
biểu
đồ,
các
đồ
thị
dựa
vào
t
ập
hợp
các
toạ
độ
(x,
y)
và
có
thể
xuấ
t
dữ
li
ệu
vào
clipboard
để
có
thể
sử
dụng
trong
các
chương
trình
khác
nhằm
đưa
những
phân
tích
chi
ti
ế
t
hơn.
OMNet++
Tran
g
8
Giao
diện
ngườ
i
sử
dụng
Mục
đích
chính
của
g
i
ao
diện
ngườ
i
sử
dụng
là
che
những
phần
phức
t
ạp
bên
t
rong
cấu
trúc
của
các
mô
hình
đố
i
vớ
i
ngườ
i
sử
dụng,
dễ
dàng
đ
i
ều
kh
i
ển
quá
t
rình
mô
phỏng,
và
cho
phép
ngườ
i
sử
dụng
có
khả
năng
t
hay
đổ
i
các
biến
hay
các
đố
i
t
ượng
bên
trong
của
mô
h
ì
nh.
Đ
i
ều
này
là
rấ
t
quan
trọng
đố
i
vớ
i
pha
phát
t
r
i
ển
và
sửa
l
ỗ
i
trong
dự
án.
G
i
ao
diện
đồ
hoạ
cũng
có
thể
được
sử
dụng
để
trình
diễn
hoạ
t
động
của
mô
hình.
Cùng
mộ
t
mô
h
ì
nh
ngườ
i
sử
dụng
có
t
hể
t
rên
nhiều
giao
diện
khác
nhau
mà
không
cần
phả
i
thay
đổ
i
gì
trong
các
file
mô
hình.
Ngườ
i
sử
dụng
có
thể
kiểm
t
hử
và
sửa
l
ỗ
i
rấ
t
dễ
dàng
qua
giao
diện
đồ
hoạ,
cuố
i
cùng
có
t
hể
chạy
nó
dựa
t
rên
mộ
t
giao
diện
đơn
giản
và
nhanh
chóng
có
hỗ
trợ
thực
hiện
t
heo
khố
i
(batch
execution).
Các
thư
viện
thành
phần
Các
k
i
ểu
module
có
thể
được
l
ưu
t
ạ
i
những
vị
trí
độc
l
ập
vớ
i
chỗ
mà
chúng
thực
sự
được
sử
dụng.
Đặc
đ
i
ểm
này
cung
cấp
cho
ngườ
i
sử
dụng
khả
nhóm
các
kiểu
module
l
ạ
i
vớ
i
nhau
và
t
ạo
ra
các
t
hư
viện
thành
phần.
Các
chương
trình
mô
phỏng
độc
l
ập
Các
chương
t
r
ì
nh
thực
h
i
ện
quá
trình
mô
phỏng
có
thể
được
l
ưu
nh
i
ều
l
ần,
không
phụ
thuộc
vào
các
mô
h
ì
nh,
sử
dụng
cùng
mộ
t
thiế
t
l
ập
cho
các
module
đơn
giản.
Ngườ
i
sử
dụng
có
thể
chỉ
ra
trong
file
cấu
h
ì
nh
mô
hình
nào
sẽ
được
chạy.
Đ
i
ều
này
t
ạo
khả
năng
cho
ngườ
i
sử
dụng
có
thể
xây
dựng
những
chương
t
rình
t
hực
hiện
l
ớn
bao
gồm
nhiều
quá
tr
ì
nh
mô
phỏng,
và
phân
phố
i
nó
như
mộ
t
công
cụ
mô
phỏng
độc
l
ập.
Khả
năng
linh
hoạ
t
của
ngôn
ngữ
mô
t
ả
topology
cũng
hỗ
trợ
cho
hướng
ti
ếp
cận
này.
2.3.2.
Hệ
thống
file
Sau
khi
cài
đặ
t
OMNe
t
++,
t
hư
mục
omne
t
pp
t
rên
hệ
thống
máy
của
bạn
nên
chứa
các
thư
mục
con
dướ
i
đây.
Hệ
thống
mô
phỏng:
omnetpp/
thư
mục
gốc
của
OMNeT++
bin/
các
công
cụ
trong
OMNeT++
(GNED,
nedtool )
include/
các
fi
l
e
header
cho
mô
hình
mô
phỏng
li
b
/
các
fi
l
e
thư
viện
bitmaps/
các
biểu
t
ượng
đồ
hoạ
doc/
các
file
hướng
dẫn,
readme
manua
l/
f
i
le
hướng
dẫn
dạng
HTML
ti
c
t
oc-tutor
i
a
l/
g
i
ớ
i
th
i
ệu
sử
dụng
OMNeT++
api
/
API
tham
ch
i
ếu
dạng
HTML
nedxm
l
-ap
i/
API
t
ham
ch
i
ếu
cho
t
hư
viện
NEDXML
src
/
mã
nguồn
của
tài
li
ệu
src/
mã
nguồn
của
OMNeT++
nedc
/
nedtoo
l
,
trình
biên
dịch
message
sim
/
phần
nhân
mô
phỏng
parsim
/
các
file
dành
cho
việc
thực
h
i
ện
phân
t
án
netbu
i
lder/
các
file
dành
cho
việc
đọc
động
các
f
il
e
NED
envir/
mã
nguồn
cho
giao
d
i
ện
ngườ
i
sử
dụng
cmdenv
/
giao
d
i
ện
ngườ
i
dùng
dòng
l
ệnh
OMNet++
Tran
g
9
t
kenv/
g
i
ao
diện
ngườ
i
sử
dụng
dựa
trên
Tc
l
/tk
gned/
công
cụ
soạn
thảo
file
NED
plove/
công
cụ
vẽ
và
phân
tích
đầu
ra
dạng
vector
scalars/
công
cụ
vẽ
và
phân
tích
đầu
ra
dạng
vô
hướng
nedxm
l/
thư
viện
NEDXML
utils/
các
ti
ện
ích
khác
tes
t/
bộ
kiểm
t
hử
lùi
core
/
bộ
kiểm
t
hử
lùi
cho
thư
viện
mô
phỏng
distrib
/
bộ
kiểm
t
hử
lùi
Các
quá
trình
mô
phỏng
mẫu
được
chứa
trong
thư
mục
samples
samples
/
thư
mục
chứa
các
mô
hình
mô
phỏng
mẫu
aloha/
mô
hình
của
giao
thức
A
l
oha
cqn/
Closed
Queue
Network
Thư
mục
contrib
chứa
các
chương
tr
ì
nh
có
thể
kế
t
hợp
vớ
i
OMNeT++
contrib
/
octave
/
script
của
Octave
dùng
để
xử
lý
kế
t
quả
emacs/
bộ
đánh
dấu
cú
pháp
NED
cho
Emacs
Ngoài
ra
bạn
cũng
có
thể
tìm
t
hấy
các
thư
mục
khác
như
msvc
/
,
chứa
các
thành
phần
tí
ch
hợp
cho
Microsoft
Visual
C++
OMNet++
Tran
g
10
3. NGÔN NGỮ NED
3.1
Tổng
quan
về
NED
NED
được
sử
dụng
để
mô
t
ả
t
opology
của
mộ
t
mô
h
ì
nh
trong
OMNeT++.
NED
sử
dụng
phương
pháp
mô
t
ả
module
hoá.
Đ
i
ều
này
có
nghĩa
l
à
mộ
t
mạng
có
thể
được
mô
t
ả
như
mộ
t
t
ập
hợp
các
mô
t
ả
thành
phần
(các
kênh,
các
kiểu
module
đơn
giản
hay
kế
t
hợp).
Các
kênh,
các
kiểu
module
đơn
g
i
ản
và
kế
t
hợp
được
sử
dụng
để
mô
t
ả
mộ
t
mạng
nào
đó
có
thể
được
sử
dụng
l
ạ
i
khi
mô
t
ả
mộ
t
mạng
khác.
Các
file
chứa
mô
t
ả
mạng
t
hường
có
phần
mở
rộng
là
.ned.
Các
file
NED
có
thể
được
load
động
vào
các
chương
trình
mô
phỏng,
hay
có
thể
được
dịch
sang
C++
bằng
bộ
biên
dịch
của
NED
và
được
li
ên
kế
t
bên
trong
các
chương
t
rình
thực
hiện.
3.1.1.
Các
thành
phần
của
ngôn
ngữ
mô
tả
NED
Mộ
t
fi
l
e
l
NED
bao
gồm
các
phần
như
sau:
•
Các
chỉ
dẫn
i
mport
•
Khai
báo
các
kênh
•
Khai
báo
các
modu
l
e
đơn
g
i
ản
và
kế
t
hợp
•
Khai
báo
mạng
3.1.2.
Các
từ
khoá
Ngườ
i
sử
dụng
cần
phả
i
chú
ý
không
sử
dụng
những
t
ừ
khoá
có
sẵn
của
NED
để
đặ
t
tên
cho
các
đố
i
t
ượng
khác.
Các
t
ừ
khoá
cơ
bản
của
NED
bao
gồm:
i
mport
channel
endchannel
simple
endsimp
l
e
module
endmodule
error
delay
datarate
const
parameters
gates
submodules
connections
atesizes
i
f
for
do
endfor
network
endnetwork
nocheck
ref
ancestor
t
rue
false
li
ke
input
numeric
string
bool
char
xm
l
xm
l
doc
3.1.3.
Đặt
tên
Trong
NED
ngườ
i
sử
dụng
có
thể
đặ
t
tên
cho
các
module,
các
kênh,
các
module
con,
các
tham
số,
các
cổng,
các
thuộc
tí
nh
và
hàm
chức
năng
của
kênh
Các
tên
này
có
thể
bao
gồm
các
chữ
cái
ti
ếng
Anh,
các
chữ
số
và
dấu
gạch
dướ
i
“_”.
Tên
luôn
được
đặ
t
bắ
t
đầu
bằng
chữ
cá
i
hoặc
dấu
gạch
dướ
i
.
Trong
t
rường
hợp
muốn
đặ
t
tên
bắ
t
đầu
bằng
chữ
số,
bạn
có
thể
sử
dụng
t
hêm
mộ
t
dấu
gạch
dướ
i
đặ
t
ở
đầu,
ví
dụ
như
_3Com
Nếu
t
ên
bao
gồm
nhiều
t
ừ
nên
viế
t
hoa
ở
đầu
mỗ
i
t
ừ
hoặc
có
thể
sử
dụng
dấu
gạch
dưới.
Tên
của
các
module,
kênh
và
mạng
nên
bắ
t
đầu
bằng
chữ
cái
in
hoa
còn
tên
của
tham
số,
cổng
và
các
module
con
nên
bắ
t
đầu
bằng
chữ
cá
i
thường.
NED
l
à
mộ
t
ngôn
ngữ
có
phân
biệ
t
hoa
t
hường.
OMNet++
Tran
g
11
3.1.4.
Chú
thích
Các
dòng
chú
thích
có
thể
đặ
t
ở
bấ
t
kì
vị
trí
nào
trong
file
NED.
Tương
t
ự
như
cú
pháp
của
C++,
các
dòng
chú
th
í
ch
trong
NED
bắ
t
đầu
bằng
dấu
‘//’.
Chú
t
hích
trong
NED
có
thể
được
sử
dụng
trong
những
công
cụ
t
ạo
t
à
i
li
ệu
(documen
t
generator)
như
JavaDoc,
Doxygen
3.2.
Các
chỉ
dẫn
import
Từ
khoá
i
mport
được
sử
dụng
để
thêm
các
khai
báo
trong
các
file
mô
t
ả
khác.
Sau
kh
i
đã
import,
ngườ
i
sử
dụng
có
t
hể
sử
dụng
t
ấ
t
cả
các
thành
phần
đã
được
định
nghĩa
trong
file
mô
t
ả
đó.
Chú
ý
khi
thêm
mộ
t
file
mô
t
ả,
chỉ
có
các
thông
tin
khai
báo
được
sử
dụng.
Cũng
t
ương
t
ự
như
vậy
khi
mộ
t
fi
l
e
được
thêm
vào
không
có
nghĩa
là
nó
sẽ
được
dịch
kh
i
file
chứa
nó
được
dịch.
Ngườ
i
sử
dụng
sẽ
phả
i
dịch
t
ấ
t
cả
các
file
chứ
không
phả
i
chỉ
là
file
ở
mức
cao
nhất.
Bạn
có
thể
xác
định
mộ
t
file
thêm
vào
mà
có
hoặc
không
viế
t
phần
mở
rộng.
Ví
dụ
:
i
mport
“ethenet”;
//import
etherne
t
.ned
Bạn
cũng
có
thể
sử
dụng
đường
dẫn
trong
khi
sử
dụng
t
ừ
khoá
impor
t
hoặc
t
ố
t
hơn
là
bạn
sử
dụng
trình
biên
dịch
của
NED
vớ
i
t
ham
số
-I
để
đặ
t
t
ên
cho
thư
mục
chứa
các
file
mà
bạn
muốn
i
mport.
3.3.
Khai
báo
các
kênh
Mộ
t
định
nghĩa
kênh
được
dùng
để
xác
định
kiểu
kế
t
nối.
Tên
của
kênh
có
thể
được
sử
dụng
sau
đó
trong
file
để
t
ạo
các
liên
kế
t
vớ
i
các
tham
số
khác.
Cú
pháp
:
channel
Tên
kênh
//
endchannel
Ba
tham
số
có
thể
được
gán
giá
trị
t
rong
phần
thân
của
đoạn
mã
khai
báo
kênh,
t
ấ
t
cả
các
tham
số
này
đều
là
các
tuỳ
chọn:
độ
trễ,
l
ỗ
i
và
t
ốc
độ
dữ
li
ệu
(datarate).
Độ
trễ
là
thờ
i
gian
t
rễ
trên
đường
truyền
được
tí
nh
bằng
giây.
Lỗ
i
là
t
ham
số
đặc
trưng
cho
xác
suấ
t
t
ruyền
sai
mộ
t
b
it
trên
đường
truyền.
Tốc
độ
dữ
li
ệu
l
à
tham
số
được
tí
nh
bằng
độ
rộng
băng
thông
của
kênh
t
ruyền,
được
tính
bằng
b
it/
s
và
được
dùng
để
tí
nh
thờ
i
gian
truyền
của
mộ
t
gó
i
tin.
Các
thuộc
tính
có
thể
xuấ
t
hiện
theo
bấ
t
kỳ
thứ
t
ự
nào
t
rong
khai
báo.
Giá
t
rị
của
các
t
ham
số
(thuộc
tính)
nên
l
à
các
hằng
số.
Ví
dụ
:
channe
l
LeasedLine
delay
0.0018
//
sec
OMNet++
Tran
g
12
error
1e-8
datarate
128000
//
bit/sec
endchannel
3.4.
Khai
báo
các
module
đơn
giản
Các
module
đơn
giản
l
à
các
khố
i
chương
trình
được
xây
dựng
sẵn
cho
các
module
khác
(có
thể
là
các
modu
l
e
kế
t
hợp).
Các
module
được
khai
báo
bằng
tên
và
theo
quy
ước
t
ên
của
các
module
này
được
đặ
t
t
ên
bắ
t
đầu
bằng
chữ
cái
in
hoa.
Các
modu
l
e
đơn
g
i
ản
được
khai
báo
thông
qua
các
cổng
và
các
tham
số.
Cú
pháp
:
s
i
mple
SimpleModuleName
parameters:
//
gates:
//
endsimp
l
e
3.4.1.
Các
tham
số
của
module
đơn
giản
Các
tham
số
là
các
biến
phụ
thuộc
vào
t
ừng
mô
hình.
Tham
số
của
các
module
đơn
giản
được
sử
dụng
bở
i
các
hàm
(hay
còn
được
gọ
i
là
các
t
huậ
t
t
oán
của
module)
khai
báo
trong
chính
modu
l
e.
Theo
quy
ước
các
tham
số
sẽ
được
đặ
t
t
ên
bắ
t
đầu
bằng
chữ
cá
i
t
hường.
Các
tham
số
được
khai
báo
bằng
cách
li
ệ
t
kê
tên
sau
t
ừ
khoá
parameters.
Kiểu
của
các
tham
số
có
thể
là
kiểu
số
(numeric),
hằng
số
(numeric
const
hay
viế
t
gọn
l
à
const),
giá
trị
log
i
c
(bool),
kiểu
chuỗ
i
(string)
hoặc
xml.
Khi
tham
số
không
khai
báo
rõ
kiểu
thì
mặc
định
k
i
ểu
của
tham
số
đó
là
numeric.
Ví
dụ
:
s
i
mple
TrafficGen
parameters:
interarrivalTime,
numOfMessages
:
const,
address
:
string;
gates:
//
endsimp
l
e
Các
tham
số
có
thể
được
gán
giá
trị
t
ừ
NED
(khi
các
module
được
sử
dụng
như
các
khố
i
dựng
sẵn
của
mộ
t
khố
i
kế
t
hợp
l
ớn
hơn)
hoặc
t
ừ
file
cấu
hình
omnetpp.ini.
Tham
số
ngẫu
nhiên
và
hằng
số
OMNet++
Tran
g
13
Các
tham
số
có
kiểu
số
có
thể
được
đặ
t
để
trả
về
mộ
t
giá
t
rị
ngẫu
nhiên
theo
dạng
phân
phố
i
đều
(un
i
formly
distributions)
hoặc
các
dạng
phân
phố
i
khác
Trong
đa
số
trường
hợp,
các
tham
số
thường
chỉ
nhận
g
i
á
trị
ngẫu
nhiên
khi
bắ
t
đầu
khở
i
gán,
sau
đó
giá
trị
này
được
giữ
nguyên.
Khi
đó
các
tham
số
này
phả
i
được
kha
i
báo
là
hằng
số
-
const.
Kha
i
báo
mộ
t
t
ham
số
là
cons
t
th
ì
giá
trị
của
tham
số
sẽ
được
xác
định
mộ
t
l
ần
duy
nhấ
t
kh
i
bắ
t
đầu
t
hực
h
i
ện
mô
phỏng
và
sau
đó
giá
t
rị
đó
sẽ
được
co
i
là
hằng
số.
(Chú
ý
OMNeT++
khuyến
khích
việc
khai
báo
mọ
i
tham
số
l
à
const
trừ
những
t
rường
hợp
bạn
muốn
sử
dụng
chức
năng
t
ạo
số
ngẫu
nhiên).
Tham
số
XML
Đôi
khi
các
module
cần
đầu
vào
là
những
t
hông
tin
phức
t
ạp
hơn
khả
năng
mô
t
ả
của
các
tham
số,
khi
đó
bạn
có
thể
sử
dụng
mộ
t
f
i
le
cấu
hình
mở
rộng.
OMNeT++
có
thể
đọc
và
xử
lý
các
file
này
thông
qua
mộ
t
tham
số
chứa
tên
của
file.
Từ
các
phiên
bản
3.0
trở
lên,
XML
được
co
i
là
mộ
t
dạng
chuẩn
cho
các
file
cấu
hình
và
OMNeT++
cũng
tí
ch
hợp
sẵn
các
công
cụ
cho
phép
ngườ
i
sử
dụng
có
t
hể
làm
việc
được
vớ
i
các
file
XML.
OMNeT++
chứa
bộ
phân
tí
ch
cú
pháp
XML
(XML
parser),
có
khả
năng
đọc
các
file
DTD,
sử
dụng
bộ
nhớ
đệm
để
nhớ
các
file
(trong
t
rường
hợp
mộ
t
file
XML
được
tham
ch
i
ếu
t
ớ
i
nh
i
ều
module
t
h
ì
nó
sẽ
cũng
chỉ
phả
i
l
oad
mộ
t
l
ần),
cung
cấp
cho
ngườ
i
sử
dụng
khả
năng
chọn
l
ọc
các
phần
trong
tài
li
ệu
thông
qua
XPa
t
h,
t
hể
hiện
nộ
i
dung
của
file
XML
thông
qua
DOM.
3.4.2.
Các
cổng
của
module
đơn
giản
Cổng
là
các
đ
i
ểm
kế
t
nố
i
của
module.
Đ
i
ểm
bắ
t
đầu
và
kế
t
thúc
mộ
t
kế
t
nố
i
g
i
ữa
ha
i
module
chính
là
các
cổng.
OMNeT++
hỗ
trợ
kiểu
kế
t
nố
i
mộ
t
chiều
(đơn
công)
do
đó
có
ha
i
loạ
i
cổng
là
cổng
vào
và
cổng
ra.
Các
message
được
gử
i
đ
i
t
ừ
cổng
ra
và
được
nhận
vào
t
ừ
cổng
vào.
Theo
quy
ước,
các
cổng
được
đặ
t
tên
bắ
t
đầu
bằng
chữ
cá
i
thường.
Ở
đây
chúng
ta
có
khái
niệm
về
các
vector
cổng
trong
đó
mộ
t
vector
cổng
l
à
mộ
t
t
ập
hợp
bao
gồm
nhiều
cổng
đơn.
Cổng
được
kha
i
báo
bằng
cách
khai
báo
tên
sau
t
ừ
khoá
gates.
Cặp
dấu
[]
thể
hiện
mộ
t
vector
cổng.
Các
thành
phần
của
mộ
t
vector
cổng
được
đánh
số
bắ
t
đầu
t
ừ
0.
Ví
dụ
:
simple
NetworkInterface
parameters:
//
gates:
in:
fromPort,
fromH
i
gherLayer;
out:
toPort,
t
oHigherLayer
;
endsimp
l
e
simple
RoutingUnit
parameters:
//
gates:
in:
output[];
OMNet++
Tran
g
14
out:
input[];
endsimp
l
e
Kích
t
hước
của
mộ
t
vector
cổng
có
thể
được
xác
định
sau
do
đó
mỗ
i
đố
i
t
ượng
cụ
thể
của
mộ
t
mô
h
ì
nh
có
thể
có
các
vector
cổng
có
k
í
ch
thước
khác
nhau.
3.5.
Khai
báo
module
kết
hợp
Module
kế
t
hợp
là
các
module
có
thể
chứa
mộ
t
hoặc
nh
i
ều
các
modu
l
e
con.
Bấ
t
kỳ
kiểu
module
nào
(đơn
g
i
ản
hay
kế
t
hợp)
đều
có
thể
được
dùng
như
là
mộ
t
module
con.
Cũng
g
i
ống
như
các
module
đơn
g
i
ản,
các
module
kế
t
hợp
cũng
có
các
cổng,
các
tham
số
và
chúng
có
t
hể
được
sử
dụng
ở
bấ
t
kỳ
chỗ
nào
mà
các
module
đơn
giản
có
thể
được
sử
dụng.
Hình
t
ượng
hoá
chúng
ta
có
t
hể
t
ưởng
t
ượng
các
module
kế
t
hợp
g
i
ống
như
các
hộp
bìa
cứng
mà
chúng
ta
có
thể
giấu
phần
mô
h
ì
nh
mô
phỏng
và
các
cấu
t
rúc
phức
t
ạp
bên
trong
nó.
Không
có
các
hành
vi
tí
ch
cực
(active
behaviour)
nào
liên
quan
đến
các
module
kế
t
hợp
-
chúng
chỉ
đơn
g
i
ản
là
mộ
t
nhóm
các
module
kế
t
hợp
t
rong
mộ
t
thành
phần
l
ớn
hơn
để
có
thể
được
sử
dụng
như
mộ
t
mô
hình
hoặc
như
mộ
t
khố
i
dựng
sẵn
cho
các
modu
l
e
kế
t
hợp
khác.
Theo
quy
ước,
t
ên
của
các
module
(bao
gồm
cả
kiểu
module
kế
t
hợp)
đều
được
bắ
t
đầu
bằng
chữ
hoa.
Các
modu
l
e
con
có
thể
sử
dụng
các
tham
số
của
module
cha.
Các
module
con
này
có
thể
kế
t
nố
i
vớ
i
nhau
hoặc/và
kế
t
nố
i
vớ
i
module
kế
t
hợp
chứa
chúng.
Việc
kha
i
báo
các
module
kế
t
hợp
cũng
t
ương
t
ự
như
khai
báo
các
module
đơn
g
i
ản.
Phần
khai
báo
cũng
bao
gồm
các
t
ừ
khoá
parameters
và
gates,
ngoà
i
ra
nó
còn
sử
dụng
t
hêm
ha
i
t
ừ
khoá
là
submodules
và
connections.
Cú
pháp
:
modu
l
e
Tên_modu
l
e
parameters:
//
gates:
//
submodules:
//
connections
:
//
endmodule
Chú
ý
l
à
t
ấ
t
cả
các
kha
i
báo
trên
(parame
t
ers,
gates,
submodules,
connections)
chỉ
là
tuỳ
chọn.
OMNet++
Tran
g
15
3.5.1.
Các
tham
số
và
cổng
của
module
kết
hợp
Các
tham
số
và
cổng
của
module
kế
t
hợp
cũng
được
kha
i
báo
và
hoạ
t
động
t
ương
t
ự
như
các
tham
số
và
cổng
của
các
module
đơn
g
i
ản.
Các
tham
số
của
module
kế
t
hợp
có
thể
được
sử
dụng
bở
i
các
module
con
và
thường
được
dùng
để
khở
i
t
ạo
g
i
á
t
rị
cho
các
tham
số
của
các
module
con.
Các
tham
số
cũng
có
thể
được
sử
dụng
để
xác
định
cấu
trúc
bên
t
rong
của
các
modu
l
e
kế
t
hợp:
số
các
module
con,
k
í
ch
t
hước
của
các
vec
t
or
cổng
mặ
t
khác
các
tham
số
này
cũng
có
thể
được
sử
dụng
để
xác
định
các
kế
t
nố
i
bên
t
rong
module
kế
t
hợp.
Các
tham
số
ảnh
hưởng
đến
cấu
trúc
bên
trong
của
module
nên
được
khai
báo
là
const
để
giá
trị
của
tham
số
không
thay
đổ
i
theo
các
l
ần
t
ruy
nhập.
Trá
i
l
ạ
i
nếu
các
tham
số
được
khai
báo
l
à
các
giá
trị
ngẫu
nhiên,
ngườ
i
sử
dụng
có
thể
sẽ
có
các
g
i
á
trị
khác
nhau
mỗ
i
l
ần
t
ham
số
được
truy
nhập
t
rong
quá
trình
xử
lý
của
module
kế
t
hợp.
Ví
dụ
:
module
Rou
t
er
parameters:
packetsPerSecond
:
numeric,
bufferS
i
ze
:
numeric,
numOfPorts
:
cons
t;
gates:
in:
inputPort[];
out:
outputPort[];
submodules:
//
connections
:
//
endmodule
3.5.2.
Các
module
con
Các
module
con
được
khai
báo
sau
t
ừ
khoá
submodules.
Theo
quy
ước
các
modu
l
e
con
được
đặ
t
t
ên
bắ
t
đầu
vớ
i
chữ
cái
thường.
Các
modu
l
e
con
có
thể
là
mộ
t
module
đơn
giản
hoặc
mộ
t
module
kế
t
hợp.
Trình
biên
dịch
NED
phả
i
biế
t
được
k
i
ểu
của
module
do
đó
các
module
con
phả
i
được
khai
báo
sớm
hơn
hoặc
được
i
mport
t
ừ
các
f
i
le
NED
khác.
Ngườ
i
sử
dụng
cũng
có
khả
năng
t
ạo
ra
các
vector
module
con
và
kích
thước
của
vector
này
có
thể
nhận
vào
t
ừ
giá
t
rị
của
mộ
t
tham
số.
Khi
khai
báo
các
module
con,
bạn
cần
phả
i
gán
g
i
á
trị
cho
các
tham
số
của
module
và
nếu
k
i
ểu
module
t
ương
ứng
có
sử
dụng
các
vector
cổng
t
h
ì
bạn
phả
i
xác
định
cho
nó
mộ
t
k
í
ch
thước
cụ
thể.
Ví
dụ
:
module
Tên_Module_kết_hợp
//
submodules:
OMNet++
Tran
g
16
tên_module_con_1:
K
i
ểu_Module_1
parameters:
//
gatesizes
:
//
tên_module_con_2:
K
i
ểu_Module_2
parameters:
//
gatesizes
:
//
endmodule
Vector
modu
l
e
Vec
t
or
module
là
mộ
t
t
ập
hợp
(mộ
t
mảng)
các
module
con.
Kích
thước
của
vec
t
or
có
thể
được
b
i
ểu
diễn
bằng
mộ
t
b
i
ểu
thức
đặ
t
trong
cặp
dấu
ngoặc
vuông
‘[]’.
Biểu
t
hức
này
có
thể
tham
ch
i
ếu
đến
các
tham
số
của
module.
Giá
trị
0
cho
số
các
module
cũng
được
chấp
nhận.
Ví
dụ
:
module
CompoundModule
parameters:
s
i
ze:
cons
t;
submodules:
submod1
:
Node[3]
//
submod2
:
Node[size]
//
submod3
:
Node[2*size+1]
//
endmodule
3.5.3.
Tham
số
tên
kiểu
module
con
Việc
sử
dụng
tên
của
các
kiểu
module
như
các
t
ham
số
t
ạo
đ
i
ều
kiện
dễ
dàng
cho
sử
dụng
các
module
con.
Lấy
v
í
dụ,
cho
rằng
mục
đích
của
quá
trình
mô
phỏng
là
so
sánh
sự
khác
nhau
g
i
ữa
các
thuậ
t
toán
tì
m
đường.
Giả
sử
bạn
đã
l
ập
trình
các
thuậ
t
toán
tì
m
đường
cần
thiế
t
như
các
module
đơn
giản
DistVecRou
ti
ngNode,
AntNetRouting1Node,
AntNetRou
ti
ng2Node,
Bạn
cũng
đã
t
ạo
ra
mộ
t
topology
mạng
như
mộ
t
module
kế
t
hợp
gọ
i
là
RountingTestNetwork
để
phục
vụ
cho
việc
đánh
giá
hoạ
t
động
của
các
thuậ
t
toán.
Hiện
t
ạ
i
RountingTestNetwork
đang
sử
dụng
thuậ
t
toán
Dis
t
VecRoutingNode
(tấ
t
cả
các
module
con
đều
có
k
i
ểu
này)
và
bạn
muốn
có
OMNet++
Tran
g
17
thể
chuyển
đổ
i
qua
l
ạ
i
mộ
t
cách
dễ
dàng
giữa
các
thuậ
t
t
oán
để
ti
ện
l
ợ
i
cho
việc
đánh
giá.
Để
thực
h
i
ện
đ
i
ều
này
t
a
có
t
hể
sử
dụng
thêm
mộ
t
biến
là
routingNodeType
cho
module
Rou
t
ingTestNetwork.
Đồng
thờ
i
bạn
cũng
kha
i
báo
cho
NED
các
modu
l
e
con
của
Rou
ti
ngTestNe
t
work
không
có
kiểu
cố
định,
mà
k
i
ểu
của
các
module
này
được
l
à
giá
trị
của
biến
routingNodeType.
Kh
i
đó
mạng
mô
phỏng
của
bạn
có
t
hể
dễ
dàng
thay
đổ
i
các
thuậ
t
t
oán
ở
t
rên
thông
qua
g
i
á
trị
của
tham
số
như
“DistVectRoutingNode”,
“AntNetRouting1Node”
hoặc
“AntNetRouting2Node”.
Trong
trường
hợp
giá
trị
của
tham
số
là
sa
i
(chứa
tên
của
mộ
t
kiểu
không
t
ồn
t
ại)
quá
trình
mô
phỏng
sẽ
bị
l
ỗ
i
khi
bắ
t
đầu
chạy
-
module
type
definition
not
found
(khai
báo
kiểu
module
không
được
tì
m
thấy).
Bên
trong
module
RoutingTestNetwork,
ta
có
thể
gán
giá
trị
cho
các
tham
số
và
ti
ến
hành
kế
t
nố
i
vớ
i
các
module
chứa
các
thuậ
t
toán
tì
m
đường
t
ương
ứng.
Tuy
nhiên
để
t
ăng
tính
chính
xác,
đảm
bảo
t
ên
của
tham
số
và
cổng
mà
bạn
sử
dụng
là
chính
xác,
NED
cần
có
sự
giúp
đỡ
t
ừ
bạn.
Bạn
có
thể
khai
báo
thêm
mộ
t
modu
l
e
(g
i
ả
sử
tên
là
RoutingNode)
và
phả
i
đảm
bảo
chắc
chắn
rằng
t
ấ
t
cả
các
module
mà
định
sử
dụng
thông
qua
tham
số
routingNodeType
đều
có
các
tham
số
và
các
cổng
giống
như
của
module
RoutingNode.
Cú
pháp
:
module
RoutingTes
t
Network
parameters:
routingNodeType:
string
;
//
should
hold
t
he
name
//
of
an
ex
i
sting
module
type
gates:
//
submodules:
node1
:
routingNodeType
like
Rou
t
ingNode;
node2
:
routingNodeType
like
Rou
t
ingNode;
//
connections
nocheck
:
node1.out0
>
node2.in0;
//
endmodule
Đoạn
mã
này
nếu
nhìn
theo
góc
độ
của
ngôn
ngữ
C++
t
h
ì
RoutingNode
đóng
vai
trò
của
mộ
t
l
ớp
cơ
sở,
Dis
t
VecRoutingNode,
AntNe
t
Routing1Node
là
các
l
ớp
kế
thừa
t
ừ
l
ớp
RoutingNode.
Tham
số
routingNodeType
t
ương
ứng
vớ
i
con
t
rỏ
trỏ
t
ớ
i
l
ớp
cơ
sở.
Module
Rou
ti
ngNode
không
cần
được
thực
hiện
trong
C++
bở
i
không
có
đố
i
t
ượng
cụ
thể
nào
của
nó
được
t
ạo
ra,
nó
chỉ
đơn
thuần
được
dùng
để
kiểm
t
ra
tính
chính
xác
của
file
NED.
Mặ
t
khác,
các
module
thực
sự
sẽ
được
thay
thể
(ví
dụ
như
D
i
stVecRou
ti
ngNode,
AntNetRouting1Node, )
sẽ
không
cần
phả
i
khai
báo
t
rong
file
NED.
OMNet++
Tran
g
18
Từ
khoá
like
cho
phép
bạn
t
ạo
ra
mộ
t
họ
các
module
phục
vụ
cho
cùng
mộ
t
mục
đích,
có
cùng
g
i
ao
ti
ếp
g
i
ống
nhau
(có
cùng
các
tham
số
và
các
cổng)
và
sử
dụng
chúng
thay
thế
nhau
t
rong
file
NED.
3.5.4.
Gán
giá
trị
cho
các
tham
số
của
các
module
con
Có
thể
gán
giá
trị
cho
các
tham
số
của
các
module
con
trong
phần
khai
báo
parameters
của
các
module
con.
Các
t
ham
số
của
module
con
có
thể
được
gán
giá
trị
như
các
hằng
số
hoặc
có
thể
sử
dụng
ngay
các
t
ham
số
của
module
kế
t
hợp
chứa
nó,
hoặc
cũng
có
khở
i
gán
bằng
mộ
t
biểu
thức.
Không
bắ
t
buộc
t
ấ
t
cả
các
t
ham
số
đều
phả
i
khở
i
gán
g
i
á
trị.
G
i
á
trị
của
t
ham
số
có
thể
nhận
trong
lúc
thực
h
i
ện
hoặc
nhận
t
ừ
file
cấu
h
ì
nh
hoặc
trong
t
rường
hợp
giá
trị
của
tham
số
không
có
trong
file
cấu
h
ì
nh,
quá
t
r
ì
nh
mô
phỏng
sẽ
nhắc
bạn.
Tuy
nhiên
nếu
các
tham
số
để
trong
file
cấu
h
ì
nh,
sẽ
dễ
dàng
hơn
cho
v
i
ệc
sửa
chữa
giá
trị
của
các
tham
số.
Ví
dụ
:
module
CompoundModule
parameters:
param1
:
numeric,
param2
:
numeric,
useParam1
:
bool;
submodules:
submodule1
:
Node
parameters:
p1
=
10,
p2
=
param1+param2,
p3
=
useParam1==
t
rue
?
param1
:
param2
;
//
endmodule
Trong
khi
mô
h
ì
nh
hoạ
t
động,
các
biểu
t
hức
gán
giá
t
rị
vẫn
được
tính
toán
nếu
các
tham
số
t
ương
ứng
được
gọ
i
đến.
Ngoà
i
ra
để
gọ
i
mộ
t
tham
số
của
module
con
t
a
có
thể
sử
dụng
cú
pháp
như
sau
:
submodule.parametername
(hoặc
submodule[index].parame
t
ername).
Từ
khoá
input
Kh
i
mộ
t
t
ham
số
không
nhận
g
i
á
t
rị
trực
ti
ếp
trong
file
NED
hoặc
t
rong
file
cấu
h
ì
nh,
ngườ
i
sử
dụng
sẽ
được
nhắc
để
nhập
g
i
á
t
rị
cho
tham
số
khi
quá
trình
mô
phỏng
bắ
t
đầu
thực
h
i
ện.
Tuy
nhiên
nếu
bạn
muốn
chủ
động
nhập
giá
t
rị
tham
số
khi
bắ
t
đầu
quá
trình
mô
phỏng,
bạn
có
thể
sử
dụng
t
ừ
khoá
input.
Từ
khoá
inpu
t
cũng
cho
phép
ngườ
i
sử
dụng
có
t
hể
th
i
ế
t
l
ập
thông
báo
nhập
giá
trị
hay
đặ
t
g
i
á
t
rị
mặc
định
cho
tham
số.
Cú
pháp
:
parameters:
OMNet++
Tran
g
19
numCPUs
=
input(10,
"Number
of
processors?"),
//
g
i
á
trị
mặc
//
định,
dấu
nhắc
processingTime
=
input(10ms),
//thông
báo
nhập
g
i
á
t
rị
cacheSize
=
input;
3.5.5.
Khai
báo
kích
thước
của
các
vector
cổng
của
module
con
Kích
t
hước
của
các
vector
cổng
được
khai
báo
bằng
t
ừ
khoá
gatesizes.
Kích
thước
này
có
thể
được
khai
báo
như
mộ
t
hằng
số,
mộ
t
t
ham
số
hay
mộ
t
biểu
thức.
Ví
dụ
:
simple
Node
gates:
in:
inputs[];
out:
outputs[];
endsimp
l
e
module
CompoundModule
parameters:
numPorts:
const;
submodules:
node1
:
Node
gatesizes
:
inputs[2],
outputs[2];
node2
:
Node
gatesizes
:
inputs[numPorts],
outputs[numPorts];
//
endmodule
gatesizes
là
không
bắ
t
buộc,
nếu
bạn
muốn
bỏ
qua
v
i
ệc
khai
báo
gatesizes
cho
vector
cổng
nó
sẽ
được
đặ
t
bằng
0.
Mộ
t
lý
do
để
bỏ
qua
v
i
ệc
gán
giá
t
rị
cho
ga
t
esizes
l
à
bạn
sẽ
sử
dụng
gate++
(“extend
gate
vector
with
a
new
gate”
-
vector
cổng
mở
rộng
vớ
i
mộ
t
cổng
mớ
i
).
gate++
sẽ
được
trình
bầy
kĩ
hơn
trong
phần
Connection.
3.5.6.
Khai
báo
gatesizes
và
tham
số
có
điều
kiện
Kích
t
hước
của
vector
cổng
và
các
tham
số
trong
module
con
thường
được
kha
i
báo
kèm
thêm
đ
i
ều
kiện.
Ví
dụ
:
module
Chain
parameters:
count:
cons
t;
OMNet++
Tran
g
20
submodules:
node
:
Node
[count]
parameters:
position
=
"midd
l
e"
;
parameters
if
index==0
:
position
=
"beginn
i
ng"
;
parameters
if
index==coun
t
-1:
position
=
"end";
gatesizes
:
in[2],
out[2]
;
gatesizes
i
f
index==0
||
index==coun
t
-1:
in[1],
out[1]
;
connections
:
//
endmodule
Chú
ý
các
g
i
á
trị
mặc
định
nên
được
khai
báo
đầu
tiên
bở
i
v
ì
NED
sẽ
duyệ
t
t
ừ
trên
xuống
dưới,
nếu
gặp
đ
i
ều
k
i
ện
đúng
thì
các
giá
t
rị
t
ương
ứng
sẽ
được
chèn
vào
các
giá
trị
mặc
định
trước
đó.
Trong
trường
hợp
khai
báo
g
i
á
trị
mặc
định
cuố
i
cùng,
g
i
á
trị
mặc
định
sẽ
có
thể
chèn
vào
giá
t
rị
của
mộ
t
t
rường
hợp
đ
i
ều
kiện
đúng
trước
đó.
3.5.7.
Kết
nối
Các
kế
t
nố
i
chỉ
ra
cụ
thể
cách
các
cổng
của
module
kế
t
hợp
giao
ti
ếp
vớ
i
các
cổng
t
ương
ứng
của
module
con.
Kế
t
nố
i
có
thể
được
t
ạo
ra
giữa
ha
i
module
con
hoặc
giữa
module
con
vớ
i
module
cha
(module
kế
t
hợp)
trực
ti
ếp
chứa
nó
(trong
mộ
t
số
ít
trường
hợp,
mộ
t
kế
t
nố
i
cũng
có
thể
được
t
ạo
ra
giữa
ha
i
cổng
của
cùng
mộ
t
module
kế
t
hợp).
Đ
i
ều
này
có
nghĩa
l
à
NED
không
cho
phép
mộ
t
kế
t
nố
i
đa
cấp
(kế
t
nố
i
giữa
ha
i
module
xa
nhau
t
rong
cấu
trúc
phân
cấp).
Hạn
chế
này
làm
t
ăng
tí
nh
độc
l
ập
và
khả
năng
dùng
l
ạ
i
của
mỗ
i
module.
Ngoài
ra,
hướng
của
module
cũng
rấ
t
trong
quan
trọng
khi
t
ạo
kế
t
nố
i
.
Không
thể
t
ạo
mộ
t
kế
t
nố
i
giữa
hai
cổng
ra
hoặc
giữa
ha
i
cổng
vào
vớ
i
nhau.
NED
chỉ
hỗ
trợ
kiểu
kế
t
nố
i
một-mộ
t
do
đó
mộ
t
cổng
riêng
b
i
ệ
t
được
sử
dụng
chỉ
xuấ
t
hiện
mộ
t
l
ần
trong
mộ
t
kế
t
nối.
K
i
ểu
kế
t
nố
i
một-nhiều
và
nhiều-mộ
t
cũng
có
thể
được
t
ạo
ra
bằng
cách
sử
dụng
các
module
đơn
g
i
ản
t
rong
đó
các
luồng
message
được
nhân
đôi
hoặc
được
ghép
thêm
(dup
li
ca
t
e
message
or
merge
message
flows).
Các
kế
t
nố
i
được
li
ệ
t
kê
sau
t
ừ
khoá
connect
i
ons
và
được
phân
tách
vớ
i
nhau
bằng
dấu
chấm
phẩy.
Ví
dụ
:
module
CompoundModule
parameters:
//
gates:
//
OMNet++
Tran
g
21
submodules:
//
connections
:
node1.outpu
t
>
node2.input;
node1.inpu
t
<
node2.output;
//
endmodule
Cổng
nguồn
có
thể
là
cổng
ra
của
các
module
con
hoặc
l
à
cổng
vào
của
modu
l
e
kế
t
hợp
và
cổng
đích
có
thể
là
cổng
vào
của
module
con
hay
cổng
ra
của
module
kế
t
hợp.
Mũ
i
tên
có
t
hể
chỉ
theo
chiều
t
ừ
t
rái
qua
phả
i
hoặc
theo
chiều
ngược
l
ại.
Chú
thích
gate++
cho
phép
ngườ
i
sử
dụng
có
thể
mộ
t
vector
cổng
vớ
i
mộ
t
cổng
mới,
mà
không
cần
phả
i
khai
báo
trong
gatesizes.
Ví
dụ
:
simple
Node
gates:
in:
in[];
out:
out[];
endsimp
l
e
module
Sma
l
lNet
submodules:
node
:
Node[6];
connections
:
node[0].ou
t
++
>
node[1].in++;
node[0].
i
n++
<
node[1].out++;
node[1].ou
t
++
>
node[2].in++;
node[1].
i
n++
<
node[2].out++;
node[1].ou
t
++
>
node[4].in++;
node[1].
i
n++
<
node[4].out++;
node[3].ou
t
++
>
node[4].in++;
node[3].
i
n++
<
node[4].out++;
node[4].ou
t
++
>
node[5].in++;
node[4].
i
n++
<
node[5].out++;
endmodule
Mộ
t
kế
t
nố
i:
•
Có
thể
có
các
thuộc
tính
(độ
trễ,
t
ỉ
số
bit
l
ỗi,
t
ốc
độ
truyền
dữ
li
ệu)
hoặc
sử
dụng
mộ
t
kênh
truyền
đã
được
đặ
t
t
ên.
OMNet++
Tran
g
22
•
Có
thể
xuấ
t
h
i
ện
trong
mộ
t
vòng
l
ặp
(để
t
ạo
ra
nh
i
ều
kế
t
nối).
•
Có
thể
là
đ
i
ều
kiện.
Kết
nố
i
đơn
và
kênh
truyền
Nếu
bạn
không
xác
định
mộ
t
kênh
truyền,
thì
kế
t
nố
i
sẽ
không
có
trễ
và
không
có
bit
l
ỗ
i
kh
i
truyền.
Bạn
có
t
hể
xác
định
mộ
t
kênh
t
ruyền
thông
qua
tên.
Ví
dụ
:
node1.outGate
>
F
i
ber
>
node2.inGate;
Trong
trường
hợp
này
fi
l
e
NED
đã
phả
i
có
khai
báo
loạ
i
kênh
t
ruyền
trên.
Hoặc
ngườ
i
sử
dụng
cũng
có
t
hể
xác
định
trực
ti
ếp
mộ
t
kênh
truyền
qua
các
tham
số
đặc
trưng.
Ví
dụ
:
node1.outGate
>
error
1e-9
delay
0.001
>
node2.inGate;
Không
nhấ
t
định
phả
i
kha
i
báo
đầy
đủ
các
tham
số
và
các
tham
số
có
t
hể
được
kha
i
báo
theo
bấ
t
kỳ
thứ
t
ự
nào.
Kết
nố
i
vòng
l
ặp
Nếu
module
con
hoặc
các
vector
cổng
được
sử
dụng,
NED
cho
phép
ngườ
i
sử
dụng
có
thể
t
ạo
ra
nh
i
ều
hơn
mộ
t
kế
t
nố
i
vớ
i
mộ
t
khai
báo.
Đó
được
gọ
i
l
à
mộ
t
đa
kế
t
nố
i
hay
mộ
t
kế
t
nố
i
vòng
l
ặp.
for
i=0 4
do
node1.outGate[i]
>
node2[i].inGate
endfor;
Mộ
t
đa
kế
t
nố
i
thực
chấ
t
l
à
mộ
t
t
ập
hợp
các
kế
t
nố
i
đơn
được
khai
báo
gọn
hơn
nhờ
câu
l
ệnh
vòng
l
ặp
for do endfor.
Hình
I-3.1
-
Đa
kết
nố
i
Các
kết
nố
i
có
đ
i
ều
kiện
Ngườ
i
sử
dụng
có
thể
sử
dụng
t
ừ
khoá
i
f
để
ràng
buộc
đ
i
ều
k
i
ện
khi
t
ạo
các
kế
t
nối.
Ví
dụ
:
for
i=0 n
do
node1.outGate[i]
>
node2[i].inGate
i
f
i
%2==0;
endfor;
Nocheck
OMNet++
Tran
g
23
Mặc
định,
NED
quy
định
t
ấ
t
cả
các
cổng
đều
phả
i
được
kế
t
nố
i
do
vậy
trong
nhiều
trường
hợp
v
i
ệc
kiểm
t
ra
này
có
thể
gây
nh
i
ều
ph
i
ền
phức.
Để
t
ắ
t
bỏ
chức
năng
này
bạn
có
thể
sử
dụng
t
ừ
khoá
nocheck.
3.6.
Khai
báo
mạng
Để
thực
sự
t
ạo
mộ
t
mô
h
ì
nh
mô
phỏng
chạy
được
th
ì
ngườ
i
sử
dụng
phả
i
khai
báo
mạng.
Việc
khai
báo
mạng
sẽ
t
ạo
ra
mộ
t
mô
h
ì
nh
mô
phỏng
như
là
mộ
t
đố
i
t
ượng
cụ
thể
của
mộ
t
kiểu
module
đã
định
nghĩa
trước
đó.
Kiểu
module
ở
đây
thường
là
mộ
t
module
kế
t
hợp,
tuy
nhiên
cũng
có
thể
t
ạo
ra
mộ
t
mạng
chỉ
là
mộ
t
module
đơn
giản
độc
l
ập.
Có
thể
khai
báo
nh
i
ều
mạng
t
rong
mộ
t
hoặc
nhiều
file
NED.
Chương
t
rình
mô
phỏng
sử
dụng
các
file
NED
đó
sẽ
có
t
hể
chạy
bấ
t
cứ
mộ
t
mạng
nào.
Nếu
bạn
muốn
cụ
thể
mộ
t
mạng
nào
đó
được
t
hực
h
i
ện
bạn
có
thể
chỉ
rõ
trong
file
cấu
hình
(omnetpp.in
i
).
Cú
pháp
khai
báo
mạng
cũng
t
ương
t
ự
như
khai
báo
các
module
con
:
network
wirelessLAN:
WirelessLAN
parameters:
numUsers=10,
httpTraffic=true,
ftpTraffic=
t
rue,
distanceFromHub=truncnormal(100,60)
;
endnetwork
Ở
đây
WirelessLAN
là
tên
của
mộ
t
kiểu
module
kế
t
hợp
đã
định
nghĩa
t
ừ
trước,
t
rong
đó
có
thể
chứa
các
k
i
ểu
module
kế
t
hợp
khác
như
WirelessHost,
WirelessHub
Mộ
t
cách
t
ự
nh
i
ên,
chỉ
các
k
i
ểu
module
không
có
cổng
mớ
i
có
t
hể
được
dùng
t
rong
các
khai
báo
mạng.
3.7.
Các
biểu
thức
Các
b
i
ểu
thức
được
sử
dụng
trong
NED
được
viế
t
theo
cú
pháp
của
C++.
Các
b
i
ểu
thức
dùng
các
toán
t
ử
của
C++,
có
thể
sử
dụng
các
tham
số
theo
cả
ha
i
hình
thức
truyền
t
heo
tham
trị
hoặc
tham
b
i
ến,
có
t
hể
gọ
i
các
hàm
của
C++,
nhận
các
g
i
á
trị
ngẫu
nhiên
hoặc
yêu
cầu
nhập
t
ừ
ngườ
i
sử
dụng
Kh
i
mộ
t
tham
số
được
gán
trị
bằng
mộ
t
biểu
thức
thì
g
i
á
trị
biểu
thức
đó
chỉ
được
tính
mỗ
i
l
ần
tham
số
được
gọ
i
t
ớ
i
(trừ
kh
i
tham
số
được
khai
báo
const).
Đ
i
ều
này
có
nghĩa
là
mộ
t
module
đơn
giản
sử
dụng
mộ
t
t
ham
số
không
được
khai
báo
const
sẽ
nhận
được
các
giá
trị
khác
nhau
mỗ
i
l
ần
gọ
i
t
ham
số
trong
quá
trình
mô
phỏng.
Các
biểu
thức
khác
(chứa
các
tham
số
được
khai
báo
const)
sẽ
chỉ
được
tí
nh
mộ
t
l
ần.
Các
tham
số
có
kiểu
XML
có
t
hể
được
dùng
để
truy
nhập
vào
các
file
XML
hay
mộ
t
phần
nào
đó
của
các
file
này.
Tham
số
kiểu
XML
có
t
hể
được
gán
g
i
á
trị
bằng
toán
t
ử
xmldoc().
OMNet++
Tran
g
24
3.7.1.
Hằng
số
Hằng
số
học
Hằng
số
học
t
hường
là
các
số
dạng
t
hập
phân
hoặc
các
số
thập
phân
vớ
i
dấu
phẩy
động.
Hằng
chuỗ
i
ký
tự
Hằng
chuỗ
i
ký
t
ự
được
kha
i
báo
giữa
cặp
dấu
ngoặc
kép.
Hằng
thờ
i
gian
Để
sử
dụng
hằng
thờ
i
g
i
an
bạn
phả
i
sử
dụng
thêm
các
t
ừ
khoá
chỉ
đơn
vị
thờ
i
g
i
an.
Ví
dụ
:
parameters:
propagationDelay
=
560ms,
//
0.560
giây
connectionT
i
meou
t
=
6m
30s
500ms,
//
390.5
giây
recoveryIntvl
=
0.5h;
//
30
phút
Các
đơn
vị
thờ
i
g
i
an
có
thể
được
sử
dụng:
Đơn
vị
Ý
nghĩa
ns
nano
giây
us
m
i
cro
giây
ms
m
ili
g
i
ây
s
giây
m
phút
(60
g
i
ây)
h
g
i
ờ
(3600
giây)
d
ngày
(86400
giây)
3.7.2.
Tham
chiếu
Các
b
i
ểu
t
hức
có
thể
sử
dụng
các
tham
số
của
module
kế
t
hợp
t
rực
ti
ếp
chứa
nó
và
của
các
module
đơn
giản
đã
được
khai
báo
trước
đó
trong
file
NED.
Cú
pháp
:
submod.param
hoặc
submod[
i
ndex].param.
Có
hai
t
ừ
khoá
có
thể
được
sử
dụng
vớ
i
t
ên
của
t
ham
số
:
ancestor
và
ref.
ancestor
có
nghĩa
l
à
nếu
mộ
t
module
kế
t
hợp
không
chứa
mộ
t
tham
số
nào,
t
h
ì
tham
số
đó
sẽ
được
tì
m
k
i
ếm
trong
các
module
cấp
cao
hơn
trong
cấu
trúc
phân
cấp.
ancestor
không
được
khuyến
khích
sử
dụng
bở
i
vì
nó
xâm
phạm
t
ớ
i
khái
niệm
đóng
OMNet++
Tran
g
25
gói
thông
ti
n
(encapsulation)
và
có
thể
chỉ
được
k
i
ểm
tra
trong
thờ
i
g
i
an
chạy.
Nó
chỉ
nên
được
sử
dụng
trong
mộ
t
số
ít
những
trường
hợp
thực
sự
cần
t
h
i
ết.
ref
l
ấy
g
i
á
t
rị
của
tham
số
bằng
phương
pháp
t
ham
ch
i
ếu,
có
nghĩa
là
v
i
ệc
thay
đổ
i
giá
trị
của
tham
số
trong
thờ
i
g
i
an
chạy
sẽ
gây
ảnh
hưởng
t
ớ
i
t
ấ
t
cả
các
module
tham
chiếu
t
ớ
i
tham
số
này.
Cũng
giống
như
ancestor,
ref
nên
được
sử
dụng
hạn
chế.
Mộ
t
trường
hợp
có
thể
sử
dụng
ref
là
khi
phả
i
đ
i
ều
chỉnh
mô
h
ì
nh
trong
t
hờ
i
gian
chạy
để
tì
m
đ
i
ều
k
i
ện
t
ố
i
ưu.
Ngườ
i
sử
dụng
có
thể
khai
báo
mộ
t
tham
số
ở
mức
cao
nhấ
t
của
mô
h
ì
nh
và
đặ
t
các
module
khác
tham
ch
i
ếu
t
ớ
i
tham
số
này.
Kh
i
bạn
thay
đổ
i
tham
số
này
trong
thờ
i
g
i
an
chạy,
nó
sẽ
ảnh
hưởng
t
ớ
i
toàn
bộ
mô
hình.
Trong
mộ
t
số
trường
hợp
khác,
các
t
ham
số
được
tham
ch
i
ếu
có
t
hể
được
dùng
như
các
biến
trạng
thái
đố
i
vớ
i
các
module
bên
cạnh.
3.7.3.
Các
toán
tử
Các
toán
t
ử
được
hỗ
trợ
t
rong
NED
cũng
t
ương
t
ự
như
các
toán
t
ử
trong
C/C++,
t
uy
nhiên
cũng
có
mộ
t
số
khác
biệ
t:
Dấu
^
được
dùng
cho
phép
tính
luỹ
thừa
(không
phả
i
l
à
phép
XOR
các
b
it
như
t
rong
C).
Dấu
#
được
sử
dụng
cho
phép
toán
logic
XOR
(tương
t
ự
như
dấu
!=)
và
##
được
dùng
cho
phép
toán
bit
XOR.
Thứ
t
ự
ưu
tiên
của
các
phép
toán
b
it
(&,
|,
#)
là
cao
nhấ
t
so
vớ
i
các
toán
t
ử
quan
hệ
khác.
Tấ
t
cả
các
b
i
ến
trong
NED
đều
có
kiểu
doubles.
Đố
i
vớ
i
các
toán
t
ử
bit,
kiểu
doubles
được
chuyển
thành
kiểu
unsigned
l
ong
bằng
hàm
chuyển
đổ
i
có
sẵn
của
C/C++
(type
cast),
sau
kh
i
phép
toán
được
t
hực
hiện
kế
t
quả
sẽ
được
chuyển
đổ
i
l
ạ
i
t
hành
k
i
ểu
doubles.
Tương
t
ự
đố
i
vớ
i
các
toán
t
ử
logic
&&,
||
và
##,
các
toán
hạng
sẽ
được
chuyển
sang
kiểu
bool
(type
cast)
và
sau
đó
kế
t
quả
sẽ
l
ạ
i
được
đổ
i
về
kiểu
doubles.
Đố
i
vớ
i
phép
chia
l
ấy
phần
dư
(%),
toán
hạng
sẽ
được
chuyển
sang
kiểu
long.
Danh
sách
các
toán
t
ử
và
t
hứ
t
ự
ưu
tiên
:
Toán
t
ử
Ý
nghĩa
-,
!,
~
dấu
âm,
phủ
định,
l
ấy
phần
bù
của
b
it
^
phép
toán
luỹ
thừa
*,
/,
%
phép
nhân,
chia,
ch
i
a
l
ấy
phần
dư
+,
-
phép
cộng,
trừ
<<,
>>
phép
dịch
b
it
&,
|,
#
phép
toán
b
it
and,
or,
xor
==
so
sánh
bằng
!=
so
sánh
khác