23 Commits

Author SHA1 Message Date
ishak jmilou.ishak
606506e40c update review feedback with additional documentation and planning notes 2024-12-03 13:37:44 +01:00
ishak jmilou.ishak
6efd95fb32 feedback sprint 4 2024-12-03 13:34:43 +01:00
ishak jmilou.ishak
5eff7fccba fix 2024-12-03 12:45:18 +01:00
ishak jmilou.ishak
a03894e52e changed MQTT connection port from 1884 to 80 2024-12-03 12:18:02 +01:00
dd2a1b56c4 changed port 2024-12-02 12:58:14 +00:00
ishak jmilou.ishak
1563528b67 changed file location 2024-12-02 13:32:45 +01:00
ishak jmilou.ishak
2e5af52ba8 changed mqtt port to 8080 2024-12-02 12:45:26 +01:00
ishak jmilou.ishak
eb04d35d40 changed path 2024-12-02 10:13:42 +01:00
ishak jmilou.ishak
80fcb1ccc3 daily stand up 02/12/2024 2024-12-02 09:13:34 +01:00
ishak jmilou.ishak
62cdf98098 testing phpmyadmin 2024-11-30 15:18:01 +01:00
ishak jmilou.ishak
db6fa156c9 Update WSGI path to point to the correct application directory 2024-11-28 13:21:24 +01:00
ishak jmilou.ishak
048790ec8b Add WSGI entry point for the application 2024-11-28 13:16:03 +01:00
ishak jmilou.ishak
aca6644c02 Merge branch 'main' of ssh://gitlab.fdmci.hva.nl/technische-informatica-sm3/ti-projectten/rooziinuubii79 2024-11-26 14:55:47 +01:00
ishak jmilou.ishak
492f506aa2 daily stand up-/ hoofdvraag en deelvragen 2024-11-26 14:55:45 +01:00
c76ba93e82 code req 2024-11-26 13:30:38 +01:00
0bfba0bffe Added comments 2024-11-24 16:42:34 +01:00
ishak jmilou.ishak
8a5b349040 Merge branch 'main' of ssh://gitlab.fdmci.hva.nl/technische-informatica-sm3/ti-projectten/rooziinuubii79 2024-11-20 17:14:55 +01:00
ishak jmilou.ishak
a41ea1b70c styling website 2024-11-20 17:14:54 +01:00
eb804c888c updated credentials to secure mqtt 2024-11-20 16:29:22 +01:00
a028a6f88f change mqtt credentials 2024-11-20 16:07:39 +01:00
47b29a1c55 added both json and idividual topic sending in cpp 2024-11-20 15:49:40 +01:00
528de4f3f4 code conventions 2024-11-20 15:49:40 +01:00
ishak jmilou.ishak
c16ba3cf9d busy with website redesign 2024-11-20 15:38:56 +01:00
18 changed files with 270 additions and 81 deletions

View File

@@ -0,0 +1,10 @@
# Requirements
1. Het compileerd op x86 en ARM architechturen
2. Geen dubbele code
3. commentaar bij lastige code
4. Doxygen comments bij elke functie, behalve als het duidelijk is in de functienaam
5. Hou je code leesbaar
6. Geen dode code
7. Gebruik TODO comments (TODO TREE)
8.

View File

@@ -1,13 +1,20 @@
# Daily stand ups
??? note "Daily Stand-ups Sprint 4"
| Day | Submitted by | What did you do yesterday | What will you do today | Any blockers? |
| ---------- | ------------ | ----------------------------- | -------------------------------------------------- | ----------------------- |
| 18/11/2024 | Ishak | --- | Engels, Repo fixen, beginnen met nieuwe user story | --- |
| 18/11/2024 | Sam | --- | Engels, Feedback verwerken medium stake | None |
| 18/11/2024 | Yannick | --- | Engels, Documentatie, Code samenvoegen | None |
| 18/11/2024 | Mees | --- | Engels, Onderzoek | None |
| 19/11/2024 | Ishak | Engels, Repo fixen | workshop | --- |
| 19/11/2024 | Sam | Engels, Feedback verwerken | workshop | None |
| 19/11/2024 | Yannick | code samenvoegen,schema maken | workshop, documentatie | None |
| 19/11/2024 | Mees | niks | workshop, fixen include path | include path werkt niet |
| Day | Submitted by | What did you do yesterday | What will you do today | Any blockers? |
| ---------- | ------------ | ----------------------------- | -------------------------------------------------- | ------------------------------------ |
| 18/11/2024 | Ishak | --- | Engels, Repo fixen, beginnen met nieuwe user story | --- |
| 18/11/2024 | Sam | --- | Engels, Feedback verwerken medium stake | None |
| 18/11/2024 | Yannick | --- | Engels, Documentatie, Code samenvoegen | None |
| 18/11/2024 | Mees | --- | Engels, Onderzoek | None |
| 19/11/2024 | Ishak | Engels, Repo fixen | workshop | --- |
| 19/11/2024 | Sam | Engels, Feedback verwerken | workshop | None |
| 19/11/2024 | Yannick | code samenvoegen,schema maken | workshop, documentatie | None |
| 19/11/2024 | Mees | niks | workshop, fixen include path | include path werkt niet |
| 26/11/2024 | Ishak | Workshop | database, engels video opnemen | phpmyadmin werkt niet(weet probleem) |
| 26/11/2024 | Sam | opencv | opencv | --- |
| 26/11/2024 | Yannick | ziek | ziek | --- |
| 26/11/2024 | Mees | Engels video | stepper motor | vscode werkt niet |
| 02/12/2024 | Ishak | database | database | --- |
| 02/12/2024 | Sam | opencv | camera beeld op website | --- |
| 02/12/2024 | Yannick | ziek, documentatie | behuizing voor esp | --- |

View File

@@ -0,0 +1,12 @@
# sprint review 4 feedback
- Definition of done SMART maken
- Uitgebreider beschrijven wat er voor de definition of done nodig is
- Testen van de software niet meer dan een halve A4
- Acceptatie criteria beter uitschrijven( vragen aan ed)
- Meer software ontwikkelen
- kijken of we met een punten systeem kunnen werken in user stories. zo kan je zien hoe groot een user story is.
- read.me file aanpassen
- meer aan documentatie doen.
- technisch iets te uitdagend
- planning beter maken

View File

@@ -535,6 +535,8 @@ void CKobuki::goToXy(long double xx, long double yy) {
return;
}
/// @brief Makes the robot move forward for 3 seconds
/// @param speedvalue How fast it will drive forward from 0 - 1024
void CKobuki::forward(int speedvalue) {
// Use the goStraight logic to determine the speed and distance
@@ -572,10 +574,10 @@ void CKobuki::Rotate(int degrees) {
float radians = degrees * PI / 180.0;
// Calculate the rotation speed in radians per second
double radpersec = 1;
double RADS_PER_SEC = 1;
// calculator rotation time and give absolute value
float rotation_time = std::abs(radians / radpersec);
float rotation_time = std::abs(radians / RADS_PER_SEC);
// Use original function to set the rotation speed in mm/s
setRotationSpeed(radians);
@@ -588,6 +590,10 @@ void CKobuki::Rotate(int degrees) {
setRotationSpeed(0);
}
/// @brief Robot safety function to be ran in another thread. Makes sure the robot does not throw inteself from the table. Only use this when the speed is lower than 350
/// @param pointerToMessage Set this pointer to the control message and then it attempts to reset it when it bumps into something so it doesnt keep trying to do the past commant
// TODO: make this return bool so it can be used in the control part
void CKobuki::robotSafety(std::string *pointerToMessage) {
while (true) {
@@ -602,6 +608,7 @@ void CKobuki::robotSafety(std::string *pointerToMessage) {
}
}
/// @brief Robot safety function to be ran in another thread. Makes sure the robot does not throw inteself from the table. Only use this when the speed is lower than 350
void CKobuki::robotSafety() {
while (true) {
@@ -614,6 +621,7 @@ void CKobuki::robotSafety() {
}
}
/// @brief When called the robot gets a control message to stop whatever its doing
void CKobuki::sendNullMessage() {
unsigned char message[11] = {

View File

@@ -2,6 +2,7 @@
MqttClient::MqttClient(const std::string& address, const std::string& clientId, const std::string& username, const std::string& password)
//client_ is the connection
//here all the @PARAMS are getting set for the connection
: client_(address, clientId), username_(username), password_(password), callback_(*this) {
client_.set_callback(callback_);
options.set_clean_session(true);

View File

@@ -1,5 +1,5 @@
#include "MqttClient.h"
//example file for testing
int main(){
MqttClient client("mqtt://localhost:1883", "raspberry_pi_client", "ishak", "kobuki");
client.connect();

View File

@@ -9,7 +9,8 @@ using namespace std;
CKobuki robot;
std::string readMQTT();
void parseMQTT(std::string message);
MqttClient client("mqtt://145.92.224.21:1883", "KobukiRPI", "ishak", "kobuki"); // create a client object
//ip, clientID, username, password
MqttClient client("mqtt://145.92.224.21:1884", "KobukiRPI", "rpi", "rpiwachtwoordofzo"); // create a client object
std::string message = "stop";
std::string serializeKobukiData(const TKobukiData &data);
void sendKobukiData(TKobukiData &data);
@@ -18,6 +19,7 @@ void setup()
{
unsigned char *null_ptr(0);
robot.startCommunication("/dev/ttyUSB0", true, null_ptr);
//connect mqtt server and sub to commands
client.connect();
client.subscribe("home/commands");
}
@@ -149,6 +151,64 @@ void logToFile()
}
}
void sendIndividualKobukiData(const TKobukiData &data) {
while (true) {
client.publishMessage("kobuki/data/timestamp", std::to_string(data.timestamp));
client.publishMessage("kobuki/data/BumperCenter", std::to_string(data.BumperCenter));
client.publishMessage("kobuki/data/BumperLeft", std::to_string(data.BumperLeft));
client.publishMessage("kobuki/data/BumperRight", std::to_string(data.BumperRight));
client.publishMessage("kobuki/data/WheelDropLeft", std::to_string(data.WheelDropLeft));
client.publishMessage("kobuki/data/WheelDropRight", std::to_string(data.WheelDropRight));
client.publishMessage("kobuki/data/CliffCenter", std::to_string(data.CliffCenter));
client.publishMessage("kobuki/data/CliffLeft", std::to_string(data.CliffLeft));
client.publishMessage("kobuki/data/CliffRight", std::to_string(data.CliffRight));
client.publishMessage("kobuki/data/EncoderLeft", std::to_string(data.EncoderLeft));
client.publishMessage("kobuki/data/EncoderRight", std::to_string(data.EncoderRight));
client.publishMessage("kobuki/data/PWMleft", std::to_string(data.PWMleft));
client.publishMessage("kobuki/data/PWMright", std::to_string(data.PWMright));
client.publishMessage("kobuki/data/ButtonPress1", std::to_string(data.ButtonPress1));
client.publishMessage("kobuki/data/ButtonPress2", std::to_string(data.ButtonPress2));
client.publishMessage("kobuki/data/ButtonPress3", std::to_string(data.ButtonPress3));
client.publishMessage("kobuki/data/Charger", std::to_string(data.Charger));
client.publishMessage("kobuki/data/Battery", std::to_string(data.Battery));
client.publishMessage("kobuki/data/overCurrent", std::to_string(data.overCurrent));
client.publishMessage("kobuki/data/IRSensorRight", std::to_string(data.IRSensorRight));
client.publishMessage("kobuki/data/IRSensorCenter", std::to_string(data.IRSensorCenter));
client.publishMessage("kobuki/data/IRSensorLeft", std::to_string(data.IRSensorLeft));
client.publishMessage("kobuki/data/GyroAngle", std::to_string(data.GyroAngle));
client.publishMessage("kobuki/data/GyroAngleRate", std::to_string(data.GyroAngleRate));
client.publishMessage("kobuki/data/CliffSensorRight", std::to_string(data.CliffSensorRight));
client.publishMessage("kobuki/data/CliffSensorCenter", std::to_string(data.CliffSensorCenter));
client.publishMessage("kobuki/data/CliffSensorLeft", std::to_string(data.CliffSensorLeft));
client.publishMessage("kobuki/data/wheelCurrentLeft", std::to_string(data.wheelCurrentLeft));
client.publishMessage("kobuki/data/wheelCurrentRight", std::to_string(data.wheelCurrentRight));
client.publishMessage("kobuki/data/digitalInput", std::to_string(data.digitalInput));
client.publishMessage("kobuki/data/analogInputCh0", std::to_string(data.analogInputCh0));
client.publishMessage("kobuki/data/analogInputCh1", std::to_string(data.analogInputCh1));
client.publishMessage("kobuki/data/analogInputCh2", std::to_string(data.analogInputCh2));
client.publishMessage("kobuki/data/analogInputCh3", std::to_string(data.analogInputCh3));
client.publishMessage("kobuki/data/frameId", std::to_string(data.frameId));
client.publishMessage("kobuki/data/extraInfo/HardwareVersionPatch", std::to_string(data.extraInfo.HardwareVersionPatch));
client.publishMessage("kobuki/data/extraInfo/HardwareVersionMinor", std::to_string(data.extraInfo.HardwareVersionMinor));
client.publishMessage("kobuki/data/extraInfo/HardwareVersionMajor", std::to_string(data.extraInfo.HardwareVersionMajor));
client.publishMessage("kobuki/data/extraInfo/FirmwareVersionPatch", std::to_string(data.extraInfo.FirmwareVersionPatch));
client.publishMessage("kobuki/data/extraInfo/FirmwareVersionMinor", std::to_string(data.extraInfo.FirmwareVersionMinor));
client.publishMessage("kobuki/data/extraInfo/FirmwareVersionMajor", std::to_string(data.extraInfo.FirmwareVersionMajor));
client.publishMessage("kobuki/data/extraInfo/UDID0", std::to_string(data.extraInfo.UDID0));
client.publishMessage("kobuki/data/extraInfo/UDID1", std::to_string(data.extraInfo.UDID1));
client.publishMessage("kobuki/data/extraInfo/UDID2", std::to_string(data.extraInfo.UDID2));
if (!data.gyroData.empty()) {
const auto& latestGyro = data.gyroData.back();
client.publishMessage("kobuki/data/gyroData/x", std::to_string(latestGyro.x));
client.publishMessage("kobuki/data/gyroData/y", std::to_string(latestGyro.y));
client.publishMessage("kobuki/data/gyroData/z", std::to_string(latestGyro.z));
}
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}
std::string serializeKobukiData(const TKobukiData &data) {
std::string json = "{\"timestamp\":" + std::to_string(data.timestamp) +
",\"BumperCenter\":" + std::to_string(data.BumperCenter) +
@@ -212,4 +272,4 @@ void sendKobukiData(TKobukiData &data) {
client.publishMessage("kobuki/data", serializeKobukiData(data));
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}
}

View File

@@ -3,14 +3,16 @@ import paho.mqtt.client as mqtt
app = Flask(__name__)
kobuki_message = "empty"
def on_message(client, userdata, message):
global kobuki_message #set scope for this variable
kobuki_message = str(message.payload.decode("utf-8"))
print(kobuki_message)
# Create an MQTT client instance
mqtt_client = mqtt.Client()
mqtt_client.username_pw_set("ishak", "kobuki")
mqtt_client.connect("localhost", 1883, 60)
mqtt_client.username_pw_set("server", "serverwachtwoordofzo")
mqtt_client.connect("localhost", 80, 60)
mqtt_client.loop_start()
mqtt_client.subscribe("kobuki/data")
mqtt_client.on_message = on_message # this lines needs to be under the function definition otherwise it cant find which function it needs to use
@@ -43,6 +45,10 @@ def move():
def data():
return kobuki_message
@app.route('/phpmyadmin/<path:path>')
def phpmyadmin_passthrough(path):
# Laat Apache deze route direct afhandelen
return "", 404

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

View File

@@ -23,6 +23,22 @@ body {
right: 0%;
}
.footer{
display: flex;
justify-content: space-between;
max-width: 80%;
background-color: #fff;
border: 1px solid #f0f0f0;
border-radius: 50px;
align-items: center;
margin: 1.5rem auto 0 auto;
padding: 0 30px;
top: 0%;
bottom: auto;
left: 0%;
right: 0%;
}
.imgNav {
height: 50px;
border-radius: 20px;
@@ -73,6 +89,18 @@ body {
transition: transform 0.2s ease, background-color 0.2s ease;
}
.text{
width: 50%;
}
.image{
height: 100%;
}
.sectionHeight{
height: 200px;
}
/* Direction buttons */
.btn:nth-child(1) {
/* Left */

View File

@@ -43,16 +43,6 @@ section h2 {
margin-top: 0;
}
footer {
background-color: #333;
color: #fff;
text-align: center;
padding: 1rem 0;
position: fixed;
width: 100%;
bottom: 0;
}
form {
display: flex;
flex-direction: column;

View File

@@ -8,8 +8,9 @@
{% block head %}{% endblock %}
</head>
<body>
{% include 'navbar.html' %}
{% include 'navbar.html' %}
{% block content %}
{% endblock %}
</body>
</html>

View File

@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<footer class="footer">
<img src="{{url_for('static', filename='images/logo_kobuki.png')}}" alt="logo" class="imgNav" />
<h3>© 2024 Kobuki Robot Project. All rights reserved.</h3>
<div class="buttonContainer">
<a href="{{ url_for('control') }}" target="_blank">
<button class="click connectButton">Controller</button>
</a>
</div>
</footer>
</body>
</html>

View File

@@ -1,58 +1,58 @@
{% extends 'base.html' %} {% block head %}
<link rel="stylesheet" href="../static/style.css" />
{% endblock %} {% block content %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Kobuki Robot Project</title>
<link rel="stylesheet" href="../static/styleIndex.css" />
</head>
<body>
<header>
<h1>Welcome to the Kobuki Robot Project</h1>
<nav>
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
</header>
<section id="home">
<h2>Introduction</h2>
<p>The Kobuki Robot Project is an innovative initiative aimed at developing a versatile and intelligent robot platform. Our goal is to create a robot that can navigate autonomously, interact with its environment, and perform various tasks.</p>
<img src="static/kobuki.jpg" alt="Kobuki Robot">
<link rel="stylesheet" href="../static/style.css" />
</head>
<body>
<section class="container sectionHeight">
<p class="text">
The Kobuki Robot Project is an innovative initiative aimed at developing
a versatile and intelligent robot platform. Our goal is to create a
robot that can navigate autonomously, interact with its environment, and
perform various tasks.
</p>
<img src="{{url_for('static', filename='images/logo.png')}}" alt="logo" class="image" />
</section>
<section id="about">
<h2>About the Project</h2>
<p>This project is a collaborative effort involving engineers, researchers, and enthusiasts. The Kobuki robot is equipped with various sensors, including bumpers, cliff sensors, and gyroscopes, to help it navigate and interact with its surroundings.</p>
<p>Key features of the Kobuki Robot:</p>
<ul>
<li>Autonomous navigation</li>
<li>Obstacle detection and avoidance</li>
<li>Real-time data processing</li>
<li>Remote control and monitoring</li>
</ul>
<section class="container sectionHeight" id="about">
<h2>About the Project</h2>
<p>
This project is a collaborative effort involving engineers, researchers,
and enthusiasts. The Kobuki robot is equipped with various sensors,
including bumpers, cliff sensors, and gyroscopes, to help it navigate
and interact with its surroundings.
</p>
<p>Key features of the Kobuki Robot:</p>
<ul>
<li>Autonomous navigation</li>
<li>Obstacle detection and avoidance</li>
<li>Real-time data processing</li>
<li>Remote control and monitoring</li>
</ul>
</section>
<section id="contact">
<h2>Contact Us</h2>
<form id="contact-form" action="/contact" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<label for="message">Message:</label>
<textarea id="message" name="message" required></textarea>
<button type="submit">Send</button>
</form>
<section class="container" id="contact">
<h2>Contact Us</h2>
<form id="contact-form" action="/contact" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" required />
<label for="email">Email:</label>
<input type="email" id="email" name="email" required />
<label for="message">Message:</label>
<textarea id="message" name="message" required></textarea>
<button type="submit">Send</button>
</form>
</section>
<footer>
<p>&copy; 2023 Kobuki Robot Project. All rights reserved.</p>
</footer>
{% include 'footer.html' %}
<script src="static/script.js"></script>
</body>
</html>
</body>
</html>
{% endblock %}

View File

@@ -11,13 +11,9 @@
<img src="{{url_for('static', filename='images/logo_kobuki.png')}}" alt="logo" class="imgNav" />
<h3>Kobuki</h3>
<div class="buttonContainer">
<a
href="https://gitlab.fdmci.hva.nl/propedeuse-hbo-ict/onderwijs/2023-2024/out-a-se-ti/blok-3/vuupoofeehoo27"
target="_blank"
>
<button class="click connectButton">Placeholder</button>
<a href="{{ url_for('control') }}" target="_blank">
<button class="click connectButton">Controller</button>
</a>
<!-- <a href="./signup.html">sign in</a> -->
</div>
</nav>

7
src/Python/wsgi.py Normal file
View File

@@ -0,0 +1,7 @@
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/home/ishak/rooziinuubii79/src/Python/flask/web")
from app import app as application

View File

@@ -0,0 +1,42 @@
# Hoofd en deelvragen
**Wat is de aanleiding?**
De aanleiding is de de behoefte aan veilige communicatie tussen apparaten. Dit is belangrijk omdat onbeveiligde dataoverdracht kan leiden tot datalekken.
**wat is het probleem/behoefte en waaruit blijkt dat?**
Het probleem is dat data die tussen apparaten wordt verstuurd kwetsbaar kan zijn. Dit blijkt nadat wij te horen hebben gekregen dat er niet goed was omgegaan met communicatie tussen apparaten.
**Wie heeft het probleem/behoefte?**
ons groepje, maar ook bijvoorbeeld grote bedrijven waar het heel belangrijk is dat data veilig wordt verstuurd zonder dat het in de verkeerde handen valt.
**Wanneer is het probleem/behoefte ontstaan?**
Het probleem is ontstaan nadat wij te horen hebben gekregen dat er niet goed was omgegaan met communicatie tussen apparaten.
**Waarom is het een probleem?**
Het is een probleem omdat onbeveiligde communicatie kan leiden tot datalekken waaronder privacy. Hiermee kunnen bedrijven in de problemen komen.
**Waar doet het probleem/behoefte zich voor (afbakening)?**
Het probleem komt voor in verschillende sectoren waar data tussen apparaten wordt verstuurd. Dit kan zijn in de zorg, industrie, op kantoor, maar ook met IoT projecten wat je thuis kan hebben.
## Hoofdvraag
Welke communicatieprotocol geeft de mogelijkheid om veilig en betrouwbaar te communiceren tussen IoT apparaten?
## Deelvragen
1. Wat houdt veilige en betrouwbare communicatie tussen apparaten in?
2. Welke protocollen zijn er om veilig en betrouwbaar te communiceren tussen apparaten?
3. Wat zijn de voor- en nadelen van de verschillende protocollen?
## Bronnen
- Singh, S., & Jyoti. (2024, June 7). Secure Communications Protocols for IoT networks: a survey. https://journal.ijprse.com/index.php/ijprse/article/view/1082
- Nguyen, K. T., Laurent, M., Oualha, N., CEA, & Institut Mines-Telecom. (2015). Survey on secure communication protocols for the Internet of Things. In Ad Hoc Networks (Vol. 32, pp. 1731) [Journal-article]. http://dx.doi.org/10.1016/j.adhoc.2015.01.006
- Miorandi, D., Sicari, S., De Pellegrini, F., & Imrich Chlamtac. (2012). Internet of things: Vision, applications and research challenges. In Ad Hoc Networks (Vol. 10, pp. 14971516) [Journal-article]. Elsevier B.V. http://dx.doi.org/10.1016/j.adhoc.2012.02.016
- Christiano, P. (2023, November 5). Top 9 IoT communication protocols & their features in 2024: An In-Depth guide - ExpertBeacon. Expertbeacon. https://expertbeacon.com/iot-communication-protocol/
- Yugha, R., & Chithra, S. (2020). A survey on technologies and security protocols: Reference for future generation IoT. Journal of Network and Computer Applications, 169, 102763. https://doi.org/10.1016/j.jnca.2020.102763
- De Mendizábal, I. (2022, June 16). IoT Communication Protocols—IoT Data Protocols. Technical Articles. https://www.allaboutcircuits.com/technical-articles/internet-of-things-communication-protocols-iot-data-protocols/
- IoT-technologieën en -protocollen | Microsoft Azure. (n.d.). https://azure.microsoft.com/nl-nl/solutions/iot/iot-technology-protocols
- Het IoT verbinden: wat is MQTT en waarin verschilt het van CoAP? (n.d.). https://www.onlogic.com/nl/blog/het-iot-verbinden-wat-is-mqtt-en-waarin-verschilt-het-van-coap/
- Nader, K. (2023, October 30). Wat zijn de voordelen van het gebruik van WebSocket voor IoT-communicatie? AppMaster - Ultimate All-in No-code Platform. https://appmaster.io/nl/blog/websocket-voor-iot-communicatie
- Sidna, J., Amine, B., Abdallah, N., & Alami, H. E. (2020). Analysis and evaluation of communication Protocols for IoT Applications. Karbala International Journal of Modern Science. https://doi.org/10.1145/3419604.3419754

Binary file not shown.