Skip to content
Snippets Groups Projects
Select Git revision
  • 5d7df41509d411f0ab7e461d4af0bdbb3e1df200
  • master default protected
  • test
3 results

exampleresources.py

Blame
  • 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))