Python 物联网入门指南(一)(2)https://developer.aliyun.com/article/1506423
直接网络链路
要使两台计算机之间的网络链接正常工作,它们需要使用相同的地址范围。可允许的地址范围由子网掩码确定(例如,255.255.0.0
或255.255.255.0
表示所有 IP 地址应该相同,除了最后两个,或者只是 IP 地址中的最后一个数字;否则,它们将被过滤)。
要在不启用 ICS 的情况下使用直接链接,请检查您正在使用的适配器的 IP 设置
要连接到的 IP 地址,并确定它是自动分配还是固定的
特定的 IP 地址。
直接连接到另一台计算机的大多数 PC 将在169.254.X.X
范围内分配 IP 地址(子网掩码为255.255.0.0
)。但是,我们必须确保网络适配器设置为自动获取 IP 地址。
为了让 Raspberry Pi 能够通过直接链接进行通信,它需要在相同的地址范围169.254.X.X
内具有 IP 地址。如前所述,Raspberry Pi 将自动为自己分配一个合适的 IP 地址并连接到网络。
因此,假设我们有 Apple Bonjour(前面提到过),我们只需要知道分配给 Raspberry Pi 的主机名(raspberrypi
)。
另请参阅
如果您没有键盘或屏幕连接到 Raspberry Pi,您可以使用此网络链接远程访问 Raspberry Pi,就像在普通网络上一样(只需使用您为连接设置的新 IP 地址)。参考通过 VNC 远程连接到 Raspberry Pi和通过 SSH(和 X11 转发)远程连接到 Raspberry Pi。
我的网站pihw.wordpress.com/guides/direct-network-connection
上提供了大量额外信息,包括额外的故障排除提示和连接到 Raspberry Pi 的其他几种方式,而无需专用屏幕和键盘。
通过 USB Wi-Fi dongle 进行网络连接和连接 Raspberry Pi 到互联网
通过在 Raspberry Pi 的 USB 端口添加USB Wi-Fi dongle,即使没有内置 Wi-Fi 的型号也可以连接并使用 Wi-Fi 网络。
准备工作
您需要获取一个合适的 USB Wi-Fi dongle,并且在某些情况下,您可能需要一个有源的 USB 集线器(这将取决于您拥有的 Raspberry Pi 的硬件版本和您的电源供应的质量)。USB Wi-Fi dongles 的一般适用性将取决于内部使用的芯片组以及可用的 Linux 支持水平。您可能会发现一些 USB Wi-Fi dongles 可以在不安装额外驱动程序的情况下工作(在这种情况下,您可以跳转到为无线网络配置它)。
支持的 Wi-Fi 适配器列表可在elinux.org/RPi_USB_Wi-Fi_Adapters
找到。
您需要确保您的 Wi-Fi 适配器也与您打算连接的网络兼容;例如,它支持相同类型的信号802.11bgn和加密WEP、WPA和WPA2(尽管大多数网络都是向后兼容的)。
您还需要了解您网络的以下详细信息:
- 服务集标识符(SSID):这是您的 Wi-Fi 网络的名称,如果您使用以下命令,应该是可见的:
sudo iwlist scan | grep SSID
- 加密类型和密钥:此值将为 None、WEP、WPA 或 WPA2,密钥将是您通常在连接手机或笔记本电脑到无线网络时输入的代码(有时它会被打印在路由器上)。
您将需要一个工作的互联网连接(即有线以太网)来下载所需的驱动程序。否则,您可以找到所需的固件文件(它们将是.deb
文件)并将它们复制到 Raspberry Pi(即通过 USB 闪存驱动器;如果您在桌面模式下运行,驱动器应该会自动挂载)。将文件复制到适当的位置并安装它,使用以下命令:
sudo apt-get install firmware_file.deb
如何做…
此任务有两个阶段:首先,我们识别并安装 Wi-Fi 适配器的固件,然后我们需要为无线网络配置它。
我们将尝试识别您的 Wi-Fi 适配器的芯片组(处理连接的部分);这可能与设备的实际制造商不匹配。
可以使用此命令找到支持的固件的近似列表:
sudo apt-cache search wireless firmware
这将产生类似以下输出的结果(忽略任何没有firmware
在软件包标题中的结果):
atmel-firmware - Firmware for Atmel at76c50x wireless networking chips. firmware-atheros - Binary firmware for Atheros wireless cards firmware-brcm80211 - Binary firmware for Broadcom 802.11 wireless cards firmware-ipw2x00 - Binary firmware for Intel Pro Wireless 2100, 2200 and 2915 firmware-iwlwifi - Binary firmware for Intel PRO/Wireless 3945 and 802.11n cards firmware-libertas - Binary firmware for Marvell Libertas 8xxx wireless cards firmware-ralink - Binary firmware for Ralink wireless cards firmware-realtek - Binary firmware for Realtek wired and wireless network adapters libertas-firmware - Firmware for Marvell's libertas wireless chip series (dummy package) zd1211-firmware - Firmware images for the zd1211rw wireless driver
要找出无线适配器的芯片组,将 Wi-Fi 适配器插入树莓派,然后从终端运行以下命令:
dmesg | grep 'Product:|Manufacturer:'
这个命令将两个命令合并成一个。首先,dmesg
显示内核的消息缓冲区(这是自动开机以来发生的系统事件的内部记录,比如检测到的 USB 设备)。您可以尝试单独使用该命令来观察完整的输出。
|
(管道)将输出发送到grep
命令;grep 'Product:|Manufacturer'
检查它,并且只返回包含Product
或Manufacturer
的行(因此我们应该得到列为Product
和Manufacturer
的任何项目的摘要)。如果您找不到任何内容,或者想要查看所有 USB 设备,请尝试grep 'usb'
命令。
这应该返回类似于以下输出——在这种情况下,我有一个ZyXEL
设备,它有一个ZyDAS
芯片组(快速的谷歌搜索显示zd1211-firmware
适用于ZyDAS
设备):
[ 1.893367] usb usb1: Product: DWC OTG Controller [ 1.900217] usb usb1: Manufacturer: Linux 3.6.11+ dwc_otg_hcd [ 3.348259] usb 1-1.2: Product: ZyXEL G-202 [ 3.355062] usb 1-1.2: Manufacturer: ZyDAS
一旦您确定了您的设备和正确的固件,您可以像安装其他通过apt-get
可用的软件包一样安装它(其中zd1211-firmware
可以替换为您需要的固件)。如下所示:
sudo apt-get install zd1211-firmware
拔出并重新插入 USB Wi-Fi dongle,以便它被检测到并加载驱动程序。我们现在可以使用ifconfig
测试新适配器是否正确安装。输出如下所示:
wlan0 IEEE 802.11bg ESSID:off/any Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm Retry long limit:7 RTS thr:off Fragment thr:off Power Management:off
该命令将显示系统上存在的网络适配器。对于 Wi-Fi,通常是wlan0
或wlan1
,如果您安装了多个,则会有更多。如果没有,请仔细检查所选的固件,或者尝试替代方案,或者在网站上查看故障排除提示。
一旦我们安装了 Wi-Fi 适配器的固件,我们就需要为我们希望连接的网络进行配置。我们可以使用 GUI,就像前面的示例中所示,或者我们可以通过终端手动配置,就像以下步骤中所示:
- 我们需要将无线适配器添加到网络接口列表中,该列表设置在
/etc/network/interfaces
中,如下所示:
sudo nano -c /etc/network/interfaces
使用以前的wlan#
值替换wlan0
,如果需要,添加以下命令:
allow-hotplug wlan0 iface wlan0 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
更改后,按Ctrl + X,Y和Enter保存并退出。
- 我们现在将我们网络的 Wi-Fi 网络设置存储在
wpa_supplicant.conf
文件中(如果您的网络不使用wpa
加密,不用担心;这只是文件的默认名称):
sudo nano -c /etc/wpa_supplicant/wpa_supplicant.conf
它应该包括以下内容:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=GB
网络设置可以写入此文件,如下所示(即,如果 SSID 设置为theSSID
):
- 如果不使用加密,请使用此代码:
network={ ssid="theSSID" key_mgmt=NONE }
- 使用
WEP
加密(即,如果WEP
密钥设置为theWEPkey
),使用以下代码:
network={ ssid="theSSID" key_mgmt=NONE wep_key0="theWEPkey" }
- 对于
WPA
或WPA2
加密(即,如果WPA
密钥设置为theWPAkey
),使用以下代码:
network={ ssid="theSSID" key_mgmt=WPA-PSK psk="theWPAkey" }
- 您可以使用以下命令启用适配器(如果需要,请再次替换
wlan0
):
sudo ifup wlan0
使用以下命令列出无线网络连接:
iwconfig
您应该看到您的无线网络连接,并列出您的 SSID,如下所示:
wlan0 IEEE 802.11bg ESSID:"theSSID" Mode:Managed Frequency:2.442 GHz Access Point: 00:24:BB:FF:FF:FF Bit Rate=48 Mb/s Tx-Power=20 dBm Retry long limit:7 RTS thr:off Fragment thr:off Power Management:off Link Quality=32/100 Signal level=32/100 Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:15 Missed beacon:0
如果不是,请调整您的设置,并使用sudo ifdown wlan0
关闭网络接口,然后使用sudo ifup wlan0
打开它。这将确认您已成功连接到您的 Wi-Fi 网络。
- 最后,我们需要检查我们是否可以访问互联网。在这里,我们假设网络已自动配置为 DHCP,并且不使用代理服务器。如果不是,请参考通过代理服务器连接到互联网的示例。
拔掉有线网络电缆(如果仍然连接),然后查看是否可以 ping 通树莓派网站,如下所示:
**sudo ping** www.raspberrypi.org
如果您想快速知道树莓派当前使用的 IP 地址,可以使用hostname -I
,或者要找出哪个适配器连接到哪个 IP 地址,可以使用ifconfig
。
还有更多…
Raspberry Pi 的 A 型版本没有内置的网络端口,因此为了获得网络连接,必须添加 USB 网络适配器(可以是 Wi-Fi dongle,如前一节所述,也可以是 LAN-to-USB 适配器,如下一节所述)。
使用 USB 有线网络适配器
就像 USB Wi-Fi 一样,适配器的支持取决于所使用的芯片组和可用的驱动程序。除非设备配备了 Linux 驱动程序,否则您可能需要在互联网上搜索以获取适用的 Debian Linux 驱动程序。
如果找到合适的.deb
文件,可以使用以下命令进行安装:
sudo apt-get install firmware_file.deb
还可以使用ifconfig
进行检查,因为一些设备将自动受支持,显示为eth1
(或者在 A 型上为eth0
),并且可以立即使用。
通过代理服务器连接到互联网
一些网络,例如工作场所或学校内的网络,通常要求您通过代理服务器连接到互联网。
准备工作
您需要代理服务器的地址,包括用户名和密码(如果需要)。
您应该确认树莓派已连接到网络,并且可以访问代理服务器。
使用ping
命令进行检查,如下所示:
ping proxy.address.com -c 4
如果失败(没有响应),您需要确保继续之前网络设置正确。
如何操作…
- 使用
nano
创建一个新文件,如下所示(如果文件中已经有一些内容,可以在末尾添加代码):
sudo nano -c ~/.bash_profile
- 要允许通过代理服务器进行基本的网页浏览,例如Midori,您可以使用以下脚本:
function proxyenable { # Define proxy settings PROXY_ADDR="proxy.address.com:port" # Login name (leave blank if not required): LOGIN_USER="login_name" # Login Password (leave blank to prompt): LOGIN_PWD= #If login specified - check for password if [[ -z $LOGIN_USER ]]; then #No login for proxy PROXY_FULL=$PROXY_ADDR else #Login needed for proxy Prompt for password -s option hides input if [[ -z $LOGIN_PWD ]]; then read -s -p "Provide proxy password (then Enter):" LOGIN_PWD echo fi PROXY_FULL=$LOGIN_USER:$LOGIN_PWD@$PROXY_ADDR fi #Web Proxy Enable: http_proxy or HTTP_PROXY environment variables export http_proxy="http://$PROXY_FULL/" export HTTP_PROXY=$http_proxy export https_proxy="https://$PROXY_FULL/" export HTTPS_PROXY=$https_proxy export ftp_proxy="ftp://$PROXY_FULL/" export FTP_PROXY=$ftp_proxy #Set proxy for apt-get sudo cat <<EOF | sudo tee /etc/apt/apt.conf.d/80proxy > /dev/null Acquire::http::proxy "http://$PROXY_FULL/"; Acquire::ftp::proxy "ftp://$PROXY_FULL/"; Acquire::https::proxy "https://$PROXY_FULL/"; EOF #Remove info no longer needed from environment unset LOGIN_USER LOGIN_PWD PROXY_ADDR PROXY_FULL echo Proxy Enabled } function proxydisable { #Disable proxy values, apt-get and git settings unset http_proxy HTTP_PROXY https_proxy HTTPS_PROXY unset ftp_proxy FTP_PROXY sudo rm /etc/apt/apt.conf.d/80proxy echo Proxy Disabled }
- 完成后,按Ctrl + X,Y和Enter保存并退出。
脚本被添加到用户自己的.bash_profile
文件中,在特定用户登录时运行。这将确保代理设置被分别保存给每个用户。如果您希望所有用户使用相同的设置,可以将代码添加到/etc/rc.local
中(此文件必须在末尾有exit 0
)。
工作原理…
许多使用互联网的程序在连接之前会检查http_proxy
或HTTP_PROXY
环境变量。如果存在,它们将使用代理设置进行连接。一些程序也可能使用HTTPS
和FTP
协议,因此我们也可以在这里为它们设置代理设置。
如果代理服务器需要用户名,则会提示输入密码。通常不建议在脚本中存储密码,除非您确信没有其他人能够访问您的设备(无论是物理上还是通过互联网)。
最后一部分允许使用sudo
命令执行的任何程序在扮演超级用户时使用代理环境变量(大多数程序首先尝试使用普通权限访问网络,即使作为超级用户运行,所以并不总是需要)。
还有更多…
我们还需要允许某些程序使用代理设置,这些程序在访问网络时使用超级用户权限(这取决于程序;大多数不需要这样做)。我们需要通过以下步骤将命令添加到存储在/etc/sudoers.d/
中的文件中:
- 使用以下命令打开一个新的
sudoer
文件:
sudo visudo -f /etc/sudoers.d/proxy
- 在文件中输入以下文本(一行):
Defaults env_keep += "http_proxy HTTP_PROXY https_proxy HTTPS_PROXY ftp_proxy FTP_PROXY"
- 完成后,按Ctrl + X,Y和Enter保存并退出;不要更改
proxy.tmp
文件名(这对于visudo
是正常的;完成后它会将其更改为 proxy)。 - 如果提示“现在怎么办?”,则命令中存在错误。按X退出而不保存并重新输入命令。
- 重新启动后(使用
sudo reboot
),您将能够使用以下命令分别启用和禁用代理:
proxyenable proxydisable
在这里使用visudo
很重要,因为它确保了为sudoers
目录正确创建文件的权限(只能由root
用户读取)。
通过 VNC 远程连接到树莓派网络
通常,最好远程连接和控制树莓派跨网络,例如,使用笔记本电脑或台式电脑作为屏幕和键盘,或者当树莓派连接到其他地方时,也许甚至连接到一些需要靠近的硬件。
VNC 只是远程连接到树莓派的一种方式。它将创建一个新的桌面会话,可以远程控制和访问。这里的 VNC 会话与树莓派显示上可能活动的会话是分开的。
准备工作
确保您的树莓派已经启动并连接到互联网。我们将使用互联网连接来使用apt-get
安装程序。这是一个允许我们直接从官方存储库中查找和安装应用程序的程序。
如何做…
- 首先,我们需要使用以下命令在树莓派上安装 TightVNC 服务器。建议先运行
update
命令以获取要安装的软件包的最新版本,如下所示:
sudo apt-get update sudo apt-get install tightvncserver
- 接受提示进行安装,并等待直到完成。要启动会话,请使用以下命令:
vncserver :1
- 第一次运行时,它将要求您输入一个密码(不超过八个字符)以访问桌面(您在从计算机连接时将使用此密码)。
以下消息应该确认已启动新的桌面会话:
New 'X' desktop is raspberrypi:1
如果您还不知道树莓派的 IP 地址,请使用hostname -I
并记下它。
接下来,我们需要运行 VNC 客户端。VNC Viewer是一个合适的程序,可以在www.realvnc.com/
上找到,并且应该可以在 Windows、Linux 和 OS X 上运行。
运行 VNC Viewer 时,将提示您输入服务器地址和加密类型。使用您的树莓派的 IP 地址与:1
。也就是说,对于 IP 地址192.168.1.69
,使用192.168.1.69:1
地址。
您可以将加密类型保留为关闭或自动。
根据您的网络,您可以使用主机名;默认值为raspberrypi
,即raspberrypi:1
。
可能会有一个关于以前未连接到计算机或没有加密的警告。如果您正在使用公共网络或在互联网上进行连接(以阻止其他人能够拦截您的数据),您应该启用加密。
还有更多…
您可以添加选项到命令行以指定显示的分辨率和颜色深度。分辨率和颜色深度越高(可以调整为每像素使用 8 位到 32 位以提供低或高颜色细节),通过网络链接传输的数据就越多。如果发现刷新速率有点慢,请尝试按照以下方式减少这些数字:
vncserver :1 -geometry 1280x780 -depth 24
要允许 VNC 服务器在打开时自动启动,您可以将vncserver
命令添加到.bash_profile
(这在每次树莓派启动时执行)。
使用nano
编辑器如下(-c
选项允许显示行号):
sudo nano -c ~/.bash_profile
将以下行添加到文件的末尾:
vncserver :1
下次启动时,您应该能够使用 VNC 从远程连接到树莓派
另一台计算机。
通过 SSH(和 X11 转发)远程连接到树莓派
安全外壳(SSH)通常是进行远程连接的首选方法,因为它只允许终端连接,并且通常需要更少的资源。
SSH 的一个额外功能是能够将X11数据传输到运行在您的计算机上的X Windows服务器。这允许您启动通常在树莓派桌面上运行的程序,并且它们将出现在本地计算机上的自己的窗口中,如下所示:
在本地显示上的 X11 转发
X11 转发可用于在 Windows 计算机上显示在树莓派上运行的应用程序。
准备工作
如果您正在运行最新版本的 Raspbian,则 SSH 和 X11 转发将默认启用(否则,请仔细检查*它是如何工作…*部分中解释的设置)。
如何做…
Linux 和 OS X 都内置支持 X11 转发,但如果你使用 Windows,你需要在计算机上安装和运行 X Windows 服务器。
从Xming网站(sourceforge.net/projects/xming/
)下载并运行xming
。
安装xming
,按照安装步骤进行安装,包括安装PuTTY(如果您还没有)。您也可以从www.putty.org/
单独下载 PuTTY。
接下来,我们需要确保我们连接时使用的 SSH 程序启用了 X11。
对于 Windows,我们将使用 PuTTY 连接到树莓派。
在 PuTTY 配置对话框中,导航到连接 | SSH | X11,并选中启用 X11 转发的复选框。如果将 X 显示位置选项留空,它将假定默认的Server 0:0
如下(您可以通过将鼠标移到运行时系统托盘中的 Xming 图标上来确认服务器号):
在 PuTTY 配置中启用 X11 转发
在会话设置中输入树莓派的 IP 地址(您还可以在这里使用树莓派的主机名;默认主机名是raspberrypi
)。
使用适当的名称保存设置,RaspberryPi
,然后单击打开以连接到您的树莓派。
您可能会看到一个警告消息弹出,指出您以前没有连接到计算机(这样可以在继续之前检查是否一切正常):
使用 PuTTY 打开到树莓派的 SSH 连接
对于 OS X 或 Linux,单击终端以打开到树莓派的连接。
要使用默认的pi
用户名连接,IP 地址为192.168.1.69
,使用以下命令;-X
选项启用 X11 转发:
ssh -X pi@192.168.1.69
一切顺利的话,您应该会收到一个输入密码的提示(请记住pi
用户的默认值是raspberry
)。
确保 Xming 正在运行,方法是从计算机的开始菜单启动 Xming 程序。然后,在终端窗口中,输入通常在树莓派桌面内运行的程序,如leafpad
或scratch
。等一会儿,程序应该会出现在您的计算机桌面上(如果出现错误,您可能忘记启动 Xming,所以请运行它并重试)。
它是如何工作的…
X Windows 和 X11 是提供树莓派(以及许多其他基于 Linux 的计算机)显示和控制图形窗口作为桌面一部分的方法。
要使 X11 转发在网络连接上工作,我们需要在树莓派上同时启用 SSH 和 X11 转发。执行以下步骤:
- 要打开(或关闭)SSH,您可以访问树莓派配置
在桌面的首选项菜单下的 SSH 中,单击接口选项卡,如下截图所示(大多数发行版通常默认启用 SSH,以帮助允许远程连接而无需显示器进行配置):
raspi-config 工具中的高级设置菜单
- 确保在树莓派上启用了 X11 转发(大多数发行版现在默认已启用此功能)。
- 使用以下命令使用
nano
:
sudo nano /etc/ssh/sshd_config
- 在
/etc/ssh/sshd_config
文件中查找控制 X11 转发的行,并确保它说yes
(之前没有#
符号),如下所示:
X11Forwarding yes
- 如果需要,按Ctrl + X,Y和Enter保存并重新启动(如果需要更改)如下:
sudo reboot
还有更多…
SSH 和 X11 转发是远程控制树莓派的便捷方式;我们将在以下部分探讨如何有效使用它的一些额外提示。
通过 X11 转发运行多个程序
如果您想运行X 程序,但仍然可以在同一终端控制台上运行其他内容,可以使用&
将命令在后台运行,如下所示:
leafpad &
只需记住,您运行的程序越多,一切就会变得越慢。您可以通过输入fg
切换到后台程序,并使用bg
检查后台任务。
通过 X11 转发作为桌面运行
您甚至可以通过 X11 运行完整的桌面会话,尽管它并不特别用户友好,而且 VNC 会产生更好的结果。要实现这一点,您必须使用lxsession
而不是startx
(以您通常从终端启动桌面的方式)。
另一种选择是使用lxpanel
,它提供了程序菜单栏,您可以从菜单中启动和运行程序,就像在桌面上一样。
通过 X11 转发运行 Pygame 和 Tkinter
在运行Pygame或Tkinter脚本时,您可能会遇到以下错误(或类似错误):
_tkinter.TclError: couldn't connect to display "localhost:10.0"
在这种情况下,使用以下命令来修复错误:
sudo cp ~/.Xauthority ~root/
Python 物联网入门指南(一)(4)https://developer.aliyun.com/article/1506430