tunnelproxy.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. "strconv"
  6. "strings"
  7. "github.com/openatx/androidutils"
  8. )
  9. var currentDeviceInfo *DeviceInfo
  10. func getDeviceInfo() *DeviceInfo {
  11. if currentDeviceInfo != nil {
  12. return currentDeviceInfo
  13. }
  14. devInfo := &DeviceInfo{
  15. Serial: getCachedProperty("ro.serialno"),
  16. Brand: getCachedProperty("ro.product.brand"),
  17. Model: getCachedProperty("ro.product.model"),
  18. Version: getCachedProperty("ro.build.version.release"),
  19. AgentVersion: version,
  20. }
  21. devInfo.Sdk, _ = strconv.Atoi(getCachedProperty("ro.build.version.sdk"))
  22. devInfo.HWAddr, _ = androidutils.HWAddrWLAN()
  23. display, _ := androidutils.WindowSize()
  24. devInfo.Display = &display
  25. battery := androidutils.Battery{}
  26. battery.Update()
  27. devInfo.Battery = &battery
  28. // devInfo.Port = listenPort
  29. memory, err := androidutils.MemoryInfo()
  30. if err != nil {
  31. log.Println("get memory error:", err)
  32. } else {
  33. total := memory["MemTotal"]
  34. around := int(math.Ceil(float64(total-512*1024) / 1024.0 / 1024.0)) // around GB
  35. devInfo.Memory = &MemoryInfo{
  36. Total: total,
  37. Around: fmt.Sprintf("%d GB", around),
  38. }
  39. }
  40. hardware, processors, err := androidutils.ProcessorInfo()
  41. if err != nil {
  42. log.Println("get cpuinfo error:", err)
  43. } else {
  44. devInfo.Cpu = &CpuInfo{
  45. Hardware: hardware,
  46. Cores: len(processors),
  47. }
  48. }
  49. // Udid is ${Serial}-${MacAddress}-${model}
  50. udid := fmt.Sprintf("%s-%s-%s",
  51. getCachedProperty("ro.serialno"),
  52. devInfo.HWAddr,
  53. strings.Replace(getCachedProperty("ro.product.model"), " ", "_", -1))
  54. devInfo.Udid = udid
  55. currentDeviceInfo = devInfo
  56. return currentDeviceInfo
  57. }
  58. // type versionResponse struct {
  59. // ServerVersion string `json:"version"`
  60. // AgentVersion string `json:"atx-agent"`
  61. // }
  62. // type TunnelProxy struct {
  63. // ServerAddr string
  64. // Secret string
  65. // udid string
  66. // }
  67. // // Need test. Connect with server use github.com/codeskyblue/heartbeat
  68. // func (t *TunnelProxy) Heratbeat() {
  69. // dinfo := getDeviceInfo()
  70. // t.udid = dinfo.Udid
  71. // client := &heartbeat.Client{
  72. // Secret: t.Secret,
  73. // ServerAddr: "http://" + t.ServerAddr + "/heartbeat",
  74. // Identifier: t.udid,
  75. // }
  76. // lostCnt := 0
  77. // client.OnConnect = func() {
  78. // lostCnt = 0
  79. // t.checkUpdate()
  80. // // send device info on first connect
  81. // dinfo.Battery.Update()
  82. // if err := t.UpdateInfo(dinfo); err != nil {
  83. // log.Println("Update info:", err)
  84. // }
  85. // }
  86. // client.OnError = func(err error) {
  87. // if lostCnt == 0 {
  88. // // open identify to make WIFI reconnected when disconnected
  89. // runShellTimeout(time.Minute, "am", "start", "-n", "com.github.uiautomator/.IdentifyActivity")
  90. // }
  91. // lostCnt++
  92. // }
  93. // // send heartbeat to server every 10s
  94. // client.Beat(10 * time.Second)
  95. // }
  96. // func (t *TunnelProxy) checkUpdate() error {
  97. // res, err := goreq.Request{Uri: "http://" + t.ServerAddr + "/version"}.Do()
  98. // if err != nil {
  99. // return err
  100. // }
  101. // defer res.Body.Close()
  102. // verResp := new(versionResponse)
  103. // if err := res.Body.FromJsonTo(verResp); err != nil {
  104. // return err
  105. // }
  106. // log.Println("Disable upgrade, until code fixed")
  107. // // if verResp.AgentVersion != version {
  108. // // if version == "dev" {
  109. // // log.Printf("dev version, skip version upgrade")
  110. // // } else {
  111. // // log.Printf("server require agent version: %v, but current %s, going to upgrade", verResp.AgentVersion, version)
  112. // // if err := doUpdate(verResp.AgentVersion); err != nil {
  113. // // log.Printf("upgrade error: %v", err)
  114. // // return err
  115. // // }
  116. // // log.Printf("restarting server")
  117. // // os.Setenv(daemon.MARK_NAME, daemon.MARK_VALUE+":reset")
  118. // // runDaemon()
  119. // // os.Exit(0)
  120. // // }
  121. // // }
  122. // return nil
  123. // }
  124. // func (t *TunnelProxy) UpdateInfo(devInfo *DeviceInfo) error {
  125. // res, err := goreq.Request{
  126. // Method: "POST",
  127. // Uri: "http://" + t.ServerAddr + "/devices/" + t.udid + "/info",
  128. // Body: devInfo,
  129. // }.Do()
  130. // if err != nil {
  131. // return err
  132. // }
  133. // res.Body.Close()
  134. // return nil
  135. // }
  136. // type WSClient struct {
  137. // // The websocket connection.
  138. // conn *websocket.Conn
  139. // cancelFunc context.CancelFunc
  140. // changeEventC chan interface{}
  141. // host string
  142. // udid string
  143. // serial string
  144. // brand string
  145. // model string
  146. // version string
  147. // ip string
  148. // }
  149. // func (c *WSClient) RunForever() {
  150. // if c.changeEventC == nil {
  151. // c.changeEventC = make(chan interface{}, 0)
  152. // }
  153. // n := 0
  154. // for {
  155. // if c.host == "" {
  156. // <-c.changeEventC
  157. // }
  158. // start := time.Now()
  159. // err := c.Run()
  160. // if time.Since(start) > 10*time.Second {
  161. // n = 0
  162. // }
  163. // n++
  164. // if n > 20 {
  165. // n = 20
  166. // }
  167. // waitDuration := 3*time.Second + time.Duration(n)*time.Second
  168. // log.Println("wait", waitDuration, "error", err)
  169. // select {
  170. // case <-time.After(waitDuration):
  171. // case <-c.changeEventC:
  172. // log.Println("wait canceled")
  173. // }
  174. // }
  175. // }
  176. // func (c *WSClient) ChangeHost(host string) {
  177. // c.host = host
  178. // if c.changeEventC != nil {
  179. // c.cancelFunc()
  180. // c.conn.Close()
  181. // select {
  182. // case c.changeEventC <- nil:
  183. // case <-time.After(1 * time.Second):
  184. // }
  185. // }
  186. // }
  187. // func (client *WSClient) Run() error {
  188. // u := url.URL{Scheme: "ws", Host: client.host, Path: "/websocket/heartbeat"}
  189. // ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
  190. // client.cancelFunc = cancel
  191. // defer cancel()
  192. // log.Println("Remote:", u.String())
  193. // c, _, err := websocket.DefaultDialer.DialContext(ctx, u.String(), nil)
  194. // if err != nil {
  195. // return err
  196. // }
  197. // client.conn = c
  198. // defer c.Close()
  199. // c.WriteJSON(map[string]interface{}{
  200. // "command": "handshake",
  201. // "name": "phone",
  202. // "owner": nil,
  203. // "secret": "",
  204. // "url": client.ip + ":7912",
  205. // "priority": 1,
  206. // })
  207. // var response WSResponse
  208. // if err = c.ReadJSON(&response); err != nil {
  209. // log.Fatal(err)
  210. // }
  211. // if !response.Success {
  212. // log.Fatal(response.Description)
  213. // }
  214. // log.Println("update android device")
  215. // c.WriteJSON(map[string]interface{}{
  216. // "command": "update",
  217. // "platform": "android",
  218. // "udid": client.udid,
  219. // "properties": map[string]string{
  220. // "serial": client.serial, // ro.serialno
  221. // "brand": client.brand, // ro.product.brand
  222. // "model": client.model, // ro.product.model
  223. // "version": client.version, // ro.build.version.release
  224. // },
  225. // "provider": map[string]string{
  226. // "atxAgentAddress": client.ip + ":7912",
  227. // "remoteConnectAddress": client.ip + ":5555",
  228. // "whatsInputAddress": client.ip + ":6677",
  229. // },
  230. // })
  231. // for {
  232. // response = WSResponse{}
  233. // err = c.ReadJSON(&response)
  234. // if err != nil {
  235. // log.Println("read:", err)
  236. // return err
  237. // }
  238. // if response.Command == "release" {
  239. // c.WriteJSON(map[string]interface{}{
  240. // "command": "update",
  241. // "udid": client.udid,
  242. // "colding": false,
  243. // })
  244. // }
  245. // }
  246. // }
  247. // type WSResponse struct {
  248. // Success bool `json:"success"`
  249. // Description string `json:"description"`
  250. // Command string `json:"command"`
  251. // Udid string `json:"udid"`
  252. // }