107 lines
2.3 KiB
Go
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,
|
|
}
|
|
}
|