PONS - Python Opportunistic Network Simulator
===
A modular DTN simulator in the style of [the ONE](https://github.com/akeranen/the-one).
Features:
- distance- or contact-window-based network simulation
- DTN routing algorithms
- epidemic
- spray & wait
- first contact
- direct delivery
- PRoPHET
- static
- mobility
- random waypoint
- external ONE movement
- external ns2 movement
- contact plan connectivity model
- ION DTN contact plans
- [core contact plan}(https://github.com/gh0st42/ccm/)
- static networkx topology
- optionally: from graphml
- optionally: fluctuating from contact plan
- simulated user applications
- tools
- `netedit` for generating graphml topologies
- `ponsanim` for generating animated gifs and mp4 from graphml topologies with a contact plan or event logs
## Requirements
- simpy >= 4.0
- networkx >= 3.2
- plotting:
- seaborn
- pandas
- matplotlib
- numpy
- tools:
- pillow
- opencv-python
- tkinter
## Example
```python
import random
import json
import pons
import pons.routing
RANDOM_SEED = 42
SIM_TIME = 3600*24
NET_RANGE = 50
NUM_NODES = 10
WORLD_SIZE = (3000, 3000)
# Setup and start the simulation
random.seed(RANDOM_SEED)
moves = pons.generate_randomwaypoint_movement(
SIM_TIME, NUM_NODES, WORLD_SIZE[0], WORLD_SIZE[1], max_pause=60.0)
net = pons.NetworkSettings("NET1", range=NET_RANGE)
epidemic = pons.routing.EpidemicRouter()
nodes = pons.generate_nodes(NUM_NODES, net=[net], router=epidemic)
config = {"movement_logger": False, "peers_logger": False, "event_logger": True}
msggenconfig = {"type": "single", "interval": 30,
"src": (0, NUM_NODES), "dst": (0, NUM_NODES),
"size": 100, "id": "M"}
netsim = pons.NetSim(SIM_TIME, WORLD_SIZE, nodes, moves,
config=config, msggens=[msggenconfig])
netsim.setup()
netsim.run()
# print results
print(json.dumps(netsim.net_stats, indent=4))
print(json.dumps(netsim.routing_stats, indent=4))
```
Run using `python3` or for improved performance use `pypy3`.
## Magic ENV Variables
Some of the simulation core functions can be set during runtime without having to change your simulation code.
- `LOG_FILE` can be set to change the default event log file from `/tmp/events.log` to something else
- `SIM_DURATION` can be used to override the calculated simulation duration
For `netedit` there are also ways to influence its behavior:
- `BG_IMG` can be set to any image and it while be rendered as a background behind the network topology
Raw data
{
"_id": null,
"home_page": null,
"name": "pons-dtn",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "DTN, delay-tolerant networks, discrete-event simulation, disruption-tolerant networks, network simulation, networking, opportunistic networks, simulator",
"author": null,
"author_email": "Lars Baumgaertner <1264131+gh0st42@users.noreply.github.com>",
"download_url": "https://files.pythonhosted.org/packages/a0/72/02ce7d96ee3ceadf39f6df142cefae5de530cedbe043acfd0b2a0e7dd182/pons_dtn-0.1.4.tar.gz",
"platform": null,
"description": "PONS - Python Opportunistic Network Simulator\n===\n\nA modular DTN simulator in the style of [the ONE](https://github.com/akeranen/the-one).\n\nFeatures:\n- distance- or contact-window-based network simulation\n- DTN routing algorithms\n - epidemic\n - spray & wait\n - first contact\n - direct delivery\n - PRoPHET\n - static\n- mobility\n - random waypoint\n - external ONE movement\n - external ns2 movement\n- contact plan connectivity model\n - ION DTN contact plans\n - [core contact plan}(https://github.com/gh0st42/ccm/)\n- static networkx topology\n - optionally: from graphml\n - optionally: fluctuating from contact plan\n- simulated user applications\n- tools\n - `netedit` for generating graphml topologies\n - `ponsanim` for generating animated gifs and mp4 from graphml topologies with a contact plan or event logs\n\n## Requirements\n\n- simpy >= 4.0\n- networkx >= 3.2\n- plotting:\n - seaborn\n - pandas\n - matplotlib\n - numpy\n- tools:\n - pillow\n - opencv-python\n - tkinter\n\n\n## Example\n\n```python\nimport random\nimport json\n\nimport pons\nimport pons.routing\n\nRANDOM_SEED = 42\nSIM_TIME = 3600*24\nNET_RANGE = 50\nNUM_NODES = 10\nWORLD_SIZE = (3000, 3000)\n\n# Setup and start the simulation\nrandom.seed(RANDOM_SEED)\n\nmoves = pons.generate_randomwaypoint_movement(\n SIM_TIME, NUM_NODES, WORLD_SIZE[0], WORLD_SIZE[1], max_pause=60.0)\n\nnet = pons.NetworkSettings(\"NET1\", range=NET_RANGE)\nepidemic = pons.routing.EpidemicRouter()\n\nnodes = pons.generate_nodes(NUM_NODES, net=[net], router=epidemic)\nconfig = {\"movement_logger\": False, \"peers_logger\": False, \"event_logger\": True}\n\nmsggenconfig = {\"type\": \"single\", \"interval\": 30, \n \"src\": (0, NUM_NODES), \"dst\": (0, NUM_NODES), \n \"size\": 100, \"id\": \"M\"}\n\nnetsim = pons.NetSim(SIM_TIME, WORLD_SIZE, nodes, moves,\n config=config, msggens=[msggenconfig])\n\nnetsim.setup()\n\nnetsim.run()\n\n# print results\n\nprint(json.dumps(netsim.net_stats, indent=4))\nprint(json.dumps(netsim.routing_stats, indent=4))\n```\n\nRun using `python3` or for improved performance use `pypy3`.\n\n## Magic ENV Variables\n\nSome of the simulation core functions can be set during runtime without having to change your simulation code.\n\n- `LOG_FILE` can be set to change the default event log file from `/tmp/events.log` to something else\n- `SIM_DURATION` can be used to override the calculated simulation duration\n\nFor `netedit` there are also ways to influence its behavior:\n- `BG_IMG` can be set to any image and it while be rendered as a background behind the network topology\n\n",
"bugtrack_url": null,
"license": null,
"summary": "The Python Opportunistic Network Simulator (PONS) is a discrete-event simulator for opportunistic/DTN networks.",
"version": "0.1.4",
"project_urls": {
"Homepage": "https://github.com/gh0st42/pons",
"Issues": "https://github.com/gh0st42/pons/issues",
"Repository": "https://github.com/gh0st42/pons.git"
},
"split_keywords": [
"dtn",
" delay-tolerant networks",
" discrete-event simulation",
" disruption-tolerant networks",
" network simulation",
" networking",
" opportunistic networks",
" simulator"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "ce26aa87d79f2dfc41782f3b69c4607c6a1b608e32c052c85c0050a1da93a1cb",
"md5": "f946fe8862ae56b03174d0b8b2c9271b",
"sha256": "9899ab92c56cd176196ac738d6695ac2cd88be2e4c5d9413dd9942c832412507"
},
"downloads": -1,
"filename": "pons_dtn-0.1.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f946fe8862ae56b03174d0b8b2c9271b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 65002,
"upload_time": "2024-11-10T21:25:52",
"upload_time_iso_8601": "2024-11-10T21:25:52.664756Z",
"url": "https://files.pythonhosted.org/packages/ce/26/aa87d79f2dfc41782f3b69c4607c6a1b608e32c052c85c0050a1da93a1cb/pons_dtn-0.1.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a07202ce7d96ee3ceadf39f6df142cefae5de530cedbe043acfd0b2a0e7dd182",
"md5": "16d1d4d01c926a5e1a548eadf01227a5",
"sha256": "eb57cc1f28480bb80c58fb74930a1b0b89fadd46bf6d8bf2707fa9d31b4f19aa"
},
"downloads": -1,
"filename": "pons_dtn-0.1.4.tar.gz",
"has_sig": false,
"md5_digest": "16d1d4d01c926a5e1a548eadf01227a5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 1881406,
"upload_time": "2024-11-10T21:25:55",
"upload_time_iso_8601": "2024-11-10T21:25:55.265650Z",
"url": "https://files.pythonhosted.org/packages/a0/72/02ce7d96ee3ceadf39f6df142cefae5de530cedbe043acfd0b2a0e7dd182/pons_dtn-0.1.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-10 21:25:55",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "gh0st42",
"github_project": "pons",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "pons-dtn"
}