Skip to content

varedias/Mid360_Pcap_Capture

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

3 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Livox MID-360 ็‚นไบ‘ๆ•ฐๆฎ้‡‡้›†ๅบ”็”จ

ๅŸบไบŽ Flutter ๅผ€ๅ‘็š„ Android ๅบ”็”จ๏ผŒ็”จไบŽๆŽฅๆ”ถๅนถไฟๅญ˜ Livox MID-360 ๆฟ€ๅ…‰้›ท่พพ็š„ UDP ็‚นไบ‘ๆ•ฐๆฎใ€‚

ๅŠŸ่ƒฝ็‰นๆ€ง

  • โœ… ้€š่ฟ‡ UDP Socket ็›ดๆŽฅๆŽฅๆ”ถ้›ท่พพ็‚นไบ‘ๆ•ฐๆฎ
  • โœ… ๆ”ฏๆŒ UDP ๅ•ๆ’ญๆจกๅผ
  • โœ… ้ซ˜ๆ•ˆ็š„ๆ•ฐๆฎๅ†™ๅ…ฅ๏ผŒ้ฟๅ…ไธขๅŒ…
  • โœ… ๆ”ฏๆŒ PCAP ๆ ผๅผไฟๅญ˜๏ผˆๅฏ็”จ Wireshark ๆ‰“ๅผ€ๅˆ†ๆž๏ผ‰
  • โœ… ๆ”ฏๆŒๅŽŸๅง‹ไบŒ่ฟ›ๅˆถๆ ผๅผไฟๅญ˜
  • โœ… ๅฎžๆ—ถๆ˜พ็คบ้‡‡้›†็Šถๆ€ๅ’Œ็ปŸ่ฎกไฟกๆฏ

้กน็›ฎ็ป“ๆž„

lib/
โ”œโ”€โ”€ main.dart                          # ๅบ”็”จๅ…ฅๅฃๅ’Œไธป็•Œ้ข
โ”œโ”€โ”€ models/
โ”‚   โ””โ”€โ”€ capture_state.dart             # ้‡‡้›†็Šถๆ€ๆจกๅž‹
โ”œโ”€โ”€ controllers/
โ”‚   โ””โ”€โ”€ capture_controller.dart        # ้‡‡้›†ๆŽงๅˆถๅ™จ
โ”œโ”€โ”€ services/
โ”‚   โ””โ”€โ”€ udp_capture_service.dart       # UDP ๆŽฅๆ”ถๆœๅŠก๏ผˆๆ ธๅฟƒ๏ผ‰
โ”œโ”€โ”€ utils/
โ”‚   โ””โ”€โ”€ pcap_writer.dart               # PCAP ๆ ผๅผๅ†™ๅ…ฅๅทฅๅ…ท
โ””โ”€โ”€ widgets/
    โ”œโ”€โ”€ capture_control_card.dart      # ๆŽงๅˆถๆŒ‰้’ฎ็ป„ไปถ
    โ”œโ”€โ”€ stats_card.dart                # ็ปŸ่ฎกไฟกๆฏ็ป„ไปถ
    โ””โ”€โ”€ config_card.dart               # ้…็ฝฎไฟกๆฏ็ป„ไปถ

ไฟๅญ˜ๆ ผๅผ่ฏดๆ˜Ž

PCAP ๆ ผๅผ๏ผˆๆŽจ่๏ผ‰

  • ๆ ‡ๅ‡†็ฝ‘็ปœๆŠ“ๅŒ…ๆ ผๅผ๏ผŒๅฏ็”จ Wireshark ็›ดๆŽฅๆ‰“ๅผ€
  • ๅŒ…ๅซๅฎŒๆ•ด็š„ IP ๅคดๅ’Œ UDP ๅคดไฟกๆฏ
  • ๆ–‡ไปถๆ‰ฉๅฑ•ๅ: .pcap
  • ๅŒ…ๅซๆ—ถ้—ดๆˆณใ€ๆบ/็›ฎๆ ‡ IPใ€็ซฏๅฃ็ญ‰ๅ…ƒๆ•ฐๆฎ

RAW ๆ ผๅผ

  • ๅŽŸๅง‹ UDP payload ๆ•ฐๆฎ
  • ไธๅŒ…ๅซไปปไฝ•ๅ่ฎฎๅคด
  • ๆ–‡ไปถๆ‰ฉๅฑ•ๅ: .bin
  • ๆ–‡ไปถไฝ“็งฏๆ›ดๅฐ

PCAP ๆ–‡ไปถ็ป“ๆž„

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚      PCAP Global Header (24B)       โ”‚  โ† ๆ–‡ไปถๅคด๏ผŒๅชๅ†™ไธ€ๆฌก
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚      Packet Header (16B)            โ”‚  โ† ๆฏไธชUDPๅŒ…็š„ๅคด
โ”‚      IP Header (20B)                โ”‚
โ”‚      UDP Header (8B)                โ”‚
โ”‚      UDP Payload (ๅ˜้•ฟ)              โ”‚  โ† ็‚นไบ‘ๆ•ฐๆฎ
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚      Packet Header (16B)            โ”‚
โ”‚      IP Header (20B)                โ”‚
โ”‚      UDP Header (8B)                โ”‚
โ”‚      UDP Payload (ๅ˜้•ฟ)              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚              ...                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆ ธๅฟƒๆžถๆž„่ฎพ่ฎก

1. ็บฟ็จ‹/Isolate ๆจกๅž‹

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      Main Isolate (UI)                       โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚ CaptureControllerโ”‚โ”€โ”€โ”€โ–ถโ”‚ UdpCaptureService              โ”‚ โ”‚
โ”‚  โ”‚   (็Šถๆ€็ฎก็†)     โ”‚    โ”‚  - ๅฏๅŠจ/ๅœๆญข Isolate           โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚  - ๆŽฅๆ”ถ็ปŸ่ฎกๆ•ฐๆฎ                 โ”‚ โ”‚
โ”‚                         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚ SendPort/ReceivePort
                                    โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   Worker Isolate (UDPๆŽฅๆ”ถ)                   โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚
โ”‚  โ”‚                                                          โ”‚โ”‚
โ”‚  โ”‚  RawDatagramSocket โ”€โ–ถ PcapWriter โ”€โ–ถ BytesBuilder โ”€โ–ถ Fileโ”‚โ”‚
โ”‚  โ”‚     (UDPๆŽฅๆ”ถ)        (ๅฐ่ฃ…PCAP)    (ๅ†™ๅ…ฅ็ผ“ๅ†ฒๅŒบ)   (็ฃ็›˜) โ”‚โ”‚
โ”‚  โ”‚                                                          โ”‚โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2. ๅ…ณ้”ฎ็ป„ไปถ่ฏดๆ˜Ž

็ป„ไปถ ่Œ่ดฃ
UdpCaptureService ็ฎก็† Isolate ็”Ÿๅ‘ฝๅ‘จๆœŸ๏ผŒไธŽ Worker ้€šไฟก
Worker Isolate ็‹ฌ็ซ‹็บฟ็จ‹ๆ‰ง่กŒ UDP ๆŽฅๆ”ถๅ’Œๆ–‡ไปถๅ†™ๅ…ฅ
PcapWriter ็”Ÿๆˆๆ ‡ๅ‡† PCAP ๆ ผๅผๆ•ฐๆฎ
CaptureController ไธšๅŠก้€ป่พ‘ๆŽงๅˆถ๏ผŒ็Šถๆ€็ฎก็†
CaptureState ไธๅฏๅ˜็Šถๆ€ๆจกๅž‹

้˜ฒไธขๅŒ…็ญ–็•ฅ

1. ไฝฟ็”จ็‹ฌ็ซ‹ Isolate ๆŽฅๆ”ถๆ•ฐๆฎ

  • UDP ๆŽฅๆ”ถๅœจ็‹ฌ็ซ‹ Isolate ไธญ่ฟ่กŒ๏ผŒๅฎŒๅ…จไธๅ— UI ็บฟ็จ‹ๅฝฑๅ“
  • ๅณไฝฟ UI ๅก้กฟ๏ผŒๆ•ฐๆฎๆŽฅๆ”ถไนŸไธไผšไธญๆ–ญ

2. ๆ‰น้‡ๅ†™ๅ…ฅ็ญ–็•ฅ

// ไฝฟ็”จ BytesBuilder ็ดฏ็งฏๆ•ฐๆฎ
final writeBuffer = BytesBuilder(copy: false);
const writeBufferThreshold = 256 * 1024; // 256KB ็ผ“ๅ†ฒๅŒบ้˜ˆๅ€ผ

// ๅฝ“็ผ“ๅ†ฒๅŒบ่พพๅˆฐ้˜ˆๅ€ผๆ—ถๆ‰น้‡ๅ†™ๅ…ฅ
if (writeBuffer.length >= writeBufferThreshold) {
  final data = writeBuffer.takeBytes();
  file.writeFromSync(data);
}

3. ่ฟž็ปญ่ฏปๅ–ๆจกๅผ

// ไธ€ๆฌกไบ‹ไปถไธญ่ฏปๅ–ๆ‰€ๆœ‰ๅฏ็”จๆ•ฐๆฎ
while (running) {
  final datagram = socket.receive();
  if (datagram == null) break;
  writeBuffer.add(datagram.data);
}

4. ๅฎšๆ—ถๅˆทๆ–ฐ

// ๆฏ 500ms ๅˆทๆ–ฐไธ€ๆฌก็ผ“ๅ†ฒๅŒบ๏ผŒ็กฎไฟๆ•ฐๆฎไธไผš้•ฟๆ—ถ้—ดๅœ็•™ๅœจๅ†…ๅญ˜
Timer.periodic(Duration(milliseconds: 500), (timer) {
  if (writeBuffer.length > 0) {
    final data = writeBuffer.takeBytes();
    file.writeFromSync(data);
  }
});

ๆ•ฐๆฎๅฎŒๆ•ดๆ€งไฟ่ฏ

1. ๆญฃ็กฎ็š„ๅ…ณ้—ญๆต็จ‹

finally {
  // 1. ๅ†™ๅ…ฅๅ‰ฉไฝ™็ผ“ๅ†ฒๅŒบๆ•ฐๆฎ
  if (writeBuffer.length > 0 && file != null) {
    final data = writeBuffer.takeBytes();
    file.writeFromSync(data);
  }
  
  // 2. ๆ˜พๅผๅˆทๆ–ฐๆ–‡ไปถ็ผ“ๅ†ฒๅŒบ
  file.flushSync();
  
  // 3. ๅ…ณ้—ญๆ–‡ไปถๅฅๆŸ„
  file.closeSync();
  
  // 4. ๅ…ณ้—ญ Socket
  socket?.close();
}

2. ็”Ÿๅ‘ฝๅ‘จๆœŸ็ฎก็†

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  // ๅบ”็”จ่ฟ›ๅ…ฅๅŽๅฐๆ—ถ่‡ชๅŠจๅœๆญข้‡‡้›†
  if (state == AppLifecycleState.paused ||
      state == AppLifecycleState.detached) {
    if (_controller.state.isCapturing) {
      _controller.stopCapture();
    }
  }
}

็ซฏๅฃ้…็ฝฎ

ๅ‚ๆ•ฐ ๅ€ผ ่ฏดๆ˜Ž
้›ท่พพๆบ็ซฏๅฃ 56300 Livox MID-360 ๅ‘้€ๆ•ฐๆฎ็š„็ซฏๅฃ
ๆœฌๆœบ็›‘ๅฌ็ซฏๅฃ 56301 Android ่ฎพๅค‡ๆŽฅๆ”ถๆ•ฐๆฎ็š„็ซฏๅฃ

ๆ‰€้œ€ๆƒ้™

<!-- AndroidManifest.xml -->

<!-- ็ฝ‘็ปœๆƒ้™ - UDP Socket ้€šไฟกๅฟ…้œ€ -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<!-- ๅญ˜ๅ‚จๆƒ้™ - ็”จไบŽไฟๅญ˜็‚นไบ‘ๆ•ฐๆฎๆ–‡ไปถ -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<!-- ไฟๆŒๅ”ค้†’ - ้•ฟๆ—ถ้—ด้‡‡้›†ๆ—ถ้˜ฒๆญขไผ‘็œ  -->
<uses-permission android:name="android.permission.WAKE_LOCK" />

ๆ•ฐๆฎๅญ˜ๅ‚จ

  • PCAP ๆ ผๅผ: .pcap ๆ–‡ไปถ๏ผˆๅฏ็”จ Wireshark ๆ‰“ๅผ€๏ผ‰
  • RAW ๆ ผๅผ: .bin ๅŽŸๅง‹ไบŒ่ฟ›ๅˆถๆ–‡ไปถ
  • ๆ–‡ไปถๅ‘ฝๅ: mid360_pointcloud_<timestamp>.<pcap|bin>
  • ๅญ˜ๅ‚จ่ทฏๅพ„: /Android/data/com.livox.mid360_capture/files/MID360/

ไฝฟ็”จ Wireshark ๆŸฅ็œ‹ PCAP ๆ–‡ไปถ

  1. ๅฐ† .pcap ๆ–‡ไปถไปŽๆ‰‹ๆœบๅคๅˆถๅˆฐ็”ต่„‘
  2. ็”จ Wireshark ๆ‰“ๅผ€ๆ–‡ไปถ
  3. ๅฏไปฅ็œ‹ๅˆฐๆฏไธช UDP ๆ•ฐๆฎๅŒ…็š„๏ผš
    • ๆ—ถ้—ดๆˆณ
    • ๆบ IP ๅ’Œ็ซฏๅฃ
    • ็›ฎๆ ‡ IP ๅ’Œ็ซฏๅฃ
    • UDP payload๏ผˆ็‚นไบ‘ๆ•ฐๆฎ๏ผ‰
  4. ไฝฟ็”จ่ฟ‡ๆปคๅ™จ udp.port == 56301 ็ญ›้€‰ๆ•ฐๆฎ

็ผ–่ฏ‘่ฟ่กŒ

# ่Žทๅ–ไพ่ต–
flutter pub get

# ๅˆ†ๆžไปฃ็ 
flutter analyze

# ็ผ–่ฏ‘ APK
flutter build apk --release

# ๆˆ–็›ดๆŽฅ่ฟ่กŒ
flutter run

ไฝฟ็”จๆต็จ‹

  1. ็ฝ‘็ปœ้…็ฝฎ: ็กฎไฟ Android ่ฎพๅค‡ไธŽ MID-360 ๅœจๅŒไธ€ๅฑ€ๅŸŸ็ฝ‘ ๆœ€ๅฅฝๅฐ†IP่ฎพ็ฝฎไธบ192.168.1.50
  2. ้›ท่พพ้…็ฝฎ: ๅฐ†้›ท่พพ็š„็›ฎๆ ‡ IP ่ฎพ็ฝฎไธบ Android ่ฎพๅค‡ IP๏ผŒ็›ฎๆ ‡็ซฏๅฃ่ฎพ็ฝฎไธบ 56301
  3. ๅผ€ๅง‹้‡‡้›†: ็‚นๅ‡ป"ๅผ€ๅง‹้‡‡้›†"ๆŒ‰้’ฎ
  4. ็›‘ๆŽง็Šถๆ€: ่ง‚ๅฏŸ UDP ๅŒ…ๆ•ฐ้‡ๅ’Œๆ•ฐๆฎๅคงๅฐๆ˜ฏๅฆๅขž้•ฟ
  5. ๅœๆญข้‡‡้›†: ็‚นๅ‡ป"ๅœๆญข้‡‡้›†"ๆŒ‰้’ฎ๏ผŒๆ•ฐๆฎๅฐ†่‡ชๅŠจไฟๅญ˜

ๆ€ง่ƒฝๆŒ‡ๆ ‡

  • ่ฎพ่ฎก็›ฎๆ ‡: ๆ”ฏๆŒ MID-360 ๆœ€ๅคงๆ•ฐๆฎ้€Ÿ็އ (~10MB/s)
  • ็ผ“ๅ†ฒๅŒบๅคงๅฐ: 256KB ๅ†™ๅ…ฅ็ผ“ๅ†ฒๅŒบ
  • ๅˆทๆ–ฐ้—ด้š”: 500ms ็ปŸ่ฎกๆ›ดๆ–ฐ๏ผŒ1000ms ๅฎšๆ—ถๅˆท็›˜
  • ๆ”ฏๆŒๆ—ถ้•ฟ: ็†่ฎบไธŠๅฏๆ”ฏๆŒๆ•ฐๅฐๆ—ถ่ฟž็ปญ้‡‡้›†๏ผˆๅ–ๅ†ณไบŽๅญ˜ๅ‚จ็ฉบ้—ด๏ผ‰

ๆŠ€ๆœฏๆ ˆ

  • Flutter: ่ทจๅนณๅฐ UI ๆก†ๆžถ
  • Dart Isolate: ๅคš็บฟ็จ‹ๅค„็†
  • RawDatagramSocket: UDP ็ฝ‘็ปœ้€šไฟก
  • Provider: ็Šถๆ€็ฎก็†
  • path_provider: ๆ–‡ไปถ่ทฏๅพ„็ฎก็†

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published