Skip to content
Snippets Groups Projects
Commit bf8f797e authored by KWAK's avatar KWAK
Browse files

con

parents b2e9ed5f 5d7df415
Branches
No related tags found
No related merge requests found
Showing with 738 additions and 61 deletions
...@@ -26,7 +26,7 @@ class CoapClient(): ...@@ -26,7 +26,7 @@ class CoapClient():
self._beacon = BeaconEmit() self._beacon = BeaconEmit()
def obtainMyID(self): def obtainMyID(self):
path = "/rasbpNodeInfoPath" path = "/rpNodeInfoPath"
path = "coap://" + self.ip + path path = "coap://" + self.ip + path
host, port, path = parse_uri(path) host, port, path = parse_uri(path)
...@@ -41,11 +41,11 @@ class CoapClient(): ...@@ -41,11 +41,11 @@ class CoapClient():
try: try:
payload = { payload = {
'option' : 0, 'option' : 0,
'myMAC' : self.myMAC 'rpMAC' : self.myMAC
} }
response = client.put(path, json.dumps(payload)) response = client.put(path, json.dumps(payload))
print((response.pretty_print())) print((response.pretty_print()))
string = json.loads(response.payload)['uuid'] string = json.loads(response.payload)['rpuuid']
except KeyboardInterrupt: except KeyboardInterrupt:
print("obtainMyID Stop") print("obtainMyID Stop")
...@@ -65,7 +65,7 @@ class CoapClient(): ...@@ -65,7 +65,7 @@ class CoapClient():
self._beacon.beacon_Start(string) self._beacon.beacon_Start(string)
def calculateNodePositionAtServer(self): def calculateNodePositionAtServer(self):
path = "/rasbpNodeInfoPath" path = "/rpNodeInfoPath"
path = "coap://" + self.ip + path path = "coap://" + self.ip + path
host, port, path = parse_uri(path) host, port, path = parse_uri(path)
...@@ -80,7 +80,7 @@ class CoapClient(): ...@@ -80,7 +80,7 @@ class CoapClient():
try: try:
payload = { payload = {
'option' : 1, 'option' : 1,
'myuuid' : self.myuuid 'rpuuid' : self.myuuid
} }
response = client.put(path, json.dumps(payload)) response = client.put(path, json.dumps(payload))
print((response.pretty_print())) print((response.pretty_print()))
...@@ -143,8 +143,8 @@ class CoapClient(): ...@@ -143,8 +143,8 @@ class CoapClient():
n = 2.2 n = 2.2
distance = math.pow(10, (float(info[4]) - float(info[5])) / (10 * n)) distance = math.pow(10, (float(info[4]) - float(info[5])) / (10 * n))
payload = { payload = {
'rasbpuuid' : self.myuuid, 'rpuuid' : self.myuuid,
'uuid' : info[1], 'useruuid' : info[1],
'distance' : distance, 'distance' : distance,
'updateTime' : time.time() 'updateTime' : time.time()
} }
...@@ -152,7 +152,7 @@ class CoapClient(): ...@@ -152,7 +152,7 @@ class CoapClient():
def regiRelWithNewPi(self, info): def regiRelWithNewPi(self, info):
#새로운 rasbPi를 찾은 경우 새로운 rasbPi를 위치측정기로 사용하기 위해서 server에 관련 정보를 저장하는 method #새로운 rasbPi를 찾은 경우 새로운 rasbPi를 위치측정기로 사용하기 위해서 server에 관련 정보를 저장하는 method
path = "/rasbpGraphInfoPath" path = "/rpGraphInfoPath"
path = "coap://" + self.ip + path path = "coap://" + self.ip + path
host, port, path = parse_uri(path) host, port, path = parse_uri(path)
...@@ -165,7 +165,7 @@ class CoapClient(): ...@@ -165,7 +165,7 @@ class CoapClient():
client = HelperClient(server=(host, port)) client = HelperClient(server=(host, port))
try: try:
response = client.put(path, json.dumps(self.mkJsonRasbpgraphInfo(info))) response = client.put(path, json.dumps(self.mkJsonRpgraphInfo(info)))
print((response.pretty_print())) print((response.pretty_print()))
except KeyboardInterrupt: except KeyboardInterrupt:
...@@ -173,7 +173,7 @@ class CoapClient(): ...@@ -173,7 +173,7 @@ class CoapClient():
client.stop() client.stop()
client.stop() client.stop()
def mkJsonRasbpgraphInfo(self, info): def mkJsonRpgraphInfo(self, info):
n = 2.2 n = 2.2
print(info) print(info)
distance = math.pow(10, ((float(info[4]) - float(info[5])) / (10 * n))) distance = math.pow(10, ((float(info[4]) - float(info[5])) / (10 * n)))
......
...@@ -3,24 +3,105 @@ import getopt ...@@ -3,24 +3,105 @@ import getopt
import sys import sys
import threading import threading
import _thread import _thread
import time
import datetime
import json
import triangulation
from coapthon.server.coap import CoAP 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): class CoAPServer(CoAP):
def __init__(self, host, port, multicast=False): def __init__(self, host, port, multicast=False):
CoAP.__init__(self, (host, port), multicast) CoAP.__init__(self, (host, port), multicast)
self.add_resource('bleInfoPath/', BleInfoResource()) self.add_resource('bleInfoPath/', BleInfoResource())
self.add_resource('rasbpNodeInfoPath/', RasbpNodeInfoResource()) self.add_resource('rpNodeInfoPath/', RpNodeInfoResource())
self.add_resource('rasbpGraphInfoPath/', RasbpGraphInfoResource()) self.add_resource('rpGraphInfoPath/', RpGraphInfoResource())
print(("CoAP Server start on " + host + ":" + str(port))) print(("CoAP Server start on " + host + ":" + str(port)))
print((self.root.dump())) 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): def updateUserLocation(self):
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()
pass 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 def usage(): # pragma: no cover
print("coapserver.py -i <ip address> -p <port>") print("coapserver.py -i <ip address> -p <port>")
......
import json import json
import uuid import uuid
import math
import triangulation
from pymongo import MongoClient from pymongo import MongoClient
from coapthon import defines from coapthon import defines
from coapthon.resources.resource import Resource from coapthon.resources.resource import Resource
class RasbpNodeInfoResource(Resource): class RpNodeInfoResource(Resource):
def __init__(self, name="RasbpNodeInfo"): def __init__(self, name="RpNodeInfo"):
super(RasbpNodeInfoResource, self).__init__(name) super(RpNodeInfoResource, self).__init__(name)
self.payload = "RasbpNodeInfo resource" self.payload = "RpNodeInfo resource"
try: try:
self.conn = MongoClient('mongodb://iotuser:iotsystem@localhost/IoT_System', 27017) self.conn = MongoClient('mongodb://iotuser:iotsystem@localhost/IoT_System', 27017)
self.db = self.conn.IoT_System self.db = self.conn.IoT_System
self.collection = self.db.RasbpNodeData self.collection = self.db.RpNodeData
except: except:
print("Could not connect to MongoDB") print("Could not connect to MongoDB")
...@@ -23,7 +25,7 @@ class RasbpNodeInfoResource(Resource): ...@@ -23,7 +25,7 @@ class RasbpNodeInfoResource(Resource):
if self.payload['option'] == 1: if self.payload['option'] == 1:
self.calculateNodePosition(sefl.payload) self.calculateNodePosition(sefl.payload)
else : else :
response.payload = self.postRasbpNodeInfoInDB(self.payload) response.payload = self.postRpNodeInfoInDB(self.payload)
response.code = defines.Codes.CREATED.number response.code = defines.Codes.CREATED.number
return self, response return self, response
...@@ -35,69 +37,111 @@ class RasbpNodeInfoResource(Resource): ...@@ -35,69 +37,111 @@ class RasbpNodeInfoResource(Resource):
if self.payload['option'] == 1: if self.payload['option'] == 1:
self.calculateNodePosition(self.payload) self.calculateNodePosition(self.payload)
else : else :
response.payload = self.postRasbpNodeInfoInDB(self.payload) response.payload = self.postRpNodeInfoInDB(self.payload)
response.code = defines.Codes.CHANGED.number response.code = defines.Codes.CHANGED.number
return self, response return self, response
def postRasbpNodeInfoInDB(self, info): def postRpNodeInfoInDB(self, info):
info = info['myMAC'] info = info['myMAC']
self.collection.delete_many({ 'rasbpMAC' : info }) self.collection.delete_many({ 'rpMAC' : info })
ruuid = "52528282"+str(uuid.uuid4())[8:] rpuuid = "52528282"+str(uuid.uuid4())[8:]
ruuid = ruuid.replace("-","") rpuuid = rpuuid.replace("-","")
if self.collection.count() == 0: if self.collection.count() == 0:
payload = { payload = {
'rasbpMAC' : info, 'rpMAC' : info,
'uuid' : ruuid 'rpuuid' : rpuuid
} }
self.collection.insert_one(payload) self.collection.insert_one(payload)
response = json.dumps({ response = json.dumps({
'uuid' : ruuid, 'rpuuid' : rpuuid,
'operate' : 0 'operate' : 0
}) })
else: else:
payload = { payload = {
'rasbpMAC' : info, 'rpMAC' : info,
'uuid' : ruuid, 'rpuuid' : rpuuid
} }
self.collection.insert_one(payload) self.collection.insert_one(payload)
response = json.dumps({ response = json.dumps({
'uuid' : ruuid, 'rpuuid' : rpuuid,
'operate' : 1 'operate' : 1
}) })
return response return response
def calculateNodePosition(self, info): def calculateNodePosition(self, info):
print("Start calculateNodePosition") print("Start calculateNodePosition")
info = info['myuuid'] info = info['rpuuid']
graphColletion = self.db.RasbpGraphData graphColletion = self.db.RpGraphData
mydoc = self.collection.find({'uuid': info}) mydoc = self.collection.find({'rpuuid': info})
if mydoc.count() == 1: if mydoc.count() == 1:
if self.collection.count() == 1: if self.collection.count() == 1:
pass self.collection.update({'rpuuid' : info}, {'$set':{'x': 0.0, 'y': 0.0}}, False)
else if self.collection.count() == 2: elif self.collection.count() == 2:
pass graphB = graphColletion.find({'v2': info})
else if self.collection.count() == 3: x = graphB[0]['distance']
pass 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: else:
pass graphD = graphColletion.find({'v2' : info})
nodeLocationData = []
else : for g in graphD:
print("This is not registered Node") 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: try:
self.conn = MongoClient('mongodb://iotuser:iotsystem@localhost/IoT_System', 27017) self.conn = MongoClient('mongodb://iotuser:iotsystem@localhost/IoT_System', 27017)
except: except:
print("Could not connect to MongoDB") print("Could not connect to MongoDB")
self.db = self.conn.IoT_System self.db = self.conn.IoT_System
self.collection = self.db.RasbpGraphData self.collection = self.db.RpGraphData
def render_GET_advanced(self, request, response): def render_GET_advanced(self, request, response):
response.payload = self.payload response.payload = self.payload
...@@ -109,7 +153,7 @@ class RasbpGraphInfoResource(Resource): ...@@ -109,7 +153,7 @@ class RasbpGraphInfoResource(Resource):
self.payload = request.payload self.payload = request.payload
from coapthon.messages.response import Response from coapthon.messages.response import Response
assert(isinstance(response, Response)) assert(isinstance(response, Response))
response.payload = self.postRasbpGraphInfoInDB(self.payload) response.payload = self.postRpGraphInfoInDB(self.payload)
response.code = defines.Codes.CREATED.number response.code = defines.Codes.CREATED.number
return self, response return self, response
...@@ -117,7 +161,7 @@ class RasbpGraphInfoResource(Resource): ...@@ -117,7 +161,7 @@ class RasbpGraphInfoResource(Resource):
self.payload = request.payload self.payload = request.payload
from coapthon.messages.response import Response from coapthon.messages.response import Response
assert(isinstance(response, Response)) assert(isinstance(response, Response))
response.payload = self.postRasbpGraphInfoInDB(self.payload) response.payload = self.postRpGraphInfoInDB(self.payload)
response.code = defines.Codes.CHANGED.number response.code = defines.Codes.CHANGED.number
return self, response return self, response
...@@ -126,7 +170,7 @@ class RasbpGraphInfoResource(Resource): ...@@ -126,7 +170,7 @@ class RasbpGraphInfoResource(Resource):
response.code = defines.Codes.DELETED.number response.code = defines.Codes.DELETED.number
return True, response return True, response
def postRasbpGraphInfoInDB(self, info): def postRpGraphInfoInDB(self, info):
info = json.loads(info) info = json.loads(info)
mydoc = self.collection.find({'v1':info['v1'], 'v2':info['v2']}) mydoc = self.collection.find({'v1':info['v1'], 'v2':info['v2']})
if mydoc.count() > 0: if mydoc.count() > 0:
......
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
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
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
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
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;
...@@ -3,7 +3,8 @@ var router = express.Router(); ...@@ -3,7 +3,8 @@ var router = express.Router();
var uuidv1 = require('uuid/v1'); var uuidv1 = require('uuid/v1');
var User = require('../models/users'); var User = require('../models/users');
var Tracking = require('../models/tracking'); var Tracking = require('../models/tracking');
var UserNode = require('../models/userNode');
var rpNode = require('../models/rpNodeData');
/* /*
var User = require('../models/users'); var User = require('../models/users');
var user = new User({ var user = new User({
...@@ -17,7 +18,7 @@ user.save(function(err, user){ ...@@ -17,7 +18,7 @@ user.save(function(err, user){
}); });
*/ */
console.log("aaaa")
/* POST CreateNewUser page. */ /* POST CreateNewUser page. */
...@@ -69,6 +70,65 @@ router.post('/findByUUID', function(req, res) { ...@@ -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) { router.post('/', function(req, res, next) {
console.log(req.body) console.log(req.body)
res.render('index', { title: 'Express' }); res.render('index', { title: 'Express' });
......
extends layout extends layout
block content block content
h1= title p #{UserLocation.x}, #{UserLocation.y}
p Welcome to #{title} 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(/&quot;/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
...@@ -5,3 +5,4 @@ html ...@@ -5,3 +5,4 @@ html
link(rel='stylesheet', href='/stylesheets/style.css') link(rel='stylesheet', href='/stylesheets/style.css')
body body
block content block content
\ No newline at end of file
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment