首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用coapthon库将资源动态添加到python服务器

使用coapthon库将资源动态添加到python服务器
EN

Stack Overflow用户
提问于 2017-09-02 06:57:10
回答 1查看 778关注 0票数 0

我正在尝试构建一个coap服务器,在该服务器中,我可以添加一个新的资源,而不需要停止服务器,对其进行重新编码,并重新启动.my服务器来托管两种类型的资源,“传感器(Sens)”和“执行器(Actuator(Act)”)。我希望,如果我按下A键,应该向服务器添加一个新的执行器实例,同样,如果我按下Sensor .Below是我的代码:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-04 08:46:39

我不知道你到底想做什么。它只是替换同一路由上的资源还是添加一个新的资源?

替换资源

根据当前的coapthon版本源代码,不可能:

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

代码语言:javascript
复制
 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方面有一点经验,所以我不确定我是否把一切都做好了,但它是有效的。有一个单独的线程轮询用户输入并添加相同的资源。在那里添加所需的代码。

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46011318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档