main.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package main
  2. import (
  3. "AudioPlayer/Common"
  4. "AudioPlayer/Docker"
  5. "AudioPlayer/Intercom"
  6. "AudioPlayer/NTP"
  7. ProcessMonitor "AudioPlayer/Process"
  8. "AudioPlayer/QuectelAT"
  9. "AudioPlayer/SystemInfo"
  10. "AudioPlayer/VoiceCall"
  11. pb "AudioPlayer/gRPC_Model"
  12. "bytes"
  13. "fmt"
  14. "github.com/gin-gonic/gin"
  15. "go-micro.dev/v5/registry"
  16. "google.golang.org/grpc"
  17. "google.golang.org/grpc/reflection"
  18. "log"
  19. "net"
  20. "os"
  21. "os/exec"
  22. "strings"
  23. "sync"
  24. "github.com/BurntSushi/toml"
  25. "github.com/denisbrodbeck/machineid"
  26. )
  27. func Command(exe string, args []string, ctx *gin.Context) {
  28. cmd := exec.Command(exe, args...)
  29. var in bytes.Buffer
  30. cmd.Stdin = &in
  31. var out bytes.Buffer
  32. cmd.Stdout = &out
  33. err := cmd.Run()
  34. if err != nil {
  35. println(err.Error())
  36. return
  37. }
  38. ctx.Data(200, "text/plain", out.Bytes())
  39. }
  40. var InExecMutex sync.RWMutex
  41. var InExec bool
  42. func MutexCommandGin(ctx *gin.Context) {
  43. InExecMutex.RLock()
  44. if InExec {
  45. ctx.AbortWithStatusJSON(200, gin.H{"error": "Command is already in execution. Request discarded."})
  46. InExecMutex.RUnlock()
  47. return
  48. }
  49. InExecMutex.RUnlock()
  50. var v []string
  51. err := ctx.ShouldBindJSON(&v)
  52. if err != nil {
  53. println(err.Error())
  54. return
  55. }
  56. InExecMutex.Lock()
  57. InExec = true
  58. InExecMutex.Unlock()
  59. Command(ctx.Query("exec"), v, ctx)
  60. InExecMutex.Lock()
  61. InExec = false
  62. InExecMutex.Unlock()
  63. }
  64. func CommandGin(ctx *gin.Context) {
  65. var v []string
  66. err := ctx.ShouldBindJSON(&v)
  67. if err != nil {
  68. println(err.Error())
  69. return
  70. }
  71. Command(ctx.Query("exec"), v, ctx)
  72. }
  73. type ServerInfo struct {
  74. UseNTP bool `toml:"UseNTP"`
  75. GlobalPositioningSystem *GPS `toml:"GPS"`
  76. VoiceService *VoiceCall.Voice `toml:"VoiceCall"`
  77. Intercom *Intercom.Intercom `toml:"Intercom"`
  78. Alarm *Alarm `toml:"Alarm"`
  79. }
  80. type Alarm struct {
  81. Volume int `toml:"Volume"`
  82. }
  83. func (receiver *ServerInfo) Refresh() {
  84. marshal, err := toml.Marshal(receiver)
  85. if err != nil {
  86. return
  87. }
  88. err = os.WriteFile("./cfg.toml", marshal, 0666)
  89. if err != nil {
  90. return
  91. }
  92. }
  93. func main() {
  94. Common.Micro = registry.NewRegistry()
  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 + "_http",
  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 + "_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. go ProcessMonitor.Start()
  265. go Docker.Start()
  266. r.Run(":4000")
  267. }