Compare commits

..

3 Commits

Author SHA1 Message Date
4f4b4bbe0d initial commit for notify-policy 2019-01-18 16:36:17 +01:00
7c35afbb0c Test debian stretch+python3 (#18)
* changes starting with python3 explicit

* removes python modules which are not available for python3

* exchanges fyzz query parsing with rdflib functionality

* fixes interop tests

* replaces reduce with for loop in nodb driver

* simple python2 -> python3 conversions

* adds changes for handling different string handling in python3

* test stretch building with travis

* installing python-setuptools in docker

* installing python-setuptools in docker

* changing python2 to python3 in docker makefiles

* changing python2 to python3 and some other test changes

* push docker only in master branche

* running version of openmtc

* fix some port problems

* porting path library completly now

* restoring travis.yml

* testing new travis.yml

* add sudo

* updating travis OS from trusty to xenial

* upgrade pip before

* show running docker logs

* show more logs

* for debugging

* showlogs of docker after failure

* testing new travis.yml

* finish travis.yml
2019-01-18 14:13:03 +01:00
36d4e84059 Merge pull request #17 from OpenMTC/master
Update development branche to master
2019-01-18 13:47:25 +01:00
25 changed files with 219 additions and 155 deletions

View File

@ -1,23 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
**Additional context**
Add any other context about the problem here.

View File

@ -1,20 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@ -1,26 +1,26 @@
services:
- docker
- docker
dist: xenial
before_script:
- sudo apt update
- sudo apt install qemu-user-static python3 python3-pip python3-setuptools
- sudo pip3 install --upgrade pip
- sudo python3 -m pip install --upgrade setuptools
- sudo python3 -m pip install --upgrade pyresttest
- "./create-binary-docker backend"
- "./create-binary-docker backend -a arm"
- "./create-binary-docker gateway"
- "./create-binary-docker gateway -a arm"
- "./create-binary-docker orioncontextbroker"
- "./create-binary-docker orioncontextbroker -a arm"
- "./create-binary-docker influxdbapp"
- "./create-binary-docker influxdbapp -a arm"
- "./create-binary-docker cul868ipe"
- "./create-binary-docker cul868ipe -a arm"
- docker run -d --name backend -p 0.0.0.0:18000:18000 -e "ONEM2M_CSE_ID=backend" -e "ONEM2M_NOTIFICATION_DISABLED=false" openmtc/backend-amd64 -v
- docker logs backend
- docker run -d --name gateway -p 0.0.0.0:8000:8000 -e "ONEM2M_HTTP_TRANSPORT_PORT=8000" -e "ONEM2M_CSE_ID=gateway" -e "ONEM2M_REMOTE_CSE_POA=<POA>" -e "ONEM2M_REMOTE_CSE_ID=backend" -e "ONEM2M_NOTIFICATION_DISABLED=false" -e "ONEM2M_REGISTRATION_DISABLED=false" openmtc/gateway-amd64 -v
- docker logs gateway
- sudo apt update
- sudo apt install qemu-user-static python3 python3-pip python3-setuptools
- sudo pip3 install --upgrade pip
- sudo python3 -m pip install --upgrade setuptools
- sudo python3 -m pip install --upgrade pyresttest
- "./create-binary-docker backend"
- "./create-binary-docker backend -a arm"
- "./create-binary-docker gateway"
- "./create-binary-docker gateway -a arm"
- "./create-binary-docker orioncontextbroker"
- "./create-binary-docker orioncontextbroker -a arm"
- "./create-binary-docker influxdbapp"
- "./create-binary-docker influxdbapp -a arm"
- "./create-binary-docker cul868ipe"
- "./create-binary-docker cul868ipe -a arm"
- docker run -d --name backend -p 0.0.0.0:18000:18000 -e "ONEM2M_CSE_ID=backend" -e "ONEM2M_NOTIFICATION_DISABLED=false" openmtc/backend-amd64 -v
- docker logs backend
- docker run -d --name gateway -p 0.0.0.0:8000:8000 -e "ONEM2M_HTTP_TRANSPORT_PORT=8000" -e "ONEM2M_CSE_ID=gateway" -e "ONEM2M_REMOTE_CSE_POA=<POA>" -e "ONEM2M_REMOTE_CSE_ID=backend" -e "ONEM2M_NOTIFICATION_DISABLED=false" -e "ONEM2M_REGISTRATION_DISABLED=false" openmtc/gateway-amd64 -v
- docker logs gateway
script:
- docker tag openmtc/orioncontextbroker-amd64 openmtc/orion-context-broker-app-amd64
- docker tag openmtc/orioncontextbroker-arm openmtc/orion-context-broker-app-arm
@ -35,21 +35,6 @@ after_script:
env:
matrix:
secure: oQe/MxxFrPPArxb6OFzOUwG2ZlA5GYekMR6qn0Y3101v82MdrIVgDILHR41iwykTtk1XpJPV9uabsRsvY4hBmbjYzihYZFOAzFf+/KU7wROtKum0fFfLjCPb8uGV41k1JTquB94FibXboVAP7rNL0Vrpl+FGUvMGatQBtwZnGvha6Ha07qTao+X9+0dJ4YvFlvcba/jfzBZBwHw7KHpRoiyKU0dPmXpHcqnZBFcNqRXhzdVrgx0auP/tghoshW5LQWkpTV11uSx/kYuby4oo8r8nB6L0rW1jYSXs9DHiTQCfCy24xlb9YJjCD9aFcjH0lIkVIqQwJYA67MzKYMK4XV684J/Jr3+jfVOoUt0bpZaTnk+r/uiFCtEsN7q0KUlvHLUAi1YNJhKs6CRrAH3GK25QByh+suzPzZoHP42F2LYP9URlzbDH+/v7CwNuw+9pHSmxEhs18LVmggwkMos3o3ArvzMLRNJ3QG1fdoxL/Ubqxhmvhy4rZi6vGQsiF64oX8PN0sRgXekTU/ma+6CTM6qhgkocMUYzT2r/6qd/9R3jmtxSZnikjkR6Iu9NLzAUY+cqnvvjohAvqYyj+tGlQfOPxAU9H4wXnbQWLBM8yn6yt2Ki+3+Jx4Owdv0oXVJpN0GWjMzIJ1nEus5odkWW+c4wcZb6m3Ak0PrzYPp2BgE=
after_success:
- if [ "$TRAVIS_BRANCH" == "master" ]; then
docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD";
docker push openmtc/backend-amd64;
docker push openmtc/backend-arm;
docker push openmtc/gateway-amd64;
docker push openmtc/gateway-arm;
docker push openmtc/orion-context-broker-app-amd64;
docker push openmtc/orion-context-broker-app-arm;
docker push openmtc/cul868-ipe-amd64;
docker push openmtc/cul868-ipe-arm;
docker push openmtc/influxdb-app-amd64;
docker push openmtc/influxdb-app-arm;
fi
after_failure:
- docker logs backend
- docker logs gateway
- coveralls
- docker logs gateway

View File

@ -1,6 +0,0 @@
# Contributors ordered by number of commits
Ronald Steinke <rst-fokus>
Christian Klopp <ckl-fokus>
Alexander Ortlieb <aor-fokus>
Jason Fox <jason-fox>

View File

@ -6,14 +6,12 @@
[![FIWARE IoT Agents](https://nexus.lab.fiware.org/static/badges/chapters/iot-agents.svg)](https://www.fiware.org/developers/catalogue/)
[![License: Eclipse](https://img.shields.io/github/license/OpenMTC/OpenMTC.svg)](https://www.eclipse.org/legal/epl-v10.html)
[![](https://img.shields.io/docker/pulls/openmtc/gateway-amd64.svg)](https://hub.docker.com/u/openmtc)
[![Support badge](https://nexus.lab.fiware.org/repository/raw/public/badges/stackoverflow/iot-agents.svg)](https://stackoverflow.com/questions/tagged/fiware+iot)
<br/>
[![Documentation badge](https://img.shields.io/readthedocs/fiware-openmtc.svg)](http://fiware-openmtc.readthedocs.org/en/latest/?badge=latest)
[![Build Status](https://travis-ci.org/OpenMTC/OpenMTC.svg?branch=master)](https://travis-ci.org/OpenMTC/OpenMTC)
[![Coverage Status](https://coveralls.io/repos/github/OpenMTC/OpenMTC/badge.svg?branch=master)](https://coveralls.io/github/OpenMTC/OpenMTC?branch=master)
[![Known Vulnerabilities](https://snyk.io/test/github/OpenMTC/OpenMTC/badge.svg?targetFile=openmtc-gevent%2Frequirements.txt)](https://snyk.io/test/github/OpenMTC/OpenMTC?targetFile=openmtc-gevent%2Frequirements.txt)
![Status](https://nexus.lab.fiware.org/static/badges/statuses/iot-openmtc.svg)
[![](https://img.shields.io/docker/pulls/openmtc/gateway-amd64.svg)](https://hub.docker.com/u/openmtc)
[![Build Status](https://travis-ci.org/OpenMTC/OpenMTC.svg?branch=master)](https://travis-ci.org/OpenMTC/OpenMTC)
The OpenMTC SDK aims to provide developers with a convenient yet flexible tool
to write oneM2M compliant applications. This includes network applications
@ -24,17 +22,12 @@ This project is part of [FIWARE](https://www.fiware.org/). For more information
check the FIWARE Catalogue entry for the
[IoT Agents](https://github.com/Fiware/catalogue/tree/master/iot-agents).
| :octocat: [Git Repository](https://github.com/OpenMTC/OpenMTC) | :whale: [Docker Hub](https://hub.docker.com/u/openmtc) | :books: [Documentation](https://fiware-openmtc.readthedocs.io/) | :page_facing_up: [Site](https://www.openmtc.org/) | :mortar_board: [Academy](https://fiware-academy.readthedocs.io/en/latest/iot-agents/open-mtc) |
| -------------------------------------------------------------- | ------------------------------------------------------ | --------------------------------------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------- |
# Content
- [Install](#install)
- [Usage](#usage)
- [API](#api)
- [Training](#training)
- [Quality Assurance](#quality-assurance)
- [Contributing](#contributing)
- [License](#license)
@ -49,11 +42,6 @@ corresponding section of the
Information about how to use the IoT Agent can be found in the
[User & Programmers Manual](https://fiware-openmtc.readthedocs.io/en/latest/introduction).
## Training
Information about our Training can be found in the
[Training Section](https://fiware-openmtc.readthedocs.io/en/latest/training/training-ipe-sensors/index.html).
## API
Information about the REST API can be found in the
@ -101,14 +89,10 @@ follows:
---
## Contributing
Contribution guidelines are detailed in the [CREDITS](CREDITS.md) file.
## License
## Licence
The OpenMTC SDK is licensed under the Eclipse Public License (EPL)
version 1.
© 2018-2019 OpenMTC
© 2018 OpenMTC

View File

@ -2,7 +2,7 @@
Transfer OpenMTC Data to an InfluxDB
"""
__version__ = "1.3.0"
__version__ = "1.2.0"
__description__ = "InfluxdbApp"
__author_name__ = "Christian Klopp"
__author_mail__ = "christian.klopp@fokus.fraunhofer.de"

View File

@ -3,7 +3,7 @@ This App will forward all incoming sensor traffic to the Fiware Orion Context
Broker
"""
__version__ = "1.3.0"
__version__ = "1.2.0"
__description__ = "OrionContextBroker"
__author_name__ = "Christian Klopp"
__author_mail__ = "christian.klopp@fokus.fraunhofer.de"

View File

@ -1,6 +1,5 @@
from urllib.parse import urljoin
import logging
from datetime import datetime
import requests
@ -90,8 +89,7 @@ class OrionAPI(LoggerMixin):
"type": self._get_type(data_senml["v"]),
"metadata": {
"timestamp": {
"value": datetime.fromtimestamp(float(data_senml["t"])).replace(microsecond=0).isoformat()
if data_senml["t"] != "none" else data_senml["t"],
"value": data_senml["t"],
"type": "String"
},
"bn": {

View File

@ -2,7 +2,7 @@
App to inject data from a csv file to OpenMTC
"""
__version__ = "1.3.0"
__version__ = "1.2.0"
__description__ = "csvInjector"
__author_name__ = "Christian Klopp"
__author_mail__ = "christian.klopp@fokus.fraunhofer.de"

View File

@ -2,7 +2,7 @@
TODO: Add description here
"""
__version__ = "1.3.0"
__version__ = "1.2.0"
__description__ = "mqttConnector"
__author_name__ = "Ronald Steinke"
__author_mail__ = "ronald.steinke@fokus.fraunhofer.de"

View File

@ -772,11 +772,21 @@ class EventNotificationCriteria(OneM2MEntity):
class BatchNotify(OneM2MEntity):
pass # TODO
""" See TS-004 6.3.5.6
See TS-004 Table 6.3.5.6-1"""
number = Attribute(int)
duration = Attribute(int)
class RateLimit(OneM2MEntity):
pass # TODO
""" See TS-004 6.3.5.31
See TS-004 Table 6.3.5.31-1"""
maxNrOfNotify = Attribute(int)
timeWindow = Attribute(int)
class Subscription(RegularResourceC):

View File

@ -13,7 +13,7 @@ from openmtc_onem2m.model import (get_onem2m_type, ContentInstance,
get_long_attribute_name,
OneM2MEntity, OneM2MResource, Container,
get_long_resource_name, OneM2MContentResource,
URIList, OneM2MIntEnum, SecurityInfo)
URIList, OneM2MIntEnum, SecurityInfo, AggregatedNotification)
_typename_matcher = re_compile(r'^m2m:([a-z]+)$')
@ -51,6 +51,17 @@ class OneM2MSerializer(LoggerMixin, metaclass=ABCMeta):
representation = data["notificationEvent"]["representation"]
representation = self.decode(self.dumps(representation))
data["notificationEvent"]["representation"] = representation
if resource_type is AggregatedNotification and "notification" in data:
notifications = data["notification"]
data["notification"] = []
for notification in notifications:
data["notification"].append(
self.decode(
self.dumps(notification)
)
)
resource = resource_type(**data)
if child_resource:
resource.childResource = child_resource
@ -67,6 +78,22 @@ class OneM2MDictSerializer(OneM2MSerializer):
self.logger.debug("Encoding representation: %s", representation)
if isinstance(resource, AggregatedNotification):
try:
notifications = representation["notification"]
if notifications:
representation["notification"] = []
for notification in notifications:
representation["notification"].append(
self.encode_resource(
notification, pretty, path, encoding, fields, True
)
)
except (AttributeError, KeyError):
pass
if isinstance(resource, Notification):
# handle notifications
try:
@ -120,7 +147,7 @@ class OneM2MDictSerializer(OneM2MSerializer):
k, v in representation.items()}
if not isinstance(resource, (OneM2MResource, Notification,
SecurityInfo, OneM2MContentResource)):
SecurityInfo, OneM2MContentResource,AggregatedNotification)):
return representation
typename = 'm2m:' + (get_short_resource_name(resource.typename) or

View File

@ -43,6 +43,6 @@ if __name__ == "__main__":
from openmtc_app.flask_runner import SimpleFlaskRunner as Runner
ep = "http://localhost:8000"
Runner(DataVisualization(poas=['http://localhost:21345'])).run(ep)
Runner(DataVisualization(), port=6050, host='auto').run(ep)

View File

@ -91,4 +91,4 @@ if __name__ == "__main__":
from openmtc_app.flask_runner import SimpleFlaskRunner as Runner
ep = "http://localhost:8000"
Runner(DataAggregation(poas=['http://localhost:21346'])).run(ep)
Runner(DataAggregation(), port=6050, host='auto').run(ep)

View File

@ -19,4 +19,4 @@ if __name__ == "__main__":
from openmtc_app.flask_runner import SimpleFlaskRunner as Runner
ep = "http://localhost:8000"
Runner(SimpleDecision2(poas=['http://localhost:21387'])).run(ep)
Runner(SimpleDecision2(), port=6050, host='auto').run(ep)

View File

@ -47,4 +47,4 @@ if __name__ == "__main__":
from openmtc_app.flask_runner import SimpleFlaskRunner as Runner
ep = "http://localhost:8000"
Runner(SimpleDecision(poas=['http://localhost:22245'])).run(ep)
Runner(SimpleDecision(), port=6050, host='auto').run(ep)

View File

@ -31,6 +31,5 @@ app_file=${app_array[$[${choice}-1]]}
################################################################################
# run app_file
cd ${base_path}
cd ..
. ../common/prep-env.sh
python3 ${app_file}
. ../../common/prep-env.sh
python ${app_file}

View File

@ -2,7 +2,7 @@
Interworking Proxy for Cul868 devices.
"""
__version__ = "1.3.0"
__version__ = "1.2.0"
__description__ = "The OpenMTC Cul868IPE"
__author_name__ = "Ronny Kreuch"
__author_mail__ = "ronny.kreuch@fokus.fraunhofer.de"

View File

@ -7,6 +7,9 @@ from openmtc_onem2m.model import (
EventNotificationCriteria,
NotificationEventTypeE,
Subscription,
BatchNotify,
RateLimit,
AggregatedNotification,
)
from openmtc_onem2m.serializer import get_onem2m_decoder
from urllib.parse import urlparse
@ -98,12 +101,19 @@ class NotificationManager(LoggerMixin):
def register_callback(self, func, sur, del_func=None):
self.callbacks[sur] = {
'cb': func if len(getargspec(func)[0]) > 1
else lambda _, **notification: func(notification['rep']),
else lambda _, **notification: (
func(notification['not']) if 'not' in notification.keys()
else func(notification['rep'])),
'del_cb': del_func
}
def _handle_callback(self, originator, **notification):
sur = notification.pop('sur')
try:
n = notification["not"][0]
except KeyError:
n = notification
sur = n.pop('sur')
sur = self._normalize_path(sur)
try:
@ -132,7 +142,7 @@ class NotificationManager(LoggerMixin):
def get_expiration_time(self):
return None
def subscribe(self, path, func, delete_func=None, filter_criteria=None, expiration_time=None,
def subscribe(self, path, func, delete_func=None, filter_criteria=None, sub_options=None, expiration_time=None,
notification_types=(NotificationEventTypeE.updateOfResource,)):
self._init()
@ -140,12 +150,23 @@ class NotificationManager(LoggerMixin):
event_notification_criteria.notificationEventType = (
event_notification_criteria.notificationEventType or list(notification_types))
subscription = self.mapper.create(path, Subscription(
subscription = Subscription(
notificationURI=[self.mapper.originator],
expirationTime=expiration_time or self.get_expiration_time(),
eventNotificationCriteria=event_notification_criteria,
subscriberURI=self.mapper.originator,
))
)
if sub_options:
try:
subscription.batchNotify = BatchNotify(**sub_options["batchNotify"])
except KeyError:
try:
subscription.rateLimit = RateLimit(**sub_options["rateLimit"])
except KeyError:
pass
subscription = self.mapper.create(path, subscription)
reference = self._normalize_path(subscription.path)
self.register_callback(func, reference, delete_func)
@ -263,10 +284,32 @@ class HttpNotificationHandler(BaseNotificationHandler):
cl = int(request.environ.get('CONTENT_LENGTH'), 0)
request.data = request.environ['wsgi.input'].read(cl)
notification = get_onem2m_decoder(request.content_type).decode(request.data)
if not notification.verificationRequest:
notification = self._unpack_notification(notification)
self._callback(request.headers['x-m2m-origin'], **notification)
######## NEW CODE BEGINNING
notification = {}
notification_type = get_onem2m_decoder(request.content_type).decode(request.data)
if isinstance(notification_type, AggregatedNotification):
notification["not"] = []
for n in notification_type.values["notification"]:
notification["not"].append(
self._unpack_notification(n)
)
else:
notification = self._unpack_notification(notification_type)
######## NEW CODE ENDING
# TODO Check if the above is working or take the below one
######## OLD CODE BEGINNING
# notification = get_onem2m_decoder(request.content_type).decode(request.data)
# if not notification.verificationRequest:
# notification = self._unpack_notification(notification)
######## OLD CODE ENDING
self._callback(request.headers['x-m2m-origin'], **notification)
return Response(
headers={

View File

@ -571,10 +571,11 @@ class XAE(LoggerMixin):
if x.rule != route]
def _add_subscription(self, path, _, handler, delete_handler, filter_criteria=None,
expiration_time=None):
sub_options=None, expiration_time=None):
params = {
'filter_criteria': filter_criteria,
'expiration_time': expiration_time,
'sub_options': sub_options,
}
return self.add_subscription_handler(path, handler, delete_handler, **params)
@ -590,7 +591,7 @@ class XAE(LoggerMixin):
def add_subscription_handler(self, path, handler, delete_handler=None,
types=(NotificationEventTypeE.updateOfResource, ),
filter_criteria=None, expiration_time=None):
filter_criteria=None, sub_options=None, expiration_time=None):
"""
:param path:
@ -598,6 +599,7 @@ class XAE(LoggerMixin):
:param delete_handler:
:param types:
:param filter_criteria:
:param sub_options:
:param expiration_time:
:return:
"""
@ -608,6 +610,7 @@ class XAE(LoggerMixin):
delete_handler,
notification_types=types,
filter_criteria=filter_criteria,
sub_options=sub_options,
expiration_time=expiration_time
)
@ -627,7 +630,7 @@ class XAE(LoggerMixin):
return subscription.path
def add_container_subscription(self, container, handler, delete_handler=None,
filter_criteria=None):
filter_criteria=None, sub_options=None):
""" Creates a Subscription to the ContentInstances of the given
Container.
@ -635,6 +638,7 @@ class XAE(LoggerMixin):
:param handler: reference of the notification handling function
:param delete_handler: reference to delete handling function
:param filter_criteria: (optional) FilterCriteria for the subscription
:param sub_options: (optional) SubscriptionOptions for the subscription
"""
path = getattr(container, "path", container)
@ -647,6 +651,7 @@ class XAE(LoggerMixin):
filter_criteria = filter_criteria or EventNotificationCriteria()
filter_criteria.notificationEventType = list([
NotificationEventTypeE.createOfDirectChildResource,
NotificationEventTypeE.updateOfResource,
])
def content_handler(cin):
@ -657,7 +662,8 @@ class XAE(LoggerMixin):
None,
content_handler,
delete_handler,
filter_criteria
filter_criteria,
sub_options,
)
def __start_refresher(self, instance, extra_fields=(), restore=None):

View File

@ -1 +0,0 @@
dependencies.txt

View File

@ -1,15 +0,0 @@
## Short Term
onem2m Release 2a compatibility
Group Resource
Pub/Sub improvements (rateLimit and batchNotify)
Persistence Enhancement
## Medium Term
onem2m Release 3 compatibility
Announcements
FlexContainer Resource
Node Resource
## Long Term
CoAP(s) & MQTTS
XML

View File

@ -1,3 +1,4 @@
import datetime
from openmtc_onem2m import OneM2MRequest
from openmtc_onem2m.exc import CSENotFound
from openmtc_onem2m.model import (
@ -8,6 +9,7 @@ from openmtc_onem2m.model import (
NotificationContentTypeE,
EventNotificationCriteria,
NotificationEventTypeE,
AggregatedNotification,
)
from openmtc_onem2m.transport import OneM2MOperation
from openmtc_server.Plugin import Plugin
@ -95,6 +97,10 @@ class NotificationHandler(Plugin):
"pid": subscription.parentID,
"enc": get_event_notification_criteria(subscription),
"sub": subscription,
"not": [], # notifications
"levt": datetime.datetime.now(), # last event time
"sno": 0 # sent notifications (ratelimit)
}
def _handle_subscription_updated(self, subscription, _):
@ -276,6 +282,68 @@ class NotificationHandler(Plugin):
# preSubscriptionNotify is not supported in this release of the
# document.
# batchNotify
try:
batch_notify = sub.batchNotify
if batch_notify is not None:
current_time = datetime.datetime.now()
notifications = self.subscriptions_info[sub.resourceID]["not"]
for uri in sub.notificationURI:
notifications.append(
Notification(
notificationEvent=NotificationEventC(
representation=resource
),
subscriptionReference=self._get_subscription_reference(uri, sub.path),
creator=sub.creator
)
)
# Note: the extra condition 'len(notifications) < int(batch_notify.number) + 1'
# is needed, otherwise sometimes one more notification is sent
if int(batch_notify.number) <= len(notifications) and len(notifications) < int(batch_notify.number) + 1 or \
int(batch_notify.duration) <= int((current_time - self.subscriptions_info[sub.resourceID]["levt"]).seconds):
aggregated_notification = AggregatedNotification(**{"notification": notifications})
self._send_notification(aggregated_notification, sub)
self.subscriptions_info[sub.resourceID]["levt"] = current_time
self.subscriptions_info[sub.resourceID]["not"] = []
return
except AttributeError:
pass
# rateLimit
try:
ratelimit = sub.rateLimit
if ratelimit is not None:
notification_resources = self.subscriptions_info[sub.resourceID]["not"]
for uri in sub.notificationURI:
notification_resources.append(resource)
for i in range(len(notification_resources)):
current_time = datetime.datetime.now()
if int((current_time - self.subscriptions_info[sub.resourceID]["levt"]).seconds) <= int(ratelimit.timeWindow):
if self.subscriptions_info[sub.resourceID]["sno"] <= int(ratelimit.maxNrOfNotify):
self._send_notification(notification_resources.pop(0), sub)
self.subscriptions_info[sub.resourceID]["sno"] += 1
else:
break
else:
self.subscriptions_info[sub.resourceID]["levt"] = current_time
self.subscriptions_info[sub.resourceID]["sno"] = 0
break
return
except AttributeError:
pass
# Step 3.0 The Originator shall check the notification and reachability
# schedules, but the notification schedules may be checked in different
# order.
@ -351,6 +419,15 @@ class NotificationHandler(Plugin):
def _send_notification(self, resource, sub):
self.logger.debug("sending notification for resource: %s", resource)
if isinstance(resource, AggregatedNotification):
for uri in sub.notificationURI:
self.api.handle_onem2m_request(OneM2MRequest(
op=OneM2MOperation.notify,
to=uri,
pc=resource
))
return
for uri in sub.notificationURI:
self.api.handle_onem2m_request(OneM2MRequest(
op=OneM2MOperation.notify,

View File

@ -13,7 +13,7 @@ from utils import (get_packages, OpenMTCSdist, OpenMTCBuildPy,
# name and version
SETUP_NAME = "openmtc-all"
SETUP_VERSION = "1.3.0"
SETUP_VERSION = "1.2.0"
SETUP_DESCRIPTION = "The OpenMTC Backend and Gateway (GEvent version)"
# meta

View File

@ -7,7 +7,7 @@ from utils import get_packages, OpenMTCSdist
# name and version
NAME = "sdk"
SETUP_NAME = "openmtc-" + NAME
SETUP_VERSION = "1.3.0"
SETUP_VERSION = "1.2.0"
SETUP_DESCRIPTION = "The OpenMTC Python SDK"
# meta