android - How to Send Transport ID from Device to Client and Use It for ADB Connection? - Stack Overflow

admin2025-04-27  3

I'm currently working on a project to connect Android devices to a web client via Node.js and WebSocket, Tango ADB. I'm able to list connected devices using AdbServerClient and retrieve the transportId of a specific device Now, I want to send this transportId from the server to the client through WebSocket, so the client can use it to establish an ADB connection with the device. transport id is a bigint data type so the error TypeError: Do not know how to serialize a BigInt, it's missing the letter n How can I pass it to the client? If possible, can create adb in the client? Please!!help mee!! diagram: client(react) -->sever(socket)-->sidecar(nodejs)-->device
bigint
string

client:

const [loading, setLoading] = useState(false);
const [deviceInfo, setDeviceInfo] = useState<Device[]>([]);
const [transport, setTransport] = useState<any>(null);
const [error, setError] = useState<string | null>(null);
const socket = io("http://localhost:8080", {
  auth: {
    token: "user",
  },
  query: {
    deviceId: "user",
  },
});

const getDevices = async () => {
  setLoading(true);
  setError(null);
  try {
    socket.emit("request", { clientId: "user" });
    console.log("socket :>> ", socket);
    socket.on("transportAndDeviceToFrontend", (data) => {
      console.log("data :>> ", data);
      const device = {
        ...data.device,
        transportId: BigInt(data.device.transportId),
      };
      setDeviceInfo([device]);
      setTransport(data.transport);
      setLoading(false);
    });
    console.log("receivedDevices :>> ", devices);
  } catch (err) {
    setError("Failed to load devices. Please try again.");
    console.log(error);
    setLoading(false);
  }
};

return (
  <div className="p-6">
    <button
      onClick={getDevices}
      disabled={loading}
      className="px-4 py-2 bg-blue-500 text-white rounded disabled:bg-gray-400"
    >
      {loading ? "Loading..." : "Get Device Transport"}
    </button>

    {error && <div className="mt-4 text-red-500">{error}</div>}

    {deviceInfo.length > 0 && (
      <div className="mt-6">
        <h2 className="text-xl font-bold mb-4">Device Information</h2>
        {deviceInfo.map((device, index) => (
          <div key={index} className="bg-gray-100 p-4 rounded mb-4">
            <p>Serial: {device.serial}</p>
            <p>Model: {device.model || "N/A"}</p>
            <p>Product: {device.product || "N/A"}</p>
            <p>Transport ID: {device.transportId.toString()}</p>
          </div>
        ))}
      </div>
    )}

    {transport && (
      <button
        onClick={connectDevice}
        disabled={loading}
        className="px-4 py-2 bg-green-500 text-white rounded disabled:bg-gray-400 mt-4"
      >
        {loading ? "Connecting..." : "Connect to Device"}
      </button>
    )}
  </div>
);

socket:

@SubscribeMessage('sendTransportAndDevice')
  handleDevice(@MessageBody() data: any) {
    console.log(`Received device:`, data);
    this.server
      .to(data.clientId)
      .emit('transportAndDeviceToFrontend', {
        device: data.device,
        transport: data.transportId,
      });
  }

  @SubscribeMessage('request')
  sendRequest(@MessageBody() data: any) {
    console.log(' :>> ', data);
    this.server.to('device').emit('sendRequest', data);
  }

sidecar:

const main = async () => {
  const deviceId = process.env.DEVICE_ID || "123";
  const socketUrl = process.env.SOCKET_URL || "ws://localhost:8080";
  const socket = io(socketUrl, {
    auth: {
      token: "device",
    },
    query: {
      deviceId: deviceId,
    },
  });

  socket.on("connect", async () => {
    console.log("Connected Socket");
  });

  socket.on("sendRequest", async (data: any) => {
    try {
      const devices: AdbServerClient.Device[] = await getTransport();
      log("devices :>> ", devices);
      if (devices.length > 0) {
        const client = new AdbServerClient(
          new AdbServerNodeTcpConnector({ host: "127.0.0.1", port: 5037 })
        );
        const transport = await client.createTransport(devices[0]);
        log("transport :>> ", transport);

        const originalConnect = transport.connect;
        transport.connect = async (service) => {
          const adbSocket = await originalConnect.call(transport, service); //connect adb vs device
          const writer = adbSocket.writable.getWriter(); // ghi dữ liệu vào adbSocket

          adbSocket.readable = adbSocket.readable.pipeThrough(
            new TransformStream({
              async transform(chunk, controller) {
                if (
                  decodeUtf8(chunk).includes("please input verify password:")
                ) {
                  await writer.write(encodeUtf8("adb36987\n"));
                  return;
                }
                controller.enqueue(chunk);
              },
            })
          );

          adbSocket.writable = new WritableStream({
            write(chunk) {
              return writer.write(chunk);
            },
            close() {
              return writer.close();
            },
            abort() {
              return writer.abort();
            },
          });

          return adbSocket;
        };

        const { transportId, ...transportData } = transport;
        socket.emit("sendTransportAndDevice", {
          clientId: data.clientId,
          device: {
            ...devices[0],
            transportId: devices[0].transportId, 
          },
          log: "Connected to device11",
        });
        log("Connected to device 2");
      }
    } catch (e) {
      console.error("Error creating transport:", e);
      socket.emit("error", {
        message: "Failed to create transport",
        clientId: data.clientId,
      });
    }
  });
转载请注明原文地址:http://anycun.com/QandA/1745708894a91127.html