Commit b198d674 authored by szh's avatar szh

添加GetDevStatus接口

parent 3e81abf5
...@@ -13,7 +13,7 @@ lint: ...@@ -13,7 +13,7 @@ lint:
golint ./... golint ./...
clean: clean:
rm -rf go-gin-example rm -rf chain33-pai
go clean -i . go clean -i .
help: help:
......
...@@ -4,23 +4,17 @@ import ( ...@@ -4,23 +4,17 @@ import (
"fmt" "fmt"
"log" "log"
"net/http" "net/http"
"bufio"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"chain33-pai/pkg/logging" "chain33-pai/pkg/logging"
"chain33-pai/pkg/setting" "chain33-pai/pkg/setting"
"chain33-pai/routers" "chain33-pai/routers"
"chain33-pai/pkg/util" "chain33-pai/pkg/util"
"os/exec" "net"
"io" "time"
"strings"
) )
var cache map[string]string
func init() { func init() {
cache = make(map[string]string,0)
getPaiConfig("cat","/proc/cpuinfo","|","grep Serial")
setting.Setup() setting.Setup()
//models.Setup() //models.Setup()
logging.Setup() logging.Setup()
...@@ -35,9 +29,8 @@ func init() { ...@@ -35,9 +29,8 @@ func init() {
// @license.name MIT // @license.name MIT
// @license.url https://chain33-pai/blob/master/LICENSE // @license.url https://chain33-pai/blob/master/LICENSE
func main() { func main() {
fmt.Println("Serial:",cache)
gin.SetMode(setting.ServerSetting.RunMode) gin.SetMode(setting.ServerSetting.RunMode)
go broadcast()
routersInit := routers.InitRouter() routersInit := routers.InitRouter()
readTimeout := setting.ServerSetting.ReadTimeout readTimeout := setting.ServerSetting.ReadTimeout
writeTimeout := setting.ServerSetting.WriteTimeout writeTimeout := setting.ServerSetting.WriteTimeout
...@@ -56,6 +49,8 @@ func main() { ...@@ -56,6 +49,8 @@ func main() {
server.ListenAndServe() server.ListenAndServe()
select {}
// If you want Graceful Restart, you need a Unix system and download github.com/fvbock/endless // If you want Graceful Restart, you need a Unix system and download github.com/fvbock/endless
//endless.DefaultReadTimeOut = readTimeout //endless.DefaultReadTimeOut = readTimeout
//endless.DefaultWriteTimeOut = writeTimeout //endless.DefaultWriteTimeOut = writeTimeout
...@@ -72,44 +67,34 @@ func main() { ...@@ -72,44 +67,34 @@ func main() {
} }
func getPaiConfig(command string ,arg ...string) (config map[string]string,err error) { func broadcast() {
//获取操作系统版本信息 ip,err := util.GetLocalIP()
if _,ok := cache["serial"]; ok {
return cache,nil
}
list := make(map[string]string,0)
cmd := exec.Command("cat", arg...)
stdout, err := cmd.StdoutPipe()
//fmt.Println(stdout)
if err != nil { if err != nil {
fmt.Println(err) log.Fatal(err)
return nil,err
} }
defer stdout.Close() // 这里设置发送者的IP地址,自己查看一下自己的IP自行设定
if err := cmd.Start(); err != nil { laddr := net.UDPAddr{
fmt.Println(err) IP: ip.IP,
return nil,err Port: 8804,
} }
rd := bufio.NewReader(stdout)
for {
line,err := rd.ReadString('\n')
if err!=nil || io.EOF==err{
break
}else{
fmt.Println("line",line)
l := strings.Split(line,":")
if len(l) == 2 { // 这里设置接收者的IP地址为广播地址
k := strings.ToLower(strings.TrimRight(strings.Trim(strings.Replace(l[0]," "," ",-1)," ")," ")) raddr := net.UDPAddr{
v := strings.Trim(strings.Replace(l[1],"\n","",-1)," ") IP: net.IPv4(255, 255, 255, 255),
fmt.Println("KEY:",k,"VAL:",v) Port: 8804,
if _, ok := list[k]; !ok {
list[k] = v
} }
cache[k] = v conn, err := net.DialUDP("udp", &laddr, &raddr)
if err != nil {
println(err.Error())
return
} }
for {
_, err := conn.Write([]byte("hello world"))
if err != nil{
fmt.Println(err)
} }
log.Println("send hello world")
time.Sleep(time.Second)
} }
return list,nil
} }
\ No newline at end of file
package chain33
import (
"github.com/33cn/chain33/types"
"google.golang.org/grpc"
"context"
)
type PaiClient struct {
}
var (
paiClient types.Chain33Client
paiNetgrpcAddr = "localhost:8802"
)
func init() {
maxReceLimit := grpc.WithMaxMsgSize(30*1024*1024)
conn, err := grpc.Dial(paiNetgrpcAddr, grpc.WithInsecure(),maxReceLimit)
if err != nil {
panic(err)
}
paiClient = types.NewChain33Client(conn)
}
func (p *PaiClient) GetWalletStatus() (*types.WalletStatus,error) {
return paiClient.GetWalletStatus(context.Background(),&types.ReqNil{})
}
func (p *PaiClient) GetPeerInfo() (*types.PeerList,error) {
return paiClient.GetPeerInfo(context.Background(),&types.ReqNil{})
}
func (p *PaiClient) IsNtpClockSync() (*types.Reply,error) {
return paiClient.IsNtpClockSync(context.Background(),&types.ReqNil{})
}
func (p *PaiClient) GetNetInfo() (*types.NodeNetInfo,error) {
return paiClient.NetInfo(context.Background(),&types.ReqNil{})
}
\ No newline at end of file
package util package util
import "chain33-pai/pkg/setting" import (
"chain33-pai/pkg/setting"
"net"
"errors"
)
// Setup Initialize the util // Setup Initialize the util
func Setup() { func Setup() {
jwtSecret = []byte(setting.AppSetting.JwtSecret) jwtSecret = []byte(setting.AppSetting.JwtSecret)
} }
// 获取本机网卡IP
func GetLocalIP() (ipv4 *net.IPNet, err error) {
var (
addrs []net.Addr
addr net.Addr
ipNet *net.IPNet // IP地址
isIpNet bool
)
// 获取所有网卡
if addrs, err = net.InterfaceAddrs(); err != nil {
return
}
// 取第一个非lo的网卡IP
for _, addr = range addrs {
// 这个网络地址是IP地址: ipv4, ipv6
if ipNet, isIpNet = addr.(*net.IPNet); isIpNet && !ipNet.IP.IsLoopback() {
// 跳过IPV6
if ipNet.IP.To4() != nil {
ipv4 = ipNet// 192.168.1.1
return
}
}
}
err = errors.New("ERR_NO_LOCAL_IP_FOUND")
return
}
\ No newline at end of file
package v1
import (
"github.com/gin-gonic/gin"
"net/http"
"chain33-pai/pkg/app"
"chain33-pai/pkg/e"
"chain33-pai/service/pai_service"
)
func GetDevdetail(c *gin.Context) {
appG := app.Gin{C: c}
var pai pai_service.Pai
ok := pai.GetConfig()
if !ok {
appG.Response(http.StatusOK, e.ERROR, nil)
}
appG.Response(http.StatusOK, e.SUCCESS, map[string]interface{}{
"serial": pai.Serial,
})
}
func GetDevstatus(c *gin.Context) {
appG := app.Gin{C: c}
var pai pai_service.Pai
err := pai.GetDevstatus()
if err != nil {
appG.Response(http.StatusOK, e.ERROR, nil)
}
appG.Response(http.StatusOK, e.SUCCESS, pai)
}
\ No newline at end of file
package routers package routers
import ( import (
"net/http"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
_ "chain33-pai/docs" _ "chain33-pai/docs"
"github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
"chain33-pai/middleware/jwt"
"chain33-pai/pkg/export"
"chain33-pai/pkg/qrcode"
"chain33-pai/pkg/upload"
"chain33-pai/routers/api"
"chain33-pai/routers/api/v1" "chain33-pai/routers/api/v1"
) )
...@@ -23,43 +12,48 @@ func InitRouter() *gin.Engine { ...@@ -23,43 +12,48 @@ func InitRouter() *gin.Engine {
r.Use(gin.Logger()) r.Use(gin.Logger())
r.Use(gin.Recovery()) r.Use(gin.Recovery())
r.StaticFS("/export", http.Dir(export.GetExcelFullPath())) //r.StaticFS("/export", http.Dir(export.GetExcelFullPath()))
r.StaticFS("/upload/images", http.Dir(upload.GetImageFullPath())) //r.StaticFS("/upload/images", http.Dir(upload.GetImageFullPath()))
r.StaticFS("/qrcode", http.Dir(qrcode.GetQrCodeFullPath())) //r.StaticFS("/qrcode", http.Dir(qrcode.GetQrCodeFullPath()))
r.GET("/auth", api.GetAuth) //r.GET("/auth", api.GetAuth)
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) //r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
r.POST("/upload", api.UploadImage) //r.POST("/upload", api.UploadImage)
apiv1 := r.Group("/api/v1") apiv1 := r.Group("/pai")
apiv1.Use(jwt.JWT()) //获取树莓派基本信息
{ apiv1.POST("/devdetail",v1.GetDevdetail)
//获取标签列表 //获取树莓派基本信息
apiv1.GET("/tags", v1.GetTags) apiv1.POST("/devstatus",v1.GetDevstatus)
//新建标签 //apiv1.Use(jwt.JWT())
apiv1.POST("/tags", v1.AddTag) //{
//更新指定标签 //
apiv1.PUT("/tags/:id", v1.EditTag) // //获取标签列表
//删除指定标签 // apiv1.GET("/tags", v1.GetTags)
apiv1.DELETE("/tags/:id", v1.DeleteTag) // //新建标签
//导出标签 // apiv1.POST("/tags", v1.AddTag)
r.POST("/tags/export", v1.ExportTag) // //更新指定标签
//导入标签 // apiv1.PUT("/tags/:id", v1.EditTag)
r.POST("/tags/import", v1.ImportTag) // //删除指定标签
// apiv1.DELETE("/tags/:id", v1.DeleteTag)
//获取文章列表 // //导出标签
apiv1.GET("/articles", v1.GetArticles) // r.POST("/tags/export", v1.ExportTag)
//获取指定文章 // //导入标签
apiv1.GET("/articles/:id", v1.GetArticle) // r.POST("/tags/import", v1.ImportTag)
//新建文章 //
apiv1.POST("/articles", v1.AddArticle) // //获取文章列表
//更新指定文章 // apiv1.GET("/articles", v1.GetArticles)
apiv1.PUT("/articles/:id", v1.EditArticle) // //获取指定文章
//删除指定文章 // apiv1.GET("/articles/:id", v1.GetArticle)
apiv1.DELETE("/articles/:id", v1.DeleteArticle) // //新建文章
//生成文章海报 // apiv1.POST("/articles", v1.AddArticle)
apiv1.POST("/articles/poster/generate", v1.GenerateArticlePoster) // //更新指定文章
} // apiv1.PUT("/articles/:id", v1.EditArticle)
// //删除指定文章
// apiv1.DELETE("/articles/:id", v1.DeleteArticle)
// //生成文章海报
// apiv1.POST("/articles/poster/generate", v1.GenerateArticlePoster)
//}
return r return r
} }
package pai_service
import (
"os/exec"
"fmt"
"io"
"strings"
"bufio"
"chain33-pai/pkg/chain33"
"chain33-pai/pkg/logging"
"github.com/33cn/chain33/types"
)
type Pai struct {
Hardware string
Revision string
Serial string
//PeerList *types.PeerList
LocalLastHeight int64
LastHeight int64
IsNtpSync bool
WalletStatus *types.WalletStatus
NetInfo *types.NodeNetInfo
}
func (p *Pai) GetConfig() bool {
if p.Serial != "" {
return true
}
config ,err := getPaiConfig("cat","/proc/cpuinfo")
if err != nil {
return false
}
if _,ok := config["serial"];ok {
p.Serial = config["serial"]
p.Hardware = config["hardware"]
p.Revision = config["revision"]
return true
}
return false
}
func (p *Pai) GetDevstatus() error {
client := &chain33.PaiClient{}
peerinfo,err := client.GetPeerInfo()
if err != nil {
logging.Error("GetDevstatus peerinfo err",err)
return err
}
for _,v := range peerinfo.Peers {
if p.LastHeight < v.Header.Height {
p.LastHeight = v.Header.Height
}
if v.Self {
p.LocalLastHeight = v.Header.Height
}
}
sync ,err := client.IsNtpClockSync()
if err != nil {
logging.Error("GetDevstatus IsNtpClockSync err",err)
return err
}
p.IsNtpSync = sync.IsOk
netinfo,err := client.GetNetInfo()
if err != nil {
logging.Error("GetDevstatus GetNetInfo err",err)
return err
}
p.NetInfo = netinfo
return nil
}
func getPaiConfig(command string ,arg ...string) (config map[string]string,err error) {
//获取操作系统版本信息
list := make(map[string]string, 0)
cmd := exec.Command("cat", arg...)
stdout, err := cmd.StdoutPipe()
//fmt.Println(stdout)
if err != nil {
fmt.Println(err)
return nil,err
}
defer stdout.Close()
if err := cmd.Start(); err != nil {
fmt.Println(err)
return nil,err
}
rd := bufio.NewReader(stdout)
for {
line, err := rd.ReadString('\n')
if err!=nil || io.EOF==err{
break
}else{
fmt.Println("line", line)
l := strings.Split(line, ":")
if len(l) == 2 {
k := strings.ToLower(strings.TrimRight(strings.Trim(strings.Replace(l[0], " ", " ", -1), " "), " "))
v := strings.Trim(strings.Replace(l[1], "\n", "", -1), " ")
fmt.Println("KEY:",k, "VAL:", v)
if _, ok := list[k]; !ok {
list[k] = v
}
}
}
}
return list, nil
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment