个人适用的单片机长距离通讯方法(PC-20230910-Wingman)
方法由四大部份构成: 上位单片机
Air780E
frp
Godot服务器
Air780E可以事先刷入AT固件,只作为联网和通讯之用。其默认开启联网功能,常用的联网指令如下: AT+CIPSTART=TCP,domain.name,port
AT+CIPSEND
> XX XX XX XX XX XX XX XX XX 1A
上述3条指令由单片机通过串口向Air780E发送,分别意为: 建立TCP连接
准备传送一段数据
在串口返回 “>” 符号后,以 十六进制 开始像串口输入数据,最后以十六进制 1A 结尾表示数据传输完毕
frp用于获取在公网上的域名并将本地服务器端口映射到该公网域名上 Godot可以用于搭建一个简易的服务器和图形界面,其启用TCP服务的脚本可参照如下:
extends Node
const HOST := "127.0.0.1"
const PORT := 114
var server := TCPServer.new()
var clientSet:Dictionary
func _ready():
if server.listen(PORT, HOST) == OK:
print("地面站网络服务启动")
else:
print_debug("地面站网络服务",HOST,PORT,"启动失败")
func _process(delta):
for client in clientSet.keys():
client.poll()
# 处理数据
var dataLength:int = client.get_available_bytes()
if dataLength:
match client.get_data(dataLength):
[var err, var data]:
if err == OK and dataLength:
handle_data(client, data)
# 清理无效连接
if client.get_status() == StreamPeerTCP.STATUS_NONE:
clientSet.erase(client)
print("TCP连接数:", clientSet.size())
continue
# 处理新增连接
if server.is_connection_available():
var client := server.take_connection()
clientSet[client] = client
print("TCP连接数:", clientSet.size())
func handle_data(client:StreamPeerTCP, data:PackedByteArray):
print("<",data)
func put_data(client:StreamPeerTCP, data:PackedByteArray):
client.put_data(data)
print(">",data)
效果如下图所示: