Обмен сообщениями между приложениями на одном и том же ESP32

#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») для эффективного взаимодействия между различными приложениями.