handlerManager.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package iot
  2. import (
  3. "encoding/json"
  4. "log"
  5. "net/http"
  6. "imuslab.com/arozos/mod/database"
  7. "imuslab.com/arozos/mod/utils"
  8. )
  9. /*
  10. IoT Handler Manager
  11. Author: tobychui
  12. This manager mange all the existsing / registered ioT Manager.
  13. This allow a much more abstract usage in the main code
  14. */
  15. type Manager struct {
  16. RegisteredHandler []ProtocolHandler
  17. cachedDeviceList []*Device
  18. db *database.Database
  19. }
  20. func NewIoTManager(sysdb *database.Database) *Manager {
  21. //Create the iot database if it doesn't exists
  22. if !sysdb.TableExists("iot") {
  23. sysdb.NewTable("iot")
  24. }
  25. //Return a new iot manager
  26. return &Manager{
  27. RegisteredHandler: []ProtocolHandler{},
  28. cachedDeviceList: []*Device{},
  29. db: sysdb,
  30. }
  31. }
  32. //Register the handler as one of the IoT Protocol Handler.
  33. func (m *Manager) RegisterHandler(h ProtocolHandler) error {
  34. //Try to start the handler
  35. err := h.Start()
  36. if err != nil {
  37. //Handler startup failed
  38. log.Println("[IoT] *ERROR* Protocol Handler Startup Failed: ", err.Error())
  39. return err
  40. }
  41. //Add it to the handlers
  42. m.RegisteredHandler = append(m.RegisteredHandler, h)
  43. return nil
  44. }
  45. //Handle listing of all avaible scanner and its stats
  46. func (m *Manager) HandleScannerList(w http.ResponseWriter, r *http.Request) {
  47. stats := []Stats{}
  48. for _, scanner := range m.RegisteredHandler {
  49. thisScannerStat := scanner.Stats()
  50. stats = append(stats, thisScannerStat)
  51. }
  52. js, _ := json.Marshal(stats)
  53. utils.SendJSONResponse(w, string(js))
  54. }
  55. //Get the device object by id
  56. func (m *Manager) GetDeviceByID(devid string) *Device {
  57. for _, dev := range m.cachedDeviceList {
  58. if dev.DeviceUUID == devid {
  59. return dev
  60. }
  61. }
  62. return nil
  63. }
  64. //Handle listing of all avaible scanner and its stats
  65. func (m *Manager) HandleIconLoad(w http.ResponseWriter, r *http.Request) {
  66. devid, err := utils.Mv(r, "devid", false)
  67. if err != nil {
  68. utils.SendErrorResponse(w, "Invalid device id")
  69. return
  70. }
  71. //Get device icon from handler
  72. targetDevice := m.GetDeviceByID(devid)
  73. iconName := targetDevice.Handler.Icon(targetDevice)
  74. iconFilePath := "./web/SystemAO/iot/hub/img/devices/" + iconName + ".png"
  75. //fmt.Println(iconFilePath)
  76. if utils.FileExists(iconFilePath) {
  77. http.ServeFile(w, r, iconFilePath)
  78. } else {
  79. http.ServeFile(w, r, "./web/SystemAO/iot/hub/img/devices/unknown.png")
  80. }
  81. }
  82. //Handle listing of all avaible scanner and its stats
  83. func (m *Manager) HandleExecute(w http.ResponseWriter, r *http.Request) {
  84. devid, err := utils.Mv(r, "devid", true)
  85. if err != nil {
  86. utils.SendErrorResponse(w, "Invalid device id")
  87. return
  88. }
  89. eptname, err := utils.Mv(r, "eptname", true)
  90. if err != nil {
  91. utils.SendErrorResponse(w, "Invalid endpoint name")
  92. return
  93. }
  94. payload, _ := utils.Mv(r, "payload", true)
  95. //Get device by device id
  96. dev := m.GetDeviceByID(devid)
  97. if dev == nil {
  98. utils.SendErrorResponse(w, "Given device id not found")
  99. return
  100. }
  101. //Get its endpoint
  102. var targetEndpoint Endpoint
  103. for _, ept := range dev.ControlEndpoints {
  104. if ept.Name == eptname {
  105. //This is the endpoint we are looking for
  106. targetEndpoint = *ept
  107. break
  108. }
  109. }
  110. //log.Println(dev.IPAddr, targetEndpoint, payload)
  111. //Send request to the target IoT device
  112. result, err := dev.Handler.Execute(dev, &targetEndpoint, payload)
  113. if err != nil {
  114. utils.SendErrorResponse(w, err.Error())
  115. return
  116. }
  117. js, _ := json.Marshal(result)
  118. utils.SendJSONResponse(w, string(js))
  119. }
  120. //Get status of the given device ID
  121. func (m *Manager) HandleGetDeviceStatus(w http.ResponseWriter, r *http.Request) {
  122. devid, err := utils.Mv(r, "devid", true)
  123. if err != nil {
  124. utils.SendErrorResponse(w, "Invalid device id")
  125. return
  126. }
  127. //Search for that device ID
  128. for _, dev := range m.cachedDeviceList {
  129. if dev.DeviceUUID == devid {
  130. //Found. Get it status and return
  131. status, err := dev.Handler.Status(dev)
  132. if err != nil {
  133. utils.SendErrorResponse(w, err.Error())
  134. return
  135. }
  136. //Return the status
  137. js, _ := json.Marshal(status)
  138. utils.SendJSONResponse(w, string(js))
  139. return
  140. }
  141. }
  142. //Not found
  143. utils.SendErrorResponse(w, "Given device ID does not match any scanned devices")
  144. }
  145. //Handle IoT Scanning Request
  146. func (m *Manager) HandleScanning(w http.ResponseWriter, r *http.Request) {
  147. //Scan the devices
  148. scannedDevices := m.ScanDevices()
  149. js, _ := json.Marshal(scannedDevices)
  150. utils.SendJSONResponse(w, string(js))
  151. }
  152. //Handle IoT Listing Request
  153. func (m *Manager) HandleListing(w http.ResponseWriter, r *http.Request) {
  154. if m.cachedDeviceList == nil || len(m.cachedDeviceList) == 0 {
  155. m.ScanDevices()
  156. }
  157. js, _ := json.Marshal(m.cachedDeviceList)
  158. utils.SendJSONResponse(w, string(js))
  159. }
  160. func (m *Manager) GetCachedDeviceList() []*Device {
  161. if m.cachedDeviceList == nil {
  162. m.ScanDevices()
  163. }
  164. return m.cachedDeviceList
  165. }
  166. func (m *Manager) ScanDevices() []*Device {
  167. scannedDevices := []*Device{}
  168. for _, ph := range m.RegisteredHandler {
  169. //Scan devices using this handler
  170. thisProtcolDeviceList, err := ph.Scan()
  171. if err != nil {
  172. log.Println("[IoT] *ERROR* Scan Error: " + err.Error())
  173. continue
  174. }
  175. //Append it to list
  176. for _, dev := range thisProtcolDeviceList {
  177. scannedDevices = append(scannedDevices, dev)
  178. }
  179. }
  180. //Cache the scan record
  181. m.cachedDeviceList = scannedDevices
  182. return scannedDevices
  183. }