From 03a74fb8a71891be0259fea2c4a93f62e7159c17 Mon Sep 17 00:00:00 2001
From: garciay <yann.garcia@fscom.fr>
Date: Thu, 27 Mar 2025 13:55:59 +0100
Subject: [PATCH] Add IoT subscriptions

---
 charts/meep-sss/templates/deployment.yaml     |    2 +-
 charts/meep-sss/templates/service.yaml        |    4 +-
 charts/meep-sss/values-template.yaml          |    4 +-
 go-apps/meep-sss/Dockerfile                   |    2 +-
 go-apps/meep-sss/sbi/sss-sbi.go               |   12 +-
 go-apps/meep-sss/server/meep-sss.go           |    6 +-
 .../meep-sss-mgr/SssMgrBindingProtocol.go     |    4 +-
 go-packages/meep-sss-mgr/http.go              |   67 +-
 go-packages/meep-sss-mgr/mqtt.go              |   40 +-
 go-packages/meep-sss-mgr/onem2m-mgr.go        |  284 ++-
 go-packages/meep-sss-mgr/onem2m-mgr_test.go   | 1557 +++++++++--------
 11 files changed, 1123 insertions(+), 859 deletions(-)

diff --git a/charts/meep-sss/templates/deployment.yaml b/charts/meep-sss/templates/deployment.yaml
index 3783dbc2c..da7ba4957 100644
--- a/charts/meep-sss/templates/deployment.yaml
+++ b/charts/meep-sss/templates/deployment.yaml
@@ -35,7 +35,7 @@ spec:
           ports:
             - containerPort: {{ .Values.deployment.port }}
               protocol: {{ .Values.deployment.protocol }}
-            - containerPort: 33122
+            - containerPort: 31122
               protocol: TCP
           env:
             {{- range $key, $value := .Values.image.env }}
diff --git a/charts/meep-sss/templates/service.yaml b/charts/meep-sss/templates/service.yaml
index b5c7947b6..ddfd90a98 100644
--- a/charts/meep-sss/templates/service.yaml
+++ b/charts/meep-sss/templates/service.yaml
@@ -21,8 +21,8 @@ spec:
       nodePort: {{ .Values.service.nodePort }}
       {{- end }}
     - name: onem2m
-      port: 33122
-      targetPort: 33122
+      port: 31122
+      targetPort: 31122
     {{- if .Values.prometheus.monitor.enabled}}
     - name: metrics
       port: {{ .Values.prometheus.monitor.port }}
diff --git a/charts/meep-sss/values-template.yaml b/charts/meep-sss/values-template.yaml
index 6455ce203..08082698d 100644
--- a/charts/meep-sss/values-template.yaml
+++ b/charts/meep-sss/values-template.yaml
@@ -52,12 +52,12 @@ ingress:
         - path: /{{.SandboxName}}/{{.MepName}}/sens
           port: 80
         - path: /{{.SandboxName}}/{{.MepName}}/onem2m
-          port: 33122
+          port: 31122
         {{- else }}
         - path: /{{.SandboxName}}/sens
           port: 80
         - path: /{{.SandboxName}}/onem2m
-          port: 33122
+          port: 31122
         {{- end }}
   annotations:
     kubernetes.io/ingress.class: nginx
diff --git a/go-apps/meep-sss/Dockerfile b/go-apps/meep-sss/Dockerfile
index d5d291efa..55202c3c4 100644
--- a/go-apps/meep-sss/Dockerfile
+++ b/go-apps/meep-sss/Dockerfile
@@ -22,6 +22,6 @@ RUN chmod +x /entrypoint.sh
 
 RUN dpkg --configure -a
 
-EXPOSE 33122/tcp
+EXPOSE 31122/tcp
 
 ENTRYPOINT ["/entrypoint.sh"]
diff --git a/go-apps/meep-sss/sbi/sss-sbi.go b/go-apps/meep-sss/sbi/sss-sbi.go
index 420ca6d17..28fee7297 100644
--- a/go-apps/meep-sss/sbi/sss-sbi.go
+++ b/go-apps/meep-sss/sbi/sss-sbi.go
@@ -65,9 +65,9 @@ type SbiCfg struct {
 	Port            int
 	HostId          string
 	Name            string
-	DiscoveryNotify func()
-	StatusNotify    func()
-	DataNotify      func()
+	DiscoveryNotify func(map[string]interface{})
+	StatusNotify    func(map[string]interface{})
+	DataNotify      func(map[string]interface{})
 	ScenarioNameCb  func(string)
 	CleanUpCb       func()
 }
@@ -89,9 +89,9 @@ type SssSbi struct {
 	port                 int
 	hostId               string
 	name                 string
-	discoveryNotify      func()
-	statusNotify         func()
-	dataNotify           func()
+	discoveryNotify      func(map[string]interface{})
+	statusNotify         func(map[string]interface{})
+	dataNotify           func(map[string]interface{})
 	updateScenarioNameCB func(string)
 	cleanUpCB            func()
 	mutex                sync.Mutex
diff --git a/go-apps/meep-sss/server/meep-sss.go b/go-apps/meep-sss/server/meep-sss.go
index ba44fb2ac..d07e22f94 100644
--- a/go-apps/meep-sss/server/meep-sss.go
+++ b/go-apps/meep-sss/server/meep-sss.go
@@ -1767,17 +1767,17 @@ func sendExpiryNotification(notifyUrl string, notification ExpiryNotification) {
  * @param {struct} notification contains notification body of type SensorDiscoveryEventNotification
  * @see ETSI GS MEC 046 V3.1.1 (2024-04) Clause 7
  */
-func discoveryNotify() {
+func discoveryNotify(map[string]interface{}) {
 	log.Debug(">>> sendTestNotification: discoveryNotify")
 
 }
 
-func statusNotify() {
+func statusNotify(map[string]interface{}) {
 	log.Debug(">>> sendTestNotification: statusNotify")
 
 }
 
-func dataNotify() {
+func dataNotify(map[string]interface{}) {
 	log.Debug(">>> sendTestNotification: dataNotify")
 
 }
diff --git a/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go b/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go
index 07585187a..86f4481c2 100644
--- a/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go
+++ b/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go
@@ -1,10 +1,8 @@
 package sssmgr
 
 type SssMgrBindingProtocol interface {
-	init(tm *SssMgr) (err error)
+	init(tm *SssMgr, notify func(map[string]interface{})) (err error)
 	send(p_ctx SssMgrBindingProtocolContext) (err error, resp interface{})
-	//(p_op string, p_type string, p_to string, p_from string, p_ri string, p_rev []string, p_bodyMap map[string]map[string]interface{}) (err error, resp map[string]map[string]interface{})
-	notify(p_resp string) (err error)
 	uninit() (err error)
 }
 
diff --git a/go-packages/meep-sss-mgr/http.go b/go-packages/meep-sss-mgr/http.go
index cc6ee1d88..ce9fcc5f1 100644
--- a/go-packages/meep-sss-mgr/http.go
+++ b/go-packages/meep-sss-mgr/http.go
@@ -17,6 +17,7 @@ import (
 )
 
 type SssMgrHttp struct {
+	notify func(map[string]interface{})
 }
 
 const (
@@ -29,19 +30,21 @@ func NewSssMgrHttp() (http_mgr *SssMgrHttp) {
 	return new(SssMgrHttp)
 }
 
-func (http_mgr *SssMgrHttp) init(tm *SssMgr) (err error) {
+func (http_mgr *SssMgrHttp) init(tm *SssMgr, notify func(map[string]interface{})) (err error) {
 	log.Info(">>> init")
 
-	// log.Info("Init: Starting OneM2M Notification server")
-	// go func() {
-	// 	http.HandleFunc("/", tm.handleRoot)
-	// 	err := http.ListenAndServe(":33122", nil)
-	// 	if err != nil {
-	// 		log.Error(err.Error())
-	// 		return
-	// 	}
-	// 	log.Info("<<< Init: Terminating OneM2M Notification server")
-	// }()
+	http_mgr.notify = notify
+
+	go func() {
+		log.Info("Init: Starting OneM2M Notification server")
+		http.HandleFunc("/", http_mgr.handleRoot)
+		err := http.ListenAndServe(":31122", nil)
+		if err != nil {
+			log.Error(err.Error())
+			return
+		}
+		log.Info("<<< Init: Terminating OneM2M Notification server")
+	}()
 
 	return nil
 }
@@ -51,15 +54,49 @@ func (http_mgr *SssMgrHttp) handleRoot(w http.ResponseWriter, r *http.Request) {
 
 	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
 
-	// get & validate query param values for sensorIdentifier
+	// Get URL
 	u, _ := url.Parse(r.URL.String())
 	log.Info("url: ", u.RequestURI())
 
+	if r.Method == "POST" { // Notification
+		// Extract body
+		bodyBytes, _ := ioutil.ReadAll(r.Body)
+		log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes))
+		var body map[string]map[string]interface{}
+		err := json.Unmarshal(bodyBytes, &body)
+		if err != nil {
+			log.Error(err.Error())
+			w.WriteHeader(http.StatusInternalServerError)
+			fmt.Fprint(w, err.Error())
+			return
+		}
+		log.Info("handleRoot: body: ", body)
+		//map[m2m:sgn:map[nev:map[net:3 rep:map[m2m:cnt:map[cbs:0 cni:0 ct:20250327T111057,824274 et:20300326T111032,133324 lt:20250327T111057,824274 mbs:10000 mni:10 pi:C7feaadbb0400 ri:cnt8465776292050557472 rn:test st:0 ty:3]]] sur:/laboai-acme-ic-cse/sub3916638126520907910]]
+		if _, ok := body["m2m:sgn"]; !ok {
+			err := errors.New("Only m2m:sgn is expected")
+			log.Error(err.Error())
+			w.WriteHeader(http.StatusBadRequest)
+			fmt.Fprint(w, err.Error())
+			return
+		}
+		// Call callback
+		m := body["m2m:sgn"]
+		log.Info("handleRoot: m: ", m)
+		if http_mgr.notify != nil {
+			http_mgr.notify(m)
+		}
+	} else {
+		log.Warn("handleRoot: Unsupported method", r.Method)
+		w.WriteHeader(http.StatusNotImplemented)
+		return
+	}
+
 	w.WriteHeader(http.StatusOK)
 }
 
 func (http_mgr *SssMgrHttp) uninit() (err error) {
 	log.Info(">>> uninit")
+
 	return nil
 }
 
@@ -130,12 +167,6 @@ func (http_mgr *SssMgrHttp) send(p_ctx SssMgrBindingProtocolContext) (err error,
 
 	return nil, resp
 }
-
-func (http_mgr *SssMgrHttp) notify(p_resp string) (err error) {
-	log.Info(">>> notify")
-	return nil
-}
-
 func sendRequest(method string, url string, headers http.Header, body io.Reader, vars map[string]string, query map[string]string, code int) ([]byte, error) {
 	//log.Debug(">>> sendRequest: url: ", url)
 	//log.Debug(">>> sendRequest: headers: ", headers)
diff --git a/go-packages/meep-sss-mgr/mqtt.go b/go-packages/meep-sss-mgr/mqtt.go
index 04ca84151..9eec0dde7 100644
--- a/go-packages/meep-sss-mgr/mqtt.go
+++ b/go-packages/meep-sss-mgr/mqtt.go
@@ -13,14 +13,13 @@ import (
 )
 
 type SssMgrMqtt struct {
-	running       bool
-	opts          *mqtt.ClientOptions
-	client        mqtt.Client
-	sent_topic    string
-	onem2m_notify func(p_topic string, p_payload []byte)
+	running    bool
+	opts       *mqtt.ClientOptions
+	client     mqtt.Client
+	sent_topic string
 }
 
-var _onem2m_notify func(p_topic string, p_payload []byte)
+var _notify func(map[string]interface{}) = nil
 
 var _sync_response *sync.WaitGroup = nil // Used to synchronize the response
 var _responses map[uint16]mqtt.Message
@@ -28,8 +27,8 @@ var _responses map[uint16]mqtt.Message
 func onMessageReceived(client mqtt.Client, msg mqtt.Message) {
 	go func() {
 		log.Info("onMessageReceived: Received message: ", msg.Payload(), " on topic ", msg.Topic())
-		// if _onem2m_notify != nil {
-		// 	_onem2m_notify(msg.Topic(), msg.Payload())
+		// if _notify != nil {
+		// 	...
 		// } else {
 		// 	log.Info("onMessageReceived: null pointer for the callbacl")
 		// }
@@ -39,11 +38,11 @@ func onMessageReceived(client mqtt.Client, msg mqtt.Message) {
 func onMessageReceivedReq(client mqtt.Client, msg mqtt.Message) {
 	go func() {
 		log.Info("onMessageReceivedReq: Received message: ", string(msg.Payload()), " on topic ", msg.Topic())
-		if _onem2m_notify != nil {
-			_onem2m_notify(msg.Topic(), msg.Payload())
-		} else {
-			log.Info("onMessageReceivedReq: null pointer for the callbacl")
-		}
+		// if _notify != nil {
+		// 	...
+		// } else {
+		// 	log.Info("onMessageReceivedReq: null pointer for the callbacl")
+		// }
 	}()
 }
 
@@ -68,11 +67,13 @@ func NewSssMgrMqtt() (broker_mqtt *SssMgrMqtt) {
 	return new(SssMgrMqtt)
 }
 
-func (broker_mqtt *SssMgrMqtt) init(tm *SssMgr) (err error) {
+func (broker_mqtt *SssMgrMqtt) init(tm *SssMgr, notify func(map[string]interface{})) (err error) {
 	log.Info(">>> init")
 
 	broker_mqtt.running = false
 
+	_notify = notify
+
 	broker_mqtt.opts = mqtt.NewClientOptions()
 	broker_mqtt.opts.SetDefaultPublishHandler(onMessageReceived)
 	broker_mqtt.opts.SetClientID("AdvantEDGE.meep-vis-traffic-mgr")
@@ -109,11 +110,6 @@ func (broker_mqtt *SssMgrMqtt) init(tm *SssMgr) (err error) {
 	}
 	token.Wait()
 
-	_onem2m_notify = broker_mqtt.onem2m_notify
-	if _onem2m_notify == nil {
-		log.Error("init: _onem2m_notify is nil")
-	}
-
 	_sync_response = new(sync.WaitGroup) // Used to synchronize the response
 	_responses = make(map[uint16]mqtt.Message, 0)
 
@@ -248,9 +244,3 @@ func (broker_mqtt *SssMgrMqtt) send(p_ctx SssMgrBindingProtocolContext) (err err
 
 	return nil, nil
 }
-
-func (broker_mqtt *SssMgrMqtt) notify(p_resp string) (err error) {
-	log.Info(">>> notify")
-
-	return nil
-}
diff --git a/go-packages/meep-sss-mgr/onem2m-mgr.go b/go-packages/meep-sss-mgr/onem2m-mgr.go
index d01cf6d20..ceebba77f 100644
--- a/go-packages/meep-sss-mgr/onem2m-mgr.go
+++ b/go-packages/meep-sss-mgr/onem2m-mgr.go
@@ -17,11 +17,8 @@
 package sssmgr
 
 import (
-	"bytes"
 	"encoding/json"
 	"errors"
-	"fmt"
-	"net/http"
 	"reflect"
 	"strconv"
 	"strings"
@@ -45,9 +42,9 @@ type SssMgr struct {
 	mutex                sync.Mutex
 	wg                   sync.WaitGroup
 	refreshTicker        *time.Ticker
-	sss_discovery_notify func()
-	sss_status_notify    func()
-	sss_data_notify      func()
+	sss_discovery_notify func(map[string]interface{})
+	sss_status_notify    func(map[string]interface{})
+	sss_data_notify      func(map[string]interface{})
 }
 
 type IotPlatformInfo struct {
@@ -91,8 +88,10 @@ var profilingTimers map[string]time.Time
 
 var protocol SssMgrBindingProtocol
 
+var subscriptionListPerSubId map[string]SensorDiscoveryInfo
+
 // NewSssMgr - Creates and initializes a new SSS Traffic Manager
-func NewSssMgr(name string, namespace string, bindingProtocol string, host string, port int, hostId string, cse_name string, sss_discovery_notify func(), sss_status_notify func(), sss_data_notify func()) (tm *SssMgr, err error) {
+func NewSssMgr(name string, namespace string, bindingProtocol string, host string, port int, hostId string, cse_name string, sss_discovery_notify func(map[string]interface{}), sss_status_notify func(map[string]interface{}), sss_data_notify func(map[string]interface{})) (tm *SssMgr, err error) {
 	if name == "" {
 		err = errors.New("Missing connector name")
 		return nil, err
@@ -143,7 +142,7 @@ func NewSssMgr(name string, namespace string, bindingProtocol string, host strin
 		return nil, err
 	}
 
-	err = protocol.init(tm)
+	err = protocol.init(tm, tm.notify)
 	if err != nil {
 		log.Error(err.Error())
 		return nil, err
@@ -174,7 +173,7 @@ func (tm *SssMgr) init() {
 	sensorsMap = make(map[string]SensorDiscoveryInfo, 0)
 	sensorsPerPlatformMap = make(map[string][]string, 0)
 	tm.refreshTicker = nil
-
+	subscriptionListPerSubId = make(map[string]SensorDiscoveryInfo, 0)
 }
 
 // DeleteSssMgr -
@@ -185,6 +184,11 @@ func (tm *SssMgr) DeleteSssMgr() (err error) {
 		protocol.uninit()
 		protocol = nil
 	}
+
+	sensorsMap = nil
+	sensorsPerPlatformMap = nil
+	subscriptionListPerSubId = nil
+
 	return nil
 }
 
@@ -684,56 +688,92 @@ func (tm *SssMgr) OneM2M_get(path string, iotPlatformId string) (sensorResp Sens
 	return sensorResp, nil
 }
 
-func (tm *SssMgr) oneM2M_subscribe(sensor SensorDiscoveryInfo, requestedIotPlatformId string, type_ string) (subscription string, err error) {
-	// FIXME FSCOM: requestedIotPlatformId should be useless
-
-	// Build the headers
-	var headers = http.Header{}
-	headers["Accept"] = []string{headerAccept}
-	headers["X-M2M-Origin"] = []string{"C" + requestedIotPlatformId} // FIXME FSCOM How to get it
-	headers["X-M2M-RI"] = []string{uuid.New().String()}
-	headers["X-M2M-RVI"] = []string{"4"}
-	s := headerContentType + ";ty=23"
-	headers["Content-Type"] = []string{s}
-	// Build the url and the body
-	var url string
+func (tm *SssMgr) OneM2M_subscribe(iotPlatformId string, path string) (subscription string, err error) {
+	if profiling {
+		profilingTimers["OneM2M_subscribe"] = time.Now()
+	}
+
+	log.Info(">>> OneM2M_subscribe: path: ", path)
+	log.Info(">>> OneM2M_subscribe: iotPlatformId: ", iotPlatformId)
+
+	if path == "" || iotPlatformId == "" {
+		err = errors.New("OneM2M_subscribe: Invalid parameters")
+		log.Error("OneM2M_subscribe: ", err.Error())
+		return "", err
+	}
+
+	tm.wg.Wait()
+	log.Info("OneM2M_subscribe: After Synchro")
+
+	// 1. Get the list of the AE
+	// Build the context
+	var ctx = SssMgrBindingProtocolContext{
+		host: registeredIotPlatformsMap[iotPlatformId].Address,
+		port: registeredIotPlatformsMap[iotPlatformId].Port,
+		name: registeredIotPlatformsMap[iotPlatformId].Name,
+		to:   path,
+		from: registeredIotPlatformsMap[iotPlatformId].IotPlatformId,
+		op:   1, // SUBSCRIBE
+		ty:   23,
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		code: 200,
+	}
 	var bodyMap = map[string]map[string]interface{}{}
 	bodyMap["m2m:sub"] = make(map[string]interface{}, 0)
-	net := make(map[string][4]int)
-	net["net"] = [4]int{1, 2, 3, 4}
+	net := make(map[string][]int)
+	net["net"] = []int{2, 3, 4}
 	bodyMap["m2m:sub"]["enc"] = net
-	bodyMap["m2m:sub"]["nu"] = "" // FIXME The URI of the listener
-	bodyMap["m2m:sub"]["rn"] = sensor.SensorIdentifier
-	url = "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + registeredIotPlatformsMap[requestedIotPlatformId].Name
-	log.Debug("oneM2M_subscribe: url=", url)
-	log.Debug("oneM2M_subscribe: bodyMap=", bodyMap)
-	body, err := json.Marshal(bodyMap)
+	bodyMap["m2m:sub"]["nu"] = []string{"http://172.29.10.52:31122/"} // FIXME FSCOM The URI of the listener
+	bodyMap["m2m:sub"]["rn"] = uuid.New().String()
+	ctx.body = bodyMap
+
+	err, resp := protocol.send(ctx)
 	if err != nil {
-		log.Error("oneM2M_subscribe: ", err.Error())
+		log.Error("OneM2M_subscribe: ", err.Error())
 		return "", err
 	}
-	log.Debug("oneM2M_subscribe: Request body: ", string(body))
-	// Send the request
-	response, err := sendRequest("POST", url, headers, bytes.NewBuffer(body), nil, nil, 201)
-	if err != nil {
-		log.Error("oneM2M_subscribe: ", err.Error())
+	log.Debug("OneM2M_subscribe: resp: ", resp)
+	log.Debug("OneM2M_subscribe: TypeOf(resp): ", reflect.TypeOf(resp))
+	if _, ok := resp.(map[string]interface{}); !ok {
+		log.Error("OneM2M_create: Interface not available")
+		return "", err
+	}
+
+	if _, ok := resp.(map[string]interface{})["m2m:sub"].(map[string]interface{})["ri"]; !ok {
+		err = errors.New("Subsciption identifier not present")
+		log.Error("OneM2M_subscribe: ", err.Error())
 		return "", err
 	}
-	log.Debug("oneM2M_subscribe: response: ", string(response))
-	var d map[string]map[string]interface{}
-	err = json.Unmarshal(response, &d)
+	subId := resp.(map[string]interface{})["m2m:sub"].(map[string]interface{})["ri"].(string)
+	log.Debug("OneM2M_subscribe: subId: ", subId)
+
+	// Add additional entries
+	var v = SensorDiscoveryInfo{
+		SensorIdentifier: subId,
+		SensorType:       "SUB",
+		IotPlatformId:    iotPlatformId,
+	}
+	v, err = tm.oneM2M_deserialize(v, resp.(map[string]interface{}))
 	if err != nil {
-		log.Error("oneM2M_subscribe: ", err.Error())
+		log.Error("OneM2M_subscribe: ", err.Error())
 		return "", err
 	}
-	log.Debug("oneM2M_subscribe: d: ", d)
+	log.Debug("OneM2M_cOneM2M_subscribereate: sensvorResp: ", v)
+
+	subscriptionListPerSubId[subId] = v
+
+	//map[m2m:sub:map[ct:20250327T065259,502192 enc:map[net:[1 2 3 4]] et:20300326T065259,314830 lt:20250327T065259,502192 nct:1 nu:[http://172.29.10.52:31122] pi:C7feaadbb0400 ri:sub415201783625924167 rn:e31e93f4-8514-4c83-8854-364eee1ad305 ty:23]]
 
-	err = errors.New("oneM2M_subscribe: To be implemented")
-	return "", err /*nil*/
+	if profiling {
+		now := time.Now()
+		log.Debug("OneM2M_subscribe: ", now.Sub(profilingTimers["OneM2M_subscribe"]))
+	}
+
+	return subId, nil
 }
 
 func (tm *SssMgr) OneM2M_Delete(sensor SensorDiscoveryInfo) (err error) {
-	// FIXME FSCOM: requestedIotPlatformId should be useless
 
 	if profiling {
 		profilingTimers["OneM2M_Delete"] = time.Now()
@@ -783,16 +823,134 @@ func (tm *SssMgr) OneM2M_Delete(sensor SensorDiscoveryInfo) (err error) {
 	return nil
 }
 
-func (tm *SssMgr) oneM2M_subscribe_discovery_event(requestedIotPlatformId string) (err error) {
+func (tm *SssMgr) OneM2M_DeleteSub(subId string) (err error) {
+
+	if profiling {
+		profilingTimers["OneM2M_DeleteSub"] = time.Now()
+	}
+
+	log.Info(">>> OneM2M_DeleteSub: sensor=", subId)
+
+	if subId == "" {
+		err = errors.New("subId fiels shall be set")
+		log.Error("OneM2M_DeleteSub: ", err.Error())
+		return err
+	}
+
+	if _, ok := subscriptionListPerSubId[subId]; !ok {
+		err = errors.New("Unkmown subscription identifier")
+		log.Error("OneM2M_DeleteSub: ", err.Error())
+		return err
+	}
+
+	tm.wg.Wait()
+	log.Info("OneM2M_DeleteSub: After Synchro")
+
+	// Send it and get the result
+	var ctx = SssMgrBindingProtocolContext{
+		host: registeredIotPlatformsMap[subscriptionListPerSubId[subId].IotPlatformId].Address,
+		port: registeredIotPlatformsMap[subscriptionListPerSubId[subId].IotPlatformId].Port,
+		name: registeredIotPlatformsMap[subscriptionListPerSubId[subId].IotPlatformId].Name,
+		to:   subscriptionListPerSubId[subId].SensorIdentifier,
+		from: subscriptionListPerSubId[subId].IotPlatformId,
+		op:   4, // DELETE
+		ty:   -1,
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		code: 200,
+	}
+	err, _ = protocol.send(ctx)
+	if err != nil {
+		log.Error("OneM2M_DeleteSub: ", err.Error())
+		return err
+	}
+
+	delete(subscriptionListPerSubId, subId)
+	log.Info("OneM2M_DeleteSub: New subscriptionListPerSubId: ", subscriptionListPerSubId)
+
+	if profiling {
+		now := time.Now()
+		log.Debug("OneM2M_DeleteSub: ", now.Sub(profilingTimers["OneM2M_DeleteSub"]))
+	}
 
 	return nil
 }
 
-func (tm *SssMgr) oneM2M_deserialize(sensor SensorDiscoveryInfo, response map[string]interface{}) (sensorResp SensorDiscoveryInfo, err error) {
-	sensorResp = sensor // Same data structure
+func (tm *SssMgr) notify(sub map[string]interface{}) {
+	log.Debug(">>> notify: sub: ", sub)
+
+	// Sanity checks
+	if _, ok := sub["nev"]; !ok {
+		log.Warn("notify: nev entry is missing")
+		return
+	}
+	if _, ok := sub["nev"].(map[string]interface{}); !ok {
+		log.Warn("notify: nev entry has unexpected type")
+		return
+	}
+	if _, ok := sub["nev"].(map[string]interface{}); !ok {
+		log.Warn("notify: nev entry has unexpected type")
+		return
+	}
+	if _, ok := sub["sur"]; !ok {
+		log.Warn("notify: sur entry is missing")
+		return
+	}
 
+	// Process subscription
+	s := strings.Split(sub["sur"].(string), "/")
+	log.Debug("notify: s: ", s)
+	log.Debug("notify: CSE-ID: ", s[1])
+	log.Debug("notify: subURL: ", strings.Join(s[2:], "/"))
+
+	rep := sub["nev"].(map[string]interface{})
+	log.Debug("notify: rep: ", rep["rep"].(map[string]interface{}))
+	if _, ok := rep["rep"]; !ok {
+		log.Warn("notify: rep entry is missing")
+		return
+	}
+	if _, ok := rep["rep"].(map[string]interface{}); !ok {
+		log.Warn("notify: rep entry has unexpected type")
+		return
+	}
+	r := rep["rep"].(map[string]interface{})
+	log.Debug("notify: r: ", r)
+	// FIXME FSCOM How to mange the 3 levels of subscriptions???
+	if v, ok := r["m2m:ae"]; ok { // Discovery notification
+		log.Debug("notify: AE level")
+		if tm.sss_discovery_notify != nil {
+			go func() {
+				tm.sss_discovery_notify(v.(map[string]interface{}))
+			}()
+		}
+		return
+	} else if v, ok := r["m2m:cnt"]; ok { // Status notification
+		log.Debug("notify: CNT level")
+		if tm.sss_status_notify != nil {
+			go func() {
+				tm.sss_status_notify(v.(map[string]interface{}))
+			}()
+		}
+		return
+	} else if v, ok := r["m2m:cin"]; ok { // Data notification
+		if tm.sss_data_notify != nil {
+			go func() {
+				tm.sss_data_notify(v.(map[string]interface{}))
+			}()
+		}
+		log.Debug("notify: CIN level")
+		return
+	} else {
+		log.Debug("notify: Unexpected level")
+		return
+	}
+}
+
+func (tm *SssMgr) oneM2M_deserialize(sensor SensorDiscoveryInfo, response map[string]interface{}) (sensorResp SensorDiscoveryInfo, err error) {
 	log.Debug(">>> oneM2M_deserialize: response: ", response)
 
+	sensorResp = sensor // Same data structure
+
 	for i, m := range response {
 		log.Debug("==> ", i, " value is ", m)
 		if _, ok := m.(map[string]interface{}); !ok {
@@ -864,19 +1022,35 @@ func (tm *SssMgr) oneM2M_deserialize(sensor SensorDiscoveryInfo, response map[st
 							CharacteristicValue: strings.Join(item, ","),
 						})
 				} else if item, ok := v.([]int64); ok {
-					log.Error("oneM2M_deserialize: Failed to convert list of int64 into string: ", item)
+					log.Warn("oneM2M_deserialize: Failed to convert list of int64 into string: ", item)
+				} else if item, ok := v.(map[string]interface{}); ok {
+					v, err := json.Marshal(item)
+					if err == nil {
+						sensorResp.SensorCharacteristicList = append(
+							sensorResp.SensorCharacteristicList,
+							SensorCharacteristic{
+								CharacteristicName:  k,
+								CharacteristicValue: string(v),
+							})
+					} else {
+						log.Warn("oneM2M_deserialize: ", err.Error())
+					}
 				} else if item, ok := v.([]interface{}); ok {
 					log.Debug("oneM2M_deserialize: Got []interface {} for ", k)
 					log.Debug("oneM2M_deserialize: ValueOf ", reflect.ValueOf(item))
-					s := SensorCharacteristic{
-						CharacteristicName: k,
+					v, err := json.Marshal(item)
+					if err == nil {
+						sensorResp.SensorCharacteristicList = append(
+							sensorResp.SensorCharacteristicList,
+							SensorCharacteristic{
+								CharacteristicName:  k,
+								CharacteristicValue: string(v),
+							})
+					} else {
+						log.Warn("oneM2M_deserialize: ", err.Error())
 					}
-					var buf bytes.Buffer
-					fmt.Fprintf(&buf, "%T", item)
-					s.CharacteristicValue = buf.String()
-					sensorResp.SensorCharacteristicList = append(sensorResp.SensorCharacteristicList, s)
 				} else {
-					log.Error("oneM2M_deserialize: Failed to process: ", k)
+					log.Warn("oneM2M_deserialize: Failed to process: ", k)
 				}
 			}
 		} // End of 'for' loop
diff --git a/go-packages/meep-sss-mgr/onem2m-mgr_test.go b/go-packages/meep-sss-mgr/onem2m-mgr_test.go
index 29632a58d..e3b43d099 100644
--- a/go-packages/meep-sss-mgr/onem2m-mgr_test.go
+++ b/go-packages/meep-sss-mgr/onem2m-mgr_test.go
@@ -20,6 +20,7 @@ import (
 	"fmt"
 	"reflect"
 	"testing"
+	"time"
 
 	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
 )
@@ -27,420 +28,479 @@ import (
 const tmName = "meep-iot"
 const tmNamespace = "sandboxtest"
 
-func TestNewSssMgr(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestNewSssMgr(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Invalid Connector
-	fmt.Println("Invalid SSS Asset Manager")
-	tm, err := NewSssMgr("", tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err == nil || tm != nil {
-		t.Fatalf("Service name not set")
-	}
-	tm, err = NewSssMgr(tmName, tmNamespace, "", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err == nil || tm != nil {
-		t.Fatalf("Binding protocol not set")
-	}
-	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err == nil || tm != nil {
-		t.Fatalf("Host not set")
-	}
-	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "", "laboai-acme-ic-cse", nil, nil, nil)
-	if err == nil || tm != nil {
-		t.Fatalf("Host id not set")
-	}
-	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "", nil, nil, nil)
-	if err == nil || tm != nil {
-		t.Fatalf("CSE name not set")
-	}
+// 	// Invalid Connector
+// 	fmt.Println("Invalid SSS Asset Manager")
+// 	tm, err := NewSssMgr("", tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err == nil || tm != nil {
+// 		t.Fatalf("Service name not set")
+// 	}
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err == nil || tm != nil {
+// 		t.Fatalf("Binding protocol not set")
+// 	}
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err == nil || tm != nil {
+// 		t.Fatalf("Host not set")
+// 	}
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err == nil || tm != nil {
+// 		t.Fatalf("Host id not set")
+// 	}
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "", nil, nil, nil)
+// 	if err == nil || tm != nil {
+// 		t.Fatalf("CSE name not set")
+// 	}
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
 
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err = NewSssMgr(tmName, tmNamespace, "REST_HTTP", "172.29.10.56", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "REST_HTTP", "172.29.10.56", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestPopulateDevicesPerIotPlatformsHttp(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// func TestPopulateDevicesPerIotPlatformsHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	err = tm.populateDevicesPerIotPlatforms()
-	if err != nil {
-		t.Fatalf(err.Error())
-	}
+// 	err = tm.populateDevicesPerIotPlatforms()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestSensorDiscoveryInfoAllHttp(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "", 0, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// func TestSensorDiscoveryInfoAllHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "", 0, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	sensors, err := tm.SensorDiscoveryInfoAll()
-	if err != nil {
-		t.Fatalf(err.Error())
-	}
-	fmt.Println("len=", len(sensors))
-	fmt.Println("sensors", sensors)
+// 	sensors, err := tm.SensorDiscoveryInfoAll()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("len=", len(sensors))
+// 	fmt.Println("sensors", sensors)
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestGetSensorHttp(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestGetSensorHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	sensors, err := tm.SensorDiscoveryInfoAll()
-	if err != nil {
-		t.Fatalf(err.Error())
-	}
+// 	sensors, err := tm.SensorDiscoveryInfoAll()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
 
-	for _, v := range sensors {
-		fmt.Println("v", v)
-		fmt.Println("TypeOf(v)", reflect.TypeOf(v))
+// 	for _, v := range sensors {
+// 		fmt.Println("v", v)
+// 		fmt.Println("TypeOf(v)", reflect.TypeOf(v))
 
-		sensor, err := tm.GetSensor(v.SensorIdentifier)
-		if !validate_sensor_discovery_info(v, sensor) {
-			t.Fatalf(err.Error())
-		}
-	}
+// 		sensor, err := tm.GetSensor(v.SensorIdentifier)
+// 		if !validate_sensor_discovery_info(v, sensor) {
+// 			t.Fatalf(err.Error())
+// 		}
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_createAEHttp(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestOneM2M_createAEHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	var sensor = SensorDiscoveryInfo{
-		SensorIdentifier: "12345",
-		SensorType:       "AE",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	new_sensor, err := tm.OneM2M_create(sensor, "")
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
+// 	var sensor = SensorDiscoveryInfo{
+// 		SensorIdentifier: "12345",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor, err := tm.OneM2M_create(sensor, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_ae(sensor, new_sensor) {
-		t.Fatalf("Failed to validate AE content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor, new_sensor) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
 
-	_ = tm.OneM2M_Delete(new_sensor)
+// 	_ = tm.OneM2M_Delete(new_sensor)
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_createAE_CNTHttp(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestOneM2M_createAE_CNTHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	var sensor_ae = SensorDiscoveryInfo{
-		SensorIdentifier: "CMyAE",
-		SensorType:       "AE",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
-	if err != nil {
-		t.Fatalf("Failed to create new AE sensor")
-	}
+// 	var sensor_ae = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyAE",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new AE sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
-		t.Fatalf("Failed to validate AE content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
 
-	var sensor_cnt = SensorDiscoveryInfo{
-		SensorIdentifier: "CMyCNT",
-		SensorType:       "CNT",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	// sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1)
-	// sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
-	sensorPath := new_sensor_ae.SensorIdentifier
-	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
-	if err != nil {
-		t.Fatalf("Failed to create new CNT sensor")
-	}
+// 	var sensor_cnt = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNT",
+// 		SensorType:       "CNT",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	// sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1)
+// 	// sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
+// 	sensorPath := new_sensor_ae.SensorIdentifier
+// 	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new CNT sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
-		t.Fatalf("Failed to validate AE content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
 
-	err = tm.OneM2M_Delete(new_sensor_cnt)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
-	err = tm.OneM2M_Delete(new_sensor_ae)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
+// 	err = tm.OneM2M_Delete(new_sensor_cnt)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_ae)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_createAE_CNT_CNIHttp(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestOneM2M_createAE_CNT_CNIHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	var sensor_ae = SensorDiscoveryInfo{
-		SensorIdentifier: "CMyAE",
-		SensorType:       "AE",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
-	if err != nil {
-		t.Fatalf("Failed to create new AE sensor")
-	}
+// 	var sensor_ae = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyAE",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new AE sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
-		t.Fatalf("Failed to validate AE content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
 
-	var sensor_cnt = SensorDiscoveryInfo{
-		SensorIdentifier: "CMyCNT",
-		SensorType:       "CNT",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	sensorPath := new_sensor_ae.SensorIdentifier
-	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
-	if err != nil {
-		t.Fatalf("Failed to create new CNT sensor")
-	}
+// 	var sensor_cnt = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNT",
+// 		SensorType:       "CNT",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensorPath := new_sensor_ae.SensorIdentifier
+// 	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new CNT sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
-		t.Fatalf("Failed to validate CNT content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
 
-	var sensor_cin = SensorDiscoveryInfo{
-		SensorIdentifier: "CMyCNI",
-		SensorType:       "CIN",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1)
-	sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
-	sensorPath = new_sensor_cnt.SensorIdentifier
-	new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
+// 	var sensor_cin = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNI",
+// 		SensorType:       "CIN",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1)
+// 	sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
+// 	sensorPath = new_sensor_cnt.SensorIdentifier
+// 	new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_cin(sensor_cin, new_sensor_cin) {
-		t.Fatalf("Failed to validate CIN content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_cin(sensor_cin, new_sensor_cin) {
+// 		t.Fatalf("Failed to validate CIN content")
+// 	}
 
-	err = tm.OneM2M_Delete(new_sensor_cin)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
-	err = tm.OneM2M_Delete(new_sensor_cnt)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
-	err = tm.OneM2M_Delete(new_sensor_ae)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
+// 	err = tm.OneM2M_Delete(new_sensor_cin)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_cnt)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_ae)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_deleteHttp(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestOneM2M_deleteHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	var new_sensor = SensorDiscoveryInfo{
-		SensorIdentifier: "12345",
-		SensorType:       "AE",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	sensor, err := oneM2M_create(tm, new_sensor, "")
-	if err != nil {
-		t.Fatalf("Failed to create new sensor: " + err.Error())
-	}
+// 	var new_sensor = SensorDiscoveryInfo{
+// 		SensorIdentifier: "12345",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensor, err := oneM2M_create(tm, new_sensor, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor: " + err.Error())
+// 	}
 
-	err = tm.OneM2M_Delete(sensor)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor: " + err.Error())
-	}
+// 	err = tm.OneM2M_Delete(sensor)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor: " + err.Error())
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_getHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
+
+// 	// Verify content
+// 	if len(sensors) != 3 || len(received_sensors) != 3 {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
+
+// 	// Get one sensor
+// 	sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
+
+// 	sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cin(received_sensors["CIN"], sensorResp) {
+// 		t.Fatalf("Failed to validate CIN content")
+// 	}
 
-func TestOneM2M_getHttp(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// 	_ = tm.OneM2M_Delete(received_sensors["CIN"])
+// 	_ = tm.OneM2M_Delete(received_sensors["CNT"])
+// 	_ = tm.OneM2M_Delete(received_sensors["AE"])
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-	sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
-	if err != nil {
-		t.Fatalf("Failed to create sensors")
-	}
+// func TestOneM2M_discoveryHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Verify content
-	if len(sensors) != 3 || len(received_sensors) != 3 {
-		t.Fatalf("Failed to create sensors")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	// Get one sensor
-	sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId)
-	if err != nil {
-		t.Fatalf("Failed to discover CNT sensor")
-	}
-	// Verify content
-	if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) {
-		t.Fatalf("Failed to validate CNT content")
-	}
+// 	_, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
 
-	sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId)
-	if err != nil {
-		t.Fatalf("Failed to discover CNT sensor")
-	}
-	// Verify content
-	if !validate_sensor_cin(received_sensors["CIN"], sensorResp) {
-		t.Fatalf("Failed to validate CIN content")
-	}
+// 	// Verify content
+// 	if len(received_sensors) != 3 {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
 
-	_ = tm.OneM2M_Delete(received_sensors["CIN"])
-	_ = tm.OneM2M_Delete(received_sensors["CNT"])
-	_ = tm.OneM2M_Delete(received_sensors["AE"])
+// 	// Discover CNTs
+// 	sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	if len(sensorList) != 1 {
+// 		t.Fatalf("Wrong discover result")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Discover AEs
+// 	sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover AE sensor")
+// 	}
+// 	if len(sensorList) != 1 {
+// 		t.Fatalf("Wrong discover result")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
+
+// 	_ = tm.OneM2M_Delete(received_sensors["CIN"])
+// 	_ = tm.OneM2M_Delete(received_sensors["CNT"])
+// 	_ = tm.OneM2M_Delete(received_sensors["AE"])
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_discoveryHttp(t *testing.T) {
+func TestOneM2M_subscribeHttp(t *testing.T) {
 	fmt.Println("--- ", t.Name())
 	log.MeepTextLogInit(t.Name())
 
 	// Valid Connector
 	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", discoveryNotify, statusNotify, dataNotify)
 	if err != nil || tm == nil {
 		t.Fatalf("Failed to create SSS Asset Manager")
 	}
@@ -450,36 +510,32 @@ func TestOneM2M_discoveryHttp(t *testing.T) {
 		t.Fatalf("Failed to create sensors")
 	}
 
-	// Verify content
-	if len(received_sensors) != 3 {
-		t.Fatalf("Failed to create sensors")
-	}
-
-	// Discover CNTs
-	sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId)
+	subscriptionMap := make(map[string]interface{})
+	subId, err := tm.OneM2M_subscribe(received_sensors["AE"].IotPlatformId, received_sensors["AE"].SensorIdentifier)
 	if err != nil {
-		t.Fatalf("Failed to discover CNT sensor")
-	}
-	if len(sensorList) != 1 {
-		t.Fatalf("Wrong discover result")
-	}
-	// Verify content
-	if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) {
-		t.Fatalf("Failed to validate CNT content")
+		t.Fatalf("Failed to subscribe")
 	}
+	fmt.Println("subId=" + subId)
+	subscriptionMap[subId] = received_sensors["AE"]
 
-	// Discover AEs
-	sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId)
+	subId, err = tm.OneM2M_subscribe(received_sensors["CNT"].IotPlatformId, received_sensors["CNT"].SensorIdentifier)
 	if err != nil {
-		t.Fatalf("Failed to discover AE sensor")
-	}
-	if len(sensorList) != 1 {
-		t.Fatalf("Wrong discover result")
-	}
-	// Verify content
-	if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) {
-		t.Fatalf("Failed to validate AE content")
+		t.Fatalf("Failed to subscribe")
 	}
+	fmt.Println("subId=" + subId)
+	subscriptionMap[subId] = received_sensors["CNT"]
+
+	fmt.Println("len(subscriptionMap)=" + fmt.Sprint(len(subscriptionMap)))
+
+	fmt.Println("You have 120 seconds to trigger subscriptions")
+	time.Sleep(time.Duration(120) * time.Second)
+
+	for k := range subscriptionMap {
+		err = tm.OneM2M_DeleteSub(k)
+		if err != nil {
+			t.Fatalf("Failed to cancel subscription")
+		}
+	} // End of 'for' statement
 
 	_ = tm.OneM2M_Delete(received_sensors["CIN"])
 	_ = tm.OneM2M_Delete(received_sensors["CNT"])
@@ -493,423 +549,423 @@ func TestOneM2M_discoveryHttp(t *testing.T) {
 	tm = nil
 }
 
-func TestPopulateDevicesPerIotPlatformsMqtt(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
-	err = tm.populateDevicesPerIotPlatforms()
-	if err != nil {
-		t.Fatalf(err.Error())
-	}
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// func TestPopulateDevicesPerIotPlatformsMqtt(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+// 	err = tm.populateDevicesPerIotPlatforms()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestSensorDiscoveryInfoAllMqtt(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestSensorDiscoveryInfoAllMqtt(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	err = tm.populateDevicesPerIotPlatforms()
-	if err != nil {
-		t.Fatalf(err.Error())
-	}
+// 	err = tm.populateDevicesPerIotPlatforms()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
 
-	sensors, err := tm.SensorDiscoveryInfoAll()
-	if err != nil {
-		t.Fatalf(err.Error())
-	}
-	fmt.Println("sensors: ", sensors)
+// 	sensors, err := tm.SensorDiscoveryInfoAll()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("sensors: ", sensors)
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// }
 
-func TestGetSensorMqtt(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestGetSensorMqtt(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	sensors, err := tm.SensorDiscoveryInfoAll()
-	if err != nil {
-		t.Fatalf(err.Error())
-	}
+// 	sensors, err := tm.SensorDiscoveryInfoAll()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
 
-	for _, v := range sensors {
-		fmt.Println("v", v)
-		fmt.Println("TypeOf(v)", reflect.TypeOf(v))
+// 	for _, v := range sensors {
+// 		fmt.Println("v", v)
+// 		fmt.Println("TypeOf(v)", reflect.TypeOf(v))
 
-		sensor, err := tm.GetSensor(v.SensorIdentifier)
-		if !validate_sensor_discovery_info(v, sensor) {
-			t.Fatalf(err.Error())
-		}
-	}
+// 		sensor, err := tm.GetSensor(v.SensorIdentifier)
+// 		if !validate_sensor_discovery_info(v, sensor) {
+// 			t.Fatalf(err.Error())
+// 		}
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_createAEMQTT(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestOneM2M_createAEMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	var sensor = SensorDiscoveryInfo{
-		SensorIdentifier: "12345",
-		SensorType:       "AE",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	new_sensor, err := tm.OneM2M_create(sensor, "")
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
+// 	var sensor = SensorDiscoveryInfo{
+// 		SensorIdentifier: "12345",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor, err := tm.OneM2M_create(sensor, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_ae(sensor, new_sensor) {
-		t.Fatalf("Failed to validate AE content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor, new_sensor) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
 
-	_ = tm.OneM2M_Delete(new_sensor)
+// 	_ = tm.OneM2M_Delete(new_sensor)
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_createAE_CNTMQTT(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestOneM2M_createAE_CNTMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	var sensor_ae = SensorDiscoveryInfo{
-		SensorIdentifier: "CMyAE",
-		SensorType:       "AE",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
-	if err != nil {
-		t.Fatalf("Failed to create new AE sensor")
-	}
+// 	var sensor_ae = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyAE",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new AE sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
-		t.Fatalf("Failed to validate AE content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
 
-	var sensor_cnt = SensorDiscoveryInfo{
-		SensorIdentifier: "CMyCNT",
-		SensorType:       "CNT",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	// sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1)
-	// sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
-	sensorPath := new_sensor_ae.SensorIdentifier
-	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
+// 	var sensor_cnt = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNT",
+// 		SensorType:       "CNT",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	// sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1)
+// 	// sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
+// 	sensorPath := new_sensor_ae.SensorIdentifier
+// 	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
-		t.Fatalf("Failed to validate CNT content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
 
-	err = tm.OneM2M_Delete(new_sensor_cnt)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
-	err = tm.OneM2M_Delete(new_sensor_ae)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
+// 	err = tm.OneM2M_Delete(new_sensor_cnt)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_ae)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_createAE_CNT_CNIMQTT(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestOneM2M_createAE_CNT_CNIMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	var sensor_ae = SensorDiscoveryInfo{
-		SensorIdentifier: "CMyAE",
-		SensorType:       "AE",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
-	if err != nil {
-		t.Fatalf("Failed to create new AE sensor")
-	}
+// 	var sensor_ae = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyAE",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new AE sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
-		t.Fatalf("Failed to validate AE content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
 
-	var sensor_cnt = SensorDiscoveryInfo{
-		SensorIdentifier: "CMyCNT",
-		SensorType:       "CNT",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	sensorPath := new_sensor_ae.SensorIdentifier
-	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
+// 	var sensor_cnt = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNT",
+// 		SensorType:       "CNT",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensorPath := new_sensor_ae.SensorIdentifier
+// 	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
 
-	// Verify content
-	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
-		t.Fatalf("Failed to validate CNT content")
-	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
 
-	var sensor_cin = SensorDiscoveryInfo{
-		SensorIdentifier: "CMyCNI",
-		SensorType:       "CIN",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1)
-	sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
-	sensorPath = new_sensor_cnt.SensorIdentifier
-	new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
-	if new_sensor_cin.SensorType != sensor_cin.SensorType {
-		t.Fatalf("received_sensor.SensorType != SensorType")
-	}
-	if new_sensor_cin.IotPlatformId != sensor_cin.IotPlatformId {
-		t.Fatalf("received_sensor.IotPlatformId != IotPlatformId")
-	}
-	if len(new_sensor_cin.SensorCharacteristicList) == 0 {
-		t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty")
-	}
+// 	var sensor_cin = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNI",
+// 		SensorType:       "CIN",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1)
+// 	sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
+// 	sensorPath = new_sensor_cnt.SensorIdentifier
+// 	new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	if new_sensor_cin.SensorType != sensor_cin.SensorType {
+// 		t.Fatalf("received_sensor.SensorType != SensorType")
+// 	}
+// 	if new_sensor_cin.IotPlatformId != sensor_cin.IotPlatformId {
+// 		t.Fatalf("received_sensor.IotPlatformId != IotPlatformId")
+// 	}
+// 	if len(new_sensor_cin.SensorCharacteristicList) == 0 {
+// 		t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty")
+// 	}
 
-	err = tm.OneM2M_Delete(new_sensor_cin)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
-	err = tm.OneM2M_Delete(new_sensor_cnt)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
-	err = tm.OneM2M_Delete(new_sensor_ae)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
+// 	err = tm.OneM2M_Delete(new_sensor_cin)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_cnt)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_ae)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_deleteMQTT(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestOneM2M_deleteMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	var new_sensor = SensorDiscoveryInfo{
-		SensorIdentifier: "12345",
-		SensorType:       "AE",
-		SensorPosition:   nil,
-		IotPlatformId:    "7feaadbb0400",
-	}
-	sensor, err := oneM2M_create(tm, new_sensor, "")
-	if err != nil {
-		t.Fatalf("Failed to create new sensor: " + err.Error())
-	}
+// 	var new_sensor = SensorDiscoveryInfo{
+// 		SensorIdentifier: "12345",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensor, err := oneM2M_create(tm, new_sensor, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor: " + err.Error())
+// 	}
 
-	err = tm.OneM2M_Delete(sensor)
-	if err != nil {
-		t.Fatalf("Failed to create new sensor: " + err.Error())
-	}
+// 	err = tm.OneM2M_Delete(sensor)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor: " + err.Error())
+// 	}
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_getMQTT(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestOneM2M_getMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
-	if err != nil {
-		t.Fatalf("Failed to create sensors")
-	}
+// 	sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
 
-	// Verify content
-	if len(sensors) != 3 || len(received_sensors) != 3 {
-		t.Fatalf("Failed to create sensors")
-	}
+// 	// Verify content
+// 	if len(sensors) != 3 || len(received_sensors) != 3 {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
 
-	// Get one sensor
-	sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId)
-	if err != nil {
-		t.Fatalf("Failed to discover CNT sensor")
-	}
-	// Verify content
-	if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) {
-		t.Fatalf("Failed to validate CNT content")
-	}
+// 	// Get one sensor
+// 	sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
 
-	sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId)
-	if err != nil {
-		t.Fatalf("Failed to discover CNT sensor")
-	}
-	// Verify content
-	if !validate_sensor_cin(received_sensors["CIN"], sensorResp) {
-		t.Fatalf("Failed to validate CIN content")
-	}
+// 	sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cin(received_sensors["CIN"], sensorResp) {
+// 		t.Fatalf("Failed to validate CIN content")
+// 	}
 
-	_ = tm.OneM2M_Delete(received_sensors["CIN"])
-	_ = tm.OneM2M_Delete(received_sensors["CNT"])
-	_ = tm.OneM2M_Delete(received_sensors["AE"])
+// 	_ = tm.OneM2M_Delete(received_sensors["CIN"])
+// 	_ = tm.OneM2M_Delete(received_sensors["CNT"])
+// 	_ = tm.OneM2M_Delete(received_sensors["AE"])
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
-func TestOneM2M_discoveryMQTT(t *testing.T) {
-	fmt.Println("--- ", t.Name())
-	log.MeepTextLogInit(t.Name())
+// func TestOneM2M_discoveryMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
 
-	// Valid Connector
-	fmt.Println("Create valid SSS Asset Manager")
-	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
-	if err != nil || tm == nil {
-		t.Fatalf("Failed to create SSS Asset Manager")
-	}
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
 
-	_, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
-	if err != nil {
-		t.Fatalf("Failed to create sensors")
-	}
+// 	_, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
 
-	// Verify content
-	if len(received_sensors) != 3 {
-		t.Fatalf("Failed to create sensors")
-	}
+// 	// Verify content
+// 	if len(received_sensors) != 3 {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
 
-	// Discover CNTs
-	sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId)
-	if err != nil {
-		t.Fatalf("Failed to discover CNT sensor")
-	}
-	if len(sensorList) != 1 {
-		t.Fatalf("Wrong discover result")
-	}
-	// Verify content
-	if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) {
-		t.Fatalf("Failed to validate CNT content")
-	}
+// 	// Discover CNTs
+// 	sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	if len(sensorList) != 1 {
+// 		t.Fatalf("Wrong discover result")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
 
-	// Discover AEs
-	sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId)
-	if err != nil {
-		t.Fatalf("Failed to discover AE sensor")
-	}
-	if len(sensorList) != 1 {
-		t.Fatalf("Wrong discover result")
-	}
-	// Verify content
-	if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) {
-		t.Fatalf("Failed to validate AE content")
-	}
+// 	// Discover AEs
+// 	sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover AE sensor")
+// 	}
+// 	if len(sensorList) != 1 {
+// 		t.Fatalf("Wrong discover result")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
 
-	_ = tm.OneM2M_Delete(received_sensors["CIN"])
-	_ = tm.OneM2M_Delete(received_sensors["CNT"])
-	_ = tm.OneM2M_Delete(received_sensors["AE"])
+// 	_ = tm.OneM2M_Delete(received_sensors["CIN"])
+// 	_ = tm.OneM2M_Delete(received_sensors["CNT"])
+// 	_ = tm.OneM2M_Delete(received_sensors["AE"])
 
-	// Cleanup
-	err = tm.DeleteSssMgr()
-	if err != nil {
-		t.Fatalf("Failed to cleanup SSS Asset Manager")
-	}
-	tm = nil
-}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
 
 // func TestVaidateOneM2MNotificationServer(t *testing.T) {
 // 	fmt.Println("--- ", t.Name())
@@ -923,7 +979,7 @@ func TestOneM2M_discoveryMQTT(t *testing.T) {
 // 	}
 
 // 	tm.init()
-// 	fmt.Println("Waiting for 2 minutes to do curl request: curl -v http://mec-platform.etsi.org:33122/sbxykqjr17/mep1/sens/v1 ")
+// 	fmt.Println("Waiting for 2 minutes to do curl request: curl -v http://mec-platform.etsi.org:31122/sbxykqjr17/mep1/sens/v1 ")
 
 // 	// Cleanup
 // 	err = tm.DeleteSssMgr()
@@ -1150,3 +1206,18 @@ func validate_sensor_cin(expected_sensor SensorDiscoveryInfo, received_sensor Se
 
 	return true
 }
+
+func discoveryNotify(map[string]interface{}) {
+	log.Debug(">>> discoveryNotify")
+
+}
+
+func statusNotify(map[string]interface{}) {
+	log.Debug(">>> statusNotify")
+
+}
+
+func dataNotify(map[string]interface{}) {
+	log.Debug(">>> dataNotify")
+
+}
-- 
GitLab