diff --git a/ETRI-SMARTFARM-POC.postman_collection.json b/ETRI-SMARTFARM-POC.postman_collection.json new file mode 100644 index 0000000..a623b02 --- /dev/null +++ b/ETRI-SMARTFARM-POC.postman_collection.json @@ -0,0 +1,235 @@ +{ + "info": { + "_postman_id": "6f0d9b87-1c8c-475e-9498-0786a8a423b4", + "name": "ETRI-SMARTFARM-POC", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "1. (post) controller-A", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"cname\": \"controller-A\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{server}}/controllers", + "protocol": "http", + "host": [ + "{{server}}" + ], + "path": [ + "controllers" + ] + } + }, + "response": [] + }, + { + "name": "2. (post) controller-B", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"cname\": \"controller-B\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{server}}/controllers", + "protocol": "http", + "host": [ + "{{server}}" + ], + "path": [ + "controllers" + ] + } + }, + "response": [] + }, + { + "name": "3. (post) device-A", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"dname\": \"device-A\",\n \"type\": \"sensor\",\n \"cid\": \"{{cid-A}}\",\n \"sname\": \"devicemanagera\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{server}}/devices", + "protocol": "http", + "host": [ + "{{server}}" + ], + "path": [ + "devices" + ] + } + }, + "response": [] + }, + { + "name": "4. (post) device-B", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"dname\": \"device-A\",\n \"type\": \"sensor\",\n \"cid\": \"{{cid-A}}\",\n \"sname\": \"devicemanagera\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{server}}/devices", + "protocol": "http", + "host": [ + "{{server}}" + ], + "path": [ + "devices" + ] + } + }, + "response": [] + }, + { + "name": "5. (post) device-C", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"dname\": \"device-A\",\n \"type\": \"sensor\",\n \"cid\": \"{{cid-A}}\",\n \"sname\": \"devicemanagera\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{server}}/devices", + "protocol": "http", + "host": [ + "{{server}}" + ], + "path": [ + "devices" + ] + } + }, + "response": [] + }, + { + "name": "6. (post) device-D", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"dname\": \"device-A\",\n \"type\": \"sensor\",\n \"cid\": \"{{cid-A}}\",\n \"sname\": \"devicemanagerb\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{server}}/devices", + "protocol": "http", + "host": [ + "{{server}}" + ], + "path": [ + "devices" + ] + } + }, + "response": [] + }, + { + "name": "7. (post) device-E", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"dname\": \"device-A\",\n \"type\": \"sensor\",\n \"cid\": \"{{cid-A}}\",\n \"sname\": \"devicemanagerb\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{server}}/devices", + "protocol": "http", + "host": [ + "{{server}}" + ], + "path": [ + "devices" + ] + } + }, + "response": [] + }, + { + "name": "8. (get) Request-to-ServiceA", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://{{server}}/services/{{sid-A}}", + "protocol": "http", + "host": [ + "{{server}}" + ], + "path": [ + "services", + "{{sid-A}}" + ] + } + }, + "response": [] + }, + { + "name": "9. (get) Request-to-ServiceB", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://{{server}}/{{sid-A}}", + "protocol": "http", + "host": [ + "{{server}}" + ], + "path": [ + "{{sid-A}}" + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file diff --git a/POC-ENV.postman_environment.json b/POC-ENV.postman_environment.json new file mode 100644 index 0000000..c70bb35 --- /dev/null +++ b/POC-ENV.postman_environment.json @@ -0,0 +1,34 @@ +{ + "id": "80fd9b0c-0696-4c64-810c-4ba804f822b4", + "name": "POC-ENV", + "values": [ + { + "key": "server", + "value": "localhost:3000", + "enabled": true + }, + { + "key": "cid-A", + "value": "562f71b4-1267-49bf-ba55-2d00add1f0f6", + "enabled": true + }, + { + "key": "cid-B", + "value": "23f65d70-78d4-4b17-b0ac-906fe01f3090", + "enabled": true + }, + { + "key": "sid-A", + "value": "8e8f6de3-94e7-4fe0-a0e9-8d473674aced", + "enabled": true + }, + { + "key": "sid-B", + "value": "7a43133f-9c01-46f9-9fd9-9e8f157ec604", + "enabled": true + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2021-11-17T03:10:47.279Z", + "_postman_exported_using": "Postman/8.12.5" +} \ No newline at end of file diff --git a/dump.db b/dump.db deleted file mode 100644 index 6cee3d5..0000000 Binary files a/dump.db and /dev/null differ diff --git a/model/interface.go b/model/interface.go index 65f4f62..68de9f7 100644 --- a/model/interface.go +++ b/model/interface.go @@ -26,6 +26,6 @@ type DBHandler interface { } func NewDBHandler(dbtype, path string) (DBHandler, error) { - // return newSqliteHandler(path) - return newPostgresqlHandler(path) + return newSqliteHandler(path) + // return newPostgresqlHandler(path) } diff --git a/router/route.go b/router/route.go index 1fc7e8b..cb00aaf 100644 --- a/router/route.go +++ b/router/route.go @@ -77,6 +77,7 @@ func GetControllerList(w http.ResponseWriter, r *http.Request) { if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) + return } fmt.Println(list) encoder := json.NewEncoder(w) @@ -85,6 +86,7 @@ func GetControllerList(w http.ResponseWriter, r *http.Request) { if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) + return } } @@ -96,6 +98,7 @@ func PostController(w http.ResponseWriter, r *http.Request) { if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) + return } encoder := json.NewEncoder(w) @@ -104,6 +107,7 @@ func PostController(w http.ResponseWriter, r *http.Request) { if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) + return } sendNotification(&Notification{Msg: "Added Controller"}) @@ -116,14 +120,19 @@ var upgrader = websocket.Upgrader{ } var notifications []chan *Notification +var notiMutex sync.Mutex func sendNotification(noti *Notification) { + // notiMutex.Lock() + // defer notiMutex.Unlock() for _, ch := range notifications { ch <- noti } } func removeNotification(noti chan *Notification) { + notiMutex.Lock() + defer notiMutex.Unlock() for i, e := range notifications { if e == noti { discoveredDevices[i] = discoveredDevices[len(discoveredDevices)-1] @@ -133,11 +142,14 @@ func removeNotification(noti chan *Notification) { } func GetNotification(w http.ResponseWriter, r *http.Request) { notiChan := make(chan *Notification, 1) + notiMutex.Lock() notifications = append(notifications, notiChan) + notiMutex.Unlock() conn, err := upgrader.Upgrade(w, r, nil) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) + return } for { @@ -146,7 +158,6 @@ func GetNotification(w http.ResponseWriter, r *http.Request) { if conn.WriteJSON(notification) != nil { log.Println(err) w.WriteHeader(http.StatusBadRequest) - w.Write([]byte(err.Error())) removeNotification(notiChan) notiChan = nil return @@ -156,11 +167,14 @@ func GetNotification(w http.ResponseWriter, r *http.Request) { func GetDiscoveredDevices(w http.ResponseWriter, r *http.Request) { noti := make(chan string, 1) + mutex.Lock() discoveredNotifications = append(discoveredNotifications, noti) + mutex.Unlock() conn, err := upgrader.Upgrade(w, r, nil) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) + return } for { @@ -221,24 +235,25 @@ func PostDevice(w http.ResponseWriter, r *http.Request) { mutex.Lock() waitPermission[device.DID] = make(chan bool) discoveredDevices = append(discoveredDevices, device) - mutex.Unlock() + for _, noti := range discoveredNotifications { noti <- device.DID } - - timer := time.NewTimer(3 * time.Second) + mutex.Unlock() + timer := time.NewTimer(20 * time.Second) select { case <-timer.C: mutex.Lock() delete(waitPermission, device.DID) removeDevice(device) - mutex.Unlock() + for _, noti := range discoveredNotifications { noti <- device.DID } - + mutex.Unlock() w.WriteHeader(http.StatusOK) w.Write([]byte("This operation is not permitted")) + return case b := <-waitPermission[device.DID]: if b { // 디바이스 등록 절차 수행 @@ -251,19 +266,20 @@ func PostDevice(w http.ResponseWriter, r *http.Request) { mutex.Lock() delete(waitPermission, device.DID) removeDevice(device) - mutex.Unlock() + for _, noti := range discoveredNotifications { noti <- device.DID } + mutex.Unlock() } else { mutex.Lock() delete(waitPermission, device.DID) removeDevice(device) - mutex.Unlock() + for _, noti := range discoveredNotifications { noti <- device.DID } - + mutex.Unlock() w.WriteHeader(http.StatusOK) w.Write([]byte("This operation is not permitted")) } @@ -278,7 +294,6 @@ func PutDevice(w http.ResponseWriter, r *http.Request) { err := decoder.Decode(&msg) fmt.Println("msg[did]: ", msg["did"]) - if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) @@ -290,7 +305,6 @@ func PutDevice(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Wrong Device ID is Sended")) return } - ch <- true w.WriteHeader(http.StatusOK) } diff --git a/server b/server new file mode 100755 index 0000000..50c356b Binary files /dev/null and b/server differ