一.购买腾讯云服务器

1.1说明

服务器买什么都行,之前用过其他的,对比发现像腾讯云阿里云服务器就是很方便,维护管理都是图形化界面,有很多功能,比如远程控制功能,可以直接进入服务器远程控制终端,如果仅仅是自己买的服务器,想登录服务器需要用工具软件或者命令。以Windows为例,

通过 SSH 远程登录 Linux 服务器的指南

SSH(Secure Shell)是远程登录和管理 Linux 服务器的标准协议。

1.1.1 Windows 系统登录方法(推荐使用 PowerShell)

  1. 打开 PowerShell

    • 按 Win + R 输入 powershell 回车

    • 或在开始菜单搜索 "PowerShell"

  2. 基本登录命令

    ssh username@server_ip
    • username:服务器用户名(如 rootubuntu 等)

    • server_ip:服务器公网 IP 地址或域名

  3. 指定端口登录(如果服务器使用非标准端口)

    ssh -p 2222 username@server_ip

    默认 SSH 端口是 22,有些服务器会修改为其他端口

  4. 使用密钥登录(更安全)

    ssh -i C:\path\to\your\private_key.pem username@server_ip
  5. 首次连接确认
    第一次连接时会提示:

    The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
    ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxx.
    Are you sure you want to continue connecting (yes/no/[fingerprint])?

    输入 yes 并回车

1.1.2 图形化工具推荐(Windows)

工具 特点 下载地址
PuTTY 轻量级经典工具 putty.org
MobaXterm 功能全面(推荐) mobaxterm.mobatek.net
WinSCP 文件传输专用 winscp.net

 1.2 腾讯云服务器部署

因为我用来做项目测试,所以申请的免费试用一个月。实名认证一下就可以申请了。

点控制台可以找到自己服务器,然后给服务器装系统,或者点重装系统如下下图,页面提示很好找,一般服务器系统都是Linux,我安装的ubuntu.

再就是重置密码,远程登录到服务器。设置完密码之后SSH登录。

然后就来到你服务器的终端,跟ubuntu终端不一样的是它是白色的而已,像下面。

然后你可以在终端运行命令,比如下载宝塔,FRP,MQTT服务器等软件。

二.部署FRP服务端

2.1 方案一.宝塔部署

2.1.1宝塔安装

功能介绍:快速创建管理web项目,快速预览服务器资源使用情况,文件管理,软件商店。感兴趣的可以自己了解一下

2.1.2软件商店安装FRP

我刚开始想用一下宝塔,所以在服务器终端用命令安装了宝塔,然后访问宝塔web页面,在软件商店下载FRP,毕竟图形化界面安装软件可能形象点,但是我感觉熟悉了命令行,其实命令下载软件更快捷,有什么问题deep seek一下,命令行直接解决。

像安装软件命令,去官网一般都有,宝塔官网宝塔面板(bt.cn) 简单好用的Linux/Windows服务器运维管理面板

然后复制安装命令到服务器终端,等待下载,输y下载就行

下载成功界面。注意保存面板链接,外网链接访问宝塔web界面,用户名和密码用来登录. 

还有两点注意,如下图绿色框两点,一是首次打开浏览器会提示不安全,解决方案如图,选择继续访问即可。二是要去腾讯云服务器的防火墙配置放行端口,才能访问宝塔web页面端口,而且宝塔也有防火墙,也就是你之后要用到哪个端口,要开两次防火墙💔,当然也可以把宝塔上防火墙全开了

点进去你的服务器能看到下面页面,可以看到,默认其实腾讯云给开了windows,Linux远程登录的端口,还预留给ping了,你可以在windows终端ping一下你的公网ip测试网络连通性,如下图

然后注册宝塔账号到软件商店搜索下载就可以了。

安装之后点进去下载frp服务端,

然后可以看到FRP服务端配置,从图片上看出两点,一是宝塔默认这些端口也是没有开放,还是那句不要忘记设置宝塔防火墙。二是FRP的web管理页面,点查看就能看到它的端口,然后浏览器访问:公网Ip+端口,就能访问web页面查看客户端情况这种

补充说明,理论上是这样,但是我在实践中,访问不了web页面,防火墙也开了,就算配置好客户端配置文件,开启FRP客户端程序之后。然后我就用其他方案了---服务器终端直接命令行安装FRP服务端,然后成功了,与上面过程不同的是,我在终端用命令配置了FRP服务端配置文件,因为时间问题,方案一为什么没成功也没有深入研究,但是网上也有这种方法成功的案例,可能是版本问题,也可能是宝塔安装没有操作落实服务端配置文件。

举个例子,就像在腾讯云界面开启了某个防火墙端口,但是有提示说要确保服务器确实开启了那个端口,这时候可以去终端用命令查看开放端口,然后我查看之后确实已经开放了,也就是说有情况可能个例吧,腾讯云页面显示开启成功,但是服务器实际上没开启。

2.2 服务器远程终端安装

其实我在终端安装也不太顺利,总结两点教训,一是绑定服务到某个端口时,检查一下端口是否空闲。二是,运行某个命令后,检查结果是否落实。下面是具体总结:

2.2.1 命令安装服务端FPRS

第一阶段:基础安装

  1. 下载解压

    wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
    tar -zxvf frp_0.52.3_linux_amd64.tar.gz
    • 🕳️ 坑1:网络中断导致下载文件损坏

    • ✅ 解决:使用 wget --retry-connrefused 重试下载

  2. 安装二进制文件

    sudo cp frps /usr/local/bin/
    sudo chmod +x /usr/local/bin/frps
    • 🕳️ 坑2:文件权限不足导致 "command not found"

    • ✅ 解决sudo chmod 755 /usr/local/bin/frps


第二阶段:配置迷宫

  1. 配置文件格式大战

    # 最初使用的 INI 格式(已弃用)
    [common]
    bind_port = 15443
    
    # 最终有效的 TOML 格式
    [common]
    bindPort = 15443  # 注意大写P!
    • 🕳️ 坑3:新版 FRP 弃用 INI 格式但又不完全兼容 TOML

    • 🕳️ 坑4:配置项大小写敏感(bindPort ≠ bindport

    • ✅ 解决:使用.conf扩展名 + INI 格式最稳定

  2. 端口监听之谜

    • 🕳️ 坑5:服务始终监听 7000 默认端口

    • ✅ 发现:配置文件未被正确加载

    • ✅ 验证sudo ps aux | grep frps 检查实际加载的配置


第三阶段:服务管理

  1. Systemd 服务配置

    [Service]
    ExecStart=/usr/local/bin/frps -c /etc/frp/frps.conf
    • 🕳️ 坑6:修改服务文件后未重载

    • ✅ 解决:每次修改后执行 sudo systemctl daemon-reload

  2. 服务启动异常

    • 🕳️ 坑7Active: activating (auto-restart)

    • ✅ 排查journalctl -u frps -xe --no-pager

    • ✅ 关键:发现 "address already in use" 错误


第四阶段:端口冲突攻坚

  1. 端口占用检测

    sudo lsof -i :15443
    sudo ss -tulnp | grep ':15443'
    • 🕳️ 坑8:FRP 自身旧进程占用端口

    • ✅ 解决sudo fuser -k 15443/tcp

  2. 终极解决方案

    # 终止占用进程
    sudo fuser -k 15443/tcp
    
    # 重启服务
    sudo systemctl restart frps


第五阶段:成功标志

✅ 最终验证命令输出

tcp6  0  0 :::15443  :::*  LISTEN  51481/frps
tcp6  0  0 :::16443  :::*  LISTEN  51481/frps

经验总结

问题类型 踩坑次数 根本原因 终极解决方案
配置文件格式 7+ INI/TOML 过渡期兼容性问题 使用 .conf + INI 格式
端口监听失败 5+ 端口占用/配置未加载 fuser -k + 严格验证配置路径
服务管理 4+ daemon 未重载 修改后必执行 daemon-reload
权限问题 3+ root 权限不足 关键操作全用 sudo
防火墙拦截 2+ 云平台/本地双重防火墙 控制台+ufw 双重检查

建议

  1. 配置格式选择

    # 保守方案:使用 .conf + INI 格式
    sudo mv frps.toml frps.conf

  2. 端口选择策略

    • 避免使用 1000 以下端口

    • 推荐范围:20000-65535

  3. 万能排查命令

    # 检查服务状态
    systemctl status frps
    
    # 检查端口监听
    sudo netstat -tulnp | grep frps
    
    # 实时查看日志
    journalctl -u frps -f
    
    # 检查进程加载的配置
    sudo ps aux | grep frps

最终成功配置参考

服务器端 (/etc/frp/frps.conf):

[common]
# 网络配置
bind_port = 15443
allow_ports = 20000-30000

# 安全配置
token = PSMOjRyFvMrZt6kXFTWyyHXGLI
authentication_timeout = 900

# 仪表板配置
dashboard_port = 16443
dashboard_user = 7FPhpFRd
dashboard_pwd = izc0bgXOmOWtPMot

# 日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 7

客户端 (frpc.toml):

[common]
server_addr = "106.54.xx.xx"
server_port = 15443
auth.token = "PSMOjRyFvMrZt6kXFTWyyHXGLI"
transport.tls.enable = false

[[proxies]]
name = "ssh-tunnel"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222

 刚开始去网上搜有没有文章参考,因为咱对ubuntu命令终端使用不太懂,但是搜到都是服务器端是windows然后直接用记事本修改配置文件的,想着应该顺利的话,下载改配置保存就可以了,然后碰到了这多坑,算是学习总结了。整好了后来换个浏览器又搜了一下,发现下面这个文章写的挺好Frp内网穿透搭建教学 - Micky233 - 博客园

2.2.2 Windows安装客户端FPRC

注意一点,下载的客户端版本要和服务器端版本一样。链接https://doc.itprojects.cn/A0002.esp32cam/02.download/04.pc.py/frp_0.52.3_windows_amd64.zip

下载之后有两个软件包,FPRS和FPRC,S是服务端sever,C是客户端client,windows上是之后要暴露的内网服务,所以安装客户端。

再就是修改客户端配置文件,相关说明: 下载解压文件包可以看到如下图,我把FPRS相关软件配置删了,客户端用不到。

参考上文给出的配置进行说明,服务端和客户端都有配置文件,根据我给出的示例可以看到,两点对应下图:1.服务器端配置了服务端口,连接密钥,仪表盘设置,也就是web网页登录访问端口,用户名和密码。所以我之前说宝塔安装后web服务端口可能没有真正写进服务端配置文件,因为我当时测试访问不了web网页,更不用提后面的测试了

2.客户端配置了,FRP服务端的公网服务器ip,端口,连接密钥(相当于服务端客户端认证密码,二者配置都要一样),穿透端口(localPort本地端口,remotePort公网服务器端口),端口设置之后,这样内网服务就可以通过frpc和frps连接为媒介,当外部访问指定公网端口,frp就会转发到指定内网端口,所以每个转发都要写一个[proxies]配置一下。

2.3  启动客户端服务并测试

2.3.1 本地运行web服务

我是直接参考之前nps内网穿透在本地电脑用python开启的web服务,链接NPS内网穿透-CSDN博客

在客户端启动web服务

1.安装 Python
下载安装时务必勾选`Add Python to PATH
2.创建脚本文件
3.运行 Web 服务
在'web_demo.py 文件所在目录,打开命令窗口
-输入:
pip install gradio
python web_demo.pyshuoshuo

import gradio as gr
 
def greet(name):
    return f"Hello {name}!"
 
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch(server_port=9877)

说明:第一点,python脚本服务端口号要对应配置文件里的穿透端口,我配置里写的9877。

第二点,在windows命令窗口下载gradio模块真的超慢💔,建议使用镜像源 ,当然也可以默认设置,多说一句,FPRS服务端也可以问一下deep seek命令,让它开机自启,这样就不用每次在终端启动命令了

pip install gradio -i https://pypi.tuna.tsinghua.edu.cn/simple

永久设置镜像源,避免每次都要指定镜像源,可以设置为默认源:

# 设置清华源为默认
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 安装gradio(无需额外指定源)
pip install gradio

本地服务开启成功结果:(上面是下载模块记录,下面是开启服务后) 

 2.3.2 运行frpc程序

在frp客户端文件夹中,执行cmd,打开终端,命令

frpc.exe -c frpc.toml

运行成功标志: 

2.3.3 验证

一:访问frp提供的web管理网页---浏览器输入--公网IP:web端口号(符号英文)

说明:端口就是配置文件里的仪表盘端口号,公网Ip去腾讯云上查看你的服务器公网ip,服务器内网Ip是它本地的Ip,不要搞错

查看frp服务端运行的情况,如上图,访问该网页需要登录用户名和密码,也是配置文件里的。第一次登录以后就直接登录就行。

客户端显示有一个。 

二,访问frp公网绑定端口(与内网端口),而我们在那个端口上用python运行了一个本地网页。

 访问成功,也就是说,我们访问公网云服务器的ip和指定端口号,访问到了本地电脑web网页,穿透成功。

三.部署mqtt服务端

3.1服务器下载并启动EMQX

我选择的是MQTT服务器--EMQX服务端,大家可以用其他的。下载链接 EMQX: MQTT 与 AI 一体化平台 

点免费试用,自托管下载即可 

到腾讯云远程登录到自己服务器终端执行下载命令,安装,启动。注意,选择好服务器对应系统和安装包类型 

3.2 访问web管理网页--浏览器输入--公网IP+服务端口

默认web端口 18083

用户名 admin

密码  public 

第一次登录之后可以修改密码。

3.3 测试

怎么测试呢,思路,MQTT服务端处理消息订阅转发,那么就整一个客户端发布特定主题,一个客户端订阅特定主题,订阅的客户端有正确反馈,通信链路就是通的。

3.3.1工具

micropython--就是python的IDE,只是没有pycharm用的广泛,优点,对esp32支持好,因为我的项目用esp32。

esp32开发板--你需要烧录固件,但是我买的烧录板,就是直接type-c可以直接烧录的可能micopython软件不识别,但是在Arduion上可以烧录💔。所以嘞,你需要USB转串口模块

USB转串口模块--很简单,tx-rx,rx-tx,gnd,5v电源就可以了,具体说明,上链接:esp32-cam Thonny 烧录以及通信_make sure the device is not in bootloader mode.-CSDN博客

3.3.2 mqtt客户端1--esp32  

 1.思路

  1. esp32链接上wifi(要不咋有网络功能)
  2. esp32上需要下载一个mqtt的库
  3. 我们自己编写一个.py文件调用上面第2步的mqtt库,从而使用mqtt实现客户端的功能
  4. 客户端功能:订阅主题ledctl,然后接收到on消息,让板上小灯亮,实现远程控制功能

 2.mqtt库(要下载到esp32上的)

MicroPython 的标准库组件 MQTT 客户端库文件

3.esp32客户端 实现代码:

import time
import network
from umqttsimple import MQTTClient
from machine import Pin


p4 = Pin(4, Pin.OUT)    # create output pin on GPIO0


def do_connect():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('wifi名', 'WIFI密码')
        i = 1
        while not wlan.isconnected():
            print("正在链接...{}".format(i))
            i += 1
            time.sleep(1)
    print('network config:', wlan.ifconfig())


def sub_cb(topic, msg):
    topic_str = topic.decode('utf-8')  # 将字节串转为字符串
    msg_str = msg.decode('utf-8')     # 将消息内容转为字符串
    
    if msg_str == "on":
        p4.value(1)  # 打开设备
    elif msg_str == "off":
        p4.value(0)  # 关闭设备      


# 1. 联网
do_connect()
# 2. 创建mqt
c = MQTTClient("umqtt_client", "公网ip")  # 建立一个MQTT客户端
c.set_callback(sub_cb)  # 设置回调函数
c.connect()  # 建立连接
c.subscribe(b"ledctl")  # 订阅主题
while True:
    c.check_msg()
    time.sleep(1)

说明:要修改部分,1. wlan.connect('wifi名', 'WIFI密码')写自己的WIFI名和密码。2.c = MQTTClient("umqtt_client", "公网ip")  # 建立一个MQTT客户端。写自己的公网ip 3.查看手册看自己的闪光灯引脚,不同品牌可能不一样,也可以去thony官网看引脚控制函数然后自己定义闪光灯模式,我定义的是接收指令然后开灯。下面是我的,闪光灯引脚是Pin4,所以程序里写的4

 说明一下,新建文件,复制库运行,保存到Micropython设备,再新建文件保存esp32mqtt客户端代码,如下图。运行mqtt客户端代码结果如下图,第一次连接wifi可能会等待输出正在连接。

ok了,一个客户端准备好了~它实现订阅这个主题:c.subscribe(b"ledctl")  # 订阅主题

当接收到这个主题的消息,调用回调函数,判断指令,若是on,则打开闪光灯

3.3.3 mqtt客户端2--MQTTX

还去刚刚EMQX下载网页,他们有提供图形化工具很友好

安装之后直接连接自己服务器,设置一下公网ip,mqtt服务端(EMQX)端口,默认1883,当然你可以改配置

连接成功标志 

 OK了,可以用这个客户端发布主题了,注意要发布那个客户端订阅的主题。

下面分别是消息发布格式选项,发布主题,消息。对于控制设备的简单命令(如开关控制),Plaintext(纯文本)格式是最简单直接的选择。

3.3.4 演示结果 

发指令on闪光灯开,off关,效果如下。

dong

当然你可以去web网页查看很多客户端信息, 

项目做到后面发现思路不是很清晰,感觉还是来整理记录一下,因为某人说过🙃,博客能跟别人讲清楚自个干了啥,还有防止忘记,之后直接拿来用,我刚学的东西确实容易忘,熟悉了好点,看之前记录很容易回想起来,就大概整理了下,有点多

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐