From 21500ba608b18244e03cb031df4c41d6384de4b7 Mon Sep 17 00:00:00 2001
From: garciay <yann.garcia@fscom.fr>
Date: Wed, 26 Mar 2025 13:34:42 +0100
Subject: [PATCH] Add discover/get IOT

---
 go-packages/meep-iot-mgr/iot-mgr.go         |    2 +-
 go-packages/meep-sss-mgr/mqtt.go            |    9 +-
 go-packages/meep-sss-mgr/onem2m-mgr.go      |  497 ++-----
 go-packages/meep-sss-mgr/onem2m-mgr_test.go | 1325 ++++++++++++++-----
 4 files changed, 1111 insertions(+), 722 deletions(-)

diff --git a/go-packages/meep-iot-mgr/iot-mgr.go b/go-packages/meep-iot-mgr/iot-mgr.go
index d6c74abbe..a517df845 100644
--- a/go-packages/meep-iot-mgr/iot-mgr.go
+++ b/go-packages/meep-iot-mgr/iot-mgr.go
@@ -500,7 +500,7 @@ func (tm *IotMgr) createDeviceWithIotPlatformId(device DeviceInfo, requestedIotP
 		// 	//DownlinkInfo *DownlinkInfo
 		// 	ClientCertificate string
 		// }
-		sensor, err := registeredIotPlatformsMap[requestedIotPlatformId].oneM2M.OneM2M_create(sensor, requestedIotPlatformId, sensor.SensorType)
+		sensor, err := registeredIotPlatformsMap[requestedIotPlatformId].oneM2M.OneM2M_create(sensor, "")
 		if err != nil {
 			return deviceResp, err
 		}
diff --git a/go-packages/meep-sss-mgr/mqtt.go b/go-packages/meep-sss-mgr/mqtt.go
index 321a3e50a..04ca84151 100644
--- a/go-packages/meep-sss-mgr/mqtt.go
+++ b/go-packages/meep-sss-mgr/mqtt.go
@@ -177,14 +177,15 @@ func (broker_mqtt *SssMgrMqtt) send(p_ctx SssMgrBindingProtocolContext) (err err
 		body["pc"] = p_ctx.body
 	}
 	if p_ctx.queries != nil && len(p_ctx.queries) != 0 {
-		d := make(map[string]int, 0)
-		for k, v := range p_ctx.queries {
-			if k == "ty" { // mosquitto_pub -d -q 0 -h 172.29.10.56 -p 1883 -t "/oneM2M/req/CAdmin/laboai-acme-ic-cse/json" -m "{\"fr\":\"CAdmin\",\"op\":2,\"rqi\":\"432bb877-7dc5-4e4d-b424-9c0d50604596\",\"rvi\":\"4\",\"to\":\"laboai-cse-in/YannouDomainAutomation/YannouGardenZone0\",\"ty\":3,\"fc\":{\"fu\":2,\"fo\":1}}"
-				body[k], err = strconv.Atoi(v)
+		d := make(map[string]interface{}, 0)
+		for k, v := range p_ctx.queries { // FIXME FSCOM Check in pure string is working too?
+			if k == "ty" {
+				s, err := strconv.Atoi(v)
 				if err != nil {
 					log.Error(err.Error())
 					return err, nil
 				}
+				d[k] = []int{s}
 				continue
 			}
 			d[k], err = strconv.Atoi(v)
diff --git a/go-packages/meep-sss-mgr/onem2m-mgr.go b/go-packages/meep-sss-mgr/onem2m-mgr.go
index ab5127e6f..5901c31bb 100644
--- a/go-packages/meep-sss-mgr/onem2m-mgr.go
+++ b/go-packages/meep-sss-mgr/onem2m-mgr.go
@@ -344,8 +344,9 @@ func (tm *SssMgr) populateSensors(iotPlatformInfo IotPlatformInfo) error {
 	// Build the queries
 	queries := map[string]string{}
 	queries["fu"] = "1" // Filter usage
-	queries["ty"] = "3" // Filter on oneM2M CIN for sensors
+	queries["ty"] = "3" // Filter on oneM2M CNT for sensors
 	ctx.queries = queries
+
 	err, resp := protocol.send(ctx)
 	if err != nil {
 		log.Error("OneM2M_create: ", err.Error())
@@ -385,281 +386,17 @@ func (tm *SssMgr) populateSensors(iotPlatformInfo IotPlatformInfo) error {
 		var sensor = SensorDiscoveryInfo{
 			IotPlatformId: iotPlatformInfo.IotPlatformId,
 		}
-		for k, v := range oneM2M_cin {
-			log.Debug(k, " value is ", v)
-			log.Debug("populateSensors: type(v): ", reflect.TypeOf(v))
-
-			if k == "ri" {
-				if item, ok := v.(string); ok {
-					sensor.SensorIdentifier = item
-				} else {
-					log.Error("populateSensors: Failed to process ", k)
-				}
-			} else if k == "ty" {
-				if item, ok := v.(float64); ok {
-					sensor.SensorType = strconv.FormatFloat(item, 'f', -1, 64)
-				} else {
-					log.Error("populateSensors: Failed to process ", k)
-				}
-			} else {
-				sensor.SensorPropertyList = append(sensor.SensorPropertyList, k)
-				if item, ok := v.(string); ok {
-					sensor.SensorCharacteristicList = append(
-						sensor.SensorCharacteristicList,
-						SensorCharacteristic{
-							CharacteristicName:  k,
-							CharacteristicValue: string(item),
-						})
-				} else if item, ok := v.(float64); ok {
-					sensor.SensorCharacteristicList = append(
-						sensor.SensorCharacteristicList,
-						SensorCharacteristic{
-							CharacteristicName:  k,
-							CharacteristicValue: strconv.FormatFloat(item, 'f', -1, 64),
-						})
-				} else if item, ok := v.(int64); ok {
-					sensor.SensorCharacteristicList = append(
-						sensor.SensorCharacteristicList,
-						SensorCharacteristic{
-							CharacteristicName:  k,
-							CharacteristicValue: strconv.FormatInt(item, 10),
-						})
-				} else if item, ok := v.(bool); ok {
-					sensor.SensorCharacteristicList = append(
-						sensor.SensorCharacteristicList,
-						SensorCharacteristic{
-							CharacteristicName:  k,
-							CharacteristicValue: strconv.FormatBool(item),
-						})
-				} else if item, ok := v.([]string); ok {
-					sensor.SensorCharacteristicList = append(
-						sensor.SensorCharacteristicList,
-						SensorCharacteristic{
-							CharacteristicName:  k,
-							CharacteristicValue: strings.Join(item, ","),
-						})
-				} else if item, ok := v.([]int64); ok {
-					log.Error("populateSensors: Failed to convert list of int64 into string: ", item)
-				} else if item, ok := v.([]interface{}); ok {
-					log.Debug("populateSensors: Got []interface {} for ", k)
-					log.Debug("populateSensors: ValueOf ", reflect.ValueOf(item))
-					s := SensorCharacteristic{
-						CharacteristicName: k,
-					}
-					var buf bytes.Buffer
-					fmt.Fprintf(&buf, "%T", reflect.ValueOf(item))
-					s.CharacteristicValue = buf.String()
-					sensor.SensorCharacteristicList = append(sensor.SensorCharacteristicList, s)
-				} else {
-					log.Error("populateSensors: Failed to process ", k)
-				}
-			}
+		sensor, err = tm.oneM2M_deserialize(sensor, oneM2M_cin)
+		if err != nil {
+			log.Warn("populateSensors: ", err.Error())
+			continue
+		}
 
-		} // End of 'for' statement
 		log.Info("populateSensors: sensor: ", sensor)
 		sensorsMap[sensor.SensorIdentifier] = sensor
 		sensorsPerPlatformMap[sensor.IotPlatformId] = append(sensorsPerPlatformMap[sensor.IotPlatformId], sensor.SensorIdentifier)
 	} // End of 'for' statement
 
-	// // 1. Get the list of the AE
-	// // Build the URL
-	// url := "http://" + iotPlatformInfo.Address + ":" + strconv.Itoa(int(iotPlatformInfo.Port)) + "/" + iotPlatformInfo.Name
-	// log.Debug("populateSensors: url=", url)
-	// // Build the headers
-	// var headers = http.Header{}
-	// headers["Accept"] = []string{headerAccept}
-	// headers["Content-Type"] = []string{headerContentType}
-	// headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it
-	// headers["X-M2M-RI"] = []string{uuid.New().String()}
-	// headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it
-	// // Build the queries
-	// queries := map[string]string{}
-	// queries["fu"] = "1" // Filter usage
-	// queries["ty"] = "4" // Filter on oneM2M CIN for sensors
-	// // Send the request
-	// response, err := sendRequest("GET", url, headers, nil, nil, queries, 200)
-	// if err != nil {
-	// 	log.Error("populateSensors: ", err.Error())
-	// 	return err
-	// }
-	// log.Debug("populateSensors: response: ", string(response))
-
-	// var oneM2M_uril map[string][]string
-	// err = json.Unmarshal(response, &oneM2M_uril)
-	// if err != nil {
-	// 	log.Error("populateSensors: ", err.Error())
-	// 	return err
-	// }
-	// log.Debug("populateSensors: oneM2M_uril: ", len(oneM2M_uril))
-	// log.Debug(oneM2M_uril)
-	// if _, ok := oneM2M_uril["m2m:uril"]; !ok {
-	// 	err := errors.New("populateSensors: CharacteristicName not found: m2m:uril")
-	// 	log.Error(err.Error())
-	// 	return err
-	// }
-	// // Loop for each CIN and build the sensor list
-	// for _, v := range oneM2M_uril["m2m:uril"] {
-	// 	log.Debug("populateSensors: Processing key: ", v)
-
-	// 	url := "http://" + iotPlatformInfo.Address + ":" + strconv.Itoa(int(iotPlatformInfo.Port)) + "/" + v
-	// 	log.Debug("populateSensors: url=", url)
-	// 	// Build the headers
-	// 	var headers = http.Header{}
-	// 	headers["Accept"] = []string{headerAccept}
-	// 	headers["Content-Type"] = []string{headerContentType}
-	// 	headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it
-	// 	headers["X-M2M-RI"] = []string{uuid.New().String()}
-	// 	headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it
-	// 	// Build the queries
-	// 	queries := map[string]string{}
-	// 	queries["fu"] = "2" // Filter usage
-	// 	// Send the request
-	// 	response, err := sendRequest("GET", url, headers, nil, nil, queries, 200)
-	// 	if err != nil {
-	// 		log.Error("populateSensors: ", err.Error())
-	// 		return err
-	// 	}
-	// 	log.Debug("populateSensors: response: ", string(response))
-	// 	var oneM2M_cin map[string]map[string]interface{}
-	// 	err = json.Unmarshal(response, &oneM2M_cin)
-	// 	if err != nil {
-	// 		log.Error("populateSensors: ", err.Error())
-	// 		continue
-	// 	}
-	// 	log.Debug("populateSensors: type(oneM2M_cin): ", reflect.TypeOf(oneM2M_cin))
-	// 	log.Debug("populateSensors: len(oneM2M_cin): ", len(oneM2M_cin))
-	// 	log.Debug("populateSensors: oneM2M_cin: ", oneM2M_cin)
-	// 	for _, m := range oneM2M_cin {
-	// 		//log.Debug("==> ", i, " value is ", m)
-	// 		var sensor = SensorDiscoveryInfo{
-	// 			IotPlatformId: iotPlatformInfo.IotPlatformId,
-	// 		}
-
-	// 		// m is a map[string]interface.
-	// 		// loop over keys and values in the map.
-	// 		for k, v := range m {
-	// 			log.Debug(k, " value is ", v)
-	// 			log.Debug("populateSensors: type(v): ", reflect.TypeOf(v))
-
-	// 			if k == "ri" {
-	// 				if item, ok := v.(string); ok {
-	// 					sensor.SensorIdentifier = item
-	// 				} else {
-	// 					log.Error("populateSensors: Failed to process ", k)
-	// 				}
-	// 			} else if k == "ty" {
-	// 				if item, ok := v.(float64); ok {
-	// 					sensor.SensorType = strconv.FormatFloat(item, 'f', -1, 64)
-	// 				} else {
-	// 					log.Error("populateSensors: Failed to process ", k)
-	// 				}
-	// 			} else {
-	// 				sensor.SensorPropertyList = append(sensor.SensorPropertyList, k)
-	// 				if item, ok := v.(string); ok {
-	// 					sensor.SensorCharacteristicList = append(
-	// 						sensor.SensorCharacteristicList,
-	// 						SensorCharacteristic{
-	// 							CharacteristicName:  k,
-	// 							CharacteristicValue: string(item),
-	// 						})
-	// 				} else if item, ok := v.(float64); ok {
-	// 					sensor.SensorCharacteristicList = append(
-	// 						sensor.SensorCharacteristicList,
-	// 						SensorCharacteristic{
-	// 							CharacteristicName:  k,
-	// 							CharacteristicValue: strconv.FormatFloat(item, 'f', -1, 64),
-	// 						})
-	// 				} else if item, ok := v.(int64); ok {
-	// 					sensor.SensorCharacteristicList = append(
-	// 						sensor.SensorCharacteristicList,
-	// 						SensorCharacteristic{
-	// 							CharacteristicName:  k,
-	// 							CharacteristicValue: strconv.FormatInt(item, 10),
-	// 						})
-	// 				} else if item, ok := v.(bool); ok {
-	// 					sensor.SensorCharacteristicList = append(
-	// 						sensor.SensorCharacteristicList,
-	// 						SensorCharacteristic{
-	// 							CharacteristicName:  k,
-	// 							CharacteristicValue: strconv.FormatBool(item),
-	// 						})
-	// 				} else if item, ok := v.([]string); ok {
-	// 					sensor.SensorCharacteristicList = append(
-	// 						sensor.SensorCharacteristicList,
-	// 						SensorCharacteristic{
-	// 							CharacteristicName:  k,
-	// 							CharacteristicValue: strings.Join(item, ","),
-	// 						})
-	// 				} else if item, ok := v.([]int64); ok {
-	// 					log.Error("populateSensors: Failed to convert list of int64 into string: ", item)
-	// 				} else if item, ok := v.([]interface{}); ok {
-	// 					log.Debug("populateSensors: Got []interface {} for ", k)
-	// 					log.Debug("populateSensors: ValueOf ", reflect.ValueOf(item))
-	// 					s := SensorCharacteristic{
-	// 						CharacteristicName: k,
-	// 					}
-	// 					var buf bytes.Buffer
-	// 					fmt.Fprintf(&buf, "%T", reflect.ValueOf(item))
-	// 					s.CharacteristicValue = buf.String()
-	// 					sensor.SensorCharacteristicList = append(sensor.SensorCharacteristicList, s)
-	// 				} else {
-	// 					log.Error("populateSensors: Failed to process ", k)
-	// 				}
-	// 			}
-	// 			// if k == "rn" {
-	// 			// 	if item, ok := v.(string); ok {
-	// 			// 		sensor.DeviceId = item
-	// 			// 	} else {
-	// 			// 		log.Error("populateSensors: Failed to process ", k)
-	// 			// 	}
-	// 			// } else if k == "ri" {
-	// 			// 	if item, ok := v.(string); ok {
-	// 			// 		sensor.SensorIdentifier = item
-	// 			// 	} else {
-	// 			// 		log.Error("populateSensors: Failed to process ", k)
-	// 			// 	}
-	// 			// } else if k == "ty" {
-	// 			// 	if item, ok := v.(float64); ok {
-	// 			// 		sensor.SensorStatusType = strconv.FormatFloat(item, 'f', -1, 64)
-	// 			// 	} else {
-	// 			// 		log.Error("populateSensors: Failed to process ", k)
-	// 			// 	}
-	// 			// } else { // default: if k == "lt" || k == "et" || k == "ct" || k == "st" || k == "pi" || k == "lbl" {
-	// 			// 	if item, ok := v.(string); ok {
-	// 			// 		sensor.SensorCharacteristicList = append(
-	// 			// 			sensor.SensorCharacteristicList,
-	// 			// 			SensorCharacteristic{
-	// 			// 				CharacteristicName:          k,
-	// 			// 				CharacteristicValue:         string(item),
-	// 			// 				CharacteristicUnitOfMeasure: nil,
-	// 			// 			})
-	// 			// 	} else if item, ok := v.(float64); ok {
-	// 			// 		sensor.SensorCharacteristicList = append(
-	// 			// 			sensor.SensorCharacteristicList,
-	// 			// 			SensorCharacteristic{
-	// 			// 				CharacteristicName:          k,
-	// 			// 				CharacteristicValue:         strconv.FormatFloat(item, 'f', -1, 64),
-	// 			// 				CharacteristicUnitOfMeasure: nil,
-	// 			// 			})
-	// 			// 	} else if item, ok := v.([]string); ok {
-	// 			// 		sensor.SensorCharacteristicList = append(
-	// 			// 			sensor.SensorCharacteristicList,
-	// 			// 			SensorCharacteristic{
-	// 			// 				CharacteristicName:          k,
-	// 			// 				CharacteristicValue:         strings.Join(item, ","),
-	// 			// 				CharacteristicUnitOfMeasure: nil,
-	// 			// 			})
-	// 			// 	} else {
-	// 			// 		log.Error("populateSensors: Failed to process ", k)
-	// 			// 	}
-	// 			// }
-	// 		} // End of 'for' loop
-	// 		log.Info("populateSensors: sensor: ", sensor)
-	// 		sensorsMap[sensor.SensorIdentifier] = sensor
-	// 		sensorsPerPlatformMap[sensor.IotPlatformId] = append(sensorsPerPlatformMap[sensor.IotPlatformId], sensor.SensorIdentifier)
-	// 	} // End of 'for' loop
-
-	// } // End of 'for' statement
 	log.Info("populateSensors: sensorsMap: ", sensorsMap)
 	log.Info("populateSensors: sensorsPerPlatformMap: ", sensorsPerPlatformMap)
 
@@ -716,15 +453,15 @@ func (tm *SssMgr) OneM2M_create(sensor SensorDiscoveryInfo, path string) (sensor
 				bodyMap["m2m:cnt"][val.CharacteristicName] = val.CharacteristicValue
 			} // End of 'for' statement
 		}
-	} else if sensor.SensorType == "CNI" {
-		bodyMap["m2m:cni"] = make(map[string]interface{}, 0)
-		bodyMap["m2m:cni"]["cnf"] = "text/plain:0"
-		bodyMap["m2m:cni"]["rn"] = sensor.SensorIdentifier
+	} else if sensor.SensorType == "CIN" {
+		bodyMap["m2m:cin"] = make(map[string]interface{}, 0)
+		bodyMap["m2m:cin"]["cnf"] = "text/plain:0"
+		bodyMap["m2m:cin"]["rn"] = sensor.SensorIdentifier
 		// Add metadata
 		if len(sensor.SensorCharacteristicList) != 0 {
 			for _, val := range sensor.SensorCharacteristicList {
-				log.Debug("OneM2M_create: Adding CNI metadata: ", val)
-				bodyMap["m2m:cni"][val.CharacteristicName] = val.CharacteristicValue
+				log.Debug("OneM2M_create: Adding CIN metadata: ", val)
+				bodyMap["m2m:cin"][val.CharacteristicName] = val.CharacteristicValue
 			} // End of 'for' statement
 		}
 	} else {
@@ -753,7 +490,7 @@ func (tm *SssMgr) OneM2M_create(sensor SensorDiscoveryInfo, path string) (sensor
 		ctx.ty = 2
 	} else if sensor.SensorType == "CNT" {
 		ctx.ty = 3
-	} else if sensor.SensorType == "CNI" {
+	} else if sensor.SensorType == "CIN" {
 		ctx.ty = 4
 	} else {
 		err = errors.New("OneM2M_create: Invalid type")
@@ -770,7 +507,7 @@ func (tm *SssMgr) OneM2M_create(sensor SensorDiscoveryInfo, path string) (sensor
 	log.Debug("OneM2M_create: TypeOf(resp): ", reflect.TypeOf(resp))
 	if _, ok := resp.(map[string]interface{}); !ok {
 		log.Error("OneM2M_create: Interface not available")
-
+		return sensorResp, err
 	}
 
 	// Add additional entries
@@ -793,111 +530,157 @@ func (tm *SssMgr) OneM2M_create(sensor SensorDiscoveryInfo, path string) (sensor
 	return sensorResp, nil
 }
 
-func (tm *SssMgr) oneM2M_discovery(sensor SensorDiscoveryInfo, requestedIotPlatformId string, type_ string) (sensorResp SensorDiscoveryInfo, err error) {
-	// FIXME FSCOM: requestedIotPlatformId should be useless
+func (tm *SssMgr) OneM2M_discovery(type_ string, iotPlatformId string) (sensorResp []SensorDiscoveryInfo, err error) {
+
+	if profiling {
+		profilingTimers["OneM2M_discovery"] = time.Now()
+	}
+
+	log.Info(">>> OneM2OneM2M_discovery_get: path: ", type_)
+	log.Info(">>> OneM2M_discovery: iotPlatformId: ", iotPlatformId)
+
+	if iotPlatformId == "" {
+		err = errors.New("IotPlatformId fiels shall be set")
+		log.Error("OneM2M_discovery: ", err.Error())
+		return nil, err
+	}
+
+	tm.wg.Wait()
+	log.Info("OneM2M_discovery: After Synchro")
 
 	// 1. Get the list of the AE
-	// Build the URL
-	url := "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + registeredIotPlatformsMap[requestedIotPlatformId].Name
-	log.Debug("oneM2M_discovery: url=", url)
-	// Build the headers
-	var headers = http.Header{}
-	headers["Accept"] = []string{headerAccept}
-	headers["Content-Type"] = []string{headerContentType}
-	headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it
-	headers["X-M2M-RI"] = []string{uuid.New().String()}
-	headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it
-	// Build the queries
+	// Build the context
+	var ctx = SssMgrBindingProtocolContext{
+		host: registeredIotPlatformsMap[iotPlatformId].Address,
+		port: registeredIotPlatformsMap[iotPlatformId].Port,
+		name: registeredIotPlatformsMap[iotPlatformId].Name,
+		to:   registeredIotPlatformsMap[iotPlatformId].Name,
+		from: "Admin", // FIXME FSCOM How to get it
+		op:   2,       // RETRIEVE
+		ty:   -1,
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		code: 200,
+	}
+	// Build the queries parameters
 	queries := map[string]string{}
-	if type_ == "CN" {
-		queries["fu"] = "1" // Filter usage
-		queries["ty"] = "4" // Filter on oneM2M CIN for sensor
+	queries["fu"] = "1" // Filter usage
+	if type_ == "AE" {
+		ctx.ty = 2
+		queries["ty"] = "2"
+	} else if type_ == "CNT" {
+		ctx.ty = 3
+		queries["ty"] = "3"
+	} else if type_ == "CIN" {
+		ctx.ty = 4
+		queries["ty"] = "4"
 	} else {
-		err = errors.New("oneM2M_discovery: Invalid type")
-		log.Error("oneM2M_discovery: ", err.Error())
-		return sensorResp, err
+		err = errors.New("OneM2M_discovery: Invalid type")
+		log.Error("OneM2M_discovery: ", err.Error())
+		return nil, err
 	}
-	// Send the request
-	response, err := sendRequest("GET", url, headers, nil, nil, queries, 200)
+	ctx.queries = queries
+
+	err, resp := protocol.send(ctx)
 	if err != nil {
-		log.Error("oneM2M_discovery: ", err.Error())
-		return sensorResp, err
+		log.Error("OneM2M_create: ", err.Error())
+		return nil, err
 	}
-	log.Debug("oneM2M_discovery: response: ", string(response))
+	log.Debug("OneM2M_discovery: resp: ", resp)
+	log.Debug("OneM2M_discovery: TypeOf(resp): ", reflect.TypeOf(resp))
+	oneM2M_uril := resp.(map[string]interface{})
+	log.Debug("OneM2M_discovery: oneM2M_uril: ", oneM2M_uril)
+	log.Debug("OneM2M_discovery: TypeOf(oneM2M_uril): ", reflect.TypeOf(oneM2M_uril))
+	log.Debug("OneM2M_discovery: len(oneM2M_uril): ", len(oneM2M_uril))
+	sensorResp = make([]SensorDiscoveryInfo, len(oneM2M_uril))
+	// Loop for each CIN and build the sensor list
+	sensorResp = make([]SensorDiscoveryInfo, 0)
+	for _, v := range oneM2M_uril["m2m:uril"].([]interface{}) {
+		log.Debug("OneM2M_discovery: Processing key: v: ", v)
+		log.Debug("OneM2M_discovery: Processing key: TypeOf(v): ", reflect.TypeOf(v))
+		s := v.(string)
+		if s == "laboai-cse-in/acpCreateACPs" || s == "laboai-cse-in/CAdmin" {
+			// FIXME FSCOM Bug in MQTT DISCOVERY request which does not provide the same response that HTTP DISCOVERY with the same filter criteria
+			continue // Discard it
+		}
+		r, err := tm.OneM2M_get(v.(string), iotPlatformId)
+		if err != nil {
+			log.Error("OneM2M_discovery: ", err.Error())
+			return nil, err
+		}
+		sensorResp = append(sensorResp, r)
+	} // End of 'for' statement
+	log.Debug("OneM2M_discovery: len(sensorResp): ", len(sensorResp))
+	log.Debug("OneM2M_discovery: sensorResp: ", sensorResp)
 
-	var d map[string]map[string]interface{}
-	err = json.Unmarshal(response, &d)
-	if err != nil {
-		log.Error("oneM2M_discovery: ", err.Error())
-		return sensorResp, err
+	if profiling {
+		now := time.Now()
+		log.Debug("OneM2M_discovery: ", now.Sub(profilingTimers["OneM2M_discovery"]))
 	}
-	log.Debug("oneM2M_discovery: d: ", d)
-	// Add additional entries
-	// sensorResp, err = tm.oneM2M_deserialize(sensor, d)
-	// if err != nil {
-	// 	log.Error("oneM2M_discovery: ", err.Error())
-	// 	return sensorResp, err
-	// }
-	log.Debug("oneM2M_discovery: sensorResp: ", sensorResp)
 
 	return sensorResp, nil
 }
 
-func (tm *SssMgr) oneM2M_get(sensor SensorDiscoveryInfo, requestedIotPlatformId string, type_ string) (sensorResp SensorDiscoveryInfo, err error) {
-	// FIXME FSCOM: requestedIotPlatformId should be useless
+func (tm *SssMgr) OneM2M_get(path string, iotPlatformId string) (sensorResp SensorDiscoveryInfo, err error) {
 
-	if sensor.SensorIdentifier == "" {
-		err = errors.New("oneM2M_get: Cannot find \"ri\" value")
-		log.Error("oneM2M_get: ", err.Error())
+	if profiling {
+		profilingTimers["OneM2M_get"] = time.Now()
+	}
+
+	log.Info(">>> OneM2M_get: path: ", path)
+	log.Info(">>> OneM2M_get: iotPlatformId: ", iotPlatformId)
+
+	if path == "" || iotPlatformId == "" {
+		err = errors.New("OneM2M_get: Invalid parameters")
+		log.Error("OneM2M_get: ", err.Error())
 		return sensorResp, err
 	}
 
+	tm.wg.Wait()
+	log.Info("OneM2M_get: After Synchro")
+
 	// 1. Get the list of the AE
-	// Build the URL
-	url := "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + sensor.SensorIdentifier
-	log.Debug("oneM2M_get: url=", url)
-	// Build the headers
-	var headers = http.Header{}
-	headers["Accept"] = []string{headerAccept}
-	headers["Content-Type"] = []string{headerContentType}
-	headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it
-	headers["X-M2M-RI"] = []string{uuid.New().String()}
-	headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it
-	// Build the queries
-	queries := map[string]string{}
-	if type_ == "AE" {
-		queries = nil
-	} else if type_ == "CN" {
-		queries["fu"] = "1" // Filter usage
-		queries["ty"] = "4" // Filter on oneM2M CIN for sensor
-	} else {
-		err = errors.New("oneM2M_get: Invalid type")
-		log.Error("oneM2M_get: ", err.Error())
-		return sensorResp, err
+	// Build the context
+	var ctx = SssMgrBindingProtocolContext{
+		host: registeredIotPlatformsMap[iotPlatformId].Address,
+		port: registeredIotPlatformsMap[iotPlatformId].Port,
+		name: registeredIotPlatformsMap[iotPlatformId].Name,
+		to:   path,
+		from: "Admin", // FIXME FSCOM How to get it
+		op:   2,       // RETRIEVE
+		ty:   -1,
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		code: 200,
 	}
-	// Send the request
-	response, err := sendRequest("GET", url, headers, nil, nil, queries, 200)
+
+	err, resp := protocol.send(ctx)
 	if err != nil {
-		log.Error("oneM2M_get: ", err.Error())
+		log.Error("OneM2M_get: ", err.Error())
+		return sensorResp, err
+	}
+	log.Debug("OneM2M_get: resp: ", resp)
+	log.Debug("OneM2M_get: TypeOf(resp): ", reflect.TypeOf(resp))
+	if _, ok := resp.(map[string]interface{}); !ok {
+		log.Error("OneM2M_get: Interface not available")
 		return sensorResp, err
 	}
-	log.Debug("oneM2M_get: response: ", string(response))
 
-	var d map[string]map[string]interface{}
-	err = json.Unmarshal(response, &d)
+	// Add additional entries
+	sensorResp.IotPlatformId = iotPlatformId
+	sensorResp, err = tm.oneM2M_deserialize(sensorResp, resp.(map[string]interface{}))
+
 	if err != nil {
-		log.Error("oneM2M_get: ", err.Error())
+		log.Error("OneM2M_get: ", err.Error())
 		return sensorResp, err
 	}
-	log.Debug("oneM2M_get: d: ", d)
+	log.Debug("OneM2M_get: sensorResp: ", sensorResp)
+
+	if profiling {
+		now := time.Now()
+		log.Debug("OneM2M_get: ", now.Sub(profilingTimers["OneM2M_get"]))
+	}
 
-	// Add additional entries
-	// sensorResp, err = tm.oneM2M_deserialize(sensor, d)
-	// if err != nil {
-	// 	log.Error("oneM2M_get: ", err.Error())
-	// 	return sensorResp, err
-	// }
-	log.Debug("oneM2M_get: sensorResp: ", sensorResp)
 	return sensorResp, nil
 }
 
@@ -1037,7 +820,7 @@ func (tm *SssMgr) oneM2M_deserialize(sensor SensorDiscoveryInfo, response map[st
 					case 3:
 						sensorResp.SensorType = "CNT"
 					case 4:
-						sensorResp.SensorType = "CNI"
+						sensorResp.SensorType = "CIN"
 					default:
 						sensorResp.SensorType = strconv.FormatFloat(item, 'f', -1, 64)
 					}
diff --git a/go-packages/meep-sss-mgr/onem2m-mgr_test.go b/go-packages/meep-sss-mgr/onem2m-mgr_test.go
index 2bda18bb4..99cc83396 100644
--- a/go-packages/meep-sss-mgr/onem2m-mgr_test.go
+++ b/go-packages/meep-sss-mgr/onem2m-mgr_test.go
@@ -81,206 +81,828 @@ func TestNewSssMgr(t *testing.T) {
 	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", "", 0, "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", "", 0, "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 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)
+
+	// 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())
+
+	// 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())
+	}
+
+	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())
+		}
+	}
+
+	// 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())
+
+	// 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")
+	}
+
+	// Verify content
+	if !validate_sensor_ae(sensor, new_sensor) {
+		t.Fatalf("Failed to validate AE content")
+	}
+
+	_ = tm.OneM2M_Delete(new_sensor)
+
+	// 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())
+
+	// 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")
+	}
+
+	// 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")
+	}
+
+	// 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")
+	}
+
+	// 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())
+
+	// 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")
+	}
+
+	// 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")
+	}
+
+	// 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")
+	}
+
+	// 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")
+	}
+
+	// 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())
+
+	// 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())
+	}
+
+	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
+}
+
+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")
+	}
+
+	_ = 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) {
+	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")
+	}
+
+	_, 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")
+	}
+
+	// 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")
+	}
+
+	_ = 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 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())
+
+	// 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())
+	}
+
+	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")
+	}
+}
+
+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")
+	}
+
+	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))
 
-// 	err = tm.populateDevicesPerIotPlatforms()
-// 	if err != nil {
-// 		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 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 TestOneM2M_createAEMQTT(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
 
-// 	sensors, err := tm.SensorDiscoveryInfoAll()
-// 	if err != nil {
-// 		t.Fatalf(err.Error())
-// 	}
-// 	fmt.Println("len=", len(sensors))
-// 	fmt.Println("sensors", sensors)
+	// 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
-// }
+	var new_sensor = SensorDiscoveryInfo{
+		SensorIdentifier: "12345",
+		SensorType:       "AE",
+		SensorPosition:   nil,
+		IotPlatformId:    "7feaadbb0400",
+	}
+	sensor, err := tm.OneM2M_create(new_sensor, "")
+	if err != nil {
+		t.Fatalf("Failed to create new sensor")
+	}
 
-// func TestGetSensorHttp(t *testing.T) {
-// 	fmt.Println("--- ", t.Name())
-// 	log.MeepTextLogInit(t.Name())
+	// Verify content
+	if !validate_sensor_ae(sensor, new_sensor) {
+		t.Fatalf("Failed to validate AE content")
+	}
 
-// 	// 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")
-// 	}
+	_ = tm.OneM2M_Delete(sensor)
 
-// 	sensors, err := tm.SensorDiscoveryInfoAll()
-// 	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 TestOneM2M_createAE_CNTMQTT(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
 
-// 	for _, v := range sensors {
-// 		fmt.Println("v", v)
-// 		fmt.Println("TypeOf(v)", reflect.TypeOf(v))
+	// 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")
+	}
 
-// 		sensor, err := tm.GetSensor(v.SensorIdentifier)
-// 		if !validate_sensor_discovery_info(v, sensor) {
-// 			t.Fatalf(err.Error())
-// 		}
-// 	}
+	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")
+	}
 
-// 	// Cleanup
-// 	err = tm.DeleteSssMgr()
-// 	if err != nil {
-// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
-// 	}
-// 	tm = nil
-// }
+	// Verify content
+	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
+		t.Fatalf("Failed to validate AE content")
+	}
 
-// func TestOneM2M_createAEHttp(t *testing.T) {
-// 	fmt.Println("--- ", t.Name())
-// 	log.MeepTextLogInit(t.Name())
+	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")
+	}
 
-// 	// 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")
-// 	}
+	// Verify content
+	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
+		t.Fatalf("Failed to validate CNT content")
+	}
 
-// 	var new_sensor = SensorDiscoveryInfo{
-// 		SensorIdentifier: "12345",
-// 		SensorType:       "AE",
-// 		SensorPosition:   nil,
-// 		IotPlatformId:    "7feaadbb0400",
-// 	}
-// 	sensor, err := tm.OneM2M_create(new_sensor, "")
-// 	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")
+	}
 
-// 	// Verify content
-// 	fmt.Println(">>> validate_sensor_discovery_info_1: expected_sensor: ", new_sensor)
-// 	fmt.Println(">>> validate_sensor_discovery_info_1: received_sensor: ", sensor)
-// 	// if sensor.SensorIdentifier != new_sensor.SensorIdentifier { // FIXME FSCOM SensorIdentifier will be replaced by oneM2M ri
-// 	// 	t.Fatalf("received_sensor.SensorIdentifier != SensorIdentifier")
-// 	// }
-// 	if sensor.SensorType != new_sensor.SensorType {
-// 		t.Fatalf("received_sensor.SensorType != SensorType")
-// 	}
-// 	if sensor.IotPlatformId != new_sensor.IotPlatformId {
-// 		t.Fatalf("received_sensor.IotPlatformId != IotPlatformId")
-// 	}
-// 	if len(sensor.SensorCharacteristicList) == 0 {
-// 		t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty")
-// 	}
+	// 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())
+
+	// 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")
+	}
+
+	// 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")
+	}
+
+	// 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")
+	}
+
+	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
+}
+
+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")
+	}
+
+	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())
+	}
+
+	// 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())
+
+	// 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")
+	}
+
+	// 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")
+	}
 
-// 	_ = tm.OneM2M_Delete(sensor)
+	_ = 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_createAE_CNTHttp(t *testing.T) {
+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, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+	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, "")
+	_, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
 	if err != nil {
-		t.Fatalf("Failed to create new AE sensor")
+		t.Fatalf("Failed to create sensors")
 	}
 
 	// Verify content
-	fmt.Println(">>> validate_sensor_discovery_info_1: expected_sensor: ", sensor_ae)
-	fmt.Println(">>> validate_sensor_discovery_info_1: received_sensor: ", new_sensor_ae)
-	// if sensor.SensorIdentifier != new_sensor.SensorIdentifier { // FIXME FSCOM SensorIdentifier will be replaced by oneM2M ri
-	// 	t.Fatalf("received_sensor.SensorIdentifier != SensorIdentifier")
-	// }
-	if new_sensor_ae.SensorType != new_sensor_ae.SensorType {
-		t.Fatalf("received_sensor.SensorType != SensorType")
-	}
-	if new_sensor_ae.IotPlatformId != sensor_ae.IotPlatformId {
-		t.Fatalf("received_sensor.IotPlatformId != IotPlatformId")
-	}
-	if len(new_sensor_ae.SensorCharacteristicList) == 0 {
-		t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty")
+	if len(received_sensors) != 3 {
+		t.Fatalf("Failed to create sensors")
 	}
 
-	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)
+	// Discover CNTs
+	sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId)
 	if err != nil {
-		t.Fatalf("Failed to create new sensor")
-	}
-	if new_sensor_cnt.SensorType != sensor_cnt.SensorType {
-		t.Fatalf("received_sensor.SensorType != SensorType")
+		t.Fatalf("Failed to discover CNT sensor")
 	}
-	if new_sensor_cnt.IotPlatformId != sensor_cnt.IotPlatformId {
-		t.Fatalf("received_sensor.IotPlatformId != IotPlatformId")
+	if len(sensorList) != 1 {
+		t.Fatalf("Wrong discover result")
 	}
-	if len(new_sensor_cnt.SensorCharacteristicList) == 0 {
-		t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty")
+	// Verify content
+	if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) {
+		t.Fatalf("Failed to validate CNT content")
 	}
 
-	err = tm.OneM2M_Delete(new_sensor_cnt)
+	// Discover AEs
+	sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId)
 	if err != nil {
-		t.Fatalf("Failed to create new sensor")
+		t.Fatalf("Failed to discover AE sensor")
 	}
-	err = tm.OneM2M_Delete(new_sensor_ae)
-	if err != nil {
-		t.Fatalf("Failed to create new 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 {
@@ -289,208 +911,6 @@ func TestOneM2M_createAE_CNTHttp(t *testing.T) {
 	tm = nil
 }
 
-// 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")
-// 	}
-
-// 	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())
-// 	}
-
-// 	// 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())
-
-// 	// 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())
-// 	}
-
-// 	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")
-// 	}
-// }
-
-// 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")
-// 	}
-
-// 	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))
-
-// 		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
-// }
-
-// 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")
-// 	}
-
-// 	var new_sensor = SensorDiscoveryInfo{
-// 		SensorIdentifier: "12345",
-// 		SensorType:       "AE",
-// 		SensorPosition:   nil,
-// 		IotPlatformId:    "7feaadbb0400",
-// 	}
-// 	sensor, err := tm.OneM2M_create(new_sensor, "")
-// 	if err != nil {
-// 		t.Fatalf("Failed to create new sensor")
-// 	}
-
-// 	// Verify content
-// 	fmt.Println(">>> validate_sensor_discovery_info_1: expected_sensor: ", new_sensor)
-// 	fmt.Println(">>> validate_sensor_discovery_info_1: received_sensor: ", sensor)
-// 	// if sensor.SensorIdentifier != new_sensor.SensorIdentifier { // FIXME FSCOM SensorIdentifier will be replaced by oneM2M ri
-// 	// 	t.Fatalf("received_sensor.SensorIdentifier != SensorIdentifier")
-// 	// }
-// 	if sensor.SensorType != new_sensor.SensorType {
-// 		t.Fatalf("received_sensor.SensorType != SensorType")
-// 	}
-// 	if sensor.IotPlatformId != new_sensor.IotPlatformId {
-// 		t.Fatalf("received_sensor.IotPlatformId != IotPlatformId")
-// 	}
-// 	if len(sensor.SensorCharacteristicList) == 0 {
-// 		t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty")
-// 	}
-
-// 	_ = tm.OneM2M_Delete(sensor)
-
-// 	// 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())
-
-// 	// 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())
-// 	}
-
-// 	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
-// }
-
 // func TestVaidateOneM2MNotificationServer(t *testing.T) {
 // 	fmt.Println("--- ", t.Name())
 // 	log.MeepTextLogInit(t.Name())
@@ -521,6 +941,56 @@ func oneM2M_create(tm *SssMgr, sensor SensorDiscoveryInfo, path string) (sensorR
 	return sensorResp, nil
 }
 
+func oneM2M_createAE_CNT_CIN(tm *SssMgr) (sensors map[string]SensorDiscoveryInfo, received_sensors map[string]SensorDiscoveryInfo, err error) {
+	sensors = make(map[string]SensorDiscoveryInfo, 0)
+	received_sensors = make(map[string]SensorDiscoveryInfo, 0)
+
+	var sensor_ae = SensorDiscoveryInfo{
+		SensorIdentifier: "CMyAE",
+		SensorType:       "AE",
+		SensorPosition:   nil,
+		IotPlatformId:    "7feaadbb0400",
+	}
+	sensors[sensor_ae.SensorType] = sensor_ae
+	new_sensor_ae, err := oneM2M_create(tm, sensor_ae, "")
+	if err != nil {
+		return nil, nil, err
+	}
+	received_sensors[new_sensor_ae.SensorType] = new_sensor_ae
+
+	var sensor_cnt = SensorDiscoveryInfo{
+		SensorIdentifier: "CMyCNT",
+		SensorType:       "CNT",
+		SensorPosition:   nil,
+		IotPlatformId:    "7feaadbb0400",
+	}
+	sensorPath := new_sensor_ae.SensorIdentifier
+	sensors[sensor_cnt.SensorType] = sensor_cnt
+	new_sensor_cnt, err := oneM2M_create(tm, sensor_cnt, sensorPath)
+	if err != nil {
+		return nil, nil, err
+	}
+	received_sensors[new_sensor_cnt.SensorType] = new_sensor_cnt
+
+	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
+	sensors[sensor_cin.SensorType] = sensor_cin
+	new_sensor_cin, err := oneM2M_create(tm, sensor_cin, sensorPath)
+	if err != nil {
+		return nil, nil, err
+	}
+	received_sensors[new_sensor_cin.SensorType] = new_sensor_cin
+
+	return sensors, received_sensors, nil
+}
+
 func validate_sensor_discovery_info(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool {
 	fmt.Println(">>> validate_sensor_discovery_info: expected_sensor: ", expected_sensor)
 	fmt.Println(">>> validate_sensor_discovery_info: received_sensor: ", received_sensor)
@@ -545,3 +1015,138 @@ func validate_sensor_discovery_info(expected_sensor SensorDiscoveryInfo, receive
 
 	return true
 }
+
+func validate_sensor_ae(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool {
+	fmt.Println(">>> validate_sensor_ae: expected_sensor: ", expected_sensor)
+	fmt.Println(">>> validate_sensor_ae: received_sensor: ", received_sensor)
+
+	if received_sensor.SensorIdentifier == "" {
+		fmt.Println("validate_sensor_ae.SensorIdentifier shall be set")
+		return false
+	}
+	if received_sensor.SensorType == "" {
+		fmt.Println("validate_sensor_ae.SensorType shall be set")
+		return false
+	}
+	if received_sensor.IotPlatformId != expected_sensor.IotPlatformId {
+		fmt.Println("validate_sensor_ae.IotPlatformId != IotPlatformId")
+		return false
+	}
+	if len(received_sensor.SensorCharacteristicList) == 0 {
+		fmt.Println("validate_sensor_ae.SensorCharacteristicList shall not be empty")
+		return false
+	}
+
+	for _, c := range received_sensor.SensorCharacteristicList { // FIXME FSCOM To be refined
+		found := true
+		switch c.CharacteristicName {
+		case "api":
+		case "srv":
+		case "pi":
+		case "ct":
+		case "et":
+		case "lt":
+		case "aei":
+		case "rn":
+		case "rr":
+		default:
+			found = true
+		} // End of 'switch' statement
+		if !found {
+			fmt.Println("Incomplete SensorCharacteristicList")
+			return false
+		}
+	}
+
+	return true
+}
+
+func validate_sensor_cnt(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool {
+	fmt.Println(">>> validate_sensor_cnt: expected_sensor: ", expected_sensor)
+	fmt.Println(">>> validate_sensor_cnt: received_sensor: ", received_sensor)
+
+	if received_sensor.SensorIdentifier == "" {
+		fmt.Println("validate_sensor_ae.SensorIdentifier shall be set")
+		return false
+	}
+	if received_sensor.SensorType != received_sensor.SensorType {
+		fmt.Println("validate_sensor_cnt.SensorType != SensorType")
+		return false
+	}
+	if received_sensor.IotPlatformId != expected_sensor.IotPlatformId {
+		fmt.Println("validate_sensor_cnt.IotPlatformId != IotPlatformId")
+		return false
+	}
+	if len(received_sensor.SensorCharacteristicList) == 0 {
+		fmt.Println("validate_sensor_cnt.SensorCharacteristicList shall not be empty")
+		return false
+	}
+
+	for _, c := range received_sensor.SensorCharacteristicList { // FIXME FSCOM To be refined
+		found := true
+		switch c.CharacteristicName {
+		case "cni":
+		case "pi":
+		case "ct":
+		case "et":
+		case "lt":
+		case "st":
+		case "cbs":
+		case "mbs":
+		case "mni":
+		case "rn":
+		default:
+			found = true
+		} // End of 'switch' statement
+		if !found {
+			fmt.Println("Incomplete SensorCharacteristicList")
+			return false
+		}
+	}
+
+	return true
+}
+
+func validate_sensor_cin(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool {
+	fmt.Println(">>> validate_sensor_cin: expected_sensor: ", expected_sensor)
+	fmt.Println(">>> validate_sensor_cin: received_sensor: ", received_sensor)
+
+	if received_sensor.SensorIdentifier == "" {
+		fmt.Println("validate_sensor_ae.SensorIdentifier shall be set")
+		return false
+	}
+	if received_sensor.SensorType != received_sensor.SensorType {
+		fmt.Println("validate_sensor_cin.SensorType != SensorType")
+		return false
+	}
+	if received_sensor.IotPlatformId != expected_sensor.IotPlatformId {
+		fmt.Println("validate_sensor_cin.IotPlatformId != IotPlatformId")
+		return false
+	}
+	if len(received_sensor.SensorCharacteristicList) == 0 {
+		fmt.Println("validate_sensor_cin.SensorCharacteristicList shall not be empty")
+		return false
+	}
+
+	for _, c := range received_sensor.SensorCharacteristicList { // FIXME FSCOM To be refined
+		found := true
+		switch c.CharacteristicName {
+		case "pi":
+		case "lt":
+		case "cs":
+		case "et":
+		case "cnf":
+		case "con":
+		case "ct":
+		case "rn":
+		default:
+			found = true
+		} // End of 'switch' statement
+		if !found {
+			fmt.Println("Incomplete SensorCharacteristicList")
+			return false
+		}
+	}
+
+	return true
+}
-- 
GitLab