同一 ESP32 上的应用程序之间的消息传递
Messaging between apps on the same ESP32
我想我找到了一种在 ESP32 内部的应用程序之间进行通信的方法。无论如何,它有效。 是的,我对这种方法的合法性有些怀疑,所以我要对你说。
我记得存在魔法地址“127.0.0.1”——loopback 地址也称为 本地主机。在日常生活中,这个地址通常用于与程序员使用的同一台计算机建立 IP 连接。例如,如果我正在编写客户端服务器,那么使用 localhost 我可以在一个应用程序中调试交换协议,而无需使用额外的计算机.
同时使用环回接口绕过任何本地网络接口硬件。
而且我认为有可能在您的系统中遵守了这一原则,我只需要尝试一下:如果可行怎么办?
而且确实有效。以下是两个应用程序的文本和并行终端的屏幕截图。 Receiver.toit app 先启动,然后 sender toit.
receiver.toit:
import net
main :
network_interface := net.open
serverSocket := network_interface.tcp_listen 1234
print ("Wait...")
socket := serverSocket.accept
print ("Accept was done...")
data := socket.read
clientAddr := socket.peer_address.ip.stringify
print ("[$clientAddr]->[$data.to_string]")
socket.close
print ("Socket closed...")
serverSocket.close
print ("ServerSocket closed...")
sender.toit:
import net
LOOPBACK := "127.0.0.1"
main :
network_interface := net.open
clientSocket := network_interface.tcp_connect LOOPBACK 1234
print ("Connect...")
clientSocket.write "Hello from flatmate..."
print ("Write was done...")
clientSocket.close
print ("Socket closed...")
接收端:
micrcx@micrcx-desktop:~/toit_apps/Hsm3/tests$ toit -d=dell run receiver.toit
2021-10-08T06:41:03.937058Z: <process initiated>
Wait...
Accept was done...
[127.0.0.1]->[Hello from flatmate...]
Socket closed...
ServerSocket closed...
2021-10-08T06:41:35.166388Z: <process terminated - exit code: 0>
micrcx@micrcx-desktop:~/toit_apps/Hsm3/tests$
发件人终端:
micrcx@micrcx-desktop:~/toit_apps/Hsm3/tests$ toit -d=dell run sender.toit
2021-10-08T06:41:34.641365Z: <process initiated>
Connect...
Write was done...
Socket closed...
2021-10-08T06:41:34.917420Z: <process terminated - exit code: 0>
micrcx@micrcx-desktop:~/toit_apps/Hsm3/tests$
在一台设备上使用 TCP 连接是一种受支持且应该有效的方案。但是,服务器没有防火墙,同一网络上的任何机器都可以连接到 ESP32 上 运行 的服务器。
另一种方法是使用本地 pubsub。看看这里的教程:https://docs.toit.io/platform/tutorials/pubsub/pubsubint
本地pubsub更轻量级和内部,但它是一种广播机制。发送方只是发送数据,任何正在监听的接收方都会收到数据。如果正确接收每条消息很重要,您需要在顶部实施一个小协议。
未来还会有专门的机制(目前称为“RPC”)在不同的应用程序之间进行有效对话。
我想我找到了一种在 ESP32 内部的应用程序之间进行通信的方法。无论如何,它有效。 是的,我对这种方法的合法性有些怀疑,所以我要对你说。
我记得存在魔法地址“127.0.0.1”——loopback 地址也称为 本地主机。在日常生活中,这个地址通常用于与程序员使用的同一台计算机建立 IP 连接。例如,如果我正在编写客户端服务器,那么使用 localhost 我可以在一个应用程序中调试交换协议,而无需使用额外的计算机.
同时使用环回接口绕过任何本地网络接口硬件。
而且我认为有可能在您的系统中遵守了这一原则,我只需要尝试一下:如果可行怎么办?
而且确实有效。以下是两个应用程序的文本和并行终端的屏幕截图。 Receiver.toit app 先启动,然后 sender toit.
receiver.toit:
import net
main :
network_interface := net.open
serverSocket := network_interface.tcp_listen 1234
print ("Wait...")
socket := serverSocket.accept
print ("Accept was done...")
data := socket.read
clientAddr := socket.peer_address.ip.stringify
print ("[$clientAddr]->[$data.to_string]")
socket.close
print ("Socket closed...")
serverSocket.close
print ("ServerSocket closed...")
sender.toit:
import net
LOOPBACK := "127.0.0.1"
main :
network_interface := net.open
clientSocket := network_interface.tcp_connect LOOPBACK 1234
print ("Connect...")
clientSocket.write "Hello from flatmate..."
print ("Write was done...")
clientSocket.close
print ("Socket closed...")
接收端:
micrcx@micrcx-desktop:~/toit_apps/Hsm3/tests$ toit -d=dell run receiver.toit
2021-10-08T06:41:03.937058Z: <process initiated>
Wait...
Accept was done...
[127.0.0.1]->[Hello from flatmate...]
Socket closed...
ServerSocket closed...
2021-10-08T06:41:35.166388Z: <process terminated - exit code: 0>
micrcx@micrcx-desktop:~/toit_apps/Hsm3/tests$
发件人终端:
micrcx@micrcx-desktop:~/toit_apps/Hsm3/tests$ toit -d=dell run sender.toit
2021-10-08T06:41:34.641365Z: <process initiated>
Connect...
Write was done...
Socket closed...
2021-10-08T06:41:34.917420Z: <process terminated - exit code: 0>
micrcx@micrcx-desktop:~/toit_apps/Hsm3/tests$
在一台设备上使用 TCP 连接是一种受支持且应该有效的方案。但是,服务器没有防火墙,同一网络上的任何机器都可以连接到 ESP32 上 运行 的服务器。
另一种方法是使用本地 pubsub。看看这里的教程:https://docs.toit.io/platform/tutorials/pubsub/pubsubint
本地pubsub更轻量级和内部,但它是一种广播机制。发送方只是发送数据,任何正在监听的接收方都会收到数据。如果正确接收每条消息很重要,您需要在顶部实施一个小协议。
未来还会有专门的机制(目前称为“RPC”)在不同的应用程序之间进行有效对话。