Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用coapthon库向python coap服务器动态添加资源_Python_Coap - Fatal编程技术网

使用coapthon库向python coap服务器动态添加资源

使用coapthon库向python coap服务器动态添加资源,python,coap,Python,Coap,我正在尝试构建一个coap服务器,在其中我可以添加新资源,而无需停止服务器、重新编码并重新启动。我的服务器支持承载两种类型的资源,“传感器(Sens-Me)”和“执行器(Act-Me)”。我希望,如果我按下A键,应向服务器添加一个新的执行器实例,同样,如果我按下传感器的S键。下面是我的代码: from coapthon.resources.resource import Resource from coapthon.server.coap import CoAP class Sensor(R

我正在尝试构建一个coap服务器,在其中我可以添加新资源,而无需停止服务器、重新编码并重新启动。我的服务器支持承载两种类型的资源,“传感器(Sens-Me)”和“执行器(Act-Me)”。我希望,如果我按下A键,应向服务器添加一个新的执行器实例,同样,如果我按下传感器的S键。下面是我的代码:

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()

我不知道你到底想做什么。 只是为了替换同一路线上的资源还是添加新资源

替换资源 根据当前的coapthon版本来源,这是不可能的:

或者,您可以在请求的范围内解决它。 比如说,拥有一个由资源使用的、可以在用户输入事件中更改的处理程序注册表。嗯,您将无法添加新路线

如果您确实需要该功能,您可以向开发人员请求或为该项目做出贡献

添加新资源 我把你的片段扩展了一点。 我有一点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()

非常感谢,您的修改(添加资源)是我想要的,我将对其进行进一步的更改,以获得我所需要的。
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()