package entity import ( "context" "fmt" "grpccanary/examples/grpcentity/protoapi" "math/rand" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) func AskingDateTime(ctx context.Context, m protoapi.IoTServiceClient) (*protoapi.DateTime, error) { request := &protoapi.RequestDateTime{ Value: "Please send me the date and time", } return m.GetDate(ctx, request) } func AskPass(ctx context.Context, m protoapi.IoTServiceClient, seed int64, length int64) (*protoapi.RandomPass, error) { request := &protoapi.RequestPass{ Seed: seed, Length: length, } return m.GetRandomPass(ctx, request) } func AskUpdateSensingData(ctx context.Context, m protoapi.IoTServiceClient, deviceId string, temp float64, humid float64) (*protoapi.SensingResponse, error) { request := &protoapi.SensingData{ DeviceId: deviceId, Temperature: temp, Humidity: humid, } return m.UpdateSensingData(ctx, request) } func AskUploadFile(ctx context.Context, m protoapi.IoTServiceClient, fileName string, fileData []byte) (*protoapi.UploadStatus, error) { stream, err := m.UploadFile(ctx) if err != nil { return nil, err } chunkSize := 1024 // 1KB 단위 청크 totalBytes := len(fileData) for i := 0; i < totalBytes; i += chunkSize { end := i + chunkSize if end > totalBytes { end = totalBytes } err := stream.Send(&protoapi.FileChunk{ FileName: fileName, Content: fileData[i:end], }) if err != nil { return nil, err } } return stream.CloseAndRecv() } func ClientRun(addr string) { conn, err := grpc.NewClient(addr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { fmt.Println("NewClient error:", err) return } client := protoapi.NewIoTServiceClient(conn) r, err := AskingDateTime(context.Background(), client) if err != nil { fmt.Println(err) return } fmt.Println("Server Date and Time:", r.Value) length := int64(rand.Intn(20)) p, err := AskPass(context.Background(), client, 100, length+1) if err != nil { fmt.Println(err) return } fmt.Println("Random Password:", p.Password) res, err := AskUpdateSensingData(context.Background(), client, "sensor-room-01", 24.5, 52.3) if err != nil { fmt.Println(err) return } fmt.Println("Sensing Update Success:", res.Success) fmt.Println("Sensing Update Message:", res.Message) // 4단계: 파일 업로드 스트리밍 실행 예제 dummyData := make([]byte, 10240) // 10KB 가상 더미 데이터 for i := range dummyData { dummyData[i] = byte(rand.Intn(256)) } fmt.Println("Uploading dummy file (10KB) via Client Streaming...") status, err := AskUploadFile(context.Background(), client, "firmware.bin", dummyData) if err != nil { fmt.Println("File upload failed:", err) return } fmt.Println("Upload Success:", status.Success) fmt.Println("Upload Message:", status.Message) fmt.Printf("Uploaded Bytes: %d bytes\n", status.BytesUploaded) }