桌面右上角点击,打开选项,找到WiFi的选择网络或者WiFi设置
在弹出的窗口中选择需要连接的WiFi,然后右下角选择连接,然后输入WiFi密码即可连接。
25.4. 命令行连接wifi路由器
命令行配置wifi的方法有很多,下面介绍几种常用的wifi工具
nmtui 图形化的NetworkManager网络配置
nmcli(NetworkManager Command Line) 系统官方使用的工具 – 桌面的wifi控制由该工具提供, 特点:简单好用
wpa_cli(开源社区的网络工具)比较多人使用的wifi工具 特点:资料多,配置后简单快捷
25.4.1. nmtui
进入图形配置
1 |
sudo nmtui |
移动键盘方向键移动到
Active a connection
按Enter键
进入wifi设置
然后移动方向键到你要连接的wifi,按
Enter键
如果是连接未连接的有密码的热点则进入输入密码界面
如果是没有密码或者已连接的热点则连接热点或者取消连接热点
注解
使用有些网卡(如rtl8821cu),系统会生成两个网络接入点p2p0和wlan0, wifi使用哪个节点连接都可以,使用p2p0会方便设置, 使用wlan0会比较符合广大网友们的习惯
第一次连接有密码的热点时,如图下
输入密码后,就可以看到wifi已连接
如果想要断开wifi,在已连接的状态按下 Enter键
就可以断开连接
25.4.2. nmcli
1 2 3 4 5 6 7 8 9 10 11 12 |
# 列出可用的wifi接入点, list可以省略 sudo nmcli dev wifi list # 连接热点PPP, 连接成功后,就会自动生成配置文件,以后要再连接,可以使用nmcli connectio up mySSID命令了 sudo nmcli dev wifi connect PPP password '00000000' ifname wlan0 #如果连接成功后,下次想再连接,就可以使用 sudo nmcli dev wifi connect PPP #更多nmcli的命令可以使用来查看 nmcli help nmcli OBJECT help |
nmcli命令组成
nmcli [OPTIONS] OBJECT { COMMAND | help }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
OPTIONS -o[verview] overview mode (hide default values) -t[erse] terse output -p[retty] pretty output -m[ode] tabular|multiline output mode -c[olors] auto|yes|no whether to use colors in output -f[ields] <field1,field2,...>|all|common specify fields to output -g[et-values] <field1,field2,...>|all|common shortcut for -m tabular -t -f -e[scape] yes|no escape columns separators in values -a[sk] ask for missing parameters -s[how-secrets] allow displaying passwords -w[ait] <seconds> set timeout waiting for finishing operations -v[ersion] show program version -h[elp] print this help #OBJECT可以用缩写表示 OBJECT g[eneral] NetworkManager's general status and operations n[etworking] overall networking control r[adio] NetworkManager radio switches c[onnection] NetworkManager's connections d[evice] devices managed by NetworkManager a[gent] NetworkManager secret agent or polkit agent m[onitor] monitor NetworkManager changes Command 可以通过 nmcli OBJECT help 来获得 |
下列列举部分常用的命令
命令 |
作用 |
---|---|
nmcli n |
显示 NetworkManager 是否接管网络设置 |
nmcli n on |
设定 NetworkManager 接管网络 |
nmcli n off |
取消 NetworkManager 接管网络 |
nmcli c status |
查看连接简略信息 |
nmcli c show |
查看连接详细信息 |
nmcli c up/down ifname |
启动/关闭指定连接(ifname 网卡) |
nmcli c show(s) ifname |
查看ifname网卡的连接详细信息 |
nmcli c delete(de) ens33 |
删除指定连接 |
nmcli d status |
查看设备简略信息 |
nmcli d show |
查看设备详细信息 |
nmcli d sh ens33 |
显示某一特定设备的详细信息 |
nmcli d connect(c) ens33 |
连接设备 |
nmcli d disconnect(c) ens33 |
断开设备 |
1 2 3 4 5 6 7 |
#先列出连接的配置,eth0现在连接的是Wired connection 1 root@lubancat:~# nmcli c s NAME UUID TYPE DEVICE Wired connection 1 35ecb023-3194-3edb-bf90-4198f82329a8 ethernet eth0 Wired connection 2 45f86cca-f8df-376e-8aad-37e10d2a65ce ethernet -- aEBF_Guest fb1d506e-6dc7-4c5b-a4ce-339f3349d26d wifi wlan0 |
然后对Wired connection 1进行修改
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#静态ip设置 sudo nmcli c modify 'aEBF_Guest' [ + | - ]选项 选项值 # 或 sudo nmcli c m 'aEBF_Guest' ipv4.address 192.168.103.172/24 # 修改 IP 地址和子网掩码 sudo nmcli c m 'aEBF_Guest' ipv4.method manual # 修改为静态配置,默认是 auto sudo nmcli c m 'aEBF_Guest' ipv4.gateway 192.168.103.254 # 修改默认网关 sudo nmcli c m 'aEBF_Guest' ipv4.dns 8.8.8.8 # 修改 DNS sudo nmcli c m 'aEBF_Guest' +ipv4.dns 114.114.114.114 # 添加一个 DNS sudo nmcli c m 'aEBF_Guest' ipv6.method disabled # 将 IPv6 禁用 sudo nmcli c m 'aEBF_Guest' connection.autoconnect yes # 开机启动 注意,必须先修改 ipv4.address,然后才能修改 ipv4.method! 用空引号""代替选项的值,可将选项设回默认值(以 ipv4.method 为例): |
详细的文档连接
25.4.3. wpa_cli
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#使能wifi wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf #进入专用控制台,默认选择wlan0 wpa_cli #添加网络,获取网络id号 add_network #假设id号为2 #设置需要连接的wifi名称 set_network 2 ssid "PPP" #设置wifi的安全性:wpa set_network 2 key_mgmt WPA-PSK #设置需要连接的密码 set_network 2 psk "88888888" #使能wifi enable_network 2 #保存wifi信息 save_config #列出所有在列表里的wifi以及序号 list_networks #根据序号选择你要连接的wifi select_network 2 #查看连接的WiFi status #退出 quit #自动获取IP dhclient wlan0 |
语句 |
功能 |
举例 |
---|---|---|
quit |
退出模式 |
quit |
scan |
扫描wifi |
scan |
scan_results |
查看扫描结果 |
scan_results |
new_password |
更换新密码 |
new_password 1 “密码” |
disale_network |
禁止WiFi |
disale_network 2 |
list_networks |
列出所有在列表里的wifi以及序号 |
list_networks |
select_network |
根据序号选择你要连接的wifi |
select_network 2 |
remove_network |
移除你不想要的wifi |
remove_network 2 |
disconnect |
停止wifi的连接 |
disconnect |
reconnect |
重新连接wifi |
reconnect |
help |
查看更多的选项 |
help |
当然也可以直接修改配置文件 /etc/wpa_supplicant/wpa_supplicant.conf
可以按照格式添加,然后在使用wpa_cli工具进行配置
1 2 3 4 5 6 7 8 |
ctrl_interface=/var/run/wpa_supplicant update_config=1 network={ ssid="PPP" psk="88888888" key_mgmt=WPA-PSK } |
25.4.4. 开启无线热点
25.4.4.1. nmcli
(NetworkManager Command Line)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
热点-72Mbps WIFI4 #使用该方法只能创建出WIFI4的热点,理论速率可达72Mbps,实测速率在50Mbps,换算大约6MB/s #5g sudo nmcli device wifi hotspot ifname wlan0 con-name AP-5G ssid LubanCat-AP-5G band a channel 36 password 88888888 #2.4g sudo nmcli device wifi hotspot ifname wlan0 con-name AP-2.4G ssid LubanCat-AP-2.4G band bg channel 6 password 88888888 #band 无线协议 bg-2.4G a-5G #channel 信道 可百度科普修改使用,可以下载 “网速管家”wifi分析中查看 #无线名字 - ssid #密码 - password #con-name 连接名,如果首次创建成功后可以直接使用 sudo nmcli device wifi hotspot #查看热点信息以及密码 sudo nmcli device wifi show-password #如果需要连接外网,即设备可以通过wifi连接到互联网上,就需要设置转发(假设网口能够连接互联网) echo 1 > /proc/sys/net/ipv4/ip_forward #如果eth1联网的话,可以把eth0换成eth1 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
25.4.4.2. hostapd
使用该方法可能稳定性会比较差,有时可能会断连的情况 下面是两个频率的wifi热点理论速率 - 2.4G - 72Mbps - 5G - 150Mps(802.11.n)单天线最大-150Mps
实测速率
2.4G - 50Mbps 大约6MB/s
5G - 120Mbps 大约15MB/s
25.4.4.2.1. 安装依赖
1 2 |
#下载工具hostapd 和 dhcpd sudo apt install hostapd isc-dhcp-server |
25.4.4.2.2. 创建配置文件
2.4G详细的配置 2G.conf
5G详细的配置 5G.conf
hostapd配置里每个详细数据的详解 hostapd.conf
修改 /etc/hostapd/hostapd.conf 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
sudo vi /etc/hostapd/hostapd.conf #简化版(5G) interface=wlan0 ctrl_interface=/var/run/hostapd ssid=LuBanCat-5G channel=36 wpa=2 wpa_passphrase=password driver=nl80211 beacon_int=100 hw_mode=a ieee80211n=1 wme_enabled=1 ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40+] wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP max_num_sta=8 wpa_group_rekey=86400 #简化版(2.4G) interface=wlan0 ctrl_interface=/var/run/hostapd ssid=LuBanCat-2.4G channel=6 wpa=2 wpa_passphrase=password driver=nl80211 beacon_int=100 hw_mode=g ieee80211n=1 wme_enabled=1 ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40+] wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP max_num_sta=8 wpa_group_rekey=86400 |
修改 /etc/dhcp/dhcpd.conf
1 2 3 4 5 6 7 8 9 10 |
#在末尾加入以下内容: subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.2 192.168.0.10; option routers 192.168.0.1; option domain-name-servers 192.168.0.1,114.114.114.114,8.8.8.8; } 其中114.114.114.114是全国通用DNS地址,8.8.8.8则是全球通用DNS地址 |
25.4.4.2.3. 设置脚本
用于关闭sta模式,打开ap模式以及关闭ap模式,打开sta模式
关闭sta模式,打开ap模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#创建脚本 vi ap-start.sh #给予权限 sudo chmod +x ap-start.sh #!/bin/bash bash -c "echo 1 > /proc/sys/net/ipv4/ip_forward" # 开启防火墙NAT转发(如果本机使用eth1上网,则把eth0改为eth1) iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 关闭NetworkManager对无线网卡的控制 nmcli d disconnect wlan0 # 设置并启动无线网卡 ifconfig wlan0 192.168.0.1 netmask 255.255.255.0 # 解锁无线设备,可以用rfkill list查看解锁结果. rfkill unblock wlan # 睡眠6秒,待rfkill解锁生效 sleep 6s # 启动dhcpd和hostapd,如果hostapd无法启动请查看日志hostapd.log,查看这两个进程ps -ef|egrep "dhcpd|hostapd" nohup hostapd /etc/hostapd/hostapd.conf >/home/cat/hostapd.log 2>&1 & dhcpd wlan0 -pf /var/run/dhcpd.pid ps -ef|head -n1 && ps -ef|egrep "dhcpd|hostapd" |
关闭ap模式,打开sta模式
1 2 3 4 5 6 7 8 9 10 11 |
#创建脚本 vi ap-stop.sh #给予权限 sudo chmod +x ap-stop.sh #!/bin/bash killall hostapd dhcpd bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward" nmcli d connect wlan0 nmcli d disconnect wlan0 nmcli d connect wlan0 |
当我们打开ap模式时,需要有3个进程,不然会开启失败
如果失败可以使用
1 2 |
cat /home/cat/hostapd.log #查看失败的原因 |
可以根据失败原因到百度上找出问题.
桌面系统配置蓝牙
默认蓝牙是打开的状态,点击右上角选项找到蓝牙设置
在打开的界面中,找到需要连接的蓝牙设备,然后双击点击即可连接。
如果连接的设备需要配对,则会弹出PIN码确认窗口,需要板卡和连接的设备都进行确认,确认后即可连接。
26.2. 命令行配置蓝牙
使用命令行配置蓝牙,我们需要使用工具—-bluetoothctl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 进入bluetoothctl命令行 bluetoothctl # 进入bluetoothctl命令行后,类似:[bluetooth]# # Controller代表arm板上的蓝牙设备,Device代表蓝牙耳机 # 按如下步骤初始化蓝牙设备,并连接蓝牙耳机 # 查看帮组 help power on agent on default-agent # 启动扫描 scan on # 假如蓝牙耳机地址为:04:8C:9A:F2:54:4B trust 04:8C:9A:F2:54:4B # 配对 pair 04:8C:9A:F2:54:4B # 连接 connect 04:8C:9A:F2:54:4B # 查看蓝牙耳机信息 info 04:8C:9A:F2:54:4B # 断开连接 disconnect 04:8C:9A:F2:54:4B # 不想自动连接上蓝牙耳机,可以删除配对信息 remove 04:8C:9A:F2:54:4B |
更多关于命令行蓝牙连接,可参考 arm 使用bluetoothctl连接蓝牙耳机-CSDN博客
26.3. 蓝牙串行通信
首先安装相关的工具
1 2 3 4 |
#安装工具 sudo apt update sudo apt install bluez util-linux sudo apt install bluez bluez-tools bluez-firmware |
26.3.1. 查看蓝牙信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#执行命令 hciconfig -a #打印信息如下 hci0: Type: Primary Bus: USB BD Address: 2C:C3:E6:63:42:57 ACL MTU: 1021:8 SCO MTU: 255:12 UP RUNNING PSCAN RX bytes:4845 acl:0 sco:0 events:434 errors:0 TX bytes:55369 acl:0 sco:0 commands:434 errors:0 Features: 0xff 0xff 0xff 0xfe 0xdb 0xfd 0x7b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH HOLD SNIFF PARK Link mode: SLAVE ACCEPT Name: 'lubancat' Class: 0x3c0000 Service Classes: Rendering, Capturing, Object Transfer, Audio Device Class: Miscellaneous, HCI Version: 4.2 (0x8) Revision: 0x75b8 LMP Version: 4.2 (0x8) Subversion: 0xf098 Manufacturer: Realtek Semiconductor Corporation (93) |
26.3.2. 修改配置文件
修改配置文件/etc/systemd/system/dbus-org.bluez.service
1 |
sudo vim /etc/systemd/system/dbus-org.bluez.service |
修改如下,/usr/libexec/bluetooth/bluetoothd这个路径不同系统可能会不一样,按原本的路径即可
1 2 |
ExecStart=/usr/libexec/bluetooth/bluetoothd -C ExecStartPost=/usr/bin/sdptool add SP |
26.3.3. 重启蓝牙服务
1 2 |
sudo systemctl daemon-reload sudo /etc/init.d/bluetooth restart |
26.3.4. 取消确认蓝牙pin码(非必须)
新建/usr/lib/systemd/system/bt-agent.service 写入以下内容
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=Bluetooth Auth Agent [Service] Type=simple ExecStartPre=/bin/sleep 15 ExecStart=/usr/bin/bt-agent -c NoInputNoOutput User=root [Install] WantedBy=bluetooth.target |
启动服务,重启系统
1 2 3 |
sudo systemctl start bt-agent sudo systemctl enable bt-agent reboot |
26.3.5. 配置蓝牙可以被发现
1 |
sudo hciconfig hci0 piscan |
26.3.6. 连接蓝牙设备
1 |
sudo rfcomm watch hci0 & |
在前面使用 hciconfig -a
命令可以看到蓝牙的名字叫lubancat,地址是2C:C3:E6:63:42:57(不同蓝牙会不一样)。我们打开手机上的蓝牙软件,比如笔者使用的是——蓝牙调试宝,一般在手机应用商店可以下载
打开软件,可以搜索到蓝牙设备,然后进行连接,连接成功,终端会打印提示信息:
1 2 |
Connection from A8:C5:6F:0D:ED:AE to /dev/rfcomm0 Press CTRL-C for hangup |
此时/dev目录下也有一个rfcomm0设备,可以通过下面命令查看:
1 2 |
#执行命令 ls /dev/rfcomm0 |
我们可以通过下面命令发送一些数据到手机的蓝牙调试工具上:
1 |
echo "6666666" > /dev/rfcomm0 |
可以看到手机的蓝牙调试工具上已经收到了相关的数据,
当然手机也可以发送数据到开发板上,比如我们发送一些ASCII码字符串到开发板上, 然后在终端通过cat命令去读取这些数据,可以看到通信是正常的:
1 2 3 4 5 6 7 |
#执行命令 cat /dev/rfcomm0 #打印信息 12 111 6666 |
使用bluetoothctl连接蓝牙耳机
1.安装 bluez,这个软件包提供蓝牙的协议栈;
2.安装 bluez-utils, 其提供 bluetoothctl 工具;
3.插入USB蓝牙后之后,可以使用lsusb命令查看USB设备;
4.运行hciconfig可以看到USB蓝牙;
第一步,先确保pulseaudio已经启动
# 查看pulseaudio是否在运行
pgrep -af pulseaudio
# 或者
ps -A |grep pulseaudio
# 如果没运行以前要先启动pulseaudio,如果连接蓝牙耳机时,就会直接返回连接失败
# 参数说明:--start Start the daemon if it is not running
# pulseaudio -h 可以查看帮助
/usr/bin/pulseaudio --start
#
pulseaudio --kill
PulseAudio 5.x 开始默认支持 A2DP。 确保这些包已经安装Install: pulseaudio-alsa, pulseaudio-bluetooth, bluez, bluez-libs, bluez-utils, bluez-firmwareAUR. 如果没有安装 pulseaudio-bluetooth,蓝牙设备在配对完成后,连接会失败,而且你不会得到任何有用的提示。
第二步,启动bluetoothd服务
# 我使用的arm板是通过如下命令启动bluetoothd
/etc/init.d/bluetooth start
/etc/init.d/bluetooth文件内容如下:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DESC=bluetooth
DAEMON=/usr/libexec/bluetooth/bluetoothd
# If you want to be ignore error of "org.freedesktop.hostname1",
# please enable NOPLUGIN_OPTION.
# NOPLUGIN_OPTION="--noplugin=hostname"
NOPLUGIN_OPTION=""
SSD_OPTIONS="--oknodo --quiet --exec $DAEMON -- $NOPLUGIN_OPTION"
test -f $DAEMON || exit 0
# FIXME: any of the sourced files may fail if/with syntax errors
test -f /etc/default/bluetooth && . /etc/default/bluetooth
test -f /etc/default/rcS && . /etc/default/rcS
set -e
case $1 in
start)
echo "Starting $DESC"
if test "$BLUETOOTH_ENABLED" = 0; then
echo "disabled. see /etc/default/bluetooth"
exit 0
fi
start-stop-daemon --start --background $SSD_OPTIONS
echo "${DAEMON##*/}"
;;
stop)
echo "Stopping $DESC"
if test "$BLUETOOTH_ENABLED" = 0; then
echo "disabled."
exit 0
fi
start-stop-daemon --stop $SSD_OPTIONS
echo "${DAEMON}"
;;
restart|force-reload)
$0 stop
sleep 1
$0 start
;;
status)
pidof ${DAEMON} >/dev/null
status=$?
if [ $status -eq 0 ]; then
echo "bluetooth is running."
else
echo "bluetooth is not running"
fi
exit $status
;;
*)
N=/etc/init.d/bluetooth
echo "Usage: $N {start|stop|restart|force-reload|status}" >&2
exit 1
;;
esac
exit 0
# vim:noet
第三步,使能USB蓝牙设备
hciconfig hci0 up
可以试一下扫描蓝牙设备
# 可以使用如下命令扫描当前可见的蓝牙,不过似乎看到有人说这个命令有些过时,但是我觉得挺好用的
hcitool scan
# 使用l2ping可以像ping命令一样检查蓝牙是否能在线
# 蓝牙地址比如:E3:28:E9:24:21:07
l2ping 蓝牙地址
# sdptool browse查看蓝牙可用服务
sdptool browse E3:28:E9:24:21:07
第四步,使用bluetoothctl连接蓝牙耳机
# 进入bluetoothctl命令行
bluetoothctl
# 进入bluetoothctl命令行后,类似:[bluetooth]#
# Controller代表arm板上的蓝牙设备,Device代表蓝牙耳机
# 按如下步骤初始化蓝牙设备,并连接蓝牙耳机
# 查看帮组
help
#
power on
agent on
default-agent
# 启动扫描
scan on
# 假如蓝牙耳机地址为:E3:28:E9:24:21:07
trust E3:28:E9:24:21:07
# 配对
pair E3:28:E9:24:21:07
# 连接
connect E3:28:E9:24:21:07
# 查看蓝牙耳机信息
info E3:28:E9:24:21:07
# 断开连接
disconnect E3:28:E9:24:21:07
# 不想自动连接上蓝牙耳机,可以删除配对信息
remove E3:28:E9:24:21:07
不出什么问题,则已经连接上蓝牙耳机了。
如果发现连接上了但是蓝牙耳机的音频用不了要做如下检查。
# 查看当前音频卡,是否有蓝牙的耳机,蓝牙耳机对应设备一般以蓝牙地址作为名称的一部分,
# 比如:name: <bluez_card.E3_28_E9_24_21_07>
pacmd list-cards
# 查看音频输入源,是否有蓝牙的耳机
pacmd list-sources
# 比如:name: <bluez_source.E3_28_E9_24_21_07>
# 如果发现有name: <bluez_sink.E3_28_E9_24_21_07.monitor>
# 但是没有bluez_source.E3_28_E9_24_21_07
# 说明蓝牙配置不对
# bluez_sink.E3_28_E9_24_21_07.monitor是不能用于录音的
蓝牙耳机设置设置如下类型:
a2dp_sink -- High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 10, available: yes)
headset_head_unit -- Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 20, available: yes)
off -- Off (sinks: 0, sources: 0, priority: 0, available: yes)
这里可选择"a2dp_sink"或"headset_head_unit"两种配置,其中"headset_head_unit"可以支持音频输入/输出,"a2dp_sink"只支持输出。
所以设置为headset_head_unit才能有蓝牙输入
# 修改配置为:headset_head_unit
pacmd set-card-profile bluez_card.E3_28_E9_24_21_07 headset_head_unit
# 查看可用于播放的音频设备
pacmd list-sinks
# 查看帮助
pacmd help
# 查看状态,包括默认输入输入音频,默认采样等
pacmd stat
# 设置默认音频输出设备
pacmd set-default-sink bluez_sink.E3_28_E9_24_21_07
# 设置默认音频输入设备,默认麦克风
pacmd set-default-source bluez_source.E3_28_E9_24_21_07
————————————————
原文链接:https://blog.csdn.net/chenjk10/article/details/90317028