【车联网原型系统|四】adhoc组网+frp内网穿透
物联网原型系统导航
【车联网原型系统|一】项目介绍+需求分析+概要设计 https://blog.csdn.net/weixin_46291251/article/details/125807297
【车联网原型系统|二】数据库+应用层协议设计 https://blog.csdn.net/weixin_46291251/article/details/125808107
【车联网原型系统|三】树莓派设计+模拟基站程序 https://blog.csdn.net/weixin_46291251/article/details/125808229
【车联网原型系统|四】adhoc组网+frp内网穿透 https://blog.csdn.net/weixin_46291251/article/details/125808621
【车联网原型系统|五】前后端分离 https://blog.csdn.net/weixin_46291251/article/details/125808674
【车联网原型系统|六】效果展示 https://blog.csdn.net/weixin_46291251/article/details/125808845
【源码下载】 https://download.csdn.net/download/weixin_46291251/86227197
文章目录
【车联网原型系统|四】adhoc组网+frp内网穿透
ad-hoc组网
小车树莓派与基站(电脑)间通过wifi连接,当小车树莓派连接不到基站(电脑)时,尝试与其他小车树莓派通过ad-hoc方式连接,进行数据传输。
概述
Ad-Hoc(点对点)模式:ad-hoc模式就和以前的直连双绞线概念一样,是P2P的连接。Ad Hoc结构是一种省去了无线中介设备AP而搭建起来的对等网络结构,只要安装了无线网卡,计算机彼此之间即可实现无线互联;其原理是网络中的一台计算机主机建立点到点连接,相当于虚拟AP,而其他计算机就可以直接通过这个点对点连接进行网络互联与共享。
Ad hoc网络是一种特殊的无线移动网络。网络中所有结点的地位平等,无需设置任何的中心控制结点。网络中的结点不仅具有普通移动终端所需的功能,而且具有报文转发能力。
Ad-hoc具有以下特点:
-
无中心:Ad hoc网络没有严格的控制中心。所有结点的地位平等,即是一个对等式网络。结点可以随时加入和离开网络。任何结点的故障不会影响整个网络的运行,具有很强的抗毁性。
-
自组织:网络的布设或展开无需依赖于任何预设的网络设施。结点通过分层协议和分布式算法协调各自的行为,结点开机后就可以快速、自动地组成一个独立的网络。
-
多跳路由:当结点要与其覆盖范围之外的结点进行通信时,需要中间结点的多跳转发。与固定网络的多跳不同,Ad hoc网络中的多跳路由是由普通的网络结点完成的,而不是由专用的路由设备(如路由器)完成的
-
动态拓扑:Ad hoc网络是一个动态的网络。网络结点可以随处移动,也可以随时开机和关机,这些都会使网络的拓扑结构随时发生变化。 这些特点使得Ad hoc网络在体系结构、网络组织、协议设计等方面都与普通的蜂窝移动通信网络和固定通信网络有着显著的区别。
配置
Linux & Raspbian PI OS
修改配置文件 /etc/network/interfaces,将内容修改为下述内容,小车启动该配置文件时将会自动修改网卡的相关配置,包括 静态IP模式,Ad-hoc的地址,网关,
# sudo vim /etc/network/interfaces
auto wlan0 #不一定是wlan0,看具体网卡name
iface wlan0 inet static
address 10.0.0.1 #小车1
#address 10.0.0.2 #小车2
#address 10.0.0.3 #小车3
netmask 255.255.255.0
wireless-essid rxy-adhoc
wireless-mode ad-hoc
wireless-channel 11
三个主机上的配置修改要相互照应,例如设置相同的essid确保ad-hoc的标识一致,主机之间可以彼此之间确定要建立Ad-hoc的对象;
网卡设置为ad-hoc模式,默认的网卡模式为managed,该模式下网卡可以正常连接wifi网络,在ad-hoc模式下,网卡将不再能够直接连接wifi网络,而是通过ad-hoc直接建立和连接这样的一个点对点的多跳网络。
网卡设置信道,配置同一ad-hoc的主机设别必须在同一信道下才能实现ad-hoc的点到点通信,不同信道的频率不同;以下列出了raspberry pi 4B的默认网卡的可用信道。
sudo /etc/init.d/networking restart #重启网络配置
设置好Ad-hoc的网络配置文件后,通过上述命令重启网络配置。linux下使用ifconfig和iwconfig进行查看是否配置成功
上述方式通过修改主机全局配置的方式设置Ad-hoc网络,如果上述方式不生效,可以采用手动配置的方式。
su root
ifconfig wlan0 down #关闭网络wlan0,看具体名称
wconfig wlan0 mode ad-hoc #ad-hoc模式
iwconfig wlan0 channel 11 #信道
iwconfig wlan0 essid rxyadhoc #ad-hoc id标识
ifconfig wlan0 up #启动网络wlan0,看具体名称
ifconfig wlan0 10.0.0.5 #地址
ifconfig wlan0 netmask 255.255.255.0 #网关
windows
windows可以实现ad-hoc,但是实际上建立的是一个无线Access Point,可以通过该ad-hoc实现流量的共享;真正意义的ad-hoc是IBSS,但是IBSS已经不再被支持,因此无法实现和树莓派建立ad-hoc网络。
但是windows上可以建立AP,通过AP实现Ad-hoc的功能。
前提是网卡必须支持承载网络功能,我们的实验使用的主机默认网卡不支持承载网络功能,我们使用了额外的支持承载网络的网卡进行配置。
netsh wlan show drivers #查看网卡是否支持承载网络
netsh wlan set hostednetwork mode=allow ssid=rxyadhoc key=00000000 **#新建Ad-hoc网络**
netsh wlan start hostednetwork **#启动无线发射**
netsh wlan stop hostednetwork #关闭**
set hostednetwork建立承载网络,mode选择模式,ssid是ad-hoc的名称,key是该ad-hoc的密钥。
网络拓扑
组网的效果图如上图所示,小车1,小车2,基站都处于Ad-hoc组网内,且它们的地址分别是10.0.0.1,10.0.0.2,10.0.0.5,Ad-hoc内通过以上地址互相访问和发送消息。我们在小车上分别部署了小车的控制程序,利用基站与小车进行交互。
另外,基站的第二张网卡和外网联通,通过互联网可以向基站发送指令,基站再通过Ad-hoc组网与小车进行交互。模拟基站上部署了Django写的联网程序的Server端,然后用户通过Client端向Server发送指令进而控制小车。
frp内网穿透
frp介绍
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
frp 分为服务端与客户端,前者运行在有公网 IP 的服务器上,后者运行在局域网内的设备上,服务端默认会先开放 7000 端口,然后客户端与其相连
同时客户端可以开启用于 ssh 的端口,与服务端的某个端口做映射,这样我们在终端访问服务端的端口时,会自动转发到客户端去
比如frpc.ini配置文件里的客户端端口22映射到服务器的6000端口,终端设备通过6000端口,访问内网里的22端口(ssh方式)
工作原理:
- 服务端运行,监听一个主端口,等待客户端的连接;
- 客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
- 服务端fork新的进程监听客户端指定的端口;
- 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
- 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。
配置服务器
这里采用的是阿里云服务器进行配置。
先编写ini配置文件,指定程序监听的端口,以及可以可以转发的端口。
[common]
bind_port = 7000
kcp_bind_port = 7000
vhost_https_port = 7001
dashboard_addr = 127.0.0.1**
dashboard_port = 7500
dashboard_user = userxxx
dashboard_pwd = passwd
log_file = ./frps.log
log_level = info
log_max_days = 3
authentication_timeout = 900
token = tokennn
allow_ports = 15000-16000
max_pool_count = 50
max_ports_per_client = 0
然后指定这个配置文件,执行服务器frps程序。
配置客户端
配置好上述服务器之后,就可以进行客户端到登陆和连接。
首先编写ini配置文件
1.[common]
2.server_addr = xxx.xxx.xxx.xxx
3.server_port = 7000
4.token = passwd
5.login_fail_exit = false
6.
7.[Raspberry-Pi-B]
8.type = tcp
9.local_ip = 127.0.0.1
10.local_port = 15102
11.remote_port = 15102
12.
13.[iot-trolley-system]
14.type = tcp
15.local_ip = 127.0.0.1
16.local_port = 15103
17.remote_port = 15103
然后运行frpc客户端程序,并指定刚才创建的ini文件运行。
连接之后效果如图:
客户端成功连接到服务器,现在就可以直接连接公网服务器上的端口,frp程序会自动进行转发,本地端口就可以收到来自公网的连接,从而实现了内网穿透。