This repository has been archived by the owner on Nov 17, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
patch_coapthon
82 lines (81 loc) · 3.68 KB
/
patch_coapthon
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
diff --git a/coapthon/layers/requestlayer.py b/coapthon/layers/requestlayer.py
index 0286b4c..ba00ecf 100644
--- a/coapthon/layers/requestlayer.py
+++ b/coapthon/layers/requestlayer.py
@@ -88,8 +88,24 @@ class RequestLayer(object):
resource = self._server.root[path]
except KeyError:
resource = None
- if resource is None:
+ if resource is None and not path.startswith("/ps"):
transaction.response.code = defines.Codes.NOT_FOUND.number
+ elif resource is None and path.startswith("/ps"):
+ #transaction = self._server.resourceLayer.create_resource(path, transaction)
+ path_el = path.split("/");
+ create_item = path_el[-1]
+ del path_el[-1];
+ new_path = '/'.join(path_el);
+ parent_resource = self._server.root[new_path]
+ print("[BROKER] Creating topic "+path+" on PUT request")
+ payload = "<"+create_item+">;ct=0;";
+ resource = parent_resource.createResFromPayload(payload,new_path)
+ parent_resource.children.append(resource)
+ parent_resource.cs.add_resource(resource.name,resource)
+ print("[BROKER] Created")
+ transaction.response.code = defines.Codes.CREATED.number
+ transaction.resource = resource
+ transaction = self._server.resourceLayer.update_resource(transaction)
else:
transaction.resource = resource
# Update request
@@ -131,7 +147,16 @@ class RequestLayer(object):
resource = self._server.root[path]
except KeyError:
resource = None
-
+ print("Notifying resource:",resource,"\n")
+ observers = self._server._observeLayer.notify(resource)
+ print("Observers",observers)
+ for transaction_ in observers:
+ with transaction_:
+ transaction_.response.code = defines.Codes.NOT_FOUND.number
+ transaction_.response.observe = transaction_.resource.observe_count+1
+ transaction_.response.type = defines.Types["NON"]
+ if transaction_.response is not None:
+ self._server.send_datagram(transaction_.response)
if resource is None:
transaction.response.code = defines.Codes.NOT_FOUND.number
else:
diff --git a/coapthon/serializer.py b/coapthon/serializer.py
index 1c094ce..2569421 100644
--- a/coapthon/serializer.py
+++ b/coapthon/serializer.py
@@ -145,6 +145,7 @@ class Serializer(object):
tmp |= message.type
tmp <<= 4
tmp |= tkl
+ print(message.mid)
values = [tmp, message.code, message.mid]
if message.token is not None and tkl > 0:
@@ -226,6 +227,7 @@ class Serializer(object):
try:
s = struct.Struct(fmt)
datagram = ctypes.create_string_buffer(s.size)
+ print(values)
s.pack_into(datagram, 0, *values)
except struct.error:
# The .exception method will report on the exception encountered
diff --git a/coapthon/server/coap.py b/coapthon/server/coap.py
index c4db32f..1d4367c 100644
--- a/coapthon/server/coap.py
+++ b/coapthon/server/coap.py
@@ -255,6 +255,9 @@ class CoAP(object):
host, port = message.destination
logger.debug("send_datagram - " + str(message))
serializer = Serializer()
+ if(message.mid is None):
+ print("Message mid was none, I must do something my friend")
+ message.mid = self._messageLayer.fetch_mid()
message = serializer.serialize(message)
if self.multicast:
self._unicast_socket.sendto(message, (host, port))