handlerManager.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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 the device object by id
  46. func (m *Manager) GetDeviceByID(devid string) *Device {
  47. for _, dev := range m.cachedDeviceList {
  48. if dev.DeviceUUID == devid {
  49. return dev
  50. }
  51. }
  52. return nil
  53. }
  54. //Handle listing of all avaible scanner and its stats
  55. func (m *Manager) HandleExecute(w http.ResponseWriter, r *http.Request) {
  56. devid, err := mv(r, "devid", true)
  57. if err != nil {
  58. sendErrorResponse(w, "Invalid device id")
  59. return
  60. }
  61. eptname, err := mv(r, "eptname", true)
  62. if err != nil {
  63. sendErrorResponse(w, "Invalid endpoint name")
  64. return
  65. }
  66. payload, _ := mv(r, "payload", true)
  67. //Get device by device id
  68. dev := m.GetDeviceByID(devid)
  69. if dev == nil {
  70. sendErrorResponse(w, "Given device id not found")
  71. return
  72. }
  73. //Get its endpoint
  74. var targetEndpoint Endpoint
  75. for _, ept := range dev.ControlEndpoints {
  76. if ept.Name == eptname {
  77. //This is the endpoint we are looking for
  78. targetEndpoint = *ept
  79. break
  80. }
  81. }
  82. //log.Println(dev.IPAddr, targetEndpoint, payload)
  83. //Send request to the target IoT device
  84. result, err := dev.Handler.Execute(dev, &targetEndpoint, payload)
  85. if err != nil {
  86. sendErrorResponse(w, err.Error())
  87. return
  88. }
  89. js, _ := json.Marshal(result)
  90. sendJSONResponse(w, string(js))
  91. }
  92. //Get status of the given device ID
  93. func (m *Manager) HandleGetDeviceStatus(w http.ResponseWriter, r *http.Request) {
  94. devid, err := mv(r, "devid", true)
  95. if err != nil {
  96. sendErrorResponse(w, "Invalid device id")
  97. return
  98. }
  99. //Search for that device ID
  100. for _, dev := range m.cachedDeviceList {
  101. if dev.DeviceUUID == devid {
  102. //Found. Get it status and return
  103. status, err := dev.Handler.Status(dev)
  104. if err != nil {
  105. sendErrorResponse(w, err.Error())
  106. return
  107. }
  108. //Return the status
  109. js, _ := json.Marshal(status)
  110. sendJSONResponse(w, string(js))
  111. return
  112. }
  113. }
  114. //Not found
  115. sendErrorResponse(w, "Given device ID does not match any scanned devices")
  116. }
  117. //Handle IoT Scanning Request
  118. func (m *Manager) HandleScanning(w http.ResponseWriter, r *http.Request) {
  119. //Scan the devices
  120. scannedDevices := m.scanDevices()
  121. js, _ := json.Marshal(scannedDevices)
  122. sendJSONResponse(w, string(js))
  123. }
  124. //Handle IoT Listing Request
  125. func (m *Manager) HandleListing(w http.ResponseWriter, r *http.Request) {
  126. if m.cachedDeviceList == nil {
  127. m.scanDevices()
  128. }
  129. js, _ := json.Marshal(m.cachedDeviceList)
  130. sendJSONResponse(w, string(js))
  131. }
  132. func (m *Manager) scanDevices() []*Device {
  133. scannedDevices := []*Device{}
  134. for _, ph := range m.RegisteredHandler {
  135. //Scan devices using this handler
  136. thisProtcolDeviceList, err := ph.Scan()
  137. if err != nil {
  138. continue
  139. }
  140. //Append it to list
  141. for _, dev := range thisProtcolDeviceList {
  142. scannedDevices = append(scannedDevices, dev)
  143. }
  144. }
  145. //Cache the scan record
  146. m.cachedDeviceList = scannedDevices
  147. return scannedDevices
  148. }