124 lines
3.3 KiB
Go
124 lines
3.3 KiB
Go
package device
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"io"
|
||
"log"
|
||
"net"
|
||
"net/http"
|
||
"strings"
|
||
"sync"
|
||
"testing"
|
||
"time"
|
||
|
||
"github.com/pkg/errors"
|
||
|
||
"github.com/gorilla/websocket"
|
||
)
|
||
|
||
func TestDevice(t *testing.T) {
|
||
t.Skip("skip test")
|
||
/* deviceManager := NewDeviceManager(10, 3)
|
||
|
||
deviceManager.OnDeviceOnline = func(userID int64, deviceID, session string) {
|
||
fmt.Printf("✅ 设备 %s (用户 %d) 上线\n", deviceID, userID)
|
||
}
|
||
|
||
deviceManager.OnDeviceOffline = func(userID int64, deviceID, session string) {
|
||
fmt.Printf("❌ 设备 %s (用户 %d) 下线\n", deviceID, userID)
|
||
}
|
||
|
||
deviceManager.OnDeviceKicked = func(userID int64, deviceID, session string, operator Operator) {
|
||
fmt.Printf("⚠️ 设备 %s (用户 %d) 被踢下线\n", deviceID, userID)
|
||
}
|
||
deviceManager.OnMessage = func(userID int64, deviceID, session string, message string) {
|
||
log.Printf("✅收到消息: 设备 %s (用户 %d) 内容: %s,sesion: %s\n", deviceID, userID, message, session)
|
||
}
|
||
engine := gin.Default()
|
||
engine.GET("/ws/:userid/:device_number", func(c *gin.Context) {
|
||
//根据Authorization获取session
|
||
authorization := c.GetHeader("Authorization")
|
||
userid, err := strconv.ParseInt(c.Param("userid"), 10, 64)
|
||
if err != nil {
|
||
t.Errorf("get user id err:%v", err)
|
||
return
|
||
}
|
||
deviceNumber := c.Param("device_number")
|
||
deviceManager.AddDevice(c, authorization, userid, deviceNumber, 3)
|
||
return
|
||
})
|
||
go func() {
|
||
err := http.ListenAndServe(":8081", engine)
|
||
if err != nil {
|
||
t.Fatalf("engine start failed: %v", err)
|
||
}
|
||
}()
|
||
*/
|
||
h := http.Header{}
|
||
h.Add("Authorization", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJTZXNzaW9uSWQiOiIwMTk0Y2ZiNy1hYjY0LTdjYjMtODUzYi03ZGU5YTAzNWRlZTgiLCJVc2VySWQiOjI5LCJleHAiOjE3MzkyNTY1MDgsImlhdCI6MTczODY1MTcwOH0.BGKT5-hongJPZrA_yAb6cf6go5iDR8T9uu1ZxUg8HDw")
|
||
|
||
mutex := sync.Mutex{}
|
||
serverURL := fmt.Sprintf("ws://localhost:8080/v1/app/ws/%d/%s", 29, "15502502051") // 假设 userID 为 1001,设备ID 为 deviceA
|
||
|
||
// 建立 WebSocket 连接
|
||
conn, resp, err := websocket.DefaultDialer.Dial(serverURL, h)
|
||
if err != nil {
|
||
all, err := io.ReadAll(resp.Body)
|
||
t.Fatalf("websocket dial failed: %v:%s", err, string(all))
|
||
}
|
||
// 启动一个 goroutine 来读取服务器消息
|
||
go func() {
|
||
for {
|
||
_, msg, err := conn.ReadMessage()
|
||
if err != nil {
|
||
if errors.Is(err, net.ErrClosed) || strings.Contains(err.Error(), "use of closed network connection") {
|
||
log.Println("连接已关闭")
|
||
return
|
||
}
|
||
log.Printf("接收消息失败: %v", err)
|
||
return
|
||
}
|
||
fmt.Printf("收到来自服务器的消息: %s\n", msg)
|
||
}
|
||
}()
|
||
|
||
//发送心跳
|
||
go func() {
|
||
ticker := time.NewTicker(time.Second * 5)
|
||
defer ticker.Stop()
|
||
|
||
for range ticker.C {
|
||
mutex.Lock()
|
||
err := conn.WriteMessage(websocket.TextMessage, []byte("ping"))
|
||
mutex.Unlock()
|
||
|
||
if err != nil {
|
||
if strings.Contains(err.Error(), "use of closed network connection") {
|
||
log.Println("连接已关闭")
|
||
return
|
||
}
|
||
t.Errorf("websocket 写入失败: %v", err)
|
||
return
|
||
}
|
||
}
|
||
}()
|
||
|
||
updateSubscribe, _ := json.Marshal(map[string]interface{}{
|
||
"method": "test_method",
|
||
})
|
||
|
||
//发送一条消息
|
||
mutex.Lock()
|
||
err = conn.WriteMessage(websocket.TextMessage, updateSubscribe)
|
||
mutex.Unlock()
|
||
if err != nil {
|
||
t.Errorf("websocket write failed: %v", err)
|
||
}
|
||
|
||
time.Sleep(time.Second * 20)
|
||
conn.Close()
|
||
time.Sleep(time.Second * 5)
|
||
|
||
}
|