Полевое устройство (Loxone miniserver) отправляет измерения в пакетах UDP на общедоступный адрес виртуальной машины Azure и на мой локальный компьютер, оба на порт 1234 (изменено для целостности).На моей локальной машине в той же сети, что и полевое устройство, я реализовал тестовый приемник в C #, который правильно получает пакеты.В уже запущенном приложении на лазурной виртуальной машине я добавил тот же код получателя, что и на локальной машине, и не получил пакетов UDP.Что я уже сделал на платформе управления Azure: - разрешил входящий порт 1234 в конфигурации сети; - отключил брандмауэр
. Для тестирования я попробовал следующее: - внедрил отправителя UDP в приложении на виртуальной машине Azure, которыйотправляет по широковещательному IP на порт 1234 -> это работает!- Добавлен пакетный монитор к сетевому интерфейсу -> здесь я вижу оба пакета, внутреннюю рассылку и полевое устройство
// Код получателя сокращен до соответствующих частей
class Program{
public static void Main(string[] args){
program.Run();
}
public void Run(){
var sync = new LoxoneSyncProcess();
while(true){
sync.readUDP();
Thread.sleep(10000);
}
}
}
class LoxoneSyncProcess{
public LoxoneSyncProcess(){
private UDPSocket c = new UDPSocket();
c.Client(1234);
}
public void readUDP(){
String buffer = c.getDatBuf();
Console.WriteLine(buffer);
//process buffer
}
}
public class UDPSocket{
private Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private const int bufSize = 8 * 1024;
private State state = new State();
private EndPoint epFrom = new IPEndPoint(IPAddress.Any, 0);
private AsyncCallback recv = null;
private String datBuf = "";
public class State
{
public byte[] buffer = new byte[bufSize];
}
public String getDatBuf()
{
String temp = datBuf;
datBuf = "";
return temp;
}
public void Client(int port)
{
_socket.Bind(new IPEndPoint(IPAddress.Any, port));
Receive();
}
private void Receive()
{
_socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
{
State so = (State)ar.AsyncState;
int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
_socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
datBuf += Encoding.ASCII.GetString(so.buffer, 0, bytes);
//Console.WriteLine("RECV: {0}: {1}, {2}", epFrom.ToString(), bytes, Encoding.ASCII.GetString(so.buffer, 0, bytes));
}, state);
}
}
код работает, я получаю самостоятельно отправленные пакеты UDP на порт 1234 по Broadcast-IP, но не от полевого устройства.Нужны ли какие-либо таблицы, подобные NAT-конфигурации?Или портпереход?Поддерживает ли Azure общедоступные конечные точки UDP?