当前位置:文档之家› WSN中LEACH协议源码分析报告

WSN中LEACH协议源码分析报告

WSN中LEACH协议源码分析

分析(一)

首先对wireless.tcl进行分析,先对默认的脚本选项进行初始化:

set opt(chan)Channel/\VirelessChannel

set opt(prop) Propagatioii/TwoRayGround

set opt(netif)PhyAVirelessPhy

set opt(mac) Mac/802_l 1

set opt(ifq) Qucuc/DropTail/PriQueue

set opt(ll) LL

set opt(ant) Antenna/OmniAntenna

set opt(x) 0 。# X dimension of the topography

set opt(y) 0。# Y dimension of the topography

set opt(cp),H,

set opt(sc) N../mobility/scene/scen-670x670-50-600-20-2u。# scenario file set opt(ifqlen)50o # max packet in if

set opt(nn) 51。# number of nodes

set opt(secd) 0.0

set opt(stop) 10.0 o # simulation time

set opt(tr) out.tr。# trace file

set opt(rp) dsdv 。 # routing protocol script

set opt(lm) M on H。# log movement

在这个wireless.tcl中设置了一些全局变呈::

#

#Initialize Global Variables

#

set ns_ [new Simulator]

set chan [new $opt(chan)]

set prop [new $opt(prop)]

set topo [newTopography]

set tracefd [open Sopt(tr) w]

Stopo Ioad_flatgrid $opt(x) $opt(y)

Sprop topography Stopo

这些初始化将在后而的使用中用到,该文件最重要的是创建leach 17点:创建方法如下:

} elseif { [string compare Sopt(rp) M leach,,]==0} {

for {set i 0} {$i < $opt(nn) } {incr i} {

leach-create-mobile-node $i

}

如果路由协议是leach协议,则在Uamps.tcl中调用leach-create-mobile-node方法创建leach节点。将在第二小节讲如何创建leach节点。

for {set i 0} {$i < $opt(nn) } {incr i} {

$ns_ at $opt(stop).000000001 M Snode_($i) reset”。〃完成后,重宜右点的应用

}

$ns_ at Sopt(stop).00000001 M puts VNS EXITING..'”。$ns_ halt” if { $opt(sc) ==

} {

puts H *** NOTE: no scenario file specified/1

set opt(sc) u none°

)else {

puts ”Loading scenario file../* source Sopt(sc)

puts ”Load complete...,r }

ns 在什么时候结束simulation,并告诉ns 加载sc 场景文件。最后$ns_ run 则ns 就开始运 行了。

分析(-)

上节对wireless.tcl 进行了简要的分析,接下来对Uanips.tcl 脚本进行分析。 set

opKEfriss^amp) [expr [expr 1.1 * $opt(RXThrcsh) * 16 * $PI * $PI] /\

[expr $opt(bw) * Sopt(Gt) * $opt(Gr) * $1 * $1]]

# Etwo_ray_amp = RXThresh /(Rb Gt Gr ht A 2 hr A 2) set opt(Etwo_ray_amp) [expr 1.1 ? $opt(RXThresh)/\

[expr $opt(bw) * $opt(Gt) * $opt(Gr) ? \

$opt(ht) * $opt(ht) * $opt(ht) * $opt(ht)]] 50e-9 o #

Energy for radio circuitry

5e-9 o # Beamforming energy (J/bit) 0

o # Sensing energy (J/bit)

o # Threshold for power adaptation o # Idle power (W) a # Sleep power (W)

set initialized 0

set rng_ [new RNG]#用于产生随机数

首先往opt 数组里而添加一些变量,并对这些变量进行初化。opt(Psleep) , opt(Pidle),

opt(thresh_energy)^t ns-lcach.tcl 中使用到,这个是讣算单位时间空闲所消耗的能呈:和休眠所 消

耗的能量。

这个脚本主要是创建leach 节点:

if {Sinitialized = O} {

#remove old trace sensjnit

set initialized 1 )

# Remove old trace files.

catch H eval exec rm [glob -nocomplain Sopt(dirname)/TDMAschedule.*.txt]M catch H exec rm $opt(dirname)/$opt(filename).energy H catch "exec rm $opt(dirnaine)/$opt(fiIename).data° catch "exec rm $opt(dirnanie)/$opt(filename).alive H catch ”exec rm $opt(dirname)/startup.energy H catch "exec rm $opt(dirnaine)/init.energy°

set opt(EXcvr) set opt(e_bf) set opt(Esense)

set opt(thresh_energy) 0.00 set opt(Pidle) 0 set opt(Psleep)

如果没有初始化过,则将以前的跟踪文件删除,接着回到创建leach的函数中,创建节点:if {Sid != $opt(nn_)} {

puts -nonewline H$id ”

important

set node_($id) [new MobileNodc/ResourceAwareNode]

} else {

puts "($opt(nn_) = BS)H

set nodc_($id) [new MobileNodc/ResourceAwareNode SBS_NODE]

}

如果不是簇头节点则将$opt(nn_)?l个肖点设置为一般盯点,将$opt(nn」设宜为BS节点。newMobileNodc/RcsourceAwarcNode函数是在ns-ranode.tcl中。分析完这个我们接下来分析ncwMobileNode/ResourceAwareNode 这个函数。

set node $nodc_($id)

if {$id != $opt(nn_)} {

# Set initial node energy.

if {$opt(eq_energy) == 1} {

Snode set-energy $opt(init_energy) $opt(thresh_energy) } else {

由于eq-energy在leach-test中给定,将eq-encrgy=l:则每个节点都会对能量进行初始化, 设置节点

的初始能量和门槛能量(个人理解,死亡能量)。

set high.e.nodes (list 97 19 12 87 8 22 83 55 34 72]

if {[lsearch $high_e_nodcs Sid] == -1} {

set E2

} else {

set E 200

}

Snode set-energy $E Sopt(thresh_energy)

set initf [open M$opt(dirname)/init.energy H a]

puts Sinitf H$id\t$E M

close Sinitf

将不属于list中的能量初始化能量设巻为2,将属于list中的能量设置为200.并将初始化能量写到init.energy中,将节点id和节点初始能量写进去。

else {

# Base station has an infinite amount of energy.

$node set-energy 50000 $opt(thresh_energy)

}

节点为簇头节点,则将节点的初始化能量设宜为50000,能量无限。

到此为止,创建肖点完成并将每个节点的能量初始化完成。下一节将分析ns-ranode.tcl脚札区

分普通节点和簇头节点的不同。接下来是配置右点信道和跟踪文件:

$ns_ at 0.0 ”Snodc_($id) start-app N

ns 在 0 的时候启动应用,应用在 ns-ranode.tcl 中分析。

分析(三)

对前而两个脚本进行分析后,已经创建好节点和设置好节点的初始能崑将opt(nnj-l 个节点设置为普通i'j 点,而将opt(nn_)设置为bs 。现在对ns-ranode.tcl 进行分析。好了我们 现在就开始分析这个脚本。

Class MobileNodc/ResourceAwareNode -superclass Node/MobileNode MobileNode/ResourccAwareNode instproc init args

set bs_nodc [lindex $args 0]

eval $self next [Ireplace Sargs 0 0]

args 由参数传递进来,若节点为簇头节点则bs_nodc=l, i 周用父类初始化函数* set ResourceManager_ [new ResourceManager]

$RcsourceManager_ Register |new Resource/NeighborResource] set energy [new Resource/Energy] $ResourceManager_ Register Senergy

ResourceManager 在 ns-resouce-manager.tcl 中立 义的? Resource/NeighborResource 在 ns-neighbor-resource 中对能量进行管理。

# Create a new agent and attach it to the node if {Sbs.nodc == 1} {

set agent [new Agent/BSAgent] } else {

set agent [new Agent/RCAgent] }

set rca_agent_ $agent

普通节点的应用为RCAgent> BS 的应用为BSAGgento 并将应用attch 到node 上。 下而两段看不明白,但是这两段不影响看程序。

set haslist [find_haslist [$self id]] if {$bs_node == 1} { set rca [new Sopt(bsapp)] } else {

set rca [new Sopt(rcapp) $opt(mtype) Swantslist Shaslist] }

$ns_ attach-agent $self Sagent Srca attach-agent Sagent

set rca_app_ Srca

将bs 右点的应用设置为bsapp,普通节点的应用设置为rcaapp,并将肖点的服务设置为 不同的服务° bsapp 在 ns-app.tcl 中。$opt(rcapp)定义在 leach.tcl 中,opt(mtype)定义在 leach.tcl 中。

M

Application/LEACH H

。# Application type

(TxTime [expr $opt(hdr_size) + 4]]

? # Total time ⑸ for CH ADVs

a # Assume max 4(nn*%) CHs set opt(ra_advjotal)

set opt(rcapp) set opt(ra_adv)

[expr $opt(ra_adv)*($opt(num_clusters)*4 + 1)]

set opt(rajoin)

o # RA Time (s) for nodes* join reqs [expr 0.01 * $opt(nn_)]

set opt(ra_dclay)

a # Buffer time for join req xmittal [TxTime [expr $opt(hdr_size) + 4]]

o # Maximum time required to transmit

set opt(xmit_sch)

a # a schedule (n nodes in 1 cluster) [expr 0.005 + [TxTime [expr $opt(nn_)*4+$opt(hdr_size)]]]

o # Overhead time for cluster set-up

set opt(start_xmit) [expr $opt(ra_advjotal) + $opt(rajoin) + $opt(xmit_sch)]

一般i'j点的应用为Applicatioii/LEACH,最终sink 竹点的应用为Applicalion/BSApp。

通过前3次的分析得出,在分析1中泄义变量,在分析2中创建leach节点,在分析3中将节点的应用绑定在节点上。

下面将分析leach的主要协议ns-leach.tcl脚本。

分析(四)

完成前面3个脚本的分析,最后进行ns-lcach.tcl脚本的分析.首先我们看下这个脚本要使用的有哪些功能.

Application/LEACH instproc init args {}对leach 进行初始化,即构造函数<> 下面是leach的一些方法

Applicatioii/LEACH instproc start {} {}

Application/LEACH instproc gctRandomNumbcr {Him ulim} {}得到随机数

Applicatioii/LEACH instproc node {} {}

Applicatioii/LEACH instproc nodelD {} {}

Application/LEACH instproc mac {} {}

Applicatioii/LEACH instproc getX {} {}

Applicatioii/LEACH instproc getY {} {}

Application/LEACH instproc getER {} {}

Application/LEACH instproc GoToSlcep {) {} if 点进行休眠

Applicatioii/LEACH instproc WakeUp {} {}右点醒来

Application/LEACH instproc setCodc code {}{}

Application/LEACH instproccheckAlive {} (} 肖点是否存活

Application/LEACH instproc isClusterHead? {} {} 判断是否是簇头节点

Application/LEACH instproc hasbecnCIusterHead? {) {}判断是否成为过簇头肖点

Applicatioii/LEACH instproc hasnotbeenClusterHead {} {}hasbeench=O 不是簇头巧点Application/LEACH instproc setClusterHead {} {} 设置为簇头节点

Applicatioii/LEACH instproc unsetClusterHead {} {}设置为非簇头节点

Application/LEACH instproc decideClusterHcad {} {} 决宦簇头if 点,非常重要

Application/LEACH instproc advertiseClusterHead {} {} 广播簇头肖点

Application/LEACH instproc findBcstCluster {} {}找到最佳簇

Application/LEACH instproc informClusterHcad {} {} 通知簇头廿点Application/LEACH instproc createSchcdule {} {}创建TDMA 调度接收功能:

Applicatioii/LEACH instproc recv {args} {}

Application/LEACH instproc recvADV_CH {msg} {}

Application/LEACH instproc rcc\JOIN_REQ {nodcID} {}

Application/LEACH instproc recvADV_SCH {order} {}

Application/LEACH instproc recvDATA {msg} {}

发送功能:

Application/LEACH instproc sendData {) {)

Application/LEACH instproc send {mac_dst link_dst type msgdata_size dist code} {}

Applicatioii/LEACH instproc send_now {mac.dst link_dst type msg data_size dist code} {}

Applicatioii/LEACH instproc SendDataToBS {} {}

Applicatioii/LEACH instproc SendMyDataToBS {} {}

分析(五)

由leach分析三可知,一般i'j点的应用为Application/LEACH.则现在就是如何选择簇头节点和设置门槛值。我们接下来分析leach分析4中红色的方法。在leach分析3中创建一个Application/LEACH对象则就会自动调用start方法。

Application/LEACH instproc start {} {

[Sself macj set node.num. [Sself nodcID]

$self decideClusterHead

$self checkAlive

}

在这个方法中会调用decideClusterHead和checkAlive方法。

Applicatioii/LEACH instproc GoToSlecp {) {

global opt ns_

Sself instvar beginjdle^ bcgin_slccp_

[[Sself node] set netif_(O)] set sleep_ 1

#If node has been awake, remove idle energy (e.g., the amount of energy

#dissipated while the node is in the idle state)? Otherwise, the node

#has been asleep and must remove sleep energy (c.g?,the amount of

#energy dissipated while the node is in the sleep state)?

if {$bcgin_idlc_> $bcgin_sleep_} {

set idle_energy [expr Sopt(Pidle) * [expr [$ns_ now] - SbeginJdleJ]

[Sself getER] remove Sidle_energy

} else {

set sleep^energy [expr $opt(Ps!eep) * [expr [$ns_ now] - $begin_sleep」]

[Sself getER] remove $sleep_energy

}

set begin_sleep_ [$ns_ now]

set begin」dlc_ 0

}

分析(六)

在start中调用下而这个方法。

Application/LEACH instproc decideClusterHead {} {

global ns_ chan opt node.

Sself instvar alive_ TDMAschedule_

$self instvar begin」dlc_ bcgin_slccp_

#Check the alive status of the node? If lhe node has run out of

#energy, it no longer functions in the network?

set ISalive [[[Sself node] set netif_(O)] set alive_]

if ($alive_= 1) {

if {$ISalive==0} {

puts "Node [$self nodelD] is DEAD!!!严

Schan removeif [[$self node] set netifJO)]

set alive. 0

set opt(nn_) [expr Sopt(nn_) -1]

set ISalive [[[Sself node] set netif_(O)] set alive」#从网络接口netif 中査看当前节点状况

如果巧点存活,但是节点能量耗光,贝I,0$chan removeif [[Sself nodel set netif_(O)]将节点信道中移出,并将节点设置为死亡。节点的总数目减少一个。

if (Sopt(eq_energy) == 1} {

#

#Pi⑴=k / (N ? k mod(r,N/k))

#where k is the expected number of clusters per round

#N is the total number of sensor nodes in the network

#and r is the number of rounds that have already passed.

#

set nn $opt(nn_)

if {[expr Snn - $opt(num_clustcrs) * $round」v 1} {

set thresh 1

} else {

set thresh [expr double($opt(nunvclusters)) / \

[expr Snn ? Sopt(num_clusters) * Sround_]]

# Whenever round, is 0. all nodes are eligible to be cluster-head.

if {$round_==0} {

Sself hasnotbeenClusterHead

}

}

#If node has been cluster-head in this group of rounds, it will not

#act as a cluster-head for this round.

if {[Sself hasbeenClusterHead?]} {

set thresh 0

}

} else {

#

#Pi(t) = Ei(t) / Etotal(t) * k

#where k is the expected number of clusters per round,

#Ei(t) is the node's current energy, and Etotal(t) is the total

#energy from all nodes in the network?

#

set Etotal 0

#Note! In a real network, would need a routing protocol to get this

#infonnation. Alternatively, each node could estimate Etotal(t) from

#the energy of nodes in its cluster.

for {set id 0) {Sid < [expr Sopt(nn)-1]} {incr id} {

set app [$nodc_($id) set rca_app_]

set E [[$app getER] query]

set Etotal [expr SEtotal + $E]

}

set E [[Sself getER] query]

set thresh [expr double([expr SE * Sopt(num_clusters)J) / SEtotal]

}

上面是对thresh的计算,当(N - k mod(r,N/k))

if {[Sself getRandoniNumber 0 1] < Sthresh) {

puts"SnodcID* *****************************************

puts "SnodelD: Is a cluster head at time [$ns_ now]"

Sself setClusterHead

set random_access [Sself getRandoniNumber 0 Sopt(ra_adv)] #opt(ra_adv) in leach.tcl

$ns_ at [expr $now_ + $random_access] M$self advertiseClusterHead H

} else {

puts"SnodcID* ****************************************”

Sself unsetClusterHead

如果thres!i>getRandomNumber,则节点成为簇头节点。然后调用advertiseClusterHead方法。set nexLchange_time_ [expr $now_ + $opt(ch_change)J

$ns_ at $next_change_time_ H$self decidcClusterHead'1

$ns_ at [expr Snow_ + $opt(ra_advjotal)] H Sself findBestCluster M

当节点成为簇头盯点,则节点调用advertiseClusterHead方法。

set chlD [$self nodelD]

set currentCH_ $chID

pp H Cluster Head $currentCH_ broadcasting ADV at time [$ns_ now]”

set mac_dst $MAC_BROADCAST

set link_dst SLINK_BROADCAST set msg [list $currcntCH」set datasize [expr SBYTES」D * [Ilength $msg]] # Send beacons opt(max_dist) meters so all nodes can hear. Sself send $mac_dst $link_dst $ADV_CH Smsg Sdatasize $opt(max_dist) $code_ 将该节点设置为簇头节点,设巻当前肖点所处的簇号。然后发送数据,广播该节点为簇头信息到全局网络。

在$ns_ at |expr Snow_ + $opt(ra_advjotal)] H SseIf findBestCIuster M i^!用findBcstCluster 方法。

分析(七)

当簇头发岀了一个ADV类型的包时,英他的节点会接收这个包,并会将发送这个包的簇头的节点号按顺序先后记录在clustcrChoiccs_中,还会计算每个簇头到接收肖点的距离并记录在clusterDist_中。这样可以方便每个盯点选簇的时候进行比较。具体的实现在ns-leach.tcl 中的recvADV_CH 函数中°

findBestCluster

if [Sself isClusterHcad?] {

#If node is CH. determine code and create a TDMA schedule?

set dist_ $opt(max_dist)

set currentCH_ SnodcID

set inyADVnum_ [[Sself mac] set myADVnum_]

#There are opt(spreading)? 1 codes available b/c need 1 code

#for communication with the base station.

set numCodesAvail [expr 2 * Sopt(spreading) - 1]

set ClusterCode [expr int(fmod($myADVnuin_, SnumCodesAvail)) + 1]

$ns_ at [expr $now_ + $opt(ra_advjotal) + $opt(rajoin)] \

M$self createSchedule,r

}

如果这个节点是簇头节点,设宜为当前的簇头,

set numCodesAvail [expr 2 * $opt(spreading) - 1]

set ClusterCode [expr int(fmod($myADVnuni_, SnumCodesAvail)) + 1]这两句没看懂在一个随机时间后调用createSchcdule,肖点根据自己收到的clusterchoices,选择最近的簇头作为簇头节点。选择好簇头节点就informClusterHead.发送完数据就进入休眠状态。Application/LEACH instproc createSchedule {} {

global ns_ opt ADV_SCH MAC_BROADCAST BYTESJD

$self instvar dusterNodes. TDMAscheduIe_

$self instvar dist_ code. now_ beginningE_

set nuniNodes [ilength SclusterNodesJ

set chlD [$self nodelD]

if {$numNodcs = 0} {

set xmitOrder,,M

puts "Warning! There are no nodes in this cluster ($chID)!H

Sself SendMyDataToBS

} else {

# Set the TDMA schedule and send it to all nodes in the cluster.

set xmitOrder $clusterNodes_

set msg [list SxmitOrder]

set spreading_factor $opt(spreading)

set datasize [expr $sprcading_factor * SBYTES」D * [llength SxmitOrder]] pp H$chID sending TDMA schedule: SxmitOrder at time [$ns_ now]1' pp "Packet size is $datasize.n

set mac_dst $MAC_BROADCAST

set link_dst $chID

$self send Smac_dst $link_dst $ADV_SCH $msg Sdatasize $dist_ $codc_

}

set TDMAschcdulj SxmitOrder

set outf [open SopKdirnamO/TDMAschedule.Snow^.txt a]

puts $outf ”$chID\($TDMAschcdulc_”

close Soutf

set outf [open $opt(dirname)/startup.energy a]

puts Soutf ”[$ns_ now]\t$chID\t[expr $beginningE_ - [[$self getER) query]] ° close Soutf

}

在recvADV_SCH给每个节点一个时间间隙发送数据

set framejime. [expr [expr 5 + [llength [join $order]J] * $opt(ss_slot_time)] set xmitTime. [expr $opt(ss_slot_time) * Sind]

set end_frmjime_ [expr $framc_timc_ - $xmiCTimc_]

set xmitat [expr [$ns_ now] + $xmitTimc_]

pp H$nodeID scheduled to transmit at $xmitat. It is now [$ns_ now].”

if {[expr Sxmitat + $end_frm_time_] <\

[expr $nexLchangejime_ - 10* SopKss^sIotJime)]} {

$ns_ at Sxmitat M$self sendData n

具体实现方法看不太懂。

Xmodem协议详解以及源代码剖析

研究 Xmodem 协议必看的 11个问题 Xmodem 协议作为串口数据传输主要的方式之一,恐怕只有做过 bootloader 的才有机会接触一下, 网上有关该协议的内容要么是英语要么讲解不详细。笔者以前写 bootloader 时研究过 1k-Xmodem ,参考了不少相关资料。这里和大家交流一下我对 Xmodem 的理解,多多指教! 1. Xmodem 协议是什么? XMODEM协议是一种串口通信中广泛用到的异步文件传输协议。分为标准Xmodem 和 1k-Xmodem 两种,前者以 128字节块的形式传输数据,后者字节块为 1k 即 1024字节,并且每个块都使用一个校验和过程来进行错误检测。在校验过程中如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节 (ACK。由于 Xmodem 需要对每个块都进行认可, 这将导致性能有所下降, 特别是延时比较长的场合, 这种协议显得效率更低。 除了 Xmodem ,还有 Ymodem , Zmodem 协议。他们的协议内容和 Xmodem 类似,不同的是 Ymodem 允许批处理文件传输,效率更高; Zmodem 则是改进的了Xmodem ,它只需要对损坏的块进行重发,其它正确的块不需要发送确认字节。减少了通信量。 2. Xmodem 协议相关控制字符 SOH 0x01 STX 0x02 EOT 0x04 ACK 0x06 NAK 0x15

CAN 0x18 CTRLZ 0x1A 3.标准 Xmodem 协议(每个数据包含有 128字节数据帧格式 _______________________________________________________________ | SOH | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 | |_____|____________|___________________|__________|____________| 4. 1k-Xmodem (每个数据包含有 1024字节数据帧格式 _______________________________________________________________ | STX | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 | |_____|____________|___________________|__________|____________| 5.数据包说明 对于标准 Xmodem 协议来说,如果传送的文件不是 128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用 CTRL- Z(0x1A来填充。这里可能有人会问,如果我传送的是 bootloader 工程生成的 .bin 文件, mcu 收到后遇到0x1A 字符会怎么处理?其实如果传送的是文本文件,那么接收方对于接收的内容是很容易识别的,因为 CTRL-Z 不是前 128个 ascii 码, 不是通用可见字符, 如果是二进制文件, mcu 其实也不会把它当作代码来执行。哪怕是 excel 文件等,由于其内部会有些结构表示各个字段长度等,所以不会读取多余的填充字符。否则 Xmodem太弱了。对于 1k-Xmodem ,同上理。 6.如何启动传输?

Ns2.34上leach协议的完美移植

Ns2.34上leach协议的完美移植 经过几天的不断实验,以及网上各位前辈的帮助,终于成功将leach协议完美移植到ns2.34上,下面是我的安装笔记。 Step1 在ns-2.34的目录下新建一个leach文件夹,将leach.tar.gz放入这个文件夹 Step2 在终端中进入这个目录下,键入tar zxf leach.tar.gz Step3 ①将leach/mit整个目录复制到ns-allinone-2.34/ns-2.34中 ②将leach/mac目录下的https://www.doczj.com/doc/4814459498.html,, mac-sensor.h, https://www.doczj.com/doc/4814459498.html,, mac-sensor-timers.h四个文件复制到ns-allinone-2.34/ns-2.34/mac中 ③将leach/tcl/mobility目录下的四个文件复制到ns-allinone-2.34/ns-2.34/tcl/mobility中 ④将ns-allinone-2.34/ns-2.34/tcl/ex目录下的wireless.tcl重命名为wireless_1.tcl,再将leach/tcl/ex目录下的wireless.tcl复制到ns-allinone-2.34/ns-2.34/tcl/ex中⑤将leach目录下的test,leach_test,package_up三个文件复制到ns-allinone-2.34/ ns-2.34中 Step3 修改文件 ①需要修改的文件有: ns-allinone-2.34/ns-2.34/apps/https://www.doczj.com/doc/4814459498.html,,app.h ns-allinone-2.34/ns-2.34/trace/https://www.doczj.com/doc/4814459498.html,,cmu-trace.h ns-allinone-2.34/ns-2.34/common/https://www.doczj.com/doc/4814459498.html,,https://www.doczj.com/doc/4814459498.html,,packet.h ns-allinone-2.34/ns-2.34/mac/https://www.doczj.com/doc/4814459498.html,,ll.h,https://www.doczj.com/doc/4814459498.html,,https://www.doczj.com/doc/4814459498.html,,phy.h,wireless-phy.c c,wireless-phy.h ②修改方法: 对于leach目录下相应的文件(即刚才未复制的文件),将代码中以“#ifdef MIT_uAMPS”开始,并以“#endif”结束的部分复制到以上文件对应的位置 这个过此要小心核对修改,否则前功尽弃 ③特殊情况 <1> ns-allinone-2.34/ns-2.34/common/packet.h中大约185行,根据其他变量的格式将代码更改为 #ifdef MIT_uAMPS static const packet_t PT_RCA = 61; #endif 并将最后一个枚举值改为62 这个过程可以随情况改变,还要注意的是packet.h文件并不是只改这一部分,前面的修改依然要。 <2> ns-allinone-2.34/ns-2.34/mac/wireless-phy.h,给类WirelessPhy添加public变量,大约105行 #ifdef MIT_uAMPS MobileNode * node_;

LWIP协议栈的分析和设计

---《计算机网络与控制》论文 LWIP协议栈的分析

摘要 近些年来,随着互联网和通讯技术的迅猛发展,除了计算机之外,大量的嵌入式设备也需求接入网络。目前,互联网中使用的通讯协议基本是TCP/IP协议族,可运行于不同的网络上,本文研究的就是嵌入式TCP/IP协议栈LWIP。文章首先分析了LWIP的整体结构和协议栈的实现,再介绍协议栈的内存管理,最后讲解协议栈应用程序接口。 关键词: 嵌入式系统;协议;LWIP;以太网 Abstract With the rapid development of internet and communication technology, Not only computers but also embeded equipments are need to connect networks. At present, the basic communication protocol using in internet is TCP/IP, it can run in different network. This paper analyses the Light-Weight TCP/IP. The process model of a protocol implementation and processing of every layer are described first, and then gives the detailed management of Buffer and memory. At last, a reference lwIP API is given. Key words: Embedded System, Protocol, Light weight TCP/IP,Ethernet 引言

LEACH协议的算法结构及最新研究进展

LEACH协议的算法结构及最新研究进展 1 LEACH协议算法结构 LEACH这个协议的解释是:低功耗自适应集簇分层型协议。通过名字,我们就能想到这个协议的大概作用了。那么在这之中,我们先来研究一下它的算法。 该算法基本思想是:以循环的方式随机选择蔟首节点,将整个网络的能量负载平均分配到每个传感器节点中,从而达到降低网络能源消耗、提高网络整体生存时间的目的。仿真表明,与一般的平面多跳路由协议和静态分层算法相比,LEACH协议可以将网络生命周期延长15%。LEACH在运行过程中不断的循环执行蔟的重构过程,每个蔟重构过程可以用回合的概念来描述。每个回合可以分成两个阶段:蔟的建立阶段和传输数据的稳定阶段。为了节省资源开销,稳定阶段的持续时间要大于建立阶段的持续时间。蔟的建立过程可分成4个阶段:蔟首节点的选择、蔟首节点的广播、蔟首节点的建立和调度机制的生成。 蔟首节点的选择依据网络中所需要的蔟首节点总数和迄今为止每个节点已成为蔟首节点的次数来决定。具体的选择办法是:每个传感器节点随机选择0-1之间的一个值。如果选定的值小于某一个阀值,那么这个节点成为蔟首节点。 选定蔟首节点后,通过广播告知整个网络。网络中的其他节点根据接收信息的信号强度决定从属的蔟,并通知相应的蔟首节点,完成蔟的建立。最后,蔟首节点采用TDMA方式为蔟中每个节点分配向其传递数据的时间点。 稳定阶段中,传感器节点将采集的数据传送到蔟首节点。蔟首节点对蔟中所有节点所采集的数据进行信息融合后再传送给汇聚节点,这是一种叫少通信业务量的合理工作模型。稳定阶段持续一段时间后,网络重新进入蔟的建立阶段,进行下一回合的蔟重构,不断循环,每个蔟采用不同的CDMA代码进行通信来减少其他蔟内节点的干扰。 LEACH协议主要分为两个阶段:即簇建立阶段(setup phase)和稳定运行阶段(ready phase)。簇建立阶段和稳定运行阶段所持续的时间总和为一轮(round)。为减少协议开销,稳定运行阶段的持续时间要长于簇建立阶段。 在簇建立阶段,传感器节点随机生成一个0,1之间的随机数,并且与阈值T(n)做比较,如果小于该阈值,则该节点就会当选为簇头。在稳定阶段,传感器节点将采集的数据传送到簇首节点。簇首节点对采集的数据进行数据融合后再将信息传送给汇聚中心,汇聚中心将数据传送给监控中心来进行数据的处理。稳定阶段持续一段时间后,网络重新进行簇的建立阶段,进行下一轮的簇重建,不断循环。 2 LEACH协议的特点 1 为了减少传送到汇聚节点的信息数量,蔟首节点负责融合来自蔟内不同源节点所产生的数据,并将融合后的数据发送到汇聚点。 2 LEACH采用基于TDMA/CDMA的MAC层机制来减少蔟内和蔟间的冲突。 3 由于数据采集是集中的和周期性的,因此该协议非常适合于要求连续监控的应用系统。 4 对于终端使用者来说,由于它并不需要立即得到所有的数据,因此协议不需要周期性的传输数据,这样可以达到限制传感器节点能量消耗的目的。 5 在给定的时间间隔后,协议重新选举蔟首节点,以保证无线传感器网络获取同意的能量分布。

WSN中LEACH协议源码分析报告

WSN中LEACH协议源码分析 分析(一) 首先对wireless.tcl进行分析,先对默认的脚本选项进行初始化: set opt(chan)Channel/\VirelessChannel set opt(prop) Propagatioii/TwoRayGround set opt(netif)PhyAVirelessPhy set opt(mac) Mac/802_l 1 set opt(ifq) Qucuc/DropTail/PriQueue set opt(ll) LL set opt(ant) Antenna/OmniAntenna set opt(x) 0 。# X dimension of the topography set opt(y) 0。# Y dimension of the topography set opt(cp),H, set opt(sc) N../mobility/scene/scen-670x670-50-600-20-2u。# scenario file set opt(ifqlen)50o # max packet in if set opt(nn) 51。# number of nodes set opt(secd) 0.0 set opt(stop) 10.0 o # simulation time set opt(tr) out.tr。# trace file set opt(rp) dsdv 。 # routing protocol script set opt(lm) M on H。# log movement 在这个wireless.tcl中设置了一些全局变呈:: # #Initialize Global Variables # set ns_ [new Simulator] set chan [new $opt(chan)] set prop [new $opt(prop)] set topo [newTopography] set tracefd [open Sopt(tr) w] Stopo Ioad_flatgrid $opt(x) $opt(y) Sprop topography Stopo 这些初始化将在后而的使用中用到,该文件最重要的是创建leach 17点:创建方法如下: } elseif { [string compare Sopt(rp) M leach,,]==0} { for {set i 0} {$i < $opt(nn) } {incr i} { leach-create-mobile-node $i } 如果路由协议是leach协议,则在Uamps.tcl中调用leach-create-mobile-node方法创建leach节点。将在第二小节讲如何创建leach节点。 for {set i 0} {$i < $opt(nn) } {incr i} { $ns_ at $opt(stop).000000001 M Snode_($i) reset”。〃完成后,重宜右点的应用

无线传感器网络LEACH协议研究

无线传感器网络LEACH协议的研究 摘要:无线传感器网络因其在军事、经济、民生等方面广阔的应用前景成为21世纪的前沿热点研究领域[1]。在传感器节点能量有限的情况下,提高路由效率,延长网络寿命成为无线传感器网络需考虑的问题。由于采取分簇,数据融合的思想,LEACH协议有着较高的路由效率,但在实际应用,尤其是大规模网络中,仍存在负载不均衡等问题。本文主要分析了LEACH协议的基本思想及优缺点,随后针对大规模的网络环境对其分簇算法进行改进。前人提出一种有效的方法计算最优簇首个数,本文推算出适合本文中网络环境的公式并加以应用。本文用NS2进行仿真,仿真后的结果表明,改进后的分簇算法更为有效,延长了网络寿命,增大了网络传送数据量。 关键词:无线传感器网络;路由协议;LEACH;分簇思想 Research on Routing Protocol of LEACH in WSN Shen Y uanyi Dept. of Information and Telecommunication,NUPT ABSTRACT:Nowadays, wireless sensor network has become a hot spot of 21st century because of its wide application on military, economy and human life. On the condition that the energy of a sensor node is limited, how to improve the routing efficiency and expand the network’s lifespan has been an important issue to consider. LEACH maintains quite high routing efficiency for its idea of clustering and data gathering. But in practical, it still has problems such as load unbalance especially in large scale network. The article mainly analyses the basic idea of LEACH, the benefits and drawbacks of it and later introduce an improvement on clustering algorithm according to large scale network. Key words:WSN;routing protocol; LEACH; clustering 1LEACH协议介绍与分析 1.1 LEACH算法思想 算法基本思想[2]是:以循环的方式随机选择簇头节点,将整个网络的能量负载平均分配到每个传感器节点中,从而达到降低网络能源消耗、提高网络整体生存时间的目的。LEACH在运行过程中不断的循环执行簇的重构过程,每个簇重构过程可以用回合的概念来描述[3]。每个回合可以分成两个阶段:簇的建立阶段和传输数据的稳定阶段。 1.2 LEACH算法的分析 LEACH协议的优点[4]有: (1)LEACH 通过减少参与路由计算的节点数目,减少了路由表尺寸。(2)LEACH协议是一种分簇路由协议,降低了非簇首节点的任务复杂度,不必对通信路由进行维护。(3)协议不需要周期性的传输数据。(4)在给定的时间间隔后,协议重新选举簇首节点,以保证无线传感器网络获取同意的能量分布。 由于LEACH算法是建立在一些假设上,所以在实际应用中LEACH协议存在一些问题:(1)在LEACH协议中,簇头的选举是随机产生的,这样的随机性可能会导致簇头

LEACH协议簇头

《单片机原理与接口技术》期中论文 论文题目 LEACH协议簇头 选择算法的改进 姓名 学号 学院电气工程学院 专业班级 2008级通信工程

目录 引言................................. 错误!未定义书签。 1 LEACH协议 .......................... 错误!未定义书签。 LEACH 协议介绍.................... 错误!未定义书签。 LEACH 协议的能量损耗模型.......... 错误!未定义书签。 LEACH 的不足在于:................ 错误!未定义书签。 LEACH 协议的优化.................. 错误!未定义书签。 基本思想....................... 错误!未定义书签。 改进细节........................ 错误!未定义书签。 2 簇头选择算法的改进LEACH-H ........... 错误!未定义书签。 簇头初选........................... 错误!未定义书签。 簇头调整过程....................... 错误!未定义书签。 3仿真结果 ............................ 错误!未定义书签。 4仿真分析 ............................ 错误!未定义书签。 5结束语 .............................. 错误!未定义书签。参考文献 ............................. 错误!未定义书签。

lwip各层协议栈详解

竭诚为您提供优质文档/双击可除lwip各层协议栈详解 篇一:lwip协议栈源码分析 lwip源码分析 -----caoxw 1lwip的结构 lwip(lightweightinternetprotocol)的主要模块包括:配置模块、初始化模块、netif模块、mem(memp)模块、netarp模块、ip模块、udp模块、icmp模块、igmp模块、dhcp模块、tcp模块、snmp模块等。下面主要对我们需要关心的协议处理进行说明和梳理。配置模块: 配置模块通过各种宏定义的方式对系统、子模块进行了配置。比如,通过宏,配置了mem管理模块的参数。该配置模块还通过宏,配置了协议栈所支持的协议簇,通过宏定制的方式,决定了支持那些协议。主要的文件是opt.h。 初始化模块: 初始化模块入口的文件为tcpip.c,其初始化入口函数为: voidtcpip_init(void(*initfunc)(void*),void*arg)

该入口通过调用lwip_init()函数,初始化了所有的子模块,并启动了协议栈管理进程。同时,该函数还带有回调钩子及其参数。可以在需要的地方进行调用。 协议栈数据分发管理进程负责了输入报文的处理、超时处理、api函数以及回调的处理,原型如下: staticvoidtcpip_thread(void*arg) netif模块: netif模块为协议栈与底层驱动的接口模块,其将底层的一个网口设备描述成协议栈的一个接口设备(netinterface)。该模块的主要文件为netif.c。其通过链表的方式描述了系统中的所有网口设备。 netif的数据结构描述了网口的参数,包括ip地址、mac 地址、link状态、网口号、收发函数等等参数。一个网口设备的数据收发主要通过该结构进行。 mem(memp)模块: mem模块同一管理了协议栈使用的内容缓冲区,并管理pbuf结构以及报文的字段处理。主要的文件包括mem.c、memp.c、pbuf.c。 netarp模块: netarp模块是处理arp协议的模块,主要源文件为etharp.c。其主要入口函数为: err_tethernet_input(structpbuf*p,structnetif*netif)

LwIP协议栈源码详解

LwIP协议栈源码详解 ——TCP/IP协议的实现 Created by.. 老衲五木 at.. UESTC Contact me.. for_rest@https://www.doczj.com/doc/4814459498.html, 540535649@https://www.doczj.com/doc/4814459498.html,

前言 最近一个项目用到LwIP,恰好看到网上讨论的人比较多,所以有了写这篇学习笔记的冲动,一是为了打发点发呆的时间,二是为了吹过的那些NB。往往决定做一件事是简单的,而坚持做完这件事却是漫长曲折的,但终究还是写完了,时间开销大概为四个月,内存开销无法估计。。 这篇文章覆盖了LwIP协议大部分的内容,但是并不全面。它主要讲解了LwIP协议最重要也是最常被用到的部分,包括内存管理,底层网络接口管理,ARP层,IP层,TCP层,API 层等,这些部分是LwIP的典型应用中经常涉及到的。而LwIP协议的其他部分,包括UDP,DHCP,DNS,IGMP,SNMP,PPP等不具有使用共性的部分,这篇文档暂时未涉及。 原来文章是发在空间中的,每节每节依次更新,后来又改发为博客,再后来就干脆懒得发了。现在终于搞定,于是将所有文章汇总。绞尽脑汁的想写一段空前绝后,人见人爱的序言,但越写越觉得像是猫儿抓的一样。就这样,PS:由于本人文笔有限,情商又低,下里巴人一枚,所以文中的很多语句可能让您很纠结,您可以通过邮箱与我联系。共同探讨才是进步的关键。 最后,欢迎读者以任何方式使用与转载,但请保留作者相关信息,酱紫!码字。。。世界上最痛苦的事情莫过于此。。。 ——老衲五木

目录 1 移植综述------------------------------------------------------------------------------------------------------4 2 动态内存管理------------------------------------------------------------------------------------------------6 3 数据包pbuf--------------------------------------------------------------------------------------------------9 4 pbuf释放---------------------------------------------------------------------------------------------------13 5 网络接口结构-----------------------------------------------------------------------------------------------16 6 以太网数据接收--------------------------------------------------------------------------------------------20 7 ARP表-----------------------------------------------------------------------------------------------------23 8 ARP表查询-----------------------------------------------------------------------------------------------26 9 ARP层流程-----------------------------------------------------------------------------------------------28 10 IP层输入-------------------------------------------------------------------------------------------------31 11 IP分片重装1--------------------------------------------------------------------------------------------34 12 IP分片重装2--------------------------------------------------------------------------------------------37 13 ICMP处理-----------------------------------------------------------------------------------------------40 14 TCP建立与断开----------------------------------------------------------------------------------------43 15 TCP状态转换-------------------------------------------------------------------------------------------46 16 TCP控制块----------------------------------------------------------------------------------------------49 17 TCP建立流程-------------------------------------------------------------------------------------------53 18 TCP状态机----------------------------------------------------------------------------------------------56 19 TCP输入输出函数1-----------------------------------------------------------------------------------60 20 TCP输入输出函数2-----------------------------------------------------------------------------------63 21 TCP滑动窗口-------------------------------------------------------------------------------------------66 22 TCP超时与重传----------------------------------------------------------------------------------------69 23 TCP慢启动与拥塞避免-------------------------------------------------------------------------------73 24 TCP快速恢复重传和Nagle算法-------------------------------------------------------------------76 25 TCP坚持与保活定时器-------------------------------------------------------------------------------80 26 TCP定时器----------------------------------------------------------------------------------------------84 27 TCP终结与小结----------------------------------------------------------------------------------------88 28 API实现及相关数据结构-----------------------------------------------------------------------------91 29 API消息机制--------------------------------------------------------------------------------------------94 30 API函数及编程实例-----------------------------------------------------------------------------------97

Ubuntu安装ns-2.35及leach协议安装

Ubuntu 13.10下安装ns-2.35及leach协议安装 powered by Hong Sheng , Jiangsu university ,Zhenjiang 583301743@https://www.doczj.com/doc/4814459498.html, Tue Nov 25 , 2013 之所以选择基于linux的操作系统ubuntu来安装ns2,是因为我个人特别讨厌Microsoft 开发的基于windows的cygwin软件,此软件安装的时候不仅有各种错误,UI也不够友好。而,有关ubuntu的安装,大家可以自行baidu或google之。下面只讲解ns-2.35和leach协议的安装过程。 1. Ubuntu 13.10下ns- 2.35安装 step 1:下载ns2.35,https://www.doczj.com/doc/4814459498.html,/s/1h8rj0#dir/path=%2FNS解压,放在home/xx下,xx是你的用户名 step 2:更新源包,终端输入:sudo apt-get update step 3:安装依赖包 sudo apt-get install tcl8.5-dev tk8.5-dev sudo apt-get install build-essential autoconf automake sudo apt-get install perl xgraph libxt-dev libx11-dev libxmu-dev step 4:修改ns-allinone-2.35中ls.h文件的代码 将void eraseAll() { erase(baseMap::begin(), baseMap::end()); } 改为: void eraseAll() { this->erase(baseMap::begin(), baseMap::end()); } step 5:sudo ls /usr/bin/gcc* //查看系统已经安装的gcc版本。Ubuntu 13.10默认安装了gcc-4.8 //和gcc-4.8版本的,如果是其他版本的linux操作系统且没有安装 //高于4.0版本的gcc/g++。则需要手动安装gcc/g++-4.8 sudo apt-get install gcc-4.8 g++-4.8 // 对于Ubuntu 13.10,此项是非必须的 sudo export CC=gcc-4.8 sudo export CXX=g++-4.8 //CC和CXX是全局变量,用来指定make将会用哪个版本的gcc/g++编译器生成 //makefile文件。如果没有这一步,保证你会makefile失败!!!因为,在ns-2.35文件夹//下的makefile.in 中要求配置全局变量。 echo $CC echo $CXX //查看全局变量导入成功了没有,如果成功,则执行 sudo ./install //开始进行安装,大概等5分钟左右。 ....... 出现以下的内容,每个人的/home/xx/不同,我的用户名是nan,所以,显示了以下信息。 Ns-allinone package has been installed successfully. Here are the installation places: tcl8.5.10: /home/nan/ns-allinone-2.35/{bin,include,lib} tk8.5.10: /home/nan/ns-allinone-2.35/{bin,include,lib} otcl: /home/nan/ns-allinone-2.35/otcl-1.14 tclcl: /home/nan/ns-allinone-2.35/tclcl-1.20 ns: /home/nan/ns-allinone-2.35/ns-2.35/ns nam:/home/nan/ns-allinone-2.35/nam-1.15/nam xgraph: /home/nan/ns-allinone-2.35/xgraph-12.2 gt-itm: /home/nan/ns-allinone-2.35/itm, edriver, sgb2alt, sgb2ns, sgb2comns, sgb2hierns

lwip协议栈源码分析

LWIP源码分析 ----- caoxw 1 LWIP的结构 LWIP(Light weight internet protocol)的主要模块包括:配置模块、初始化模块、NetIf 模块、mem(memp)模块、netarp模块、ip模块、udp模块、icmp 模块、igmp模块、dhcp 模块、tcp模块、snmp模块等。下面主要对我们需要关心的协议处理进行说明和梳理。 配置模块: 配置模块通过各种宏定义的方式对系统、子模块进行了配置。比如,通过宏,配置了mem管理模块的参数。该配置模块还通过宏,配置了协议栈所支持的协议簇,通过宏定制的方式,决定了支持那些协议。主要的文件是opt.h。 初始化模块: 初始化模块入口的文件为tcpip.c,其初始化入口函数为: void tcpip_init(void (* initfunc)(void *), void *arg) 该入口通过调用lwip_init()函数,初始化了所有的子模块,并启动了协议栈管理进程。同时,该函数还带有回调钩子及其参数。可以在需要的地方进行调用。 协议栈数据分发管理进程负责了输入报文的处理、超时处理、API函数以及回调的处理,原型如下: static void tcpip_thread(void *arg) NetIf模块: Netif模块为协议栈与底层驱动的接口模块,其将底层的一个网口设备描述成协议栈的一个接口设备(net interface)。该模块的主要文件为netif.c。其通过链表的方式描述了系统中的所有网口设备。 Netif的数据结构描述了网口的参数,包括IP地址、MAC地址、link状态、网口号、收发函数等等参数。一个网口设备的数据收发主要通过该结构进行。 Mem(memp)模块: Mem模块同一管理了协议栈使用的内容缓冲区,并管理pbuf结构以及报文的字段处理。主要的文件包括mem.c、memp.c、pbuf.c。 netarp模块: netarp模块是处理arp协议的模块,主要源文件为etharp.c。其主要入口函数为: err_t ethernet_input(struct pbuf *p, struct netif *netif) 该入口函数通过判断输入报文p的协议类型来决定是按照arp协议进行处理还是将该报文提交到IP协议。如果报文是arp报文,该接口则调用etharp_arp_input,进行arp请求处理。 如果是ip报文,该接口就调用etharp_ip_input进行arp更新,并调用ip_input接口,将报文提交给ip层。 在该模块中,创建了设备的地址映射arp表,并提供地址映射关系查询接口。同时还提供了arp报文的发送接口。如下:

LwIP协议栈开发嵌入式网络的三种方法分析

LwIP协议栈开发嵌入式网络的三种方法分析 摘要轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统中。本文结合μC/OS-II这一实时操作系统,以建立TCP服务器端通信为例,分析三种方法以及之间的关系,着重介绍基于raw API的应用程序设计。最后在ST公司STM32F107微处理器平台上验证,并给出了测试结果。 关键词LwIP协议栈;μC/OS-II;嵌入式网络;STM32F107; 随着嵌入式系统功能的多样化以及网络在各个领域的中的广泛应用,具备网络功能的嵌入式设备拥有更高的使用价值和更强的通用性。然而大部分嵌入式设备使用经济型处理器,受内存和速度限制,资源有限,不需要也不可能完整实现所有的TCP/IP协议,有时只需要满足实际需求就行。LwIP是由瑞典计算机科学研究院开发的轻量型TCP/IP协议栈,其特点是保持了以太网的基本功能,通过优化减少了对存储资源的占用。LwIP是免费、开源的,任何人可以使用,能够在裸机的环境下运行,当然设计的时候也考虑了将来的移植问题,可以很容易移植到多任务操作系统中。本文介绍了以ARM微处理器STM32F107和PHY接口DP83848为平台,构建的嵌入式系统中,采用LwIP和嵌入式操作系统μC/OS-II,使用协议栈提供的三种应用程序接口,实现嵌入式设备的网络通信功能。 1LwIP和μC/OS-II介绍 1.1 LwIP协议栈 LwIP协议是瑞士计算机科学院的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP含义是light weight(轻型)IP协议,在实现时保持了TCP协议的主要功能基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM 就可以运行,这使LwIP协议栈很适合在低端嵌入式系统中使用。 LwIP协议栈的设计才用分层结构的思想,每一个协议都作为一个模块来实现,提供一些与其它协议的接口函数。所有的TCP/IP协议栈都在一个进程当中,这样TCP/IP协议栈就和操作系统内核分开了。而应用程序既可以是单独的进程也可以驻留在TCP/IP进程中,它们之间利用ICP机制进行通讯。如果应用程序是单独的线程可以通过操作系统的邮箱、消息队列等,与协议栈进程通讯。如果应用程序驻留在协议栈进程中,则应用程序可以通过内部回调函数和协议栈进程通讯。 1.2 μC/OS-II实时操作系统 μC/OS-II是一个源码公开、可移植、可固化、可裁剪及占先式的实时多任务操作系统,是专门为嵌入式应用设计的实时操作系统内核,已广泛的应用在各种嵌入式系统中。 μC/OS-II是多任务系统,内核负责管理各个任务,每个任务都有其优先级,μC/OS-II 最多可以管理64个任务,其每个任务都拥有自己独立的堆栈。μC/OS-II提供了非常丰富的系统服务功能,比如信号量、消息邮箱、消息队列、事件标志、内存管理和时间管理等,这些功能可以帮助用户实现非常复杂的应用。 1.3 LwIP协议栈移植到μC/OS-II LwIP协议栈在设计的时候就考虑到了将来的移植问题,因此把所有与硬件、操作系统、编译器有关的部分都全部独立起来,形成了一个操作系统模拟层。操作系统模拟层用进程间的信号量、邮箱机制处理通信问题,而μC/OS-II是一个基于任务调度的嵌入式实时操作系

LEACH协议的MATLAIB仿真代码

Matlab Code for LEACH NodeNums = 100; % the num of node AreaR = 100 ; % the area of simulate NodeTranR=10; % the transit Radius Elec=50 * 10^(-9); % Eamp=100*10^(-12); Bx=50; % The Postion of Baseation By=175; MaxInteral =700; % the leach simulate time Pch=0.05; % the desired percentage of cluster heads InitEn=0.5; % the init energy of all node Tr=30; TDMA=100; Kbit=2000; % the bits of a node transmiting a packet every time BandWitch = 1*10.^(6); % Channel Bandwitch TOS_LOCAL_ADDRESS = 0; for i=1:(MaxInteral) AliveNode(i)=NodeNums; AmountData(i)=0; end sym alldata; alldata=0; LAECH = zeros(1,MaxInteral); LAENO = zeros(1,MaxInteral); for i=1:1:NodeNums EnNode(i)=InitEn; % the init energy of all node StateNode(i)=1; % the State of all node 1: alive 0:dead ClusterHeads(i)=0; % the Set of Cluster Head ,1: cluster head 0 :node Rounds=0; % the round end Threshold=0; % the threshold of node becoming a cluster-head Node.x=AreaR*rand(1,NodeNums); % the position of node Node.y=AreaR*rand(1,NodeNums); Node.c=zeros(1,NodeNums); Node.d=zeros(1,NodeNums); Node.l=zeros(1,NodeNums); Node.csize=zeros(1,NodeNums); Node.initclEn=zeros(1,NodeNums); % for i=1:NodeNums % Node.c(i)=0; % the Cluster head of node

相关主题
文本预览
相关文档 最新文档