dapps 0.0.2__tar.gz → 0.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dapps-0.0.2 → dapps-0.0.3}/.github/workflows/tag-and-release.yml +10 -9
- dapps-0.0.3/PKG-INFO +109 -0
- dapps-0.0.3/README.md +65 -0
- dapps-0.0.3/VERSION +1 -0
- {dapps-0.0.2 → dapps-0.0.3}/examples/spectrum_dapp.py +34 -6
- dapps-0.0.3/pyproject.toml +66 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/visualization/templates/index.html +13 -6
- dapps-0.0.2/PKG-INFO +0 -83
- dapps-0.0.2/README.md +0 -42
- dapps-0.0.2/VERSION +0 -1
- dapps-0.0.2/pyproject.toml +0 -58
- {dapps-0.0.2 → dapps-0.0.3}/.github/workflows/mirror.yml +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/.gitignore +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/LICENSE +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/MANIFEST.in +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/docker/Dockerfile +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/docker/build.sh +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/docs/dapp_uml.txt +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/docs/gui_uml.txt +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/e3protocol/README.md +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/e3protocol/build_asn.sh +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/e3protocol/client/client.c +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/e3protocol/dump_packets.sh +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/e3protocol/server/server.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/e3protocol/wrapper/e3.c +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/e3protocol/wrapper/e3.h +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/dapp/__init__.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/dapp/dapp.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/e3interface/__init__.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/e3interface/defs/e3.asn +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/e3interface/e3_connector.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/e3interface/e3_interface.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/e3interface/e3_logging.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/spectrum/__init__.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/spectrum/spectrum_dapp.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/visualization/__init__.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/visualization/dashboard.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/visualization/energy.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/visualization/grafana.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/visualization/influx.py +0 -0
- {dapps-0.0.2 → dapps-0.0.3}/src/visualization/iq.py +0 -0
|
@@ -9,7 +9,7 @@ jobs:
|
|
|
9
9
|
create-tag:
|
|
10
10
|
runs-on: ubuntu-latest
|
|
11
11
|
outputs:
|
|
12
|
-
version: ${{ steps.
|
|
12
|
+
version: ${{ steps.get_version.outputs.version }}
|
|
13
13
|
tag_created: ${{ steps.set_output.outputs.tag_created }}
|
|
14
14
|
steps:
|
|
15
15
|
- name: Checkout repository
|
|
@@ -48,11 +48,6 @@ jobs:
|
|
|
48
48
|
echo "tag_created=false" >> $GITHUB_OUTPUT
|
|
49
49
|
fi
|
|
50
50
|
|
|
51
|
-
- name: Set version output
|
|
52
|
-
id: set_version
|
|
53
|
-
run: |
|
|
54
|
-
echo "version=${{ steps.get_version.outputs.version }}" >> $GITHUB_OUTPUT
|
|
55
|
-
|
|
56
51
|
build:
|
|
57
52
|
name: Build distribution 📦
|
|
58
53
|
runs-on: ubuntu-latest
|
|
@@ -78,7 +73,9 @@ jobs:
|
|
|
78
73
|
|
|
79
74
|
publish-to-pypi:
|
|
80
75
|
name: Publish to PyPI
|
|
81
|
-
needs:
|
|
76
|
+
needs:
|
|
77
|
+
- build
|
|
78
|
+
- create-tag
|
|
82
79
|
runs-on: ubuntu-latest
|
|
83
80
|
if: ${{ needs.create-tag.outputs.tag_created == 'true' && github.repository == 'wineslab/dApp-library' }}
|
|
84
81
|
environment:
|
|
@@ -97,7 +94,9 @@ jobs:
|
|
|
97
94
|
|
|
98
95
|
github-release:
|
|
99
96
|
name: Sign packages with Sigstore and upload them to GitHub Release
|
|
100
|
-
needs:
|
|
97
|
+
needs:
|
|
98
|
+
- publish-to-pypi
|
|
99
|
+
- create-tag
|
|
101
100
|
runs-on: ubuntu-latest
|
|
102
101
|
if: ${{ needs.create-tag.outputs.tag_created == 'true' && github.repository == 'wineslab/dApp-library' }}
|
|
103
102
|
permissions:
|
|
@@ -126,7 +125,9 @@ jobs:
|
|
|
126
125
|
|
|
127
126
|
publish-to-testpypi:
|
|
128
127
|
name: Publish to TestPyPI
|
|
129
|
-
needs:
|
|
128
|
+
needs:
|
|
129
|
+
- publish-to-pypi
|
|
130
|
+
- create-tag
|
|
130
131
|
runs-on: ubuntu-latest
|
|
131
132
|
if: ${{ needs.create-tag.outputs.tag_created == 'true' && github.repository == 'wineslab/dApp-library' }}
|
|
132
133
|
environment:
|
dapps-0.0.3/PKG-INFO
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dapps
|
|
3
|
+
Version: 0.0.3
|
|
4
|
+
Summary: A library for creating and connecting dApps to Open RAN units.
|
|
5
|
+
Project-URL: Homepage, https://openrangym.com/o-ran-frameworks/dapps
|
|
6
|
+
Project-URL: Package, https://pypi.org/project/dapps/
|
|
7
|
+
Project-URL: Source, https://github.com/wineslab/dApp-library
|
|
8
|
+
Project-URL: Bug Tracker, https://github.com/wineslab/dApp-library/issues
|
|
9
|
+
Author-email: Andrea Lacava <thecave003@gmail.com>
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: 5G,O-RAN,cellular,dApps,networks
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Programming Language :: Python
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
20
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
21
|
+
Requires-Python: >=3.8
|
|
22
|
+
Requires-Dist: asn1tools
|
|
23
|
+
Requires-Dist: numpy
|
|
24
|
+
Requires-Dist: pyzmq
|
|
25
|
+
Requires-Dist: typing-extensions
|
|
26
|
+
Provides-Extra: all
|
|
27
|
+
Requires-Dist: flask; extra == 'all'
|
|
28
|
+
Requires-Dist: flask-socketio; extra == 'all'
|
|
29
|
+
Requires-Dist: influxdb-client; extra == 'all'
|
|
30
|
+
Requires-Dist: libiq; extra == 'all'
|
|
31
|
+
Requires-Dist: matplotlib; extra == 'all'
|
|
32
|
+
Requires-Dist: pysctp; extra == 'all'
|
|
33
|
+
Provides-Extra: api
|
|
34
|
+
Requires-Dist: influxdb-client; extra == 'api'
|
|
35
|
+
Provides-Extra: cnn
|
|
36
|
+
Requires-Dist: libiq; extra == 'cnn'
|
|
37
|
+
Provides-Extra: gui
|
|
38
|
+
Requires-Dist: flask; extra == 'gui'
|
|
39
|
+
Requires-Dist: flask-socketio; extra == 'gui'
|
|
40
|
+
Requires-Dist: matplotlib; extra == 'gui'
|
|
41
|
+
Provides-Extra: network
|
|
42
|
+
Requires-Dist: pysctp; extra == 'network'
|
|
43
|
+
Description-Content-Type: text/markdown
|
|
44
|
+
|
|
45
|
+
# dApp Library
|
|
46
|
+
|
|
47
|
+
A complete tutorial on how to deploy a dApp can be found on the [OpenRAN Gym website](https://openrangym.com/tutorials/dapps-oai). Please refer to that guide to instrument your system.
|
|
48
|
+
|
|
49
|
+
## Installation
|
|
50
|
+
|
|
51
|
+
### Python package installation
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
pip3 install dapps[all]
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Manual installation
|
|
58
|
+
Clone the repository and install it manually
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
hatch build
|
|
62
|
+
pip3 install dist/*.tar.gz
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Launch the Spectrum Sharing dApp
|
|
66
|
+
|
|
67
|
+
OAI should start _before_ running the dApp
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
python3 examples/spectrum_dapp.py
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
This dApp implements a spectrum sharing use case discussed in [our paper](https://arxiv.org/pdf/2501.16502).
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
The dApp can be controlled through the following command-line arguments:
|
|
77
|
+
|
|
78
|
+
- `--ota` (store_true, default: False): Specify if this is OTA or on Colosseum
|
|
79
|
+
- `--link` (str, default: 'zmq', choices: [layer.value for layer in E3LinkLayer]): Specify the link layer to be used
|
|
80
|
+
- `--transport` (str, default: 'ipc', choices: [layer.value for layer in E3TransportLayer]): Specify the transport layer to be used
|
|
81
|
+
- `--save-iqs` (store_true, default: False): Specify if this is data collection run or not. In the first case I/Q samples will be saved
|
|
82
|
+
- `--control` (store_true, default: False): Set whether to perform control of PRB
|
|
83
|
+
- `--energy-gui` (store_true, default: False): Set whether to enable the energy GUI
|
|
84
|
+
- `--iq-plotter-gui` (store_true, default: False): Set whether to enable the IQ Plotter GUI
|
|
85
|
+
- `--demo-gui` (store_true, default: False): Set whether to enable the Demo GUI
|
|
86
|
+
- `--timed` (store_true, default: False): Run with a 5-minute time limit
|
|
87
|
+
- `--model` (str, default: ''): Path to the CNN model file to be used
|
|
88
|
+
- `--time-window` (int, default: 5): Number of input vectors to pass to the CNN model
|
|
89
|
+
- `--input-vector` (int, default: 1536): Number of I/Q samples per input vector
|
|
90
|
+
- `--moving-avg-window` (int, default: 30): Window size (in samples) for the moving average used to detect energy peaks in the spectrum
|
|
91
|
+
- `--extraction-window` (int, default: 600): Number of samples to retain after detecting an energy peak
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
If you use the dApp concept and/or the framework to develop your own dApps, please cite the following paper:
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
@article{LACAVA2025111342,
|
|
98
|
+
title = {{dApps: Enabling Real-Time AI-based Open RAN Control}},
|
|
99
|
+
journal = {Computer Networks},
|
|
100
|
+
pages = {111342},
|
|
101
|
+
year = {2025},
|
|
102
|
+
issn = {1389-1286},
|
|
103
|
+
doi = {https://doi.org/10.1016/j.comnet.2025.111342},
|
|
104
|
+
url = {https://www.sciencedirect.com/science/article/pii/S1389128625003093},
|
|
105
|
+
author = {Andrea Lacava and Leonardo Bonati and Niloofar Mohamadi and Rajeev Gangula and Florian Kaltenberger and Pedram Johari and Salvatore D’Oro and Francesca Cuomo and Michele Polese and Tommaso Melodia},
|
|
106
|
+
keywords = {Open RAN, dApps, Real-time control loops, Radio Resource Management (RRM), Spectrum sharing, Positioning, Integrated Sensing and Communication (ISAC)},
|
|
107
|
+
abstract = {Open Radio Access Networks (RANs) leverage disaggregated and programmable RAN functions and open interfaces to enable closed-loop, data-driven radio resource management. This is performed through custom intelligent applications on the RAN Intelligent Controllers (RICs), optimizing RAN policy scheduling, network slicing, user session management, and medium access control, among others. In this context, we have proposed dApps as a key extension of the O-RAN architecture into the real-time and user-plane domains. Deployed directly on RAN nodes, dApps access data otherwise unavailable to RICs due to privacy or timing constraints, enabling the execution of control actions within shorter time intervals. In this paper, we propose for the first time a reference architecture for dApps, defining their life cycle from deployment by the Service Management and Orchestration (SMO) to real-time control loop interactions with the RAN nodes where they are hosted. We introduce a new dApp interface, E3, along with an Application Protocol (AP) that supports structured message exchanges and extensible communication for various service models. By bridging E3 with the existing O-RAN E2 interface, we enable dApps, xApps, and rApps to coexist and coordinate. These applications can then collaborate on complex use cases and employ hierarchical control to resolve shared resource conflicts. Finally, we present and open-source a dApp framework based on OpenAirInterface (OAI). We benchmark its performance in two real-time control use cases, i.e., spectrum sharing and positioning in a 5th generation (5G) Next Generation Node Base (gNB) scenario. Our experimental results show that standardized real-time control loops via dApps are feasible, achieving average control latency below 450microseconds and allowing optimal use of shared spectral resources.}
|
|
108
|
+
}
|
|
109
|
+
```
|
dapps-0.0.3/README.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# dApp Library
|
|
2
|
+
|
|
3
|
+
A complete tutorial on how to deploy a dApp can be found on the [OpenRAN Gym website](https://openrangym.com/tutorials/dapps-oai). Please refer to that guide to instrument your system.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
### Python package installation
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
pip3 install dapps[all]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Manual installation
|
|
14
|
+
Clone the repository and install it manually
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
hatch build
|
|
18
|
+
pip3 install dist/*.tar.gz
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Launch the Spectrum Sharing dApp
|
|
22
|
+
|
|
23
|
+
OAI should start _before_ running the dApp
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
python3 examples/spectrum_dapp.py
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
This dApp implements a spectrum sharing use case discussed in [our paper](https://arxiv.org/pdf/2501.16502).
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
The dApp can be controlled through the following command-line arguments:
|
|
33
|
+
|
|
34
|
+
- `--ota` (store_true, default: False): Specify if this is OTA or on Colosseum
|
|
35
|
+
- `--link` (str, default: 'zmq', choices: [layer.value for layer in E3LinkLayer]): Specify the link layer to be used
|
|
36
|
+
- `--transport` (str, default: 'ipc', choices: [layer.value for layer in E3TransportLayer]): Specify the transport layer to be used
|
|
37
|
+
- `--save-iqs` (store_true, default: False): Specify if this is data collection run or not. In the first case I/Q samples will be saved
|
|
38
|
+
- `--control` (store_true, default: False): Set whether to perform control of PRB
|
|
39
|
+
- `--energy-gui` (store_true, default: False): Set whether to enable the energy GUI
|
|
40
|
+
- `--iq-plotter-gui` (store_true, default: False): Set whether to enable the IQ Plotter GUI
|
|
41
|
+
- `--demo-gui` (store_true, default: False): Set whether to enable the Demo GUI
|
|
42
|
+
- `--timed` (store_true, default: False): Run with a 5-minute time limit
|
|
43
|
+
- `--model` (str, default: ''): Path to the CNN model file to be used
|
|
44
|
+
- `--time-window` (int, default: 5): Number of input vectors to pass to the CNN model
|
|
45
|
+
- `--input-vector` (int, default: 1536): Number of I/Q samples per input vector
|
|
46
|
+
- `--moving-avg-window` (int, default: 30): Window size (in samples) for the moving average used to detect energy peaks in the spectrum
|
|
47
|
+
- `--extraction-window` (int, default: 600): Number of samples to retain after detecting an energy peak
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
If you use the dApp concept and/or the framework to develop your own dApps, please cite the following paper:
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
@article{LACAVA2025111342,
|
|
54
|
+
title = {{dApps: Enabling Real-Time AI-based Open RAN Control}},
|
|
55
|
+
journal = {Computer Networks},
|
|
56
|
+
pages = {111342},
|
|
57
|
+
year = {2025},
|
|
58
|
+
issn = {1389-1286},
|
|
59
|
+
doi = {https://doi.org/10.1016/j.comnet.2025.111342},
|
|
60
|
+
url = {https://www.sciencedirect.com/science/article/pii/S1389128625003093},
|
|
61
|
+
author = {Andrea Lacava and Leonardo Bonati and Niloofar Mohamadi and Rajeev Gangula and Florian Kaltenberger and Pedram Johari and Salvatore D’Oro and Francesca Cuomo and Michele Polese and Tommaso Melodia},
|
|
62
|
+
keywords = {Open RAN, dApps, Real-time control loops, Radio Resource Management (RRM), Spectrum sharing, Positioning, Integrated Sensing and Communication (ISAC)},
|
|
63
|
+
abstract = {Open Radio Access Networks (RANs) leverage disaggregated and programmable RAN functions and open interfaces to enable closed-loop, data-driven radio resource management. This is performed through custom intelligent applications on the RAN Intelligent Controllers (RICs), optimizing RAN policy scheduling, network slicing, user session management, and medium access control, among others. In this context, we have proposed dApps as a key extension of the O-RAN architecture into the real-time and user-plane domains. Deployed directly on RAN nodes, dApps access data otherwise unavailable to RICs due to privacy or timing constraints, enabling the execution of control actions within shorter time intervals. In this paper, we propose for the first time a reference architecture for dApps, defining their life cycle from deployment by the Service Management and Orchestration (SMO) to real-time control loop interactions with the RAN nodes where they are hosted. We introduce a new dApp interface, E3, along with an Application Protocol (AP) that supports structured message exchanges and extensible communication for various service models. By bridging E3 with the existing O-RAN E2 interface, we enable dApps, xApps, and rApps to coexist and coordinate. These applications can then collaborate on complex use cases and employ hierarchical control to resolve shared resource conflicts. Finally, we present and open-source a dApp framework based on OpenAirInterface (OAI). We benchmark its performance in two real-time control use cases, i.e., spectrum sharing and positioning in a 5th generation (5G) Next Generation Node Base (gNB) scenario. Our experimental results show that standardized real-time control loops via dApps are feasible, achieving average control latency below 450microseconds and allowing optimal use of shared spectral resources.}
|
|
64
|
+
}
|
|
65
|
+
```
|
dapps-0.0.3/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.0.3
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
|
|
3
|
+
Example script to showcase the Spectrum Sharing dApp
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
import argparse
|
|
@@ -24,6 +24,19 @@ def main(args, time_to_wait: float = 60.0):
|
|
|
24
24
|
# with open(f"{LOG_DIR}/busy.txt", "w") as f:
|
|
25
25
|
# f.close()
|
|
26
26
|
|
|
27
|
+
if args.model:
|
|
28
|
+
try:
|
|
29
|
+
from libiq.classifier.cnn import Classifier
|
|
30
|
+
except ModuleNotFoundError:
|
|
31
|
+
print(
|
|
32
|
+
"Optional dependencies to run this example are not installed.\n"
|
|
33
|
+
"Fix this by running:\n\n"
|
|
34
|
+
" pip install libiq # OR\n"
|
|
35
|
+
" pip install dapps[cnn] (minimal) # OR\n"
|
|
36
|
+
" pip install dapps[all] (preferred)\n"
|
|
37
|
+
)
|
|
38
|
+
exit(-1)
|
|
39
|
+
|
|
27
40
|
if args.ota:
|
|
28
41
|
print(f'Using OTA configuration')
|
|
29
42
|
noise_floor_threshold = 20 # this really depends on the RF conditions and should be carefully calibrated
|
|
@@ -32,9 +45,20 @@ def main(args, time_to_wait: float = 60.0):
|
|
|
32
45
|
noise_floor_threshold = 53
|
|
33
46
|
|
|
34
47
|
print(f'Threshold {noise_floor_threshold}')
|
|
35
|
-
|
|
48
|
+
|
|
49
|
+
classifier = None
|
|
50
|
+
if args.model:
|
|
51
|
+
classifier = Classifier(
|
|
52
|
+
time_window = args.time_window,
|
|
53
|
+
input_vector = args.input_vector,
|
|
54
|
+
moving_avg_window = args.moving_avg_window,
|
|
55
|
+
extraction_window = args.extraction_window,
|
|
56
|
+
model_path = args.model
|
|
57
|
+
)
|
|
58
|
+
|
|
36
59
|
dapp = SpectrumSharingDApp(noise_floor_threshold=noise_floor_threshold, save_iqs=args.save_iqs, control=args.control, link=args.link, transport=args.transport,
|
|
37
|
-
energyGui=args.energy_gui, iqPlotterGui=args.iq_plotter_gui, dashboard=args.demo_gui)
|
|
60
|
+
energyGui=args.energy_gui, iqPlotterGui=args.iq_plotter_gui, dashboard=args.demo_gui, classifier=classifier)
|
|
61
|
+
|
|
38
62
|
dapp.setup_connection()
|
|
39
63
|
|
|
40
64
|
if args.timed:
|
|
@@ -51,19 +75,23 @@ def main(args, time_to_wait: float = 60.0):
|
|
|
51
75
|
|
|
52
76
|
|
|
53
77
|
if __name__ == "__main__":
|
|
54
|
-
parser = argparse.ArgumentParser(description="dApp
|
|
78
|
+
parser = argparse.ArgumentParser(description="Example of a dApp for Spectrum Sharing")
|
|
55
79
|
parser.add_argument('--ota', action='store_true', default=False, help="Specify if this is OTA or on Colosseum")
|
|
56
80
|
parser.add_argument('--link', type=str, default='zmq', choices=[layer.value for layer in E3LinkLayer], help="Specify the link layer to be used")
|
|
57
|
-
parser.add_argument('--transport', type=str,
|
|
81
|
+
parser.add_argument('--transport', type=str, default='ipc', choices=[layer.value for layer in E3TransportLayer], help="Specify the transport layer to be used")
|
|
58
82
|
parser.add_argument('--save-iqs', action='store_true', default=False, help="Specify if this is data collection run or not. In the first case I/Q samples will be saved")
|
|
59
83
|
parser.add_argument('--control', action='store_true', default=False, help="Set whether to perform control of PRB")
|
|
60
84
|
parser.add_argument('--energy-gui', action='store_true', default=False, help="Set whether to enable the energy GUI")
|
|
61
85
|
parser.add_argument('--iq-plotter-gui', action='store_true', default=False, help="Set whether to enable the IQ Plotter GUI")
|
|
62
86
|
parser.add_argument('--demo-gui', action='store_true', default=False, help="Set whether to enable the Demo GUI")
|
|
63
87
|
parser.add_argument('--timed', action='store_true', default=False, help="Run with a 5-minute time limit")
|
|
88
|
+
parser.add_argument('--model', type=str, default='', help="Path to the CNN model file to be used")
|
|
89
|
+
parser.add_argument('--time-window', type=int, default=5, help="Number of input vectors to pass to the CNN model.")
|
|
90
|
+
parser.add_argument('--input-vector', type=int, default=1536, help="Number of I/Q samples per input vector.")
|
|
91
|
+
parser.add_argument('--moving-avg-window', type=int, default=30, help="Window size (in samples) for the moving average used to detect energy peaks in the spectrum.")
|
|
92
|
+
parser.add_argument('--extraction-window', type=int, default=600, help="Number of samples to retain after detecting an energy peak.")
|
|
64
93
|
|
|
65
94
|
args = parser.parse_args()
|
|
66
|
-
|
|
67
95
|
print("Start dApp")
|
|
68
96
|
|
|
69
97
|
main(args)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = [ "hatchling" ]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
[project]
|
|
7
|
+
name = "dapps"
|
|
8
|
+
dynamic = [ "version" ]
|
|
9
|
+
description = "A library for creating and connecting dApps to Open RAN units."
|
|
10
|
+
readme = "README.md"
|
|
11
|
+
requires-python = ">=3.8"
|
|
12
|
+
keywords = [ "dApps", "O-RAN", "5G", "cellular", "networks" ]
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Development Status :: 4 - Beta",
|
|
15
|
+
"Programming Language :: Python",
|
|
16
|
+
"Programming Language :: Python :: 3.8",
|
|
17
|
+
"Programming Language :: Python :: 3.9",
|
|
18
|
+
"Programming Language :: Python :: 3.10",
|
|
19
|
+
"Programming Language :: Python :: 3.11",
|
|
20
|
+
"Programming Language :: Python :: 3.12",
|
|
21
|
+
"Programming Language :: Python :: Implementation :: CPython",
|
|
22
|
+
"Programming Language :: Python :: Implementation :: PyPy"
|
|
23
|
+
]
|
|
24
|
+
dependencies = [ "asn1tools", "typing_extensions", "numpy", "pyzmq" ]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
[[project.authors]]
|
|
28
|
+
name = "Andrea Lacava"
|
|
29
|
+
email = "thecave003@gmail.com"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
[project.urls]
|
|
33
|
+
Homepage = "https://openrangym.com/o-ran-frameworks/dapps"
|
|
34
|
+
Package = "https://pypi.org/project/dapps/"
|
|
35
|
+
Source = "https://github.com/wineslab/dApp-library"
|
|
36
|
+
"Bug Tracker" = "https://github.com/wineslab/dApp-library/issues"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
[project.optional-dependencies]
|
|
40
|
+
api = [ "influxdb_client" ]
|
|
41
|
+
cnn = [ "libiq" ]
|
|
42
|
+
gui = [ "flask", "flask-socketio", "matplotlib" ]
|
|
43
|
+
network = [ "pysctp" ]
|
|
44
|
+
all = [
|
|
45
|
+
"pysctp",
|
|
46
|
+
"flask",
|
|
47
|
+
"flask-socketio",
|
|
48
|
+
"matplotlib",
|
|
49
|
+
"influxdb_client",
|
|
50
|
+
"libiq"
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
[tool.hatch.version]
|
|
55
|
+
path = "VERSION"
|
|
56
|
+
pattern = "(?P<version>\\d+\\.\\d+\\.\\d+)"
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
[tool.hatch.build.targets.wheel]
|
|
60
|
+
packages = [
|
|
61
|
+
"src/dapp",
|
|
62
|
+
"src/e3interface",
|
|
63
|
+
"src/spectrum",
|
|
64
|
+
"src/visualization"
|
|
65
|
+
]
|
|
66
|
+
sources = [ "src" ]
|
|
@@ -17,13 +17,20 @@
|
|
|
17
17
|
var waterfall = [{
|
|
18
18
|
z: [],
|
|
19
19
|
type: 'heatmap',
|
|
20
|
-
colorscale: "Viridis"
|
|
20
|
+
colorscale: "Viridis",
|
|
21
|
+
colorbar: {
|
|
22
|
+
title:{
|
|
23
|
+
text: "Magnitude [dB]",
|
|
24
|
+
side: 'right'
|
|
25
|
+
},
|
|
26
|
+
orientation: 'h'
|
|
27
|
+
}
|
|
21
28
|
}];
|
|
22
29
|
|
|
23
30
|
var waterfallLayout = {
|
|
24
|
-
title: "
|
|
31
|
+
title: "Sensed Spectrum",
|
|
25
32
|
xaxis: {
|
|
26
|
-
title: "
|
|
33
|
+
title: "OFDM Symbol Subcarriers"
|
|
27
34
|
},
|
|
28
35
|
yaxis: {
|
|
29
36
|
title: "Time samples",
|
|
@@ -155,7 +162,7 @@
|
|
|
155
162
|
|
|
156
163
|
var classifierLayout = {
|
|
157
164
|
title: {
|
|
158
|
-
text: "Predicted
|
|
165
|
+
text: "RFI Predicted: N/A",
|
|
159
166
|
font: { size: 24 }
|
|
160
167
|
},
|
|
161
168
|
xaxis: { visible: false },
|
|
@@ -199,9 +206,9 @@
|
|
|
199
206
|
data.prb_list.forEach(index => prbs_buffer[0][index] = 1);
|
|
200
207
|
Plotly.restyle('prbs', { z: [prbs_buffer] });
|
|
201
208
|
} else if ('predicted_label' in data) {
|
|
202
|
-
console.log("Predicted
|
|
209
|
+
console.log("RFI Predicted is ", data.predicted_label);
|
|
203
210
|
Plotly.relayout('predicted_label', {
|
|
204
|
-
'title.text': `Predicted
|
|
211
|
+
'title.text': `RFI Predicted: ${data.predicted_label}`
|
|
205
212
|
});
|
|
206
213
|
} else {
|
|
207
214
|
console.error('Error unknown values in data ', data);
|
dapps-0.0.2/PKG-INFO
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: dapps
|
|
3
|
-
Version: 0.0.2
|
|
4
|
-
Summary: A library for creating and connecting dApps to Open RAN units.
|
|
5
|
-
Project-URL: Homepage, https://openrangym.com/ran-frameworks/dapps
|
|
6
|
-
Project-URL: Package, https://pypi.org/project/dapps/
|
|
7
|
-
Project-URL: Source, https://github.com/wineslab/dApp-library
|
|
8
|
-
Project-URL: Bug Tracker, https://github.com/wineslab/dApp-library/issues
|
|
9
|
-
Author-email: Andrea Lacava <thecave003@gmail.com>
|
|
10
|
-
License-File: LICENSE
|
|
11
|
-
Keywords: 5g,dApps,o-ran
|
|
12
|
-
Classifier: Development Status :: 4 - Beta
|
|
13
|
-
Classifier: Programming Language :: Python
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
-
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
20
|
-
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
21
|
-
Requires-Python: >=3.8
|
|
22
|
-
Requires-Dist: asn1tools
|
|
23
|
-
Requires-Dist: numpy
|
|
24
|
-
Requires-Dist: pyzmq
|
|
25
|
-
Requires-Dist: typing-extensions
|
|
26
|
-
Provides-Extra: all
|
|
27
|
-
Requires-Dist: flask; extra == 'all'
|
|
28
|
-
Requires-Dist: flask-socketio; extra == 'all'
|
|
29
|
-
Requires-Dist: influxdb-client; extra == 'all'
|
|
30
|
-
Requires-Dist: matplotlib; extra == 'all'
|
|
31
|
-
Requires-Dist: pysctp; extra == 'all'
|
|
32
|
-
Provides-Extra: api
|
|
33
|
-
Requires-Dist: influxdb-client; extra == 'api'
|
|
34
|
-
Provides-Extra: gui
|
|
35
|
-
Requires-Dist: flask; extra == 'gui'
|
|
36
|
-
Requires-Dist: flask-socketio; extra == 'gui'
|
|
37
|
-
Requires-Dist: matplotlib; extra == 'gui'
|
|
38
|
-
Provides-Extra: network
|
|
39
|
-
Requires-Dist: pysctp; extra == 'network'
|
|
40
|
-
Description-Content-Type: text/markdown
|
|
41
|
-
|
|
42
|
-
# dApp Library
|
|
43
|
-
|
|
44
|
-
A complete tutorial on how to deploy a dApp can be found on the [OpenRAN Gym website](https://openrangym.com/tutorials/dapps-oai). Please refer to that guide to instrument your system.
|
|
45
|
-
|
|
46
|
-
## Installation
|
|
47
|
-
|
|
48
|
-
Clone the repository
|
|
49
|
-
|
|
50
|
-
```
|
|
51
|
-
hatch build
|
|
52
|
-
pip3 install dist/*.tar.gz
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Launch the Spectrum Sharing dApp
|
|
56
|
-
|
|
57
|
-
OAI should start _before_ running the dApp
|
|
58
|
-
|
|
59
|
-
```python
|
|
60
|
-
python3 examples/spectrum_dapp.py
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
This dApp implements a spectrum sharing use case discussed in [our paper](https://arxiv.org/pdf/2501.16502).
|
|
64
|
-
|
|
65
|
-
The dApp can be controlled through the following command-line arguments:
|
|
66
|
-
- `ota` bool (false): If true, use the OAI and spectrum configurations for OTA else use the ones of Colosseum
|
|
67
|
-
- `control` bool (false): If set to true, performs the PRB masking
|
|
68
|
-
- `energy-gui` bool (false): If set to true, creates and show the energy spectrum
|
|
69
|
-
- `iq-plotter-gui` bool (false): If set to true, creates and show the sensed spectrum
|
|
70
|
-
- `save-iqs` bool (false): Specify if this is data collection run or not. In the first case I/Q samples will be saved
|
|
71
|
-
- `timed` bool (false): Run with a 5-minute time limit
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
If you use the dApp concept and/or the framework to develop your own dApps, please cite the following paper:
|
|
75
|
-
|
|
76
|
-
```text
|
|
77
|
-
@ARTICLE{lacava2025dApps,
|
|
78
|
-
author={Andrea Lacava and Leonardo Bonati and Niloofar Mohamadi and Rajeev Gangula and Florian Kaltenberger and Pedram Johari and Salvatore D'Oro and Francesca Cuomo and Michele Polese and Tommaso Melodia},
|
|
79
|
-
title: {dApps: Enabling Real-Time AI-Based Open RAN Control},
|
|
80
|
-
url={https://arxiv.org/pdf/2501.16502},
|
|
81
|
-
year={2025}
|
|
82
|
-
}
|
|
83
|
-
```
|
dapps-0.0.2/README.md
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# dApp Library
|
|
2
|
-
|
|
3
|
-
A complete tutorial on how to deploy a dApp can be found on the [OpenRAN Gym website](https://openrangym.com/tutorials/dapps-oai). Please refer to that guide to instrument your system.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
Clone the repository
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
hatch build
|
|
11
|
-
pip3 install dist/*.tar.gz
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
### Launch the Spectrum Sharing dApp
|
|
15
|
-
|
|
16
|
-
OAI should start _before_ running the dApp
|
|
17
|
-
|
|
18
|
-
```python
|
|
19
|
-
python3 examples/spectrum_dapp.py
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
This dApp implements a spectrum sharing use case discussed in [our paper](https://arxiv.org/pdf/2501.16502).
|
|
23
|
-
|
|
24
|
-
The dApp can be controlled through the following command-line arguments:
|
|
25
|
-
- `ota` bool (false): If true, use the OAI and spectrum configurations for OTA else use the ones of Colosseum
|
|
26
|
-
- `control` bool (false): If set to true, performs the PRB masking
|
|
27
|
-
- `energy-gui` bool (false): If set to true, creates and show the energy spectrum
|
|
28
|
-
- `iq-plotter-gui` bool (false): If set to true, creates and show the sensed spectrum
|
|
29
|
-
- `save-iqs` bool (false): Specify if this is data collection run or not. In the first case I/Q samples will be saved
|
|
30
|
-
- `timed` bool (false): Run with a 5-minute time limit
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
If you use the dApp concept and/or the framework to develop your own dApps, please cite the following paper:
|
|
34
|
-
|
|
35
|
-
```text
|
|
36
|
-
@ARTICLE{lacava2025dApps,
|
|
37
|
-
author={Andrea Lacava and Leonardo Bonati and Niloofar Mohamadi and Rajeev Gangula and Florian Kaltenberger and Pedram Johari and Salvatore D'Oro and Francesca Cuomo and Michele Polese and Tommaso Melodia},
|
|
38
|
-
title: {dApps: Enabling Real-Time AI-Based Open RAN Control},
|
|
39
|
-
url={https://arxiv.org/pdf/2501.16502},
|
|
40
|
-
year={2025}
|
|
41
|
-
}
|
|
42
|
-
```
|
dapps-0.0.2/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.0.2
|
dapps-0.0.2/pyproject.toml
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
[build-system]
|
|
2
|
-
requires = ["hatchling"]
|
|
3
|
-
build-backend = "hatchling.build"
|
|
4
|
-
|
|
5
|
-
[project]
|
|
6
|
-
name = "dapps"
|
|
7
|
-
dynamic = ["version"]
|
|
8
|
-
description = 'A library for creating and connecting dApps to Open RAN units.'
|
|
9
|
-
readme = "README.md"
|
|
10
|
-
requires-python = ">=3.8"
|
|
11
|
-
keywords = ["dApps", "o-ran", "5g"]
|
|
12
|
-
authors = [
|
|
13
|
-
{ name = "Andrea Lacava", email = "thecave003@gmail.com" },
|
|
14
|
-
]
|
|
15
|
-
classifiers = [
|
|
16
|
-
"Development Status :: 4 - Beta",
|
|
17
|
-
"Programming Language :: Python",
|
|
18
|
-
"Programming Language :: Python :: 3.8",
|
|
19
|
-
"Programming Language :: Python :: 3.9",
|
|
20
|
-
"Programming Language :: Python :: 3.10",
|
|
21
|
-
"Programming Language :: Python :: 3.11",
|
|
22
|
-
"Programming Language :: Python :: 3.12",
|
|
23
|
-
"Programming Language :: Python :: Implementation :: CPython",
|
|
24
|
-
"Programming Language :: Python :: Implementation :: PyPy",
|
|
25
|
-
]
|
|
26
|
-
|
|
27
|
-
dependencies = [
|
|
28
|
-
"asn1tools",
|
|
29
|
-
"typing_extensions",
|
|
30
|
-
"numpy",
|
|
31
|
-
"pyzmq"
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
[project.urls]
|
|
35
|
-
Homepage = "https://openrangym.com/ran-frameworks/dapps"
|
|
36
|
-
Package = "https://pypi.org/project/dapps/"
|
|
37
|
-
Source = "https://github.com/wineslab/dApp-library"
|
|
38
|
-
"Bug Tracker" = "https://github.com/wineslab/dApp-library/issues"
|
|
39
|
-
|
|
40
|
-
[tool.hatch.version]
|
|
41
|
-
path = "VERSION"
|
|
42
|
-
pattern = "(?P<version>\\d+\\.\\d+\\.\\d+)"
|
|
43
|
-
|
|
44
|
-
[tool.hatch.build.targets.wheel]
|
|
45
|
-
packages = ['src/dapp', 'src/e3interface', 'src/spectrum','src/visualization']
|
|
46
|
-
sources = ["src"]
|
|
47
|
-
|
|
48
|
-
[project.optional-dependencies]
|
|
49
|
-
network = ["pysctp"]
|
|
50
|
-
gui = ["flask", "flask-socketio", "matplotlib"]
|
|
51
|
-
api = ["influxdb_client"]
|
|
52
|
-
all = [
|
|
53
|
-
"pysctp",
|
|
54
|
-
"flask",
|
|
55
|
-
"flask-socketio",
|
|
56
|
-
"matplotlib",
|
|
57
|
-
"influxdb_client"
|
|
58
|
-
]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|