2017-09-02 86 views
0

我正在尝试构建一个Coap服务器,我可以添加新资源而无需停止服务器,重新编码它并重新启动。承载两种类型的资源,“传感器(Sens-Me)”和“执行器(Act-Me)”。我想,如果我按A键,执行器的一个新实例应该添加到服务器,同样的,如果我按s的传感器。下面是我的代码:动态地将资源添加到具有coapthon库的python coap服务器

from coapthon.resources.resource import Resource 
from coapthon.server.coap import CoAP 


class Sensor(Resource): 

    def __init__(self,name="Sensor",coap_server=None): 
    super(Sensor,self).__init__(name,coap_server,visible=True,observable=True,allow_children=True) 
    self.payload = "This is a new sensor" 
    self.resource_type = "rt1" 
    self.content_type = "application/json" 
    self.interface_type = "if1" 
    self.var = 0 

    def render_GET(self,request): 
     self.payload = "new sensor value ::{}".format(str(int(self.var+1))) 
     self.var +=1 
    return self 

class Actuator(Resource): 
def __init__(self,name="Actuator",coap_server=None): 
    super(Actuator,self).__init__(name,coap_server,visible=True,observable=True) 
    self.payload="This is an actuator" 
    self.resource_type="rt1" 
def render_GET(self,request): 
    return self 

class CoAPServer(CoAP): 
    def __init__(self, host, port, multicast=False): 
    CoAP.__init__(self,(host,port),multicast) 
     self.add_resource('sens-Me/',Sensor()) 
     self.add_resource('act-Me/',Actuator()) 
    print "CoAP server started on {}:{}".format(str(host),str(port)) 
    print self.root.dump() 


def main(): 
    ip = "0.0.0.0" 
    port = 5683 
    multicast=False 
    server = CoAPServer(ip,port,multicast) 
    try: 
    server.listen(10) 
      print "executed after listen" 
    except KeyboardInterrupt: 
    server.close() 

if __name__=="__main__": 
main() 

回答

0

我不知道究竟你想做。 只是为了替换同一路线上的资源或添加新的资源?

替换资源

它根据当前coapthon版本源是不可能的:

https://github.com/Tanganelli/CoAPthon/blob/b6983fbf48399bc5687656be55ac5b9cce4f4718/coapthon/server/coap.py#L279

try: 
    res = self.root[actual_path] 
except KeyError: 
    res = None 
if res is None: 
    if len(paths) != i: 
     return False 
    resource.path = actual_path 
     self.root[actual_path] = resource 

或者,你可以解决它的请求范围。假设有一个由资源使用的处理程序注册表,可以在用户输入事件中对其进行更改。那么,你将无法添加新的路线。

如果您绝对需要该功能,您可以向开发人员请求或为该项目提供帮助。

添加新的资源

我已经延长您的片段一点点。 我有一点Python的经验,所以我不知道我做了一切正常,但它的工作原理。 有一个单独的线程轮询用户输入并添加相同的资源。在那里添加所需的代码。

from coapthon.resources.resource import Resource 
from coapthon.server.coap import CoAP 
from threading import Thread 
import sys 

class Sensor(Resource): 
    def __init__(self,name="Sensor",coap_server=None): 
    super(Sensor,self).__init__(name,coap_server,visible=True,observable=True,allow_children=True) 
    self.payload = "This is a new sensor" 
    self.resource_type = "rt1" 
    self.content_type = "application/json" 
    self.interface_type = "if1" 
    self.var = 0 

    def render_GET(self,request): 
    self.payload = "new sensor value ::{}".format(str(int(self.var+1))) 
    self.var +=1 
    return self 

class Actuator(Resource): 
    def __init__(self,name="Actuator",coap_server=None): 
    super(Actuator,self).__init__(name,coap_server,visible=True,observable=True) 
    self.payload="This is an actuator" 
    self.resource_type="rt1" 
    def render_GET(self,request): 
    return self 

class CoAPServer(CoAP): 
    def __init__(self, host, port, multicast=False): 
    CoAP.__init__(self,(host,port),multicast) 
    self.add_resource('sens-Me/',Sensor()) 
    self.add_resource('act-Me/',Actuator()) 
    print "CoAP server started on {}:{}".format(str(host),str(port)) 
    print self.root.dump() 

def pollUserInput(server): 
    while 1: 
    user_input = raw_input("Some input please: ") 
    print user_input 
    server.add_resource('sens-Me2/', Sensor()) 

def main(): 
    ip = "0.0.0.0" 
    port = 5683 
    multicast=False 

    server = CoAPServer(ip,port,multicast) 
    thread = Thread(target = pollUserInput, args=(server,)) 
    thread.setDaemon(True) 
    thread.start() 

    try: 
    server.listen(10) 
    print "executed after listen" 
    except KeyboardInterrupt: 
    print server.root.dump() 
    server.close() 
    sys.exit() 

if __name__=="__main__": 
    main() 
+0

非常感谢,您的修改(添加资源)是我想要的,我会对其进行进一步更改,以获得我所需要的。 –

相关问题