handlerManager.go 4.5 KB

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