Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Bộ định tuyến đường viền chuỗi - Kết nối IPv6 hai chiều và khám phá dịch vụ dựa trên DNS

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

1. Giới thiệu

699d673d05a55535.png

Bộ định tuyến đường viền là gì?

Chuỗi cuộc trò chuyện là một giao thức mạng lưới không dây công suất thấp dựa trên IP, cho phép giao tiếp giữa các thiết bị và đám mây bảo mật theo thiết bị. Mạng chuỗi có thể thích ứng với các thay đổi về cấu trúc liên kết để tránh một điểm bị lỗi.

Bộ định tuyến biên chuỗi kết nối mạng Thread với các mạng dựa trên IP khác, chẳng hạn như Wi-Fi hoặc Ethernet. Mạng Thread cần có Bộ định tuyến biên để kết nối với các mạng khác. Bộ định tuyến đường viền chuỗi hỗ trợ tối thiểu các chức năng sau đây:

  • Kết nối IP hai chiều giữa các chuỗi Thread và Wi-Fi/Ethernet.
  • Khám phá dịch vụ hai chiều thông qua mDNS (trên đường liên kết Wi-Fi/Ethernet) và SRP (trên mạng trong chuỗi).
  • Cấu trúc chuỗi trên cơ sở hợp nhất các phân vùng Chuỗi chỉ trên các liên kết dựa trên IP.
  • Phí ủy quyền cho chuỗi cuộc trò chuyện bên ngoài (ví dụ: điện thoại di động) để xác thực và kết nối thiết bị Chuỗi với mạng Thread.

Bộ định tuyến đường viền chuỗi (OTBR) do Google phát hành là phương thức triển khai nguồn mở của Bộ định tuyến đường viền chuỗi.

Nội dung bạn sẽ tạo dựng

Trong lớp học lập trình này, bạn sẽ thiết lập một Bộ định tuyến biên dạng chuỗi và kết nối điện thoại di động của bạn với Thiết bị kết thúc chuỗi qua Bộ định tuyến biên.

Nội dung bạn sẽ tìm hiểu

  • Cách thiết lập OTBR
  • Cách tạo một mạng Chuỗi có OTBR
  • Cách xây dựng thiết bị OpenThread CLI bằng tính năng SRP
  • Cách đăng ký dịch vụ có SRP
  • Cách khám phá và tiếp cận thiết bị kết thúc Chuỗi.

Những gì bạn cần có

  • Thiết bị Raspberry Pi 3/4 và thẻ SD có dung lượng tối thiểu 8 GB.
  • 2 bảng điều khiển dành cho nhà phát triển Bắc Mỹ Bán dẫn nRF52840.
  • AP-Wi-Fi không cóBảo vệ quảng cáo bộ định tuyến IPv6 đã bật trên bộ định tuyến.
  • Điện thoại iOS chạy iOS 14 hoặc điện thoại Android tối thiểu Android 8.1.

2. Thiết lập OTBR

Thiết lập Raspberry Pi

Thật đơn giản để thiết lập thiết bị Raspberry Pi mới bằng công cụ rpi-imager bằng cách làm theo hướng dẫn trên raspberrypi.org (thay vì sử dụng hệ điều hành Raspberry Pi mới nhất trong công cụ này, hãy tải 2021-05-07-raspios-buster-armhf-lite của tôi). Để hoàn tất các bước trên điện thoại di động trong lớp học lập trình này, bạn cần kết nối Raspberry Pi với một mạng Wi-Fi AP. Hãy làm theo hướng dẫn này để thiết lập tính năng kết nối không dây. Để thuận tiện để đăng nhập vào Raspberry Pi bằng SSH, bạn có thể tìm hướng dẫn tại đây.

Nhận mã OTBR

Đăng nhập vào Raspberry Pi và sao chép ot-br-posix từ GitHub:

$ git clone https://github.com/openthread/ot-br-posix.git --depth 1

Xây dựng và cài đặt giao diện khởi động lại

OTBR có hai tập lệnh khởi động và thiết lập Bộ định tuyến đường viền chuỗi:

$ cd ot-br-posix
$ ./script/bootstrap
$ INFRA_IF_NAME=wlan0 ./script/setup

OTBR hoạt động trên cả giao diện luồng và giao diện mạng cơ sở hạ tầng (ví dụ: Wi-Fi/Ethernet) được chỉ định bằng INFRA_IF_NAME. Giao diện Chuỗi là do chính OTBR tạo và được đặt tên theo mặc định là wpan0 và giao diện cơ sở hạ tầng có giá trị mặc định là wlan0 nếu INFRA_IF_NAME không được chỉ định rõ ràng. Nếu dây Raspberry Pi của bạn được kết nối bằng cáp Ethernet, hãy chỉ định tên giao diện Ethernet (ví dụ: eth0):

$ INFRA_IF_NAME=eth0 ./script/setup

Kiểm tra xem bạn đã cài đặt thành công OTBR hay chưa:

$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
   Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: exit-code) since Mon 2021-03-01 05:43:38 GMT; 2s ago
  Process: 2444 ExecStart=/usr/sbin/otbr-agent $OTBR_AGENT_OPTS (code=exited, status=2)
 Main PID: 2444 (code=exited, status=2)

Dự kiến, dịch vụ otbr-agent không hoạt động vì dịch vụ này yêu cầu một khối RCP để chạy.

Khởi động lại Raspberry Pi để áp dụng các thay đổi.

Xây dựng và chạy chương trình cơ sở RCP

OTBR hỗ trợ chip radio 15.4 ở chế độ Radio Co-Processor (RCP). Ở chế độ này, ngăn xếp OpenThread đang chạy ở phía máy chủ và truyền/nhận khung hình qua bộ thu phát IEEE802.15.4.

Thực hiện theo bước 4 của Xây dựng mạng chuỗi cuộc trò chuyện có bảng nRF52840 và lớp học mã OpenThread để xây dựng và flash thiết bị nRF52840 RCP:

$ script/build nrf52840 USB_trans

Bắt đầu OTBR và xác minh trạng thái

Kết nối bảng nRF52840 với Raspberry Pi của bạn và bắt đầu dịch vụ otbr-agent:

$ sudo service otbr-agent restart

Xác minh rằng dịch vụ otbr-agent đang hoạt động:

$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
   Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-03-01 05:46:26 GMT; 2s ago
 Main PID: 2997 (otbr-agent)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/otbr-agent.service
           └─2997 /usr/sbin/otbr-agent -I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0

Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Stop publishing service
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [adproxy] Stopped
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: PSKc is not initialized
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Check if PSKc is initialized: OK
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Initialize OpenThread Border Router Agent: OK
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Border router agent started.
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-CORE----: Notifier: StateChanged (0x00038200) [NetData PanId NetName ExtPanId]
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-PLAT----: Host netif is down

3. Tạo mạng chuỗi

Có một lệnh ot-ctl có thể dùng để kiểm soát dịch vụ otbr-agent. ot-ctl chấp nhận tất cả lệnh OpenLI CLI, xem Openthread CLI Guide để biết thêm chi tiết.

Tạo mạng chuỗi cuộc trò chuyện có tính năng OTBR:

$ sudo ot-ctl dataset init new
Done
$ sudo ot-ctl dataset commit active
Done
$ sudo ot-ctl ifconfig up
Done
$ sudo ot-ctl thread start
Done

Đợi một vài giây, chúng ta sẽ có thể thấy rằng OTBR đang hoạt động như một Chuỗi leader và có một tiền tố off-mesh-routable (OMR) trong Dữ liệu mạng theo chuỗi:

$ sudo ot-ctl state
leader
Done
$ sudo ot-ctl netdata show
Prefixes:
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
$ sudo ot-ctl ipaddr      
fda8:5ce9:df1e:6620:0:ff:fe00:fc11
fda8:5ce9:df1e:6620:0:0:0:fc38
fda8:5ce9:df1e:6620:0:ff:fe00:fc10
fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
fda8:5ce9:df1e:6620:0:ff:fe00:fc00
fda8:5ce9:df1e:6620:0:ff:fe00:4000
fda8:5ce9:df1e:6620:3593:acfc:10db:1a8d
fe80:0:0:0:a6:301c:3e9f:2f5b
Done

4. Thiết lập thiết bị kết thúc ứng dụng SRP

Xây dựng và cài đặt Flash giao diện dòng lệnh (CLI)

Thực hiện theo bước 5 của Xây dựng mạng chuỗi cuộc trò chuyện có bảng nRF52840 và lớp học mã OpenThread để tạo và kích hoạt thiết bị cuối CLI nRF52840.

Nhưng thay vì bật OT_COMMISSIONEROT_JOINER, nút CLI yêu cầu các tính năng OT_SRP_CLIENTOT_ECDSA.

Do đó, lệnh gọi bản dựng đầy đủ sẽ có dạng như sau:

$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

Kết nối với mạng OTBR

Để tham gia mạng Chuỗi do dịch vụ otbr-agent tạo, chúng tôi cần lấy Tập dữ liệu hoạt động từ thiết bị OTBR. Hãy quay lại dòng lệnh otbr-agent và lấy tập dữ liệu đang hoạt động:

$ sudo ot-ctl dataset active -x
0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Quay lại phiên màn hình nút ứng dụng khách SRP và đặt tập dữ liệu đang hoạt động:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Sau đó, hãy khởi động giao diện Chuỗi cuộc trò chuyện:

> ifconfig up
Done
> thread start
Done

Đợi một vài giây và xác minh xem liệu việc tham gia vào mạng Chuỗi có thành công hay không:

> state
child
Done
> netdata show
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
> ipaddr
fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
fda8:5ce9:df1e:6620:0:ff:fe00:4001
fda8:5ce9:df1e:6620:ed74:123:cc5d:74ba
fe80:0:0:0:d4a9:39a0:abce:b02e
Done

Hãy đảm bảo rằng dữ liệu mạng khớp với dữ liệu in trên OTBR. Bây giờ, chúng ta có thể ping địa chỉ OMR của OTBR:

> ping fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
Done
> 16 bytes from fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9: icmp_seq=1 hlim=64 time=49ms

5. Xuất bản dịch vụ trên Thiết bị cuối

mDNS đã được sử dụng rộng rãi để phát hành dịch vụ DNS-SD trên link-local. Tuy nhiên, tin nhắn đa hướng tiêu tốn quá nhiều băng thông và nhanh chóng làm tiêu hao pin của thiết bị yếu. Thread sử dụng giao thức SRP đơn nguyên để đăng ký dịch vụ của họ với Bộ định tuyến biên và dựa vào Bộ định tuyến biên để quảng cáo dịch vụ trên liên kết Wi-Fi hoặc Ethernet.

Chúng tôi có thể đăng ký một dịch vụ bằng lệnh srp client.

Chuyển đến phiên màn hình nút ứng dụng SRP và tự động khởi động ứng dụng SRP:

> srp client autostart enable
Done

Đặt tên máy chủ sẽ được quảng cáo trên liên kết Wi-Fi/Ethernet:

> srp client host name ot-host
Done

Đối với một thiết bị dùng đường liên kết Wi-Fi/Ethernet để đến một thiết bị kết thúc chuỗi, bạn cần quảng cáo địa chỉ OMR của thiết bị cuối:

> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
Done

Cuối cùng, hãy đăng ký một dịch vụ _ipps._tcp giả mạo:

> srp client service add ot-service _ipps._tcp 12345
Done

Hãy chờ vài giây và chúng tôi sẽ có thể thấy dịch vụ đã đăng ký:

> srp client service
instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0
Done

Chúng tôi đã hoàn tất mọi quá trình thiết lập và dịch vụ _ipps._tcp hẳn đã được quảng cáo trên đường liên kết Wi-Fi/Ethernet. Đã đến lúc khám phá và sử dụng thiết bị cuối ngay bây giờ!

6. Khám phá dịch vụ

Khám phá dịch vụ bằng điện thoại di động

54a136a8940897cc.png

Chúng tôi dùng Ứng dụng trình duyệt dịch vụ để khám phá các dịch vụ liên quan đến mDNS trên điện thoại Android. Bạn cũng có thể tìm thấy một ứng dụng tương đương cho thiết bị di động iOS. Hãy mở Ứng dụng và dịch vụ _ipps._tcp sẽ chỉ hiển thị.

Khám phá dịch vụ thông qua một nhà cung cấp dịch vụ lưu trữ Linux

Nếu muốn khám phá dịch vụ này từ một máy chủ Linux khác, bạn có thể sử dụng lệnh avahi-browse.

Cài đặt avahi-daemonavahi-utils:

$ sudo apt-get install -y avahi-daemon avahi-utils

Giải quyết dịch vụ:

$ sudo service avahi-daemon start # Ensure the avahi daemon is started.
$ avahi-browse -r _ipps._tcp
+ wlan0 IPv6 ot-service                                    Secure Internet Printer local
= wlan0 IPv6 ot-service                                    Secure Internet Printer local
   hostname = [ot-host.local]
   address = [fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927]
   port = [12345]
   txt = []
...

Khám phá dịch vụ thông qua máy chủ macOS

Bạn có thể sử dụng dns-sd trên macOS để giải quyết dịch vụ này:

$ dns-sd -Z _ipps._tcp local.
Browsing for _ipps._tcp.local.
DATE: ---Sun 14 Mar 2021---
21:31:42.125  ...STARTING...

; To direct clients to browse a different domain, substitute that domain in place of '@'
lb._dns-sd._udp                                 PTR     @

; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names.
; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local
; names with the correct fully-qualified (unicast) domain name of the target host offering the service.

_ipps._tcp                                      PTR     ot-service._ipps._tcp
ot-service._ipps._tcp                           SRV     0 0 12345 ot-host.local. ; Replace with unicast FQDN of target host
ot-service._ipps._tcp                           TXT     ""
...

7. Ping thiết bị cuối

Ping từ điện thoại di động

Hãy dùng điện thoại Pixel làm ví dụ để chúng tôi có thể tìm thấy địa chỉ OMR của dịch vụ "ot-service" đã đăng ký trước đó trên trang chi tiết của phiên bản dịch vụ đó trong ứng dụng Dịch vụ trình duyệt.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Giờ đây, chúng ta có thể ping địa chỉ OMR bằng một ứng dụng khác của Trình phân tích mạng.

Rất tiếc, phiên bản Android của Ứng dụng phân tích mạng không hỗ trợ truy vấn mDNS cho tiện ích ping và chúng tôi không thể ping trực tiếp tên máy chủ ot-host.local (chúng tôi có thể ping tên máy chủ với phiên bản iOS của ứng dụng).

Ping từ máy chủ Linux/macOS

Bộ định tuyến biên của chuỗi, gửi Quảng cáo bộ định tuyến ICMPv6 (RA) để quảng cáo tiền tố (thông qua Tùy chọn thông tin tiền tố) và tuyến đường (qua Tùy chọn thông tin tuyến đường) trên liên kết Wi-Fi/Ethernet.

Chuẩn bị máy chủ Linux

Điều quan trọng là phải đảm bảo rằng RA và RIO được bật trên máy chủ của bạn:

  1. net.ipv6.conf.wlan0.accept_raít nhất1 nếu tính năng chuyển tiếp ip không được bật, và2 nếu ngược lại.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen không được nhỏ hơn 64.

accept_ra được đặt mặc định là 1 đối với hầu hết các bản phân phối. Tuy nhiên, có thể có các daemon khác trên mạng sẽ ghi đè tùy chọn này (ví dụ: dhcpcd trên Raspberry Pi sẽ ghi đè accept_ra thành 0). Bạn có thể kiểm tra giá trị accept_ra bằng:

$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra
0

Và đặt giá trị thành 1 (hoặc 2 trong trường hợp tính năng chuyển tiếp IP được bật) với:

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1
Net.ipv6.conf.wlan0.accept_ra = 1

Tùy chọn accept_ra_rt_info_max_plen trên hầu hết các bản phân phối Linux sẽ mặc định là 0, đặt thành 64 với:

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen=64
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

Thay đổi này sẽ bị mất sau khi người dùng khởi động lại máy chủ. Ví dụ: thêm các lệnh dưới đây vào /etc/sysctl.conf để kích hoạt vĩnh viễn RIO:

$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

Có thể quá muộn để thay đổi các cấu hình đó vì OTBR đã gửi thông báo RA và khoảng thời gian giữa hai lần thông báo RA không mong muốn có thể mất vài trăm giây. Có một cách là ngắt kết nối rồi kết nối lại với Wi-Fi AP để gửi tin nhắn Khuyến khích về bộ định tuyến, nhờ đó, OTBR sẽ phản hồi bằng RAs khởi động. Một tùy chọn khác là khởi động lại chức năng Định tuyến biên giới trên Bộ định tuyến biên:

$ sudo ot-ctl br disable
Done
$ sudo ot-ctl br enable
Done

Nếu bạn đang cố gắng kết nối lại Wi-Fi hoặc khởi động lại giao diện Ethernet, hãy đảm bảo rằng bạn không dùng dhcpcd để quản lý mạng IPv6/Ethernet IPv6 của mình. Vì dhcpcd luôn ghi đè tùy chọn accept_ra mỗi khi giao diện được khởi động lại và cấu hình accept_ra của bạn sẽ bị mất. Thêm các dòng bên dưới vào tệp cấu hình dhcpcd (ví dụ: /etc/dhcpcd.conf) để vô hiệu hóa rõ ràng IPv6 trong dhcpcd:

noipv6
noipv6rs

Bạn cần khởi động lại để thay đổi này có hiệu lực.

Chuẩn bị máy chủ macOS

Cả hai tùy chọn accept_ra* đều được bật theo mặc định. Tuy nhiên, bạn cần nâng cấp hệ thống của mình lên ít nhất là macOS Big Sur.

Ping tên máy chủ hoặc địa chỉ IPv6

Bây giờ, chúng ta có thể ping tên máy chủ ot-host.local bằng lệnh ping -6 (ping6 dành cho macOS):

$ ping -6 ot-host.local.
PING ot-host.local.(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927)) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=1 ttl=63 time=170 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=2 ttl=63 time=64.2 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=3 ttl=63 time=22.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=4 ttl=63 time=37.7 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=5 ttl=63 time=28.7 ms
...

Lệnh này có thể không thành công trên các máy chủ Linux có lỗi "Name or service not known". Đó là do lệnh ping không phân giải tên ot-host.local. có truy vấn mDNS. Mở /etc/nsswitch.conf và thêm mdns6_minimal vào dòng bắt đầu bằng hosts:

hosts:          files mdns4_minimal mdns6_minimal dns

Tất nhiên, bạn luôn có thể ping trực tiếp địa chỉ IPv6:

$ ping -6 fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
PING fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=1 ttl=63 time=32.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=2 ttl=63 time=27.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=3 ttl=63 time=29.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=4 ttl=63 time=73.5 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=5 ttl=63 time=26.4 ms
...

8. Thiết bị cuối hủy xuất bản dịch vụ

Để xóa địa chỉ và dịch vụ đã đăng ký khỏi nút ứng dụng khách SRP:

> srp client host remove
Done

Bạn sẽ không khám phá được dịch vụ _ipps._tcp ngay bây giờ.

9. Chúc mừng

Xin chúc mừng! Bạn đã thiết lập thành công OTBR làm Bộ định tuyến đường viền chuỗi để cung cấp khả năng kết nối dịch vụ và kết nối IP cho hai thiết bị kết thúc.

Tiếp theo, bạn cần làm gì?

Hãy xem một số lớp học lập trình này...

Tài liệu tham khảo