main.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. package main
  2. import (
  3. "AudioPlayer/Common"
  4. "AudioPlayer/Intercom"
  5. "AudioPlayer/NTP"
  6. ProcessMonitor "AudioPlayer/Process"
  7. "AudioPlayer/QuectelAT"
  8. "AudioPlayer/SystemInfo"
  9. "AudioPlayer/VoiceCall"
  10. pb "AudioPlayer/gRPC_Model"
  11. "bytes"
  12. "fmt"
  13. "github.com/gin-gonic/gin"
  14. "go-micro.dev/v5/registry"
  15. "google.golang.org/grpc"
  16. "google.golang.org/grpc/reflection"
  17. "log"
  18. "net"
  19. "os"
  20. "os/exec"
  21. "strings"
  22. "sync"
  23. "github.com/BurntSushi/toml"
  24. "github.com/denisbrodbeck/machineid"
  25. )
  26. func Command(exe string, args []string, ctx *gin.Context) {
  27. cmd := exec.Command(exe, args...)
  28. var in bytes.Buffer
  29. cmd.Stdin = &in
  30. var out bytes.Buffer
  31. cmd.Stdout = &out
  32. err := cmd.Run()
  33. if err != nil {
  34. println(err.Error())
  35. return
  36. }
  37. ctx.Data(200, "text/plain", out.Bytes())
  38. }
  39. var InExecMutex sync.RWMutex
  40. var InExec bool
  41. func MutexCommandGin(ctx *gin.Context) {
  42. InExecMutex.RLock()
  43. if InExec {
  44. ctx.AbortWithStatusJSON(200, gin.H{"error": "Command is already in execution. Request discarded."})
  45. InExecMutex.RUnlock()
  46. return
  47. }
  48. InExecMutex.RUnlock()
  49. var v []string
  50. err := ctx.ShouldBindJSON(&v)
  51. if err != nil {
  52. println(err.Error())
  53. return
  54. }
  55. InExecMutex.Lock()
  56. InExec = true
  57. InExecMutex.Unlock()
  58. Command(ctx.Query("exec"), v, ctx)
  59. InExecMutex.Lock()
  60. InExec = false
  61. InExecMutex.Unlock()
  62. }
  63. func CommandGin(ctx *gin.Context) {
  64. var v []string
  65. err := ctx.ShouldBindJSON(&v)
  66. if err != nil {
  67. println(err.Error())
  68. return
  69. }
  70. Command(ctx.Query("exec"), v, ctx)
  71. }
  72. type ServerInfo struct {
  73. UseNTP bool `toml:"UseNTP"`
  74. GlobalPositioningSystem *GPS `toml:"GPS"`
  75. VoiceService *VoiceCall.Voice `toml:"VoiceCall"`
  76. Intercom *Intercom.Intercom `toml:"Intercom"`
  77. Alarm *Alarm `toml:"Alarm"`
  78. }
  79. type Alarm struct {
  80. Volume int `toml:"Volume"`
  81. }
  82. func (receiver *ServerInfo) Refresh() {
  83. marshal, err := toml.Marshal(receiver)
  84. if err != nil {
  85. return
  86. }
  87. err = os.WriteFile("./cfg.toml", marshal, 0666)
  88. if err != nil {
  89. return
  90. }
  91. }
  92. func main() {
  93. Common.Micro = registry.NewRegistry()
  94. go ProcessMonitor.Start()
  95. var err error
  96. var cfg ServerInfo
  97. Common.Machine, err = machineid.ID()
  98. if err != nil {
  99. return
  100. }
  101. _, err = toml.DecodeFile("./cfg.toml", &cfg)
  102. if err != nil {
  103. log.Println(err.Error())
  104. //return
  105. }
  106. if cfg.UseNTP {
  107. ntpSrv := NTP.NewNTPServer("0.0.0.0:123")
  108. err = ntpSrv.Start()
  109. if err != nil {
  110. log.Println(err.Error())
  111. return
  112. }
  113. }
  114. // Set up a TCP listener.
  115. gRPClistener, err := net.Listen("tcp", ":50051")
  116. if err != nil {
  117. log.Println("Failed to listen: %v", err)
  118. return
  119. }
  120. // Create a gRPC server.
  121. grpcServer := grpc.NewServer()
  122. NMCLI := SystemInfo.NMCliServer{}
  123. NMCLI.Open()
  124. pb.RegisterTimeServer(grpcServer, &SystemInfo.TimeGRpcServer{})
  125. pb.RegisterNetworkManagerServer(grpcServer, &NMCLI)
  126. reflection.Register(grpcServer)
  127. go func() {
  128. log.Println(" Server is running on port 50051...")
  129. if err := grpcServer.Serve(gRPClistener); err != nil {
  130. log.Fatalf("Failed to serve: %v", err)
  131. }
  132. }()
  133. if cfg.VoiceService != nil {
  134. cfg.VoiceService.SetOnRefresh(cfg.Refresh)
  135. err = cfg.VoiceService.ConnectRoom()
  136. if err == nil {
  137. go func() {
  138. err := cfg.VoiceService.PushMicrophone()
  139. if err != nil {
  140. log.Println(err.Error())
  141. return
  142. }
  143. }()
  144. } else {
  145. log.Println(err.Error())
  146. }
  147. }
  148. err = os.Setenv("ALSA_PCM_CARD", "1")
  149. if err != nil {
  150. log.Println(err.Error())
  151. return
  152. }
  153. err = os.Setenv("ALSA_PCM_DEVICE", "0")
  154. if err != nil {
  155. log.Println(err.Error())
  156. return
  157. }
  158. gin.SetMode(gin.ReleaseMode)
  159. r := gin.Default()
  160. r.PUT("/MutexCommand", MutexCommandGin)
  161. r.PUT("/Command", CommandGin)
  162. r.GET("/Host", Host)
  163. r.GET("/NetPort", NetPort)
  164. r.GET("/Memory", Memory)
  165. r.GET("/Cpu", Cpu)
  166. r.GET("/Bandwidth", Bandwidth)
  167. r.GET("/Temperature", Temperature)
  168. r.GET("/File", func(context *gin.Context) {
  169. if context.GetHeader("token") != "以无我、无人、无众生、无寿者,修一切善法,即得阿耨多罗三藐三菩提。" {
  170. return
  171. }
  172. context.File(context.Query("file"))
  173. })
  174. if cfg.Intercom != nil && cfg.Alarm != nil {
  175. cfg.Intercom.Init()
  176. r.PUT("/Mailbox", func(ctx *gin.Context) {
  177. data, err := ctx.GetRawData()
  178. if err != nil {
  179. return
  180. }
  181. cfg.Intercom.Add(data)
  182. })
  183. go cfg.Intercom.Start()
  184. }
  185. var Q QuectelAT.Quectel
  186. err = Q.Open()
  187. if err == nil {
  188. r.GET("/MobileSignal", func(context *gin.Context) {
  189. if data, err := Q.GetCSQ(); err != nil {
  190. context.JSON(400, gin.H{"error": err.Error()})
  191. } else {
  192. context.JSON(200, data)
  193. }
  194. })
  195. }
  196. if cfg.GlobalPositioningSystem != nil {
  197. err = cfg.GlobalPositioningSystem.Open()
  198. if err != nil {
  199. log.Println(err.Error())
  200. return
  201. }
  202. r.GET("/GPS", cfg.GlobalPositioningSystem.ObtainLatitudeAndLongitude)
  203. }
  204. // 获取网卡ip
  205. interfaces, err := net.Interfaces()
  206. if err != nil {
  207. return
  208. }
  209. for _, inter := range interfaces {
  210. if inter.Flags&net.FlagUp == 0 {
  211. continue
  212. }
  213. if inter.Flags&net.FlagRunning == 0 {
  214. continue
  215. }
  216. if inter.HardwareAddr == nil {
  217. continue
  218. }
  219. if shouldSkipInterface(inter.Name) {
  220. continue
  221. }
  222. fmt.Printf("%v", inter)
  223. println(inter.Name)
  224. addrs, err := inter.Addrs()
  225. if err != nil {
  226. return
  227. }
  228. for _, addr := range addrs {
  229. if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
  230. if ipnet.IP.To4() != nil {
  231. Common.Address = append(Common.Address, ipnet.IP.String())
  232. }
  233. }
  234. }
  235. }
  236. err = Common.Micro.Register(
  237. &registry.Service{
  238. Name: "omat_tsukino_usagi",
  239. Version: "latest",
  240. Nodes: []*registry.Node{
  241. {
  242. Id: Common.Machine + "_tsukino_usagi",
  243. Address: "0.0.0.0:4000",
  244. Metadata: map[string]string{
  245. "protocol": "http",
  246. "ip": strings.Join(Common.Address, ","),
  247. },
  248. },
  249. {
  250. Id: Common.Machine + "_tsukino_usagi_grpc",
  251. Address: "0.0.0.0:50051",
  252. Metadata: map[string]string{
  253. "protocol": "grpc",
  254. "ip": strings.Join(Common.Address, ","),
  255. },
  256. },
  257. },
  258. },
  259. )
  260. if err != nil {
  261. log.Println(err.Error())
  262. return
  263. }
  264. r.Run(":4000")
  265. }