ws
CI / changes (push) Successful in 1m29s
CI / ad (push) Successful in 0s
CI / admin (push) Successful in 0s
CI / bff (push) Successful in 29s
CI / chore (push) Successful in 0s
CI / equipment (push) Successful in 0s
CI / express (push) Successful in 0s
CI / factory (push) Successful in 0s
CI / message (push) Successful in 1s
CI / order (push) Successful in 0s
CI / payment (push) Successful in 0s
CI / product (push) Successful in 1s
CI / record (push) Successful in 0s
CI / sale (push) Successful in 20s
CI / support (push) Successful in 1s
CI / task (push) Successful in 0s
CI / user (push) Successful in 0s
CI / wecom (push) Successful in 1s
CI / changes (push) Successful in 1m29s
CI / ad (push) Successful in 0s
CI / admin (push) Successful in 0s
CI / bff (push) Successful in 29s
CI / chore (push) Successful in 0s
CI / equipment (push) Successful in 0s
CI / express (push) Successful in 0s
CI / factory (push) Successful in 0s
CI / message (push) Successful in 1s
CI / order (push) Successful in 0s
CI / payment (push) Successful in 0s
CI / product (push) Successful in 1s
CI / record (push) Successful in 0s
CI / sale (push) Successful in 20s
CI / support (push) Successful in 1s
CI / task (push) Successful in 0s
CI / user (push) Successful in 0s
CI / wecom (push) Successful in 1s
This commit is contained in:
@@ -1,30 +0,0 @@
|
||||
package logic
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"lone-services/rpc/percutaneous/pb"
|
||||
"lone-services/services/percutaneous/internal/svc"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
)
|
||||
|
||||
type WeatherLogic struct {
|
||||
ctx context.Context
|
||||
svcCtx *svc.ServiceContext
|
||||
logx.Logger
|
||||
}
|
||||
|
||||
func NewWeatherLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WeatherLogic {
|
||||
return &WeatherLogic{
|
||||
ctx: ctx,
|
||||
svcCtx: svcCtx,
|
||||
Logger: logx.WithContext(ctx),
|
||||
}
|
||||
}
|
||||
|
||||
func (l *WeatherLogic) Weather(in *percutaneous.EmptyRequest) (*percutaneous.Response, error) {
|
||||
// todo: add your logic here and delete this line
|
||||
|
||||
return &percutaneous.Response{}, nil
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package logic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"lone-services/pkg/utils"
|
||||
"time"
|
||||
|
||||
"lone-services/rpc/percutaneous/pb"
|
||||
"lone-services/services/percutaneous/internal/svc"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
type WsAddUserStreamLogic struct {
|
||||
ctx context.Context
|
||||
svcCtx *svc.ServiceContext
|
||||
logx.Logger
|
||||
}
|
||||
|
||||
func NewWsAddUserStreamLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WsAddUserStreamLogic {
|
||||
return &WsAddUserStreamLogic{
|
||||
ctx: ctx,
|
||||
svcCtx: svcCtx,
|
||||
Logger: logx.WithContext(ctx),
|
||||
}
|
||||
}
|
||||
|
||||
// 添加用户
|
||||
func (l *WsAddUserStreamLogic) WsAddUserStream(stream percutaneous.Percutaneous_WsAddUserStreamServer) error {
|
||||
l.Logger.Error("in coming ws tunnel stream")
|
||||
ctx := stream.Context()
|
||||
// 扫码超时30s
|
||||
timeout := 30 * time.Second
|
||||
ctx, cancel := context.WithTimeout(ctx, timeout)
|
||||
defer cancel()
|
||||
|
||||
for {
|
||||
// 先判断上下文是否已经结束
|
||||
if err := ctx.Err(); err != nil {
|
||||
if err == context.DeadlineExceeded {
|
||||
return status.Errorf(codes.DeadlineExceeded, "扫码超时")
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// 阻塞等待客户端上报扫码消息
|
||||
recvFrame, err := stream.Recv()
|
||||
if err != nil {
|
||||
// 客户端主动关闭流
|
||||
return err
|
||||
}
|
||||
|
||||
// 解析扫码payload
|
||||
type res struct {
|
||||
Id int64 `json:"id"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
var resData res
|
||||
if err := utils.JsonStringToStruct(string(recvFrame.RawBody), &resData); !err {
|
||||
l.Logger.Errorf("parse scan payload failed: %v", err)
|
||||
return status.Errorf(codes.InvalidArgument, "解析扫码数据失败")
|
||||
}
|
||||
l.Logger.Errorf("receive scan success data: %+v", resData)
|
||||
|
||||
// 下发结果给ws客户端(同步设备)
|
||||
sendFrame := &percutaneous.WsStreamRequest{
|
||||
RawBody: []byte(utils.StructToJson(resData)),
|
||||
}
|
||||
if err := stream.Send(sendFrame); err != nil {
|
||||
l.Logger.Errorf("send result frame failed: %v", err)
|
||||
return err
|
||||
}
|
||||
// 收发完成,直接关闭grpc双向流(ws连接随之断开)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
@@ -57,3 +57,33 @@ func (s *PercutaneousServer) Weather(ctx context.Context, in *percutaneous.Empty
|
||||
l := logic.NewWeatherLogic(ctx, s.svcCtx)
|
||||
return l.Weather(in)
|
||||
}
|
||||
|
||||
// 登录二维码
|
||||
func (s *PercutaneousServer) LoginQR(ctx context.Context, in *percutaneous.LoginQRRequest) (*percutaneous.Response, error) {
|
||||
l := logic.NewLoginQRLogic(ctx, s.svcCtx)
|
||||
return l.LoginQR(in)
|
||||
}
|
||||
|
||||
// 添加用户
|
||||
func (s *PercutaneousServer) AddUserQR(ctx context.Context, in *percutaneous.AddUserQRRequest) (*percutaneous.Response, error) {
|
||||
l := logic.NewAddUserQRLogic(ctx, s.svcCtx)
|
||||
return l.AddUserQR(in)
|
||||
}
|
||||
|
||||
// WebSocket登录
|
||||
func (s *PercutaneousServer) WsLoginStream(stream percutaneous.Percutaneous_WsLoginStreamServer) error {
|
||||
l := logic.NewWsLoginStreamLogic(stream.Context(), s.svcCtx)
|
||||
return l.WsLoginStream(stream)
|
||||
}
|
||||
|
||||
// 添加用户
|
||||
func (s *PercutaneousServer) WsAddUserStream(stream percutaneous.Percutaneous_WsAddUserStreamServer) error {
|
||||
l := logic.NewWsAddUserStreamLogic(stream.Context(), s.svcCtx)
|
||||
return l.WsAddUserStream(stream)
|
||||
}
|
||||
|
||||
// 使用
|
||||
func (s *PercutaneousServer) WsUsedStream(stream percutaneous.Percutaneous_WsUsedStreamServer) error {
|
||||
l := logic.NewWsUsedStreamLogic(stream.Context(), s.svcCtx)
|
||||
return l.WsUsedStream(stream)
|
||||
}
|
||||
|
||||
@@ -14,14 +14,17 @@ import (
|
||||
)
|
||||
|
||||
type (
|
||||
AddUserQRRequest = percutaneous.AddUserQRRequest
|
||||
AddUserRequest = percutaneous.AddUserRequest
|
||||
EmptyRequest = percutaneous.EmptyRequest
|
||||
LoginQRRequest = percutaneous.LoginQRRequest
|
||||
Response = percutaneous.Response
|
||||
UseRequest = percutaneous.UseRequest
|
||||
UsedLogRequest = percutaneous.UsedLogRequest
|
||||
UserItemsRequest = percutaneous.UserItemsRequest
|
||||
WifiCheckRequest = percutaneous.WifiCheckRequest
|
||||
WifiSetRequest = percutaneous.WifiSetRequest
|
||||
WsStreamRequest = percutaneous.WsStreamRequest
|
||||
|
||||
Percutaneous interface {
|
||||
WifiCheck(ctx context.Context, in *WifiCheckRequest, opts ...grpc.CallOption) (*Response, error)
|
||||
@@ -31,6 +34,16 @@ type (
|
||||
AddUser(ctx context.Context, in *AddUserRequest, opts ...grpc.CallOption) (*Response, error)
|
||||
UserItems(ctx context.Context, in *UserItemsRequest, opts ...grpc.CallOption) (*Response, error)
|
||||
Weather(ctx context.Context, in *EmptyRequest, opts ...grpc.CallOption) (*Response, error)
|
||||
// 登录二维码
|
||||
LoginQR(ctx context.Context, in *LoginQRRequest, opts ...grpc.CallOption) (*Response, error)
|
||||
// 添加用户
|
||||
AddUserQR(ctx context.Context, in *AddUserQRRequest, opts ...grpc.CallOption) (*Response, error)
|
||||
// WebSocket登录
|
||||
WsLoginStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsLoginStreamClient, error)
|
||||
// 添加用户
|
||||
WsAddUserStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsAddUserStreamClient, error)
|
||||
// 使用
|
||||
WsUsedStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsUsedStreamClient, error)
|
||||
}
|
||||
|
||||
defaultPercutaneous struct {
|
||||
@@ -78,3 +91,33 @@ func (m *defaultPercutaneous) Weather(ctx context.Context, in *EmptyRequest, opt
|
||||
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
|
||||
return client.Weather(ctx, in, opts...)
|
||||
}
|
||||
|
||||
// 登录二维码
|
||||
func (m *defaultPercutaneous) LoginQR(ctx context.Context, in *LoginQRRequest, opts ...grpc.CallOption) (*Response, error) {
|
||||
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
|
||||
return client.LoginQR(ctx, in, opts...)
|
||||
}
|
||||
|
||||
// 添加用户
|
||||
func (m *defaultPercutaneous) AddUserQR(ctx context.Context, in *AddUserQRRequest, opts ...grpc.CallOption) (*Response, error) {
|
||||
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
|
||||
return client.AddUserQR(ctx, in, opts...)
|
||||
}
|
||||
|
||||
// WebSocket登录
|
||||
func (m *defaultPercutaneous) WsLoginStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsLoginStreamClient, error) {
|
||||
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
|
||||
return client.WsLoginStream(ctx, opts...)
|
||||
}
|
||||
|
||||
// 添加用户
|
||||
func (m *defaultPercutaneous) WsAddUserStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsAddUserStreamClient, error) {
|
||||
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
|
||||
return client.WsAddUserStream(ctx, opts...)
|
||||
}
|
||||
|
||||
// 使用
|
||||
func (m *defaultPercutaneous) WsUsedStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsUsedStreamClient, error) {
|
||||
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
|
||||
return client.WsUsedStream(ctx, opts...)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user