#localhost #tcpclient #esp32 #tcpserver #toit
Вопрос:
Я думаю, что нашел способ связи между приложениями внутри одного ESP32. В любом случае, это работает. Правда, у меня есть некоторые сомнения в законности такого подхода, поэтому я обращаюсь к вам.
Я вспомнил, что существует магический адрес «127.0. 0.1» — адрес обратной связи, также называемый локальным хостом. В обычной жизни этот адрес используется в основном для установления IP-соединения с тем же компьютером, который используется программистом. Например, если я пишу клиент-сервер, то с помощью localhost я могу отлаживать протокол обмена внутри одного приложения без использования дополнительного компьютера.
В то же время использование интерфейса обратной связи обходит любое аппаратное обеспечение интерфейса локальной сети.
И я подумал, что есть некоторая вероятность того, что этот принцип соблюдался в вашей системе, и мне просто нужно попробовать: что, если это сработает?
И это действительно работает. Ниже приведены тексты двух приложений и скриншоты с параллельных терминалов. Сначала запускается приложение Receiver.toit, а затем-отправитель.
приемник.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...")
отправитель.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$
Комментарии:
1. Ммм, я не могу найти вопрос в этом посте.
2. Правда, у меня есть некоторые сомнения в законности такого подхода, поэтому я обращаюсь к вам.
Ответ №1:
Использование TCP-соединения на одном устройстве-это сценарий, который поддерживается и должен работать. Однако сервер не имеет брандмауэра, и любая машина в той же сети может подключиться к серверу, работающему на ESP32.
Альтернативой является использование локального pubsub. Взгляните на учебник здесь: https://docs.toit.io/platform/tutorials/pubsub/pubsubint
Локальный pubsub более легкий и внутренний, но это широковещательный механизм. Отправитель просто отправляет данные, и любой получатель, который их прослушивает, получает эти данные. Если важно, чтобы каждое сообщение было получено правильно, вам нужно будет внедрить небольшой протокол сверху.
В будущем также будет создан специальный механизм (в настоящее время называемый «RPC») для эффективного взаимодействия между различными приложениями.