Mqtt_To_Http : Done for SmartGarden & SmartPrinter + Update Service avec SmartGardenMessage

This commit is contained in:
ThomasFransolet 2019-04-17 23:11:23 +02:00
parent 144c74d7cc
commit b21572f372
10 changed files with 164 additions and 42 deletions

View File

@ -26,23 +26,47 @@ namespace MyCore.Controllers
/// <summary>
/// Retrieve all SmartPrinterMessage
/// </summary>
[HttpGet]
public ActionResult<List<SmartPrinterMessage>> Get(int id)
[HttpGet("smartprinter/{idDevice}")]
public ActionResult<List<SmartPrinterMessage>> GetSmartPrinterMessages(int id)
{
return _ioTDeviceService.Get();
return _ioTDeviceService.GetSmartPrinterMessages();
}
// POST: IOT/Create
/// <summary>
/// It's the method to post data from mqtt broker to Database (Thanks Rpi!)
/// </summary>
[HttpPost("{idDevice}")]
public IActionResult PostToDB(int idDevice, [FromBody] SmartPrinterMessage[] content)
[HttpPost("smartprinter/{idDevice}")]
public IActionResult PostToDBPrinter(int idDevice, [FromBody] SmartPrinterMessage[] content)
{
if(idDevice == 0) {
if(idDevice == 0)
{
foreach (SmartPrinterMessage message in content) {
_ioTDeviceService.Create(message);
message.Type = "SmartPrinter";
_ioTDeviceService.CreateSmartPrinterMessage(message);
}
return StatusCode(201);
}
return StatusCode(500);
}
// POST: IOT/Create
/// <summary>
/// It's the method to post data from mqtt broker to Database (Thanks Rpi!)
/// </summary>
[HttpPost("smartgarden/{idDevice}")]
public IActionResult PostToDBSmartGarden(int idDevice, [FromBody] SmartGardenMessage[] content)
{
if (idDevice == 0)
{
foreach (SmartGardenMessage message in content)
{
message.Type = "SmartGarden";
_ioTDeviceService.CreateSmartGardenMessage(message);
}
return StatusCode(201);

View File

@ -0,0 +1,37 @@
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MyCore.Models
{
public class SmartGardenMessage
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("Type")]
public string Type { get; set; }
[BsonElement("Time")]
public string Time { get; set; }
[BsonElement("Temperature")]
public double Temperature { get; set; }
[BsonElement("Pressure")]
public double Pressure { get; set; }
[BsonElement("Humidity")]
public double Humidity { get; set; }
[BsonElement("Water")]
public int Water { get; set; }
[BsonElement("Light")]
public int Light { get; set; }
}
}

View File

@ -13,6 +13,9 @@ namespace MyCore.Models
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("Type")]
public string Type { get; set; }
[BsonElement("Time")]
public string Time { get; set; }

View File

@ -13,30 +13,48 @@ namespace MyCore.Services
public class IoTDeviceService
{
private readonly IMongoCollection<SmartPrinterMessage> _SmartPrinterMessages;
private readonly IMongoCollection<SmartGardenMessage> _SmartGardenMessages;
public IoTDeviceService(IConfiguration config)
{
var client = new MongoClient(config.GetConnectionString("MyCoreDb"));
var database = client.GetDatabase("MyCoreDb");
_SmartPrinterMessages = database.GetCollection<SmartPrinterMessage> ("IoTDevices");
_SmartGardenMessages = database.GetCollection<SmartGardenMessage>("IoTDevices");
}
public List<SmartPrinterMessage> Get()
public List<SmartPrinterMessage> GetSmartPrinterMessages()
{
return _SmartPrinterMessages.Find(m => true).ToList();
}
public SmartPrinterMessage Get(string id)
public SmartPrinterMessage GetSmartPrinterMessage(string id)
{
return _SmartPrinterMessages.Find<SmartPrinterMessage>(m => m.Id == id).FirstOrDefault();
}
public SmartPrinterMessage Create(SmartPrinterMessage message)
public SmartPrinterMessage CreateSmartPrinterMessage(SmartPrinterMessage message)
{
_SmartPrinterMessages.InsertOne(message);
return message;
}
public List<SmartGardenMessage> GetSmartGardenMessages()
{
return _SmartGardenMessages.Find(m => true).ToList();
}
public SmartGardenMessage GetSmartGardenMessage(string id)
{
return _SmartGardenMessages.Find<SmartGardenMessage>(m => m.Id == id).FirstOrDefault();
}
public SmartGardenMessage CreateSmartGardenMessage(SmartGardenMessage message)
{
_SmartGardenMessages.InsertOne(message);
return message;
}
/*public void Update(string id, Book bookIn)
{
_books.ReplaceOne(book => book.Id == id, bookIn);

View File

@ -4,12 +4,17 @@
<name>MyCore</name>
</assembly>
<members>
<member name="M:MyCore.Controllers.IOTController.Get(System.Int32)">
<member name="M:MyCore.Controllers.IOTController.GetSmartPrinterMessages(System.Int32)">
<summary>
Retrieve all SmartPrinterMessage
</summary>
</member>
<member name="M:MyCore.Controllers.IOTController.PostToDB(System.Int32,MyCore.Models.SmartPrinterMessage[])">
<member name="M:MyCore.Controllers.IOTController.PostToDBPrinter(System.Int32,MyCore.Models.SmartPrinterMessage[])">
<summary>
It's the method to post data from mqtt broker to Database (Thanks Rpi!)
</summary>
</member>
<member name="M:MyCore.Controllers.IOTController.PostToDBSmartGarden(System.Int32,MyCore.Models.SmartGardenMessage[])">
<summary>
It's the method to post data from mqtt broker to Database (Thanks Rpi!)
</summary>

View File

@ -4,12 +4,17 @@
<name>MyCore</name>
</assembly>
<members>
<member name="M:MyCore.Controllers.IOTController.Get(System.Int32)">
<member name="M:MyCore.Controllers.IOTController.GetSmartPrinterMessages(System.Int32)">
<summary>
Retrieve all SmartPrinterMessage
</summary>
</member>
<member name="M:MyCore.Controllers.IOTController.PostToDB(System.Int32,MyCore.Models.SmartPrinterMessage[])">
<member name="M:MyCore.Controllers.IOTController.PostToDBPrinter(System.Int32,MyCore.Models.SmartPrinterMessage[])">
<summary>
It's the method to post data from mqtt broker to Database (Thanks Rpi!)
</summary>
</member>
<member name="M:MyCore.Controllers.IOTController.PostToDBSmartGarden(System.Int32,MyCore.Models.SmartGardenMessage[])">
<summary>
It's the method to post data from mqtt broker to Database (Thanks Rpi!)
</summary>

View File

@ -12,11 +12,13 @@ broker="localhost"
#password="lEyZb90q49Rf"
# defining the api-endpoint
API_ENDPOINT = 'http://192.168.0.17:3000/api/iot/0'
API_ENDPOINT_SmartPrinter = 'http://192.168.0.17:3000/api/iot/smartprinter/'
API_ENDPOINT_SmartGarden = 'http://192.168.0.17:3000/api/iot/smartgarden/'
delay = 5000
bufferJsonPrinter = []
bufferJsonSmartGarden = []
headersVar = {}
def getToken():
@ -34,6 +36,7 @@ def getToken():
def on_message(mosq, obj, msg):
print("Topic = " + msg.topic)
global bufferJsonPrinter
global bufferJsonSmartGarden
global headers
if msg.topic == '3DPrinterSensors' :
@ -42,7 +45,7 @@ def on_message(mosq, obj, msg):
# Add increment and test = if data length >= 10, push to DB via Http
# Add Verification on token.. if status code == 401 forbidden then get token and call again the service
validData = False;
validDataPrinter = False;
try :
msgPayload = '{"Time":"'+ str(datetime.datetime.now()) + '",'+ msgPayload[1:]
@ -51,21 +54,18 @@ def on_message(mosq, obj, msg):
#item_dict = json.loads(bufferJsonPrinter)
#print("BufferJsonPrinter= " + json.dumps(bufferJsonPrinter))
print("3DPrinterMessage = NumberOfElement already collected : " + str(len(bufferJsonPrinter)))
validData = True;
validDataPrinter = True;
except Exception as e:
print(e)
print("3DPrinterMessage = Got an error in parsing message")
if validData and len(bufferJsonPrinter) == 10:
if validDataPrinter and len(bufferJsonPrinter) == 10:
print("I'm in !")
# Request
#jsonData1 = json.dumps([{'Time': '14/04/19', 'Temperature': 26.5, 'Pressure': 1004.3, 'Smoke': 100},{'Time': '14/04/19', 'Temperature': 26.5, 'Pressure': 1004.3, 'Smoke': 100}])
try:
jsonData = bufferJsonPrinter
#print('jsonData1 : ' + jsonData1)
#print('jsonData : ' + str(jsonData).replace("'",""))
printerRequest = requests.post(API_ENDPOINT,data=str(jsonData).replace("'",""), headers=headersVar)
printerRequest = requests.post(API_ENDPOINT_SmartPrinter + "0",data=str(bufferJsonPrinter).replace("'",""), headers=headersVar)
except Exception as e:
print(e)
print("3DPrinterMessage = error in post request")
@ -73,14 +73,13 @@ def on_message(mosq, obj, msg):
while printerRequest.status_code == 401:
getToken()
time.sleep(20)
time.sleep(30)
print("3DPrinterMessage = Forbidden error : Trying to send again the request with new token")
#jsonData = json.dumps([{'Time': '14/04/19', 'Temperature': 26.5, 'Pressure': 1004.3, 'Smoke': 100}])
printerRequest = requests.post(API_ENDPOINT,data=bufferJsonPrinter["result"], headers=headersVar)
printerRequest = requests.post(API_ENDPOINT_SmartPrinter + "0",data=str(bufferJsonPrinter).replace("'",""), headers=headersVar)
if printerRequest.status_code == 404:
print("3DPrinterMessage = The server is unreachable (404)")
if printerRequest.status_code == 400:
elif printerRequest.status_code == 400:
print("3DPrinterMessage = Bad request (400)")
elif printerRequest.status_code == 200 or printerRequest.status_code == 201:
print("3DPrinterMessage = I sent the infos ! Everything is ok :) !")
@ -93,21 +92,50 @@ def on_message(mosq, obj, msg):
#data = r.json()
elif msg.topic == 'SmartGarden' :
print(str(msg.payload, "utf-8"))
msgPayload = str(msg.payload, "utf-8")
print("SmartGardenMessage = PayLoad : " + msgPayload)
# data to be sent to api
data = {'api_dev_key':'',
'api_option':'paste',
'api_paste_code':source_code,
'api_paste_format':'python'}
# Add increment and test = if data length >= 10, push to DB via Http
# Add Verification on token.. if status code == 401 forbidden then get token and call again the service
validDataSmartGarden = False;
try :
msgPayload = '{"Time":"'+ str(datetime.datetime.now()) + '",'+ msgPayload[1:]
bufferJsonSmartGarden.append(msgPayload)
print("SmartGardenMessage = NumberOfElement already collected : " + str(len(bufferJsonSmartGarden)))
validDataSmartGarden = True;
except Exception as e:
print(e)
print("SmartGardenMessage = Got an error in parsing message")
# sending post request and saving response as response object
r = requests.post(url = API_ENDPOINT, data = data)
if validDataSmartGarden and len(bufferJsonSmartGarden) == 10:
print("I'm in !")
try:
print(headersVar)
print("Request = " + str(bufferJsonSmartGarden).replace("'",""))
smartGardenRequest = requests.post(API_ENDPOINT_SmartGarden + "0",data=str(bufferJsonSmartGarden).replace("'",""), headers=headersVar)
except Exception as e:
print(e)
print("SmartGardenMessage = error in post request")
while smartGardenRequest.status_code == 401:
getToken()
time.sleep(30)
print("SmartGardenMessage = Forbidden error : Trying to send again the request with new token")
smartGardenRequest = requests.post(API_ENDPOINT_SmartGarden + "0",data=str(bufferJsonSmartGarden).replace("'",""), headers=headersVar)
if smartGardenRequest.status_code == 404:
print("SmartGardenMessage = The server is unreachable (404)")
elif smartGardenRequest.status_code == 400:
print("SmartGardenMessage = Bad request (400)")
elif smartGardenRequest.status_code == 200 or smartGardenRequest.status_code == 201:
print("SmartGardenMessage = I sent the infos ! Everything is ok :) !")
bufferJsonSmartGarden = []
else:
print(str(smartGardenRequest.status_code))
print("SmartGardenMessage = Unexpected Error : status code")
# extracting response text
pastebin_url = r.text
print("The pastebin URL is:%s"%pastebin_url)
else:
print("Unknown topic")
@ -116,15 +144,17 @@ def on_message(mosq, obj, msg):
mqttc = mqtt.Client('Mqtt_To_Http_Interceptor')
#mqttc.username_pw_set(username, password)
print("connecting to broker : ",broker)
mqttc.connect(broker, 1883)
TOKEN_URL = 'http://192.168.0.17:3000/api/token?username=Thomas&password=MonsieurMagic'
print("trying to retrieve a token from server")
getToken()
mqttc.on_message=on_message
#####
print("connecting to broker ",broker)
mqttc.loop_start() #start loop to process received messages
print("subscribing ")
mqttc.subscribe("SmartGarden")#subscribe

View File

@ -240,8 +240,8 @@ try:
#print ("Temperature : ", temperature, "C")
#print ("Pressure : ", pressure, "hPa")
#print ("Humidity : ", humidity, "%")
# Pause for ten seconds.
time.sleep(10)
# Pause for one minute.
time.sleep(60)
except KeyboardInterrupt:
# here you put any code you want to run before the program