add: agent template
This commit is contained in:
commit
1f92b43879
2
agent/.gitignore
vendored
Normal file
2
agent/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
venv
|
||||||
|
__pycache__
|
||||||
12
agent/Dockerfile
Normal file
12
agent/Dockerfile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# set base image (host OS)
|
||||||
|
FROM python:latest
|
||||||
|
# set the working directory in the container
|
||||||
|
WORKDIR /usr/agent
|
||||||
|
# copy the dependencies file to the working directory
|
||||||
|
COPY requirements.txt .
|
||||||
|
# install dependencies
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
|
# copy the content of the local src directory to the working directory
|
||||||
|
COPY src/ .
|
||||||
|
# command to run on container start
|
||||||
|
CMD ["python", "main.py"]
|
||||||
33
agent/docker/docker-compose.yaml
Normal file
33
agent/docker/docker-compose.yaml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
version: "3.9"
|
||||||
|
name: "road_vision"
|
||||||
|
services:
|
||||||
|
mqtt:
|
||||||
|
image: eclipse-mosquitto
|
||||||
|
container_name: mqtt
|
||||||
|
volumes:
|
||||||
|
- ./mosquitto:/mosquitto
|
||||||
|
- ./mosquitto/data:/mosquitto/data
|
||||||
|
- ./mosquitto/log:/mosquitto/log
|
||||||
|
ports:
|
||||||
|
- 1883:1883
|
||||||
|
- 9001:9001
|
||||||
|
networks:
|
||||||
|
mqtt_network:
|
||||||
|
|
||||||
|
|
||||||
|
fake_agent:
|
||||||
|
container_name: agent
|
||||||
|
build: ../
|
||||||
|
depends_on:
|
||||||
|
- mqtt
|
||||||
|
environment:
|
||||||
|
MQTT_BROKER_HOST: "mqtt"
|
||||||
|
MQTT_BROKER_PORT: 1883
|
||||||
|
MQTT_TOPIC: "agent_data_topic"
|
||||||
|
DELAY: 0.1
|
||||||
|
networks:
|
||||||
|
mqtt_network:
|
||||||
|
|
||||||
|
|
||||||
|
networks:
|
||||||
|
mqtt_network:
|
||||||
11
agent/docker/mosquitto/config/mosquitto.conf
Normal file
11
agent/docker/mosquitto/config/mosquitto.conf
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
persistence true
|
||||||
|
persistence_location /mosquitto/data/
|
||||||
|
listener 1883
|
||||||
|
## Authentication ##
|
||||||
|
allow_anonymous true
|
||||||
|
# allow_anonymous false
|
||||||
|
# password_file /mosquitto/config/password.txt
|
||||||
|
## Log ##
|
||||||
|
log_dest file /mosquitto/log/mosquitto.log
|
||||||
|
log_dest stdout
|
||||||
|
# listener 1883
|
||||||
3
agent/requirements.txt
Normal file
3
agent/requirements.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
marshmallow==3.20.2
|
||||||
|
packaging==23.2
|
||||||
|
paho-mqtt==1.6.1
|
||||||
17
agent/src/config.py
Normal file
17
agent/src/config.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def try_parse(type, value: str):
|
||||||
|
try:
|
||||||
|
return type(value)
|
||||||
|
except Exception:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# MQTT config
|
||||||
|
MQTT_BROKER_HOST = os.environ.get("MQTT_BROKER_HOST") or "mqtt"
|
||||||
|
MQTT_BROKER_PORT = try_parse(int, os.environ.get("MQTT_BROKER_PORT")) or 1883
|
||||||
|
MQTT_TOPIC = os.environ.get("MQTT_TOPIC") or "agent"
|
||||||
|
|
||||||
|
# Delay for sending data to mqtt in seconds
|
||||||
|
DELAY = try_parse(float, os.environ.get("DELAY")) or 1
|
||||||
1422
agent/src/data/accelerometer.csv
Normal file
1422
agent/src/data/accelerometer.csv
Normal file
File diff suppressed because it is too large
Load Diff
126
agent/src/data/gps.csv
Normal file
126
agent/src/data/gps.csv
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
longitude,latitude
|
||||||
|
50.450386085935094,30.524547100067142
|
||||||
|
50.45050063818424,30.52432932092009
|
||||||
|
50.45061519043338,30.524111541773035
|
||||||
|
50.450729742682526,30.52389376262598
|
||||||
|
50.45084429493167,30.523675983478928
|
||||||
|
50.450958847180814,30.523458204331874
|
||||||
|
50.45107339942996,30.52324042518482
|
||||||
|
50.4511879516791,30.523022646037766
|
||||||
|
50.45130250392825,30.522804866890713
|
||||||
|
50.45141705617739,30.52258708774366
|
||||||
|
50.45158184958234,30.52247389776916
|
||||||
|
50.451757508676074,30.522413170763514
|
||||||
|
50.45193316776981,30.522352443757867
|
||||||
|
50.452108826863544,30.52229171675222
|
||||||
|
50.45228448595728,30.522230989746575
|
||||||
|
50.45246014505101,30.52217026274093
|
||||||
|
50.45263580414475,30.522109535735282
|
||||||
|
50.45281146323848,30.522048808729636
|
||||||
|
50.45298712233222,30.52198808172399
|
||||||
|
50.45316278142595,30.521927354718343
|
||||||
|
50.45333844051969,30.521866627712697
|
||||||
|
50.4535017075372,30.521748100680377
|
||||||
|
50.45366497455471,30.521629573648056
|
||||||
|
50.453828241572225,30.521511046615736
|
||||||
|
50.45399150858974,30.521392519583415
|
||||||
|
50.45415477560725,30.521273992551095
|
||||||
|
50.45431804262476,30.521155465518774
|
||||||
|
50.454481309642276,30.521036938486453
|
||||||
|
50.45464457665979,30.520918411454133
|
||||||
|
50.4548078436773,30.520799884421812
|
||||||
|
50.454971110694814,30.520681357389492
|
||||||
|
50.455093555427055,30.520474423051503
|
||||||
|
50.4552160001593,30.520267488713515
|
||||||
|
50.45523090797679,30.51998595727611
|
||||||
|
50.455245815794285,30.519704425838704
|
||||||
|
50.45526072361178,30.5194228944013
|
||||||
|
50.455275631429274,30.519141362963893
|
||||||
|
50.45529053924677,30.518859831526488
|
||||||
|
50.45530544706426,30.518578300089082
|
||||||
|
50.455320354881756,30.518296768651677
|
||||||
|
50.45533526269925,30.51801523721427
|
||||||
|
50.455350170516745,30.517733705776866
|
||||||
|
50.45536507833424,30.51745217433946
|
||||||
|
50.45535571063255,30.517170053920086
|
||||||
|
50.45518133729636,30.517100783785818
|
||||||
|
50.455006963960166,30.51703151365155
|
||||||
|
50.45483259062397,30.51696224351728
|
||||||
|
50.45465821728778,30.516892973383012
|
||||||
|
50.454483843951586,30.516823703248743
|
||||||
|
50.45430947061539,30.516754433114475
|
||||||
|
50.4541350972792,30.516685162980206
|
||||||
|
50.45397769437711,30.51682186381075
|
||||||
|
50.45382029147502,30.516958564641296
|
||||||
|
50.45366288857293,30.51709526547184
|
||||||
|
50.45348323217105,30.517081686354636
|
||||||
|
50.45336278271238,30.51687189126274
|
||||||
|
50.45324233325371,30.51666209617084
|
||||||
|
50.45312188379504,30.516452301078942
|
||||||
|
50.45297828058652,30.516282205294928
|
||||||
|
50.452804445806855,30.516209678584172
|
||||||
|
50.45263061102719,30.516137151873416
|
||||||
|
50.45245677624752,30.51606462516266
|
||||||
|
50.45228294146786,30.515992098451903
|
||||||
|
50.45210910668819,30.515919571741147
|
||||||
|
50.451935271908525,30.51584704503039
|
||||||
|
50.45176143712886,30.515774518319635
|
||||||
|
50.45158760234919,30.51570199160888
|
||||||
|
50.45141376756953,30.515629464898122
|
||||||
|
50.45123993278986,30.515556938187366
|
||||||
|
50.451066098010195,30.51548441147661
|
||||||
|
50.45089226323053,30.515411884765854
|
||||||
|
50.45071842845086,30.515339358055098
|
||||||
|
50.4505445936712,30.51526683134434
|
||||||
|
50.45037075889153,30.515194304633585
|
||||||
|
50.450196924111864,30.51512177792283
|
||||||
|
50.4500230893322,30.515049251212073
|
||||||
|
50.44984925455253,30.514976724501317
|
||||||
|
50.449675419772866,30.51490419779056
|
||||||
|
50.4495015849932,30.514831671079804
|
||||||
|
50.449327750213534,30.514759144369048
|
||||||
|
50.44915391543387,30.514686617658292
|
||||||
|
50.4489800806542,30.514614090947536
|
||||||
|
50.44893464360986,30.51488739159867
|
||||||
|
50.44888920656552,30.515160692249804
|
||||||
|
50.448843769521176,30.515433992900938
|
||||||
|
50.448798332476834,30.515707293552072
|
||||||
|
50.44875289543249,30.515980594203207
|
||||||
|
50.44870745838815,30.51625389485434
|
||||||
|
50.44866202134381,30.516527195505475
|
||||||
|
50.448616584299465,30.51680049615661
|
||||||
|
50.44857114725512,30.517073796807743
|
||||||
|
50.44852571021078,30.517347097458877
|
||||||
|
50.44848027316644,30.51762039811001
|
||||||
|
50.4484348361221,30.517893698761146
|
||||||
|
50.448389399077755,30.51816699941228
|
||||||
|
50.44834396203341,30.518440300063414
|
||||||
|
50.44829852498907,30.51871360071455
|
||||||
|
50.44825308794473,30.518986901365682
|
||||||
|
50.448207650900386,30.519260202016817
|
||||||
|
50.448162213856044,30.51953350266795
|
||||||
|
50.4481167768117,30.519806803319085
|
||||||
|
50.44807133976736,30.52008010397022
|
||||||
|
50.44802590272302,30.520353404621353
|
||||||
|
50.447980465678675,30.520626705272488
|
||||||
|
50.44793502863433,30.52090000592362
|
||||||
|
50.44788959158999,30.521173306574756
|
||||||
|
50.44784415454565,30.52144660722589
|
||||||
|
50.44779871750131,30.521719907877024
|
||||||
|
50.447753280456965,30.52199320852816
|
||||||
|
50.4479216063945,30.52209274810735
|
||||||
|
50.44808993233204,30.522192287686543
|
||||||
|
50.448258258269576,30.522291827265736
|
||||||
|
50.44842658420711,30.52239136684493
|
||||||
|
50.44859491014465,30.52249090642412
|
||||||
|
50.448763236082186,30.522590446003314
|
||||||
|
50.44893156201972,30.522689985582506
|
||||||
|
50.44907610254229,30.52285809923405
|
||||||
|
50.44922064306486,30.523026212885593
|
||||||
|
50.44936518358743,30.523194326537137
|
||||||
|
50.44950972411,30.52336244018868
|
||||||
|
50.44965426463257,30.523530553840224
|
||||||
|
50.44979880515514,30.523698667491768
|
||||||
|
50.44994334567771,30.52386678114331
|
||||||
|
50.450069433207545,30.52406822530458
|
||||||
|
50.450204300386,30.52425511880424
|
||||||
|
8
agent/src/domain/accelerometer.py
Normal file
8
agent/src/domain/accelerometer.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Accelerometer:
|
||||||
|
x: int
|
||||||
|
y: int
|
||||||
|
z: int
|
||||||
12
agent/src/domain/aggregated_data.py
Normal file
12
agent/src/domain/aggregated_data.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
from domain.accelerometer import Accelerometer
|
||||||
|
from domain.gps import Gps
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class AggregatedData:
|
||||||
|
accelerometer: Accelerometer
|
||||||
|
gps: Gps
|
||||||
|
time: datetime
|
||||||
7
agent/src/domain/gps.py
Normal file
7
agent/src/domain/gps.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Gps:
|
||||||
|
longitude: float
|
||||||
|
latitude: float
|
||||||
21
agent/src/file_datasource.py
Normal file
21
agent/src/file_datasource.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
from csv import reader
|
||||||
|
from datetime import datetime
|
||||||
|
from domain.aggregated_data import AggregatedData
|
||||||
|
|
||||||
|
|
||||||
|
class FileDatasource:
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
accelerometer_filename: str,
|
||||||
|
gps_filename: str,
|
||||||
|
) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def read(self) -> AggregatedData:
|
||||||
|
"""Метод повертає дані отримані з датчиків"""
|
||||||
|
|
||||||
|
def startReading(self, *args, **kwargs):
|
||||||
|
"""Метод повинен викликатись перед початком читання даних"""
|
||||||
|
|
||||||
|
def stopReading(self, *args, **kwargs):
|
||||||
|
"""Метод повинен викликатись для закінчення читання даних"""
|
||||||
53
agent/src/main.py
Normal file
53
agent/src/main.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
from paho.mqtt import client as mqtt_client
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
from schema.aggregated_data_schema import AggregatedDataSchema
|
||||||
|
from file_datasource import FileDatasource
|
||||||
|
import config
|
||||||
|
|
||||||
|
|
||||||
|
def connect_mqtt(broker, port):
|
||||||
|
"""Create MQTT client"""
|
||||||
|
print(f"CONNECT TO {broker}:{port}")
|
||||||
|
|
||||||
|
def on_connect(client, userdata, flags, rc):
|
||||||
|
if rc == 0:
|
||||||
|
print(f"Connected to MQTT Broker ({broker}:{port})!")
|
||||||
|
else:
|
||||||
|
print("Failed to connect {broker}:{port}, return code %d\n", rc)
|
||||||
|
exit(rc) # Stop execution
|
||||||
|
|
||||||
|
client = mqtt_client.Client()
|
||||||
|
client.on_connect = on_connect
|
||||||
|
client.connect(broker, port)
|
||||||
|
client.loop_start()
|
||||||
|
return client
|
||||||
|
|
||||||
|
|
||||||
|
def publish(client, topic, datasource, delay):
|
||||||
|
datasource.startReading()
|
||||||
|
while True:
|
||||||
|
time.sleep(delay)
|
||||||
|
data = datasource.read()
|
||||||
|
msg = AggregatedDataSchema().dumps(data)
|
||||||
|
result = client.publish(topic, msg)
|
||||||
|
# result: [0, 1]
|
||||||
|
status = result[0]
|
||||||
|
if status == 0:
|
||||||
|
pass
|
||||||
|
# print(f"Send `{msg}` to topic `{topic}`")
|
||||||
|
else:
|
||||||
|
print(f"Failed to send message to topic {topic}")
|
||||||
|
|
||||||
|
|
||||||
|
def run():
|
||||||
|
# Prepare mqtt client
|
||||||
|
client = connect_mqtt(config.MQTT_BROKER_HOST, config.MQTT_BROKER_PORT)
|
||||||
|
# Prepare datasource
|
||||||
|
datasource = FileDatasource("data/data.csv", "data/gps_data.csv")
|
||||||
|
# Infinity publish data
|
||||||
|
publish(client, config.MQTT_TOPIC, datasource, config.DELAY)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
run()
|
||||||
7
agent/src/schema/accelerometer_schema.py
Normal file
7
agent/src/schema/accelerometer_schema.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from marshmallow import Schema, fields
|
||||||
|
|
||||||
|
|
||||||
|
class AccelerometerSchema(Schema):
|
||||||
|
x = fields.Int()
|
||||||
|
y = fields.Int()
|
||||||
|
z = fields.Int()
|
||||||
9
agent/src/schema/aggregated_data_schema.py
Normal file
9
agent/src/schema/aggregated_data_schema.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from marshmallow import Schema, fields
|
||||||
|
from schema.accelerometer_schema import AccelerometerSchema
|
||||||
|
from schema.gps_schema import GpsSchema
|
||||||
|
|
||||||
|
|
||||||
|
class AggregatedDataSchema(Schema):
|
||||||
|
accelerometer = fields.Nested(AccelerometerSchema)
|
||||||
|
gps = fields.Nested(GpsSchema)
|
||||||
|
time = fields.DateTime("iso")
|
||||||
6
agent/src/schema/gps_schema.py
Normal file
6
agent/src/schema/gps_schema.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from marshmallow import Schema, fields
|
||||||
|
|
||||||
|
|
||||||
|
class GpsSchema(Schema):
|
||||||
|
longitude = fields.Number()
|
||||||
|
latitude = fields.Number()
|
||||||
Loading…
x
Reference in New Issue
Block a user