handlerManager.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package iot
  2. import (
  3. "encoding/json"
  4. "log"
  5. "net/http"
  6. )
  7. /*
  8. IoT Handler Manager
  9. Author: tobychui
  10. This manager mange all the existsing / registered ioT Manager.
  11. This allow a much more abstract usage in the main code
  12. */
  13. type Manager struct {
  14. RegisteredHandler []ProtocolHandler
  15. cachedDeviceList []*Device
  16. }
  17. func NewIoTManager() *Manager {
  18. return &Manager{
  19. RegisteredHandler: []ProtocolHandler{},
  20. }
  21. }
  22. //Register the handler as one of the IoT Protocol Handler.
  23. func (m *Manager) RegisterHandler(h ProtocolHandler) error {
  24. //Try to start the handler
  25. err := h.Start()
  26. if err != nil {
  27. //Handler startup failed
  28. log.Println("*IoT* Protocol Handler Startup Failed: ", err.Error())
  29. return err
  30. }
  31. //Add it to the handlers
  32. m.RegisteredHandler = append(m.RegisteredHandler, h)
  33. return nil
  34. }
  35. //Handle listing of all avaible scanner and its stats
  36. func (m *Manager) HandleScannerList(w http.ResponseWriter, r *http.Request) {
  37. stats := []Stats{}
  38. for _, scanner := range m.RegisteredHandler {
  39. thisScannerStat := scanner.Stats()
  40. stats = append(stats, thisScannerStat)
  41. }
  42. js, _ := json.Marshal(stats)
  43. sendJSONResponse(w, string(js))
  44. }
  45. //Get status of the given device ID
  46. func (m *Manager) HandleGetDeviceStatus(w http.ResponseWriter, r *http.Request) {
  47. devid, err := mv(r, "devid", true)
  48. if err != nil {
  49. sendErrorResponse(w, "Invalid device id")
  50. return
  51. }
  52. //Search for that device ID
  53. for _, dev := range m.cachedDeviceList {
  54. if dev.DeviceUUID == devid {
  55. //Found. Get it status and return
  56. status, err := dev.Handler.Status(dev)
  57. if err != nil {
  58. sendErrorResponse(w, err.Error())
  59. return
  60. }
  61. //Return the status
  62. js, _ := json.Marshal(status)
  63. sendJSONResponse(w, string(js))
  64. return
  65. }
  66. }
  67. //Not found
  68. sendErrorResponse(w, "Given device ID does not match any scanned devices")
  69. }
  70. //Handle IoT Scanning Request
  71. func (m *Manager) HandleScanning(w http.ResponseWriter, r *http.Request) {
  72. scannedDevices := []*Device{}
  73. for _, ph := range m.RegisteredHandler {
  74. //Scan devices using this handler
  75. thisProtcolDeviceList, err := ph.Scan()
  76. if err != nil {
  77. continue
  78. }
  79. //Append it to list
  80. for _, dev := range thisProtcolDeviceList {
  81. scannedDevices = append(scannedDevices, dev)
  82. }
  83. }
  84. //Cache the scan record
  85. m.cachedDeviceList = scannedDevices
  86. js, _ := json.Marshal(scannedDevices)
  87. sendJSONResponse(w, string(js))
  88. }
  89. //Handle IoT Listing Request
  90. func (m *Manager) HandleListing(w http.ResponseWriter, r *http.Request) {
  91. if m.cachedDeviceList == nil || len(m.cachedDeviceList) == 0 {
  92. //Scan results not exists. Scan again
  93. m.HandleScanning(w, r)
  94. } else {
  95. //Cache already exists. Return it
  96. js, _ := json.Marshal(m.cachedDeviceList)
  97. sendJSONResponse(w, string(js))
  98. }
  99. }