handlerManager.go 5.3 KB

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