diff --git a/RPi_Client/CoAPthon3/coapclient.py b/RPi_Client/CoAPthon3/coapclient.py index a3812a30018c09d5f192ce79d0007549033847ff..b80a69a1196c0bd038deee7abba439e3c0ad18f5 100644 --- a/RPi_Client/CoAPthon3/coapclient.py +++ b/RPi_Client/CoAPthon3/coapclient.py @@ -26,7 +26,7 @@ class CoapClient(): self._beacon = BeaconEmit() def obtainMyID(self): - path = "/rasbpNodeInfoPath" + path = "/rpNodeInfoPath" path = "coap://" + self.ip + path host, port, path = parse_uri(path) @@ -41,11 +41,11 @@ class CoapClient(): try: payload = { 'option' : 0, - 'myMAC' : self.myMAC + 'rpMAC' : self.myMAC } response = client.put(path, json.dumps(payload)) print((response.pretty_print())) - string = json.loads(response.payload)['uuid'] + string = json.loads(response.payload)['rpuuid'] except KeyboardInterrupt: print("obtainMyID Stop") @@ -65,7 +65,7 @@ class CoapClient(): self._beacon.beacon_Start(string) def calculateNodePositionAtServer(self): - path = "/rasbpNodeInfoPath" + path = "/rpNodeInfoPath" path = "coap://" + self.ip + path host, port, path = parse_uri(path) @@ -80,7 +80,7 @@ class CoapClient(): try: payload = { 'option' : 1, - 'myuuid' : self.myuuid + 'rpuuid' : self.myuuid } response = client.put(path, json.dumps(payload)) print((response.pretty_print())) @@ -143,8 +143,8 @@ class CoapClient(): n = 2.2 distance = math.pow(10, (float(info[4]) - float(info[5])) / (10 * n)) payload = { - 'rasbpuuid' : self.myuuid, - 'uuid' : info[1], + 'rpuuid' : self.myuuid, + 'useruuid' : info[1], 'distance' : distance, 'updateTime' : time.time() } @@ -152,7 +152,7 @@ class CoapClient(): def regiRelWithNewPi(self, info): #새로운 rasbPi를 찾은 경우 새로운 rasbPi를 위치측정기로 사용하기 위해서 server에 관련 정보를 저장하는 method - path = "/rasbpGraphInfoPath" + path = "/rpGraphInfoPath" path = "coap://" + self.ip + path host, port, path = parse_uri(path) @@ -165,7 +165,7 @@ class CoapClient(): client = HelperClient(server=(host, port)) try: - response = client.put(path, json.dumps(self.mkJsonRasbpgraphInfo(info))) + response = client.put(path, json.dumps(self.mkJsonRpgraphInfo(info))) print((response.pretty_print())) except KeyboardInterrupt: @@ -173,7 +173,7 @@ class CoapClient(): client.stop() client.stop() - def mkJsonRasbpgraphInfo(self, info): + def mkJsonRpgraphInfo(self, info): n = 2.2 print(info) distance = math.pow(10, ((float(info[4]) - float(info[5])) / (10 * n))) diff --git a/Server_CoAP/CoAPthon3/coapserver.py b/Server_CoAP/CoAPthon3/coapserver.py index 373183afc4ffa7ad5622999ce4fb6228e20d9591..3f80d0f73d38c9f6b33dc05488a7a0bd21a49b88 100644 --- a/Server_CoAP/CoAPthon3/coapserver.py +++ b/Server_CoAP/CoAPthon3/coapserver.py @@ -3,24 +3,105 @@ import getopt import sys import threading import _thread +import time +import datetime +import json +import triangulation from coapthon.server.coap import CoAP -from exampleresources import BleInfoResource, RasbpNodeInfoResource, RasbpGraphInfoResource - +from exampleresources import BleInfoResource, RpNodeInfoResource, RpGraphInfoResource +from pymongo import MongoClient class CoAPServer(CoAP): def __init__(self, host, port, multicast=False): CoAP.__init__(self, (host, port), multicast) self.add_resource('bleInfoPath/', BleInfoResource()) - self.add_resource('rasbpNodeInfoPath/', RasbpNodeInfoResource()) - self.add_resource('rasbpGraphInfoPath/', RasbpGraphInfoResource()) + self.add_resource('rpNodeInfoPath/', RpNodeInfoResource()) + self.add_resource('rpGraphInfoPath/', RpGraphInfoResource()) print(("CoAP Server start on " + host + ":" + str(port))) print((self.root.dump())) + try: + self.conn = MongoClient('mongodb://iotuser:iotsystem@localhost/IoT_System', 27017) + self.db = self.conn.IoT_System + self.piNodeCollection = self.db.RpNodeData + self.userNodeCollection = self.db.UserNodeData + self.trackingCollection = self.db.TrackingData + self.usersCollection = self.db.users + except: + print("Could not connect to MongoDB") + def updateUserLocation(self): - - pass + try: + while True: + cursor = self.usersCollection.find() + for c in cursor: + positionCalculationThread = threading.Thread(target = self.positionCalculation, args=([c['uuid']])) + positionCalculationThread.start() + time.sleep(3) + except KeyboardInterrupt: + print("existing updateUserLocation") + + def positionCalculation(self, useruuid): + currentTime = time.time() + """ + trackingCursor = self.trackingCollection.find({'$and':[{'useruuid':{'$eq' : useruuid}}, + {'updateTime':{'$gt' : currentTime - 3}}]}) + 실제 코드, 밑에는 테스트용 코드 + """ + trackingCursor = self.trackingCollection.find({'$and':[{'useruuid':{'$eq' : useruuid}}]}) + userLocationData =[] + + flag = 0 + for c in trackingCursor: + for i in userLocationData: + if i['rpuuid'] == c['rpuuid']: + i['sum']+= c['distance'] + i['count']+=1 + i['distance'] = i['sum']/i['count'] + flag = 1 + break + if flag == 0: + userLocationData.append({ + 'rpuuid': c['rpuuid'], + 'distance': c['distance'], + 'sum': c['distance'], + 'count':1 + }) + flag = 0 + + userLocationData = sorted(userLocationData, key=lambda k: k['distance'], reverse = False) + + if len(userLocationData) < 3: + return + + nodeList = [] + for i in range(3): + nodeList.append({ + 'x': self.piNodeCollection.find({'rpuuid': userLocationData[i]['rpuuid']})[0]['x'], + 'y': self.piNodeCollection.find({'rpuuid': userLocationData[i]['rpuuid']})[0]['y'], + 'distance': userLocationData[i]['distance'] + }) + + triangulationInst = triangulation.Triangulation(nodeList[:3]) + x, y = triangulationInst.doTriangulation() + + if x == None: + return + dd = datetime.datetime.now() + dd = dd.replace(hour=dd.hour + 9) + userNodeData = { + 'rpuuid1': userLocationData[0]['rpuuid'], + 'rpuuid2': userLocationData[1]['rpuuid'], + 'rpuuid3': userLocationData[2]['rpuuid'], + 'useruuid': useruuid, + 'x': x, + 'y': y, + 'updateTime': str(dd) + } + print(userNodeData) + self.userNodeCollection.insert_one(userNodeData) def usage(): # pragma: no cover print("coapserver.py -i <ip address> -p <port>") diff --git a/Server_CoAP/CoAPthon3/exampleresources.py b/Server_CoAP/CoAPthon3/exampleresources.py index cffc127728f3e74371313766ad8ea857673ff30e..4c44314c3c49265c46ef9faadf3a1dcc7a8bbd1f 100644 --- a/Server_CoAP/CoAPthon3/exampleresources.py +++ b/Server_CoAP/CoAPthon3/exampleresources.py @@ -1,17 +1,19 @@ import json import uuid +import math +import triangulation from pymongo import MongoClient from coapthon import defines from coapthon.resources.resource import Resource -class RasbpNodeInfoResource(Resource): - def __init__(self, name="RasbpNodeInfo"): - super(RasbpNodeInfoResource, self).__init__(name) - self.payload = "RasbpNodeInfo 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.RasbpNodeData + self.collection = self.db.RpNodeData except: print("Could not connect to MongoDB") @@ -23,7 +25,7 @@ class RasbpNodeInfoResource(Resource): if self.payload['option'] == 1: self.calculateNodePosition(sefl.payload) else : - response.payload = self.postRasbpNodeInfoInDB(self.payload) + response.payload = self.postRpNodeInfoInDB(self.payload) response.code = defines.Codes.CREATED.number return self, response @@ -35,69 +37,111 @@ class RasbpNodeInfoResource(Resource): if self.payload['option'] == 1: self.calculateNodePosition(self.payload) else : - response.payload = self.postRasbpNodeInfoInDB(self.payload) + response.payload = self.postRpNodeInfoInDB(self.payload) response.code = defines.Codes.CHANGED.number return self, response - def postRasbpNodeInfoInDB(self, info): + def postRpNodeInfoInDB(self, info): info = info['myMAC'] - self.collection.delete_many({ 'rasbpMAC' : info }) - ruuid = "52528282"+str(uuid.uuid4())[8:] - ruuid = ruuid.replace("-","") + self.collection.delete_many({ 'rpMAC' : info }) + rpuuid = "52528282"+str(uuid.uuid4())[8:] + rpuuid = rpuuid.replace("-","") if self.collection.count() == 0: payload = { - 'rasbpMAC' : info, - 'uuid' : ruuid + 'rpMAC' : info, + 'rpuuid' : rpuuid } self.collection.insert_one(payload) response = json.dumps({ - 'uuid' : ruuid, + 'rpuuid' : rpuuid, 'operate' : 0 }) else: payload = { - 'rasbpMAC' : info, - 'uuid' : ruuid, + 'rpMAC' : info, + 'rpuuid' : rpuuid } self.collection.insert_one(payload) response = json.dumps({ - 'uuid' : ruuid, + 'rpuuid' : rpuuid, 'operate' : 1 }) return response def calculateNodePosition(self, info): print("Start calculateNodePosition") - info = info['myuuid'] - graphColletion = self.db.RasbpGraphData - mydoc = self.collection.find({'uuid': info}) - if mydoc.count() == 1: - if self.collection.count() == 1: - pass - else if self.collection.count() == 2: - pass - else if self.collection.count() == 3: - pass - else: - pass - - else : - print("This is not registered Node") + 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 RasbpGraphInfoResource(Resource): - def __init__(self, name="RasbpGraphInfo"): - super(RasbpGraphInfoResource, self).__init__(name) - self.payload = "RasbpGraphInfo resource" - +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.RasbpGraphData + self.collection = self.db.RpGraphData def render_GET_advanced(self, request, response): response.payload = self.payload @@ -109,7 +153,7 @@ class RasbpGraphInfoResource(Resource): self.payload = request.payload from coapthon.messages.response import Response assert(isinstance(response, Response)) - response.payload = self.postRasbpGraphInfoInDB(self.payload) + response.payload = self.postRpGraphInfoInDB(self.payload) response.code = defines.Codes.CREATED.number return self, response @@ -117,7 +161,7 @@ class RasbpGraphInfoResource(Resource): self.payload = request.payload from coapthon.messages.response import Response assert(isinstance(response, Response)) - response.payload = self.postRasbpGraphInfoInDB(self.payload) + response.payload = self.postRpGraphInfoInDB(self.payload) response.code = defines.Codes.CHANGED.number return self, response @@ -126,7 +170,7 @@ class RasbpGraphInfoResource(Resource): response.code = defines.Codes.DELETED.number return True, response - def postRasbpGraphInfoInDB(self, info): + def postRpGraphInfoInDB(self, info): info = json.loads(info) mydoc = self.collection.find({'v1':info['v1'], 'v2':info['v2']}) if mydoc.count() > 0: diff --git a/Server_CoAP/CoAPthon3/triangulation.py b/Server_CoAP/CoAPthon3/triangulation.py new file mode 100644 index 0000000000000000000000000000000000000000..9365c81e13eaee5030a8d2e628d55e76b1166286 --- /dev/null +++ b/Server_CoAP/CoAPthon3/triangulation.py @@ -0,0 +1,250 @@ +import math + +class Triangulation(): + def __init__(self, nodeList): + self.n = nodeList + for a in self.n: + print(a) + + def cal_distance(self, a1,b1,a2,b2): + return math.sqrt((a2-a1)*(a2-a1)+(b2-b1)*(b2-b1)) + + def first_situation(self, a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가 서로에게 모두 겹치는 경우가 있는 경우이다 + line_position = [[0,0,0],[0,0,0],[0,0,0]]#Ax+By=c의 형태[A,B,C] + meet1 = [[0,0],[0,0],[0,0]] + meet2 = [[0,0],[0,0],[0,0]] + meet_result = [[0,0],[0,0],[0,0]] + #첫번째 직선(1,2) + line_position[0][0]=-2*a1+2*a2 + line_position[0][1]=-2*b1+2*b2 + line_position[0][2]=(r1*r1-r2*r2)+(a2*a2-a1*a1)+(b2*b2-b1*b1) + #두번째 직선(1,3) + line_position[1][0]=-2*a1+2*a3 + line_position[1][1]=-2*b1+2*b3 + line_position[1][2]=(r1*r1-r3*r3)+(a3*a3-a1*a1)+(b3*b3-b1*b1) + #세번째 직선(2,3) + line_position[2][0]=-2*a2+2*a3 + line_position[2][1]=-2*b2+2*b3 + line_position[2][2]=(r2*r2-r3*r3)+(a3*a3-a2*a2)+(b3*b3-b2*b2) + + #첫번째 직선의 교점 + if(line_position[0][0]==0 and line_position[0][1]!=0): + meet1[0][1]=line_position[0][2]/line_position[0][1] + meet2[0][1]=meet1[0][1] + meet1[0][0]=math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1))+a1 + meet2[0][0]=a1-math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1)) + if(self.cal_distance(meet1[0][0],meet1[0][1],a3,b3)>=self.cal_distance(meet2[0][0],meet2[0][1],a3,b3)): + meet_result[0][0]=meet2[0][0] + meet_result[0][1]=meet2[0][1] + else: + meet_result[0][0]=meet1[0][0] + meet_result[0][1]=meet1[0][1] + elif(line_position[0][0]!=0 and line_position[0][1]==0): + meet1[0][0]=line_position[0][2]/line_position[0][0] + meet2[0][0]=meet1[0][0] + meet1[0][1]=math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1))+b1 + meet2[0][1]=b1-math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1)) + if(self.cal_distance(meet1[0][0],meet1[0][1],a3,b3)>=self.cal_distance(meet2[0][0],meet2[0][1],a3,b3)): + meet_result[0][0]=meet2[0][0] + meet_result[0][1]=meet2[0][1] + else: + meet_result[0][0]=meet1[0][0] + meet_result[0][1]=meet1[0][1] + else: + a=1+(line_position[0][0]/line_position[0][1])*(line_position[0][0]/line_position[0][1]) + b=(-2*a1)+((-2*line_position[0][0]*line_position[0][2]) / (line_position[0][1]*line_position[0][1]))+(2*line_position[0][0]*b1/line_position[0][1]) + c=(line_position[0][2]/line_position[0][1])*(line_position[0][2]/line_position[0][1]) + (-2*line_position[0][2]*b1/line_position[0][1]) + b1*b1 - r1*r1 + a1*a1 + meet1[0][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a) + meet2[0][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a) + meet1[0][1]=(-1*line_position[0][0]*meet1[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1]) + meet2[0][1]=(-1*line_position[0][0]*meet2[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1]) + if(self.cal_distance(meet1[0][0],meet1[0][1],a3,b3)>=self.cal_distance(meet2[0][0],meet2[0][1],a3,b3)): + meet_result[0][0]=meet2[0][0] + meet_result[0][1]=meet2[0][1] + else: + meet_result[0][0]=meet1[0][0] + meet_result[0][1]=meet1[0][1] + print("x1:",meet_result[0][0],"y1:",meet_result[0][1]) + + #두번째 직선의 교점 + if(line_position[1][0]==0 and line_position[1][1]!=0): + meet1[1][1]=line_position[1][2]/line_position[1][1] + meet2[1][1]=meet1[0][1] + meet1[1][0]=math.sqrt(r1*r1-(meet1[1][1]-b1)*(meet1[1][1]-b1))+a1 + meet2[1][0]=a1-math.sqrt(r1*r1-(meet1[1][1]-b1)*(meet1[0][1]-b1)) + if(self.cal_distance(meet1[1][0],meet1[1][1],a2,b2)>=self.cal_distance(meet2[1][0],meet2[1][1],a2,b2)): + meet_result[1][0]=meet2[1][0] + meet_result[1][1]=meet2[1][1] + else: + meet_result[1][0]=meet1[1][0] + meet_result[1][1]=meet1[1][1] + elif(line_position[1][0]!=0 and line_position[1][1]==0): + meet1[1][0]=line_position[1][2]/line_position[1][0] + meet2[1][0]=meet1[1][0] + meet1[1][1]=math.sqrt(r1*r1-(meet1[1][0]-a1)*(meet1[1][0]-a1))+b1 + meet2[1][1]=b1-math.sqrt(r1*r1-(meet1[1][0]-a1)*(meet1[1][0]-a1)) + if(self.cal_distance(meet1[1][0],meet1[1][1],a2,b2)>=self.cal_distance(meet2[1][0],meet2[1][1],a2,b2)): + meet_result[1][0]=meet2[1][0] + meet_result[1][1]=meet2[1][1] + else: + meet_result[1][0]=meet1[1][0] + meet_result[1][1]=meet1[1][1] + else: + a=1+((line_position[1][0]/line_position[1][1])*(line_position[1][0]/line_position[1][1])) + b=(-2*a1)+((-2*line_position[1][0]*line_position[1][2]) / (line_position[1][1]*line_position[1][1]))+((2*line_position[1][0]*b1)/line_position[1][1]) + c=((line_position[1][2]/line_position[1][1])*(line_position[1][2]/line_position[1][1])) + ((-2*line_position[1][2]*b1)/line_position[1][1]) + b1*b1 - r1*r1 + a1*a1 + meet1[1][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a) + meet2[1][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a) + meet1[1][1]=(-1*line_position[1][0]*meet1[1][0]/line_position[1][1])+(line_position[1][2]/line_position[1][1]) + meet2[1][1]=(-1*line_position[1][0]*meet2[1][0]/line_position[1][1])+(line_position[1][2]/line_position[1][1]) + if(self.cal_distance(meet1[1][0],meet1[1][1],a2,b2)>=self.cal_distance(meet2[1][0],meet2[1][1],a2,b2)): + meet_result[1][0]=meet2[1][0] + meet_result[1][1]=meet2[1][1] + else: + meet_result[1][0]=meet1[1][0] + meet_result[1][1]=meet1[1][1] + print("x2:",meet_result[1][0],"y2:",meet_result[1][1]) + + #세번째 직선의 교점 + if(line_position[2][0]==0 and line_position[2][1]!=0): + meet1[2][1]=line_position[2][2]/line_position[2][1] + meet2[2][1]=meet1[2][1] + meet1[2][0]=math.sqrt(r2*r2-(meet1[2][1]-b2)*(meet1[2][1]-b2))+a2 + meet2[2][0]=a2-math.sqrt(r2*r2-(meet1[2][1]-b2)*(meet1[2][1]-b2)) + if(self.cal_distance(meet1[2][0],meet1[2][1],a1,b1)>=self.cal_distance(meet2[2][0],meet2[2][1],a1,b1)): + meet_result[2][0]=meet2[2][0] + meet_result[2][1]=meet2[2][1] + else: + meet_result[2][0]=meet1[2][0] + meet_result[2][1]=meet1[2][1] + elif(line_position[2][0]!=0 and line_position[2][1]==0): + meet1[2][0]=line_position[2][2]/line_position[2][0] + meet2[2][0]=meet1[2][0] + meet1[2][1]=math.sqrt(r2*r2-(meet1[2][0]-a2)*(meet1[2][0]-a2))+b2 + meet2[2][1]=b2-math.sqrt(r2*r2-(meet1[2][0]-a1)*(meet1[2][0]-a2)) + if(self.cal_distance(meet1[2][0],meet1[2][1],a1,b1)>=self.cal_distance(meet2[2][0],meet2[2][1],a1,b1)): + meet_result[2][0]=meet2[2][0] + meet_result[2][1]=meet2[2][1] + else: + meet_result[2][0]=meet1[2][0] + meet_result[2][1]=meet1[2][1] + else: + a=1+(line_position[2][0]/line_position[2][1])*(line_position[2][0]/line_position[2][1]) + b=(-2*a2)+((-2*line_position[2][0]*line_position[2][2]) / (line_position[2][1]*line_position[2][1]))+(2*line_position[2][0]*b1/line_position[2][1]) + c=(line_position[2][2]/line_position[2][1])*(line_position[2][2]/line_position[2][1]) + (-2*line_position[2][2]*b1/line_position[2][1]) + b2*b2 - r2*r2 +a2*a2 + meet1[2][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a) + meet2[2][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a) + meet1[2][1]=(-1*line_position[2][0]*meet1[2][0]/line_position[2][1])+(line_position[2][2]/line_position[2][1]) + meet2[2][1]=(-1*line_position[2][0]*meet2[2][0]/line_position[2][1])+(line_position[2][2]/line_position[2][1]) + if(self.cal_distance(meet1[2][0],meet1[2][1],a1,b1)>=self.cal_distance(meet2[2][0],meet2[2][1],a1,b1)): + meet_result[2][0]=meet2[2][0] + meet_result[2][1]=meet2[2][1] + else: + meet_result[2][0]=meet1[2][0] + meet_result[2][1]=meet1[2][1] + print("x3:",meet_result[2][0],"y3:",meet_result[2][1]) + + print("x:",(meet_result[0][0]+meet_result[1][0]+meet_result[2][0])/3,"/y:",(meet_result[0][1]+meet_result[1][1]+meet_result[2][1])/3) + return (meet_result[0][0]+meet_result[1][0]+meet_result[2][0])/3, (meet_result[0][1]+meet_result[1][1]+meet_result[2][1])/3 + + + def second_situation(self, a1,b1,r1,a2,b2,r2,oa3,ob3,or3):#2번째 경우로 2개의 원만 겹치는 부분이 있는 경우이다. + line_position = [[0,0,0],[0,0,0],[0,0,0]]#Ax+By=c의 형태[A,B,C] + meet1 = [[0,0],[0,0],[0,0]] + meet2 = [[0,0],[0,0],[0,0]] + meet_result = [[0,0],[0,0],[0,0]] + #첫번째 직선(1,2) + line_position[0][0]=-2*a1+2*a2 + line_position[0][1]=-2*b1+2*b2 + line_position[0][2]=(r1*r1-r2*r2)+(a2*a2-a1*a1)+(b2*b2-b1*b1) + print(line_position[0]) + #첫번째 직선의 교점 + if(line_position[0][0]==0 and line_position[0][1]!=0): + meet1[0][1]=line_position[0][2]/line_position[0][1] + meet2[0][1]=meet1[0][1] + meet1[0][0]=math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1))+a1 + meet2[0][0]=a1-math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1)) + if(self.cal_distance(meet1[0][0],meet1[0][1],oa3,ob3)>=self.cal_distance(meet2[0][0],meet2[0][1],oa3,ob3)): + meet_result[0][0]=meet2[0][0] + meet_result[0][1]=meet2[0][1] + else: + meet_result[0][0]=meet1[0][0] + meet_result[0][1]=meet1[0][1] + elif(line_position[0][0]!=0 and line_position[0][1]==0): + meet1[0][0]=line_position[0][2]/line_position[0][0] + meet2[0][0]=meet1[0][0] + meet1[0][1]=math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1))+b1 + meet2[0][1]=b1-math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1)) + if(self.cal_distance(meet1[0][0],meet1[0][1],oa3,ob3)>=self.cal_distance(meet2[0][0],meet2[0][1],oa3,ob3)): + meet_result[0][0]=meet2[0][0] + meet_result[0][1]=meet2[0][1] + else: + meet_result[0][0]=meet1[0][0] + meet_result[0][1]=meet1[0][1] + else: + a=1+(line_position[0][0]/line_position[0][1])*(line_position[0][0]/line_position[0][1]) + b=(-2*a1)+((-2*line_position[0][0]*line_position[0][2]) / (line_position[0][1]*line_position[0][1]))+(2*line_position[0][0]*b1/line_position[0][1]) + c=(line_position[0][2]/line_position[0][1])*(line_position[0][2]/line_position[0][1]) + (-2*line_position[0][2]*b1/line_position[0][1]) + b1*b1 - r1*r1 + a1*a1 + print(a,b,c) + meet1[0][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a) + meet2[0][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a) + meet1[0][1]=(-1*line_position[0][0]*meet1[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1]) + meet2[0][1]=(-1*line_position[0][0]*meet2[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1]) + print(meet1[0][0],meet1[0][1]) + print(meet2[0][0],meet2[0][1]) + print(self.cal_distance(meet1[0][0],meet1[0][1],oa3,ob3)) + print(self.cal_distance(meet2[0][0],meet2[0][1],oa3,ob3)) + if(self.cal_distance(meet1[0][0],meet1[0][1],oa3,ob3)>=self.cal_distance(meet2[0][0],meet2[0][1],oa3,ob3)): + meet_result[0][0]=meet2[0][0] + meet_result[0][1]=meet2[0][1] + else: + meet_result[0][0]=meet1[0][0] + meet_result[0][1]=meet1[0][1] + + return meet_result[0][0], meet_result[0][1] + #print("x:",meet_result[0][0],"y:",meet_result[0][1]) + + #def third_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#3번째 경우로 겹치는 원이 없는 경우이다.(값이 정확히지는 않음) + # a=2*(a1-a2) + # b=2*(b1-b2) + # c=(r2*r2-r1*r1)+(a1*a1-a2*a2)+(b1*b1-b2*b2) + # d=2*(a2-a3) + # e=2*(b2-b3) + # f=(r3*r3-r2*r2)+(a2*a2-a3*a3)+(b2*b2-b3*b3) + # y1=(f-((d*c) / a)) / (e-((b*d)/a)) + # x1=(c-b*y1)/a + # print("x:",x1,"y:",y1) + + def doTriangulation(self): + a=self.cal_distance(self.n[0]['x'],self.n[0]['y'],self.n[1]['x'],self.n[1]['y']) + b=self.cal_distance(self.n[0]['x'],self.n[0]['y'],self.n[2]['x'],self.n[2]['y']) + c=self.cal_distance(self.n[1]['x'],self.n[1]['y'],self.n[1]['x'],self.n[1]['y']) + if(a<=self.n[0]['distance']+self.n[1]['distance'] and b<=self.n[0]['distance']+self.n[2]['distance'] and c<=self.n[1]['distance']+self.n[2]['distance']): + x, y = self.first_situation(self.n[0]['x'],self.n[0]['y'],self.n[0]['distance'], + self.n[1]['x'],self.n[1]['y'],self.n[1]['distance'], + self.n[2]['x'],self.n[2]['y'],self.n[2]['distance']) + elif(a<=self.n[0]['distance']+self.n[1]['distance'] and b>self.n[0]['distance']+self.n[2]['distance'] and c>self.n[1]['distance']+self.n[2]['distance']): + x, y = self.second_situation(self.n[0]['x'],self.n[0]['y'],self.n[0]['distance'], + self.n[1]['x'],self.n[1]['y'],self.n[1]['distance'], + self.n[2]['x'],self.n[2]['y'],self.n[2]['distance']) + elif(a>self.n[0]['distance']+self.n[1]['distance'] and b<=self.n[0]['distance']+self.n[2]['distance'] and c>self.n[1]['distance']+self.n[2]['distance']): + x, y = self.second_situation(self.n[0]['x'],self.n[0]['y'],self.n[0]['distance'], + self.n[2]['x'],self.n[2]['y'],self.n[2]['distance'], + self.n[1]['x'],self.n[1]['y'],self.n[1]['distance']) + elif(a>self.n[0]['distance']+self.n[1]['distance'] and b>self.n[0]['distance']+self.n[2]['distance'] and c<=self.n[1]['distance']+self.n[2]['distance']): + x, y = self.second_situation(self.n[1]['x'],self.n[1]['y'],self.n[1]['distance'], + self.n[2]['x'],self.n[2]['y'],self.n[2]['distance'], + self.n[0]['x'],self.n[0]['y'],self.n[0]['distance']) + else: + x, y = None, None + print("NoneNone") + return x, y + """ + #예시 + self.first_situation(20,10,10,9,10,1,10,9,1) + doTriangulation(20,10,10,9,10,1,10,9,1) + print("-----------------------") + self.second_situation(0,3,1,0,4,1,5,3,1) + doTriangulation(0,3,1,0,4,1,5,3,1) + print("-----------------------") + """ \ No newline at end of file diff --git a/Server_Vue_Express/backend/models/rpNodeData.js b/Server_Vue_Express/backend/models/rpNodeData.js new file mode 100644 index 0000000000000000000000000000000000000000..f37b1688b6ba734b17695af09dec23d37d6768c8 --- /dev/null +++ b/Server_Vue_Express/backend/models/rpNodeData.js @@ -0,0 +1,17 @@ +var mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const rpNodeDataSchema = new Schema({ + rpMAC: { type: String, default: "" }, + rpuuid: { type: String, default: "" }, + x:{ type: Number, default: 0 }, + y:{ type: Number, default: 0 }, + type : { type: String, default: "" } +}, { collection : 'RpNodeData', // 컬렉션명 지정 + versionKey : false, // "__v" 필드 생성X + strict : false } +); + + +//users collection +module.exports = mongoose.model('RpNodeData', rpNodeDataSchema); \ No newline at end of file diff --git a/Server_Vue_Express/backend/models/userNode.js b/Server_Vue_Express/backend/models/userNode.js new file mode 100644 index 0000000000000000000000000000000000000000..448fddea63781d57bf05ed43a7ab3c7a5b388cae --- /dev/null +++ b/Server_Vue_Express/backend/models/userNode.js @@ -0,0 +1,17 @@ +var mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const userNodeSchema = new Schema({ + rasbpID: { type: String, default: "" }, + useruuid: { type: String, default: "" }, + x:{ type: Number, default: 0 }, + y:{ type: Number, default: 0 }, + updateTime : { type: String, default: "" } +}, { collection : 'UserNodeData', // 컬렉션명 지정 + versionKey : false, // "__v" 필드 생성X + strict : false } +); + + +//users collection +module.exports = mongoose.model('UserNodeData', userNodeSchema); \ No newline at end of file diff --git a/Server_Vue_Express/backend/public/chart.js b/Server_Vue_Express/backend/public/chart.js new file mode 100644 index 0000000000000000000000000000000000000000..d461cc046fbe53e77389258b457bec9d70b31abd --- /dev/null +++ b/Server_Vue_Express/backend/public/chart.js @@ -0,0 +1,70 @@ + +var data = { + labels: [ + "1", "2", "3", "4", "5" + ], + datasets: [ + + ] +}; + + +var dat = { + +} +var options = { + animation: { + animateScale: false + }, + responsive: false, + scales: { + yAxes: [ + { + ticks: { + //max:30, + beginAtZero: true + } + } + ], + xAxes: [ + { + ticks: { + //max:20, + beginAtZero: true + } + } + ] + } +}; +var ctx = document.getElementById("myChart").getContext('2d'); +var myBarChart = new Chart(ctx, { + type: 'bubble', + data: data, + options: options +}); +var button = document.getElementById("sendAjax") + +button.addEventListener("click", function() { + sendAjax('http://localhost:3000/'); +}) + +function sendAjax(url) { + var oReq = new XMLHttpRequest(); + + oReq.open('POST', url); + oReq.setRequestHeader('Content-Type', "application/json") // json 형태로 보낸다 + oReq.send(); + + oReq.addEventListener('load', function() { + var result = JSON.parse(oReq.responseText); + var score = result.score; + var comp_data = data.datasets[0].data; + + for (var i = 0; i < comp_data.length; i++) { + comp_data[i] = score[i]; + } + + data.datasets[0].data = comp_data; + myBarChart.update(); + }) +} \ No newline at end of file diff --git a/Server_Vue_Express/backend/routes/api copy.js b/Server_Vue_Express/backend/routes/api copy.js new file mode 100644 index 0000000000000000000000000000000000000000..054519273c6480c7e1e7ca61d71317b654467e8d --- /dev/null +++ b/Server_Vue_Express/backend/routes/api copy.js @@ -0,0 +1,76 @@ +var express = require('express'); +var router = express.Router(); +var uuidv1 = require('uuid/v1'); +var User = require('../models/users'); +var Tracking = require('../models/tracking'); + +/* +var User = require('../models/users'); +var user = new User({ + name: "NodeJS Tutorialaaaaa", + token: "velopert", + uuid:"asdf" +}); +user.save(function(err, user){ + if(err) return console.error(err); + console.dir(user); +}); + +*/ + + + +/* POST CreateNewUser page. */ +router.post('/CreateNewUser', function(req, res, next) { + var uuid = uuidv1() + + var user = new User({ + name: req.body.name, + aID: req.body.aID, + uuid:uuid + }); + user.save(function(err, user){ + if(err) return console.error(err); + console.dir(user); + }); + res.send({ + name: req.body.name, + aID: req.body.aID, + uuid:uuid + }); +}); + + +/* Delete User page. */ +router.post('/DeleteUser', function(req, res) { + aID = req.body.aID + User.deleteMany({ aID: req.body.aID }, function(err, output){ + if(err) return res.status(500).json({ error: "database failure" }); + + // ( SINCE DELETE OPERATION IS IDEMPOTENT, NO NEED TO SPECIFY ) + //if(!output.result.n) return res.status(404).json({ error: "user not found" }); + //res.json({ message: "user deleted" }); + res.json({message: output, res : req.body}); + }) +}); + + +router.post('/findByUUID', function(req, res) { + uuid = req.body.uuid + + Tracking.find({uuid:req.body.uuid}, function(err, output){ + if(err) return res.status(500).json({ error: "database failure" }); + + // ( SINCE DELETE OPERATION IS IDEMPOTENT, NO NEED TO SPECIFY ) + //if(!output.result.n) return res.status(404).json({ error: "user not found" }); + //res.json({ message: "user deleted" }); + + res.json({message: output, res : req.body}); + }) +}); + +router.post('/', function(req, res, next) { + console.log(req.body) + res.render('index', { title: 'Express' }); +}); +module.exports = router; diff --git a/Server_Vue_Express/backend/routes/api.js b/Server_Vue_Express/backend/routes/api.js index 054519273c6480c7e1e7ca61d71317b654467e8d..5e435684682301d69dfebf9060bc82a527d60199 100644 --- a/Server_Vue_Express/backend/routes/api.js +++ b/Server_Vue_Express/backend/routes/api.js @@ -3,7 +3,8 @@ var router = express.Router(); var uuidv1 = require('uuid/v1'); var User = require('../models/users'); var Tracking = require('../models/tracking'); - +var UserNode = require('../models/userNode'); +var rpNode = require('../models/rpNodeData'); /* var User = require('../models/users'); var user = new User({ @@ -17,7 +18,7 @@ user.save(function(err, user){ }); */ - +console.log("aaaa") /* POST CreateNewUser page. */ @@ -69,6 +70,65 @@ router.post('/findByUUID', function(req, res) { }) }); +router.get('/findUserByUUID/:id', function(req, res, next) { + var userData=new Array(); + var data =new Array(); + var UserName = ""; + var UserLocation =[]; + var rpNodeData=[]; + //console.log("kkkk") + (async () => { + try{ + await User.find({uuid:req.params.id}, (err,output)=>{ + //res.json(output); + console.log(output[0].name) + userData.push({name:output[0].name}) + UserName = output[0].name; + }) + await User.find({uuid:req.params.id}, (err,output)=>{ + //res.json(output); + console.log(output[0].name) + userData.push({name:output[0].name}) + UserName = output[0].name; + }) + await UserNode.find({useruuid:req.params.id}, (err,output)=>{ + //res.json(output); + try{ + UserLocation ={ + x:output[0].x, + y:output[0].y, + r:10 + } + userData.push({ + x:output[0].x, + y:output[0].y, + updateTime:output[0].updateTime, + }) + }catch(exception){} + }) + + await rpNode.find((err,output) =>{ + rpNodeData = output; + console.log("tt",JSON.stringify(rpNodeData)); + }) + } + catch(exception){ + console.log(exception) + } + + res.render('index',{title:'Express',UserName:UserName ,UserLocation: UserLocation, rpNodeData:JSON.stringify(rpNodeData)}) + })(); +}); + + +router.get('/users', function(req, res, next) { + User.find((err,output) =>{ + console.log(output); + res.render('users', { data: output }); + }) + +}); + router.post('/', function(req, res, next) { console.log(req.body) res.render('index', { title: 'Express' }); diff --git a/Server_Vue_Express/backend/views/index.pug b/Server_Vue_Express/backend/views/index.pug index 3d63b9a044a859b59259d5e23dd4e68ec8e1f2be..ece03bdd40bedc215c5e0213aa16d08144f4129e 100644 --- a/Server_Vue_Express/backend/views/index.pug +++ b/Server_Vue_Express/backend/views/index.pug @@ -1,5 +1,56 @@ extends layout block content - h1= title - p Welcome to #{title} + p #{UserLocation.x}, #{UserLocation.y} + script(type='text/javascript', src ="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.js") + canvas(id="myChart",width="700", height="400") + script(type='text/javascript', src ="/chart.js") + script(type='text/javascript'). + console.log(data); + try{ + data.datasets.push({ + label: '#{UserName}', + data: [ + { + x: #{UserLocation.x}, + y: #{UserLocation.y}, + r:10, + } + ], + backgroundColor: [ + 'rgba(255, 159, 64, 0.2)' + ], + borderColor: [ + 'rgba(255, 159, 64, 1)' + ], + borderWidth: 1 + }); + var t = []; + + const nodeData = JSON.parse(`#{rpNodeData}`.replace(/"/g, '"')); + + for(i in nodeData){ + t.push({ + x: nodeData[i].x, + y: nodeData[i].y, + r: 5 + }) + + } + console.log(t) + data.datasets.push({ + label: 'RPi', + data: t, + backgroundColor: [ + 'rgba(255, 99, 132, 0.2)', + ], + borderColor: [ + 'rgba(255,99,132,1)', + ], + borderWidth: 1 + }); + } + catch (exception){ + console.log(exception); + } + myBarChart.update(); \ No newline at end of file diff --git a/Server_Vue_Express/backend/views/layout.pug b/Server_Vue_Express/backend/views/layout.pug index 15af079bf7c34e638ba14844efd979ac9111628b..e39a995d945e109988d8799d40ff140d6f4b7ef1 100644 --- a/Server_Vue_Express/backend/views/layout.pug +++ b/Server_Vue_Express/backend/views/layout.pug @@ -5,3 +5,4 @@ html link(rel='stylesheet', href='/stylesheets/style.css') body block content + \ No newline at end of file diff --git a/Server_Vue_Express/backend/views/users.pug b/Server_Vue_Express/backend/views/users.pug new file mode 100644 index 0000000000000000000000000000000000000000..e09b850c9ac8b645e79808734b5fa8660e9bc13c --- /dev/null +++ b/Server_Vue_Express/backend/views/users.pug @@ -0,0 +1,10 @@ +extends layout + +block content + hr(size='3px') + p + - let i=0; + for i in data + a(href='/api/findUserByUUID/'+i.uuid) #{i.name} , uuid:#{i.uuid} + br + -i++ \ No newline at end of file