Select Git revision
exampleresources.py
-
Server (Shared Users) authoredServer (Shared Users) authored
exampleresources.py 9.21 KiB
import json
import uuid
import math
import triangulation
from pymongo import MongoClient
from coapthon import defines
from coapthon.resources.resource import Resource
class RpNodeInfoResource(Resource):
def __init__(self, name="RpNodeInfo"):
super(RpNodeInfoResource, self).__init__(name)
self.payload = "RpNodeInfo resource"
try:
self.conn = MongoClient('mongodb://iotuser:iotsystem@localhost/IoT_System', 27017)
self.db = self.conn.IoT_System
self.collection = self.db.RpNodeData
except:
print("Could not connect to MongoDB")
def render_POST_advanced(self, request, response):
self.payload = request.payload
from coapthon.messages.response import Response
assert(isinstance(response, Response))
self.payload = json.loads(self.payload)
if self.payload['option'] == 1:
self.calculateNodePosition(sefl.payload)
else :
response.payload = self.postRpNodeInfoInDB(self.payload)
response.code = defines.Codes.CREATED.number
return self, response
def render_PUT_advanced(self, request, response):
self.payload = request.payload
from coapthon.messages.response import Response
assert(isinstance(response, Response))
self.payload = json.loads(self.payload)
if self.payload['option'] == 1:
self.calculateNodePosition(self.payload)
else :
response.payload = self.postRpNodeInfoInDB(self.payload)
response.code = defines.Codes.CHANGED.number
return self, response
def postRpNodeInfoInDB(self, info):
info = info['myMAC']
self.collection.delete_many({ 'rpMAC' : info })
rpuuid = "52528282"+str(uuid.uuid4())[8:]
rpuuid = rpuuid.replace("-","")
if self.collection.count() == 0:
payload = {
'rpMAC' : info,
'rpuuid' : rpuuid
}
self.collection.insert_one(payload)
response = json.dumps({
'rpuuid' : rpuuid,
'operate' : 0
})
else:
payload = {
'rpMAC' : info,
'rpuuid' : rpuuid
}
self.collection.insert_one(payload)
response = json.dumps({
'rpuuid' : rpuuid,
'operate' : 1
})
return response
def calculateNodePosition(self, info):
print("Start calculateNodePosition")
info = info['rpuuid']
graphColletion = self.db.RpGraphData
mydoc = self.collection.find({'rpuuid': info})
if mydoc.count() == 1:
if self.collection.count() == 1:
self.collection.update({'rpuuid' : info}, {'$set':{'x': 0.0, 'y': 0.0}}, False)
elif self.collection.count() == 2:
graphB = graphColletion.find({'v2': info})
x = graphB[0]['distance']
self.collection.update({'rpuuid' : info}, {'$set':{'x': x, 'y': 0.0}}, False)
elif self.collection.count() == 3:
graphC = graphColletion.find({'v2': info})
for doc in graphC:
tempdoc = self.collection.find({'rpuuid': doc['v1']})
if tempdoc[0]['x'] == 0 and tempdoc[0]['y'] == 0:
vertexA = tempdoc[0]
vertexB = tempdoc[0]
dis = {
'a': graphColletion.find({'v1': vertexB[0][rpuuid], 'v2': info})[0]['distance'],
'b': graphColletion.find({'v1': vertexA[0][rpuuid], 'v2': info})[0]['distance'],
'c': vertexB[0]['x']
}
cosA = (math.pow(dis['b'], 2) + math.pow(dis['c'], 2) - math.pow(dis['a'], 2)) / (2 * dis['b'] * dis['c'])
sinA = math.sqrt((1 - math.pow(cosA,2)))
x = b * cosA
y = b * sinA
self.collection.update({'rpuuid' : info}, {'$set':{'x': x, 'y': y}}, False)
else:
graphD = graphColletion.find({'v2' : info})
nodeLocationData = []
for g in graphD:
nodeLocationData.append({
'rpuuid': g['v1'],
'distance': g['distance']
})
nodeLocationData = sorted(nodeLocationData, key=lambda k: k['distance'], reverse = False)
if len(nodeLocationData) < 3:
return
nodeList = []
for i in range(3):
nodeList.append({
'x': self.piNodeCollection.find({'rpuuid': nodeLocationData[i]['rpuuid']})[0]['x'],
'y': self.piNodeCollection.find({'rpuuid': nodeLocationData[i]['rpuuid']})[0]['y'],
'distance': nodeLocationData[i]['distance']
})
triangulationInst = triangulation.Triangulation(nodeList[:3])
x, y = triangulation.doTriangulation()
if x == None:
return
self.collection.update({'rpuuid' : info}, {'$set':{'x': x, 'y': y}}, False)
class RpGraphInfoResource(Resource):
def __init__(self, name="RpGraphInfo"):
super(RpGraphInfoResource, self).__init__(name)
self.payload = "RpGraphInfo resource"
try:
self.conn = MongoClient('mongodb://iotuser:iotsystem@localhost/IoT_System', 27017)
except:
print("Could not connect to MongoDB")
self.db = self.conn.IoT_System
self.collection = self.db.RpGraphData
def render_GET_advanced(self, request, response):
response.payload = self.payload
response.max_age = 20
response.code = defines.Codes.CONTENT.number
return self, response
def render_POST_advanced(self, request, response):
self.payload = request.payload
from coapthon.messages.response import Response
assert(isinstance(response, Response))
response.payload = self.postRpGraphInfoInDB(self.payload)
response.code = defines.Codes.CREATED.number
return self, response
def render_PUT_advanced(self, request, response):
self.payload = request.payload
from coapthon.messages.response import Response
assert(isinstance(response, Response))
response.payload = self.postRpGraphInfoInDB(self.payload)
response.code = defines.Codes.CHANGED.number
return self, response
def render_DELETE_advanced(self, request, response):
response.payload = "Response deleted"
response.code = defines.Codes.DELETED.number
return True, response
def postRpGraphInfoInDB(self, info):
info = json.loads(info)
mydoc = self.collection.find({'v1':info['v1'], 'v2':info['v2']})
if mydoc.count() > 0:
distance = (mydoc[0]['sum']+info['distance']) / (mydoc[0]['count'] + 1)
self.collection.update({ 'v1' : info['v1'], 'v2':info['v2']}, {
'v1':info['v1'],
'v2': info['v2'],
'distance' : distance,
'sum': mydoc[0]['sum']+float(info['distance']),
'count': mydoc[0]['count']+1
}, upsert=True)
if mydoc.count() == 0:
self.collection.update({ 'v1' : info['v1'], 'v2':info['v2']}, {
'v1':info['v1'],
'v2': info['v2'],
'distance' : float(info['distance']),
'sum': float(info['distance']),
'count': 1
}, upsert=True)
class BleInfoResource(Resource):
def __init__(self, name="BleInfo"):
super(BleInfoResource, self).__init__(name)
self.payload = "BleInfo resource"
try:
self.conn = MongoClient('mongodb://iotuser:iotsystem@localhost/IoT_System', 27017)
self.db = self.conn.IoT_System
self.collection = self.db.TrackingData
except:
print("Could not connect to MongoDB")
def render_GET_advanced(self, request, response):
response.payload = self.payload
response.max_age = 20
response.code = defines.Codes.CONTENT.number
return self, response
def render_POST_advanced(self, request, response):
self.payload = request.payload
self.postBLEInfoInDB(self.payload)
from coapthon.messages.response import Response
assert isinstance(response, Response)
response.payload = "Response changed through POST"
response.code = defines.Codes.CREATED.number
return self, response
def render_PUT_advanced(self, request, response):
self.payload = request.payload
self.postBLEInfoInDB(self.payload)
from coapthon.messages.response import Response
assert isinstance(response, Response)
response.payload = "Response changed through PUT"
response.code = defines.Codes.CHANGED.number
return self, response
def render_DELETE_advanced(self, request, response):
response.payload = "Response deleted"
response.code = defines.Codes.DELETED.number
return True, response
def postBLEInfoInDB(self, payload):
self.collection.insert_many(json.loads(payload))