2025-06-10 17:50:46 +08:00

107 lines
2.3 KiB
Go

package bootstrap
import (
"encoding/json"
"fmt"
"math/rand"
"net/http"
"time"
"github.com/gorilla/websocket"
)
type WaterQualityData struct {
DevAddr string `json:"devAddr"` // 设备名称
NodeId string `json:"nodeId"` // 监测池
DataItem []map[string]interface{} `json:"dataItem"` // 监测指标
}
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func StartWebSocketServer() error {
http.HandleFunc("/things_info", handleWebSocket)
fmt.Println("WebSocket Server started on :8800")
err := http.ListenAndServe(":8800", nil)
return err
}
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println("Error upgrading connection:", err)
return
}
defer conn.Close()
for {
data := generateMockData()
jsonData, _ := json.Marshal(data)
err := conn.WriteMessage(websocket.TextMessage, jsonData)
if err != nil {
fmt.Println("Error sending message:", err)
break
}
time.Sleep(30 * time.Second) // 每 30 秒发送一次数据
}
}
func generateMockData() WaterQualityData {
timestamp := time.Now().Format("2006-01-02 15:04:05")
indicators := []map[string]interface{}{
{
"indicator": "水温",
"value": fmt.Sprintf("%v", 20+rand.Intn(10)),
"unit": "°C",
"lower_limit": 24,
"upper_limit": 26,
"time": timestamp,
},
{
"indicator": "PH值",
"value": fmt.Sprintf("%.1f", 6+rand.NormFloat64()*3),
"unit": "",
"lower_limit": 6.5,
"upper_limit": 8.5,
"time": timestamp,
},
{
"indicator": "氨氮",
"value": fmt.Sprintf("%.1f", 0+rand.NormFloat64()*0.3),
"unit": "mg/L",
"lower_limit": 0,
"upper_limit": 0.2,
"time": timestamp,
},
{
"indicator": "溶解氧",
"value": fmt.Sprintf("%.1f", 4+rand.NormFloat64()*4),
"unit": "mg/L",
"lower_limit": 5.0,
"upper_limit": 8.0,
"time": timestamp,
},
{
"indicator": "电导率",
"value": fmt.Sprintf("%v", 598+rand.Intn(23)),
"unit": "S",
"lower_limit": 600,
"upper_limit": 620,
"time": timestamp,
},
}
return WaterQualityData{
DevAddr: "1001",
NodeId: "63a678e7-7c6f-4a27-91e0-69d093292529",
DataItem: indicators,
}
}