米尔电子
直播中

jf_50393217

4年用户 202经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[技术]

【米尔-全志T113-i开发板试用】4、使用Gin框架搭建简易的web server和提供设备信息获取接口

上一个章节,我们搞定了golang获取系统信息,在这一课,我们需要搭建一个简易的web服务器,将设备信息通过gin的json接口提供给网页。

1、编写定期获取信息功能的代码

Gin的web服务开启后会长期提供服务,上一课的获取CPU占用信息内容,需要延时1秒才可以得到结果。这个情况会影响客户体验,我们可以通过golang实现简单的并发程序。

由于golang的全局变量是可以多个并发同时访问的,而我们这边只涉及到两个线程(Gin的服务线程读取CPU占用信息,获取CPU占用信息的线程写入CPU占用信息)。这种简单的应用,并不需要设置什么读写锁,也不需要考虑什么线程安全问题,直接使用全局变量就行了。

所以我们将上一期的代码修改成独立的文件sysinfo.go

package main

import (
	"github.com/shirou/gopsutil/cpu"
	"github.com/shirou/gopsutil/host"
	"github.com/shirou/gopsutil/mem"
	"time"
)

var AvailableMemory float64
var UsedPercent float64
var ModelName string
var AvgPercent float64
var UpTime float64
var KernelVersion string

func getCpuInfo() {
	perPercents, _ := cpu.Percent(1*time.Second, false)
	AvgPercent = perPercents[0]
}

func getUpTime() {
	timestamp, _ := host.BootTime()
	t := time.Unix(int64(timestamp), 0)
	now := time.Now()
	duration := now.Sub(t)
	UpTime = duration.Hours()
}

// 获取内存信息
func getMemInfo() {
	memInfo, _ := mem.VirtualMemory()
	AvailableMemory = float64(memInfo.Available) / (1024 * 1024 * 1024)
	UsedPercent = memInfo.UsedPercent
}

func getCPUAndUptime() {
	for {
		getMemInfo()
		getCpuInfo()
		getUpTime()
		time.Sleep(5 * time.Second)
	}
}

func getInfo() {
	// 获取cpu信息和系统平台信息
	infos, _ := cpu.Info()
	ModelName = infos[0].ModelName
	kernel, _ := host.KernelVersion()
	platform, _, _, _ := host.PlatformInformation()
	KernelVersion = kernel + "--" + platform
	// 开启另一个线程获取CPU、内存、开机时间
	go getCPUAndUptime()
}

这个代码其实很简单,就是开启一个线程,每隔5秒钟获取一次信息存储到全局变量里。同时在getInfo函数里,会获取一些不会变化的信息,例如CPU类型,内核版本,等等。

2、使用Gin提供json接口

Gin是一个用Go语言编写的Web框架,它具有高性能和低内存消耗的特点。Gin框架提供了快速的路由功能、中间件支持、参数解析、JSON/XML响应等功能,使得编写Web应用变得简单和高效。可以使用Gin框架来构建RESTful API、Web服务等。
根据官方文档的提示,使用Gin编写一个提供JSON响应接口的web 服务器很简单。代码如下

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func setupRouter() *gin.Engine {
	gin.SetMode(gin.ReleaseMode)
	r := gin.Default()

	r.GET("/getSystemInfo", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"ModelName": ModelName,
			"MemAvailable":  AvailableMemory * 1024,
			"MemUsed":       UsedPercent,
			"CPUAvgPercent": AvgPercent,
			"UpTime":        UpTime,
			"KernelVersion": KernelVersion,
		})
	})

	return r
}

func main() {
	getInfo()
	r := setupRouter()
	// Listen and Server in 0.0.0.0:8080
	r.Run(":80")
}

就是这么简单的代码,就可以开启一个绑定了80端口的web服务器,这个服务器提供了一个/getSystemInfo路径的JSON接口,用于提供我们获取到的系统信息。我们可以在另一台电脑上,使用curl命令来测试。

image.png

我们在开发板上,也可以看到这个服务程序的响应速度,以及访问的客户端IP。几百微秒就完成响应了,可以说在T113-i上做这种简单的应用,完全是小意思。
image.png

更多回帖

发帖
×
20
完善资料,
赚取积分