save work, not yet working
This commit is contained in:
@ -3,11 +3,20 @@ package dispatcher
|
||||
import "log"
|
||||
import "time"
|
||||
import "os"
|
||||
import "fmt"
|
||||
import "net/url"
|
||||
import "encoding/json"
|
||||
import "udi/mqtt"
|
||||
import "udi/config"
|
||||
import "udi/handlers/handler"
|
||||
import "udi/handlers/ttn"
|
||||
import "udi/handlers/iot"
|
||||
|
||||
type archivingStruct struct {
|
||||
timestamp string `json:"timestamp"`
|
||||
topic string `json:"topic"`
|
||||
payload string `json:"payload"`
|
||||
}
|
||||
|
||||
var handlerMap map[string]handler.Handler = make(map[string]handler.Handler)
|
||||
var archiverChannel chan mqtt.Message = make(chan mqtt.Message, 100)
|
||||
@ -21,32 +30,56 @@ func InitDispatcher() {
|
||||
case "TTN":
|
||||
handlerMap[handlerEntry.Name] = ttn.NewTTNHandler()
|
||||
log.Printf("TTN initialized")
|
||||
case "IoT":
|
||||
handlerMap[handlerEntry.Name] = iot.NewIoTHandler()
|
||||
log.Printf("IoT initialized")
|
||||
default:
|
||||
log.Fatalf("Handler %s not found", handlerEntry.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func storeMessage(filename, item string) {
|
||||
file, err := os.OpenFile(archivingFilename, os.O_APPEND | os.O_CREATE | os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
log.Printf("Unable to open archiving file %s, message is not archived: %s", archivingFilename, err)
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
archivingString, err := json.Marshal(archivingItem)
|
||||
if err != nil {
|
||||
log.Printf("Unable to convert to json, message is not archived: %s", err)
|
||||
return
|
||||
}
|
||||
_, err := file.WriteString(string(message.Payload))
|
||||
if err != nil {
|
||||
log.Printf("Unable to write message, message is not archived: %s", err)
|
||||
return
|
||||
}
|
||||
log.Printf("Archiving message in file %s", archivingFilename)
|
||||
}
|
||||
|
||||
func archiver() {
|
||||
archivingRootDir := config.Config.Archiver.Dir
|
||||
currentArchivingDir := ""
|
||||
lastArchivingDir := ""
|
||||
var lastArchivingDir string
|
||||
|
||||
for {
|
||||
select {
|
||||
case _ = <- archiverChannel:
|
||||
case message := <- archiverChannel:
|
||||
currentTime := time.Now()
|
||||
currentDateStr := currentTime.Format("2006/01/02")
|
||||
currentDateStr := currentTime.Format("2006/01/02/15")
|
||||
currentArchivingDir := archivingRootDir + "/" + currentDateStr
|
||||
if currentArchivingDir != lastArchivingDir {
|
||||
err := os.MkdirAll(currentArchivingDir, 0755)
|
||||
if err := nil {
|
||||
log.Printf("Unable to create archiving dir %s", currentArchivingDir)
|
||||
if err != nil {
|
||||
log.Printf("Unable to create archiving dir %s: %s", currentArchivingDir, err)
|
||||
}
|
||||
lastArchivingDir = currentArchivingDir
|
||||
log.Printf("Archiving dir %s created", currentArchivingDir)
|
||||
}
|
||||
archivingFilename := currentArchivingDir + "/" + string(currentTime.Hour()) + "/"
|
||||
log.Printf("Archiving message")
|
||||
archivingFilename := fmt.Sprintf("%s/%s", currentArchivingDir, url.PathEscape(message.Topic))
|
||||
archivingItem := archivingStruct { currentTime.Format("2006-01-02 15:04:05"), message.Topic, string(message.Payload) }
|
||||
storeMessage(archivingFilename, archivingItem)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user