feat(internal): 添加空调状态上报功能
- 新增 Report 函数,实现空调状态的定期上报 - 添加 airConditionerBodyMessage 结构体用于构造上报数据 - 使用 http.Client 发送 POST 请求到上报 URL - 在 main.go 中调用 Report 函数,替换原有的空实现
This commit is contained in:
parent
0519fbe216
commit
bf18a04040
8
configs/config.go
Normal file
8
configs/config.go
Normal file
@ -0,0 +1,8 @@
|
||||
package configs
|
||||
|
||||
const (
|
||||
AC_PORT = "/dev/ttyUSB0"
|
||||
REPORT_URL = "https://pa-api.mmeiblog.cn"
|
||||
X_API_KEY = "X-API-KEY"
|
||||
AGENT_ID = 1
|
||||
)
|
@ -1 +1,86 @@
|
||||
package internal
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"git.mmeiblog.cn/mei/FatAgent/configs"
|
||||
"git.mmeiblog.cn/mei/FatAgent/pkg"
|
||||
)
|
||||
|
||||
const (
|
||||
reportPath = "/receive/airConditioner"
|
||||
httpTimeout = 30 * time.Second
|
||||
)
|
||||
|
||||
type airConditionerBodyMessage struct {
|
||||
AgentID int `json:"agentID"`
|
||||
Timestamp int64 `json:"timestamp"`
|
||||
Message pkg.ACStatus `json:"message"`
|
||||
}
|
||||
|
||||
var httpClient = &http.Client{
|
||||
Timeout: httpTimeout,
|
||||
}
|
||||
|
||||
func Report() {
|
||||
now := time.Now().Unix()
|
||||
|
||||
ac, err := pkg.NewACController(configs.AC_PORT)
|
||||
if err != nil {
|
||||
log.Printf("错误:创建控制器失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
ACStatus, err := ac.GetAllStatus()
|
||||
if err != nil {
|
||||
log.Printf("错误:查询状态失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
payload := airConditionerBodyMessage{
|
||||
AgentID: configs.AGENT_ID,
|
||||
Timestamp: now,
|
||||
Message: *ACStatus,
|
||||
}
|
||||
|
||||
bodyBytes, err := json.Marshal(payload)
|
||||
if err != nil {
|
||||
log.Printf("错误:JSON序列化失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
url := configs.REPORT_URL + reportPath
|
||||
req, err := http.NewRequest("POST", url, bytes.NewReader(bodyBytes))
|
||||
if err != nil {
|
||||
log.Printf("错误:创建HTTP请求失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
req.Header.Add("x-api-key", configs.X_API_KEY)
|
||||
req.Header.Add("Content-Type", "application/json")
|
||||
|
||||
res, err := httpClient.Do(req)
|
||||
if err != nil {
|
||||
log.Printf("错误:发送HTTP请求失败: %v", err)
|
||||
return
|
||||
}
|
||||
defer res.Body.Close()
|
||||
|
||||
if res.StatusCode != http.StatusOK {
|
||||
log.Printf("警告:HTTP响应状态码非200,状态码: %d", res.StatusCode)
|
||||
return
|
||||
}
|
||||
|
||||
body, err := io.ReadAll(res.Body)
|
||||
if err != nil {
|
||||
log.Printf("错误:读取HTTP响应失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("上报成功,响应内容:%s", body)
|
||||
}
|
||||
|
6
main.go
6
main.go
@ -6,16 +6,14 @@ import (
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"git.mmeiblog.cn/mei/FatAgent/pkg"
|
||||
"git.mmeiblog.cn/mei/FatAgent/internal"
|
||||
"github.com/robfig/cron/v3"
|
||||
)
|
||||
|
||||
func main() {
|
||||
c := cron.New()
|
||||
|
||||
c.AddFunc("@every 1m", func() {
|
||||
pkg.NewACController("/dev/tty1")
|
||||
})
|
||||
c.AddFunc("@every 1m", internal.Report)
|
||||
|
||||
c.Start()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user