2017-09-02 7 views
0

私はサーバを停止し、再コードして再起動する必要なしに新しいリソースを追加できるcoapサーバを構築しようとしています。センサー(Sens-Me)とアクチュエーター(Act-Me)の2種類のリソースをホストします。私は正確にあなたが何をするかわからない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

:私は私がセンサー.BelowためにSを押しても同様にした場合、私のコードで、私はキーを押すと、アクチュエータの新しいインスタンスをサーバーに追加する必要があることを望みますやってみたいです。 同じルート上のリソースを置き換えるか、新しいルートを追加するだけですか?また、あなたが要求のスコープでそれを解決することができ

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 

は、それが現在の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() 
+0

ありがとう、あなたの変更(リソースを追加)は私が望んだものです。私はそれをさらに変更して、必要なものを得ることができます。 –

関連する問題