Source code for simulator.generators.DtnConstantBitRateGenerator
import numpy as np
from simulator.core.DtnBundle import Bundle
from simulator.generators.DtnAbstractGenerator import DtnAbstractGenerator
[docs]class DtnConstantBitRateGenerator(DtnAbstractGenerator):
def initialize(self):
# Get generator properties
self.datarate = self.props.rate
self.duration = self.props.until
self.tstart = self.props.tstart
# Get bundle properties
self.data_type = self.props.data_type
self.bundle_sz = self.props.bundle_size
self.bundle_lat = self.props.bundle_TTL
self.critical = self.props.critical
# Get origin and destination
self.orig = self.parent.nid
self.dest = self.props.destination
# Get the flow id for this generator
self.assign_fid()
# Run generator
self.env.process(self.run())
def run(self):
# How often a bundle should be released
dt = self.bundle_sz / self.datarate
# Wait until it is time to start this flow
yield self.env.timeout(self.tstart)
while self.is_alive:
# Create a new bundle and record it
new_bundle = Bundle(self.env, self.orig, next(self.destination()),
self.data_type, self.bundle_sz, self.bundle_lat,
self.critical, fid=self.fid, TTL=self.bundle_lat)
# Monitor the new bundle creation
self.monitor_new_bundle(new_bundle)
# Log the new bundle creation
self.disp('{} is created at node {}', new_bundle, self.parent.nid)
# Schedule routers of bundle
self.parent.forward(new_bundle)
# Wait until next time to transmit
yield self.env.timeout(dt)
# If you exceed this generator's duration, exit
if self.t >= self.tstart+self.duration: break
[docs] def predicted_data_vol(self):
return self.datarate*self.duration
def destination(self):
# Get list of possible destination nodes
nodes = list(self.env.nodes.keys())
while self.is_alive:
if self.dest:
yield self.dest
else:
yield nodes[np.random.randint(0, len(nodes))]