Udp

Дорогие друзья: разработчики и пользователи! Описываю проблему:

Соединяюсь с икс плейном (9м) по udp, т.е. посылаю массив байт как описано здесь.
X-Plane пишет (внутри себя так сказать) что получены такие-то данные с такого-то адреса, и «отправляю <Имя команды>».
В настройках в «Ввод и вывод данных» во вкладке Набор данных отмечен 25й индекс (управление тягой), частота udp = 20Гц

А вот на самом деле результата не видно. работает только пример MESS (который посылает звуковое сообщение), а DATA не работает.

Работает: MESS0Hello0127.0.0.10

Не работает: DATA025128 63128 63128 63128 63128 63128 63128 63128 630 (Включает тягу каждого двигателя на 100%)

Что делаю не так? помогите пожалуйста кто чем может))
Заранее благодарен

Ответов: 11

Цитата

DATA025128 63128 63128 63128 63128 63128 63128 63128 630

Это сильно устарело. Формат пакета такой:
DATA’ ‘ {int idx; float data[8]}

Посмотреть сообщениеGhost-V (19.05.2009 01:41) написал:

Цитата

DATA025128 63128 63128 63128 63128 63128 63128 63128 630

Это сильно устарело. Формат пакета такой:
DATA’ ‘ {int idx; float data[8]}

Отлично, спасибо большое! Заработало. Для интересующихся подобными проблемами публикую исходник на C# для посылки x-plane-у команды (та, которая включает тягу)

————————————————————————————-

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace Udp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
}

private void button2_Click(object sender, EventArgs e)
{
int ptr = 0;
byte[] buffer = new byte[1024];

buffer[ptr++] = Convert.ToByte(‘D’);
buffer[ptr++] = Convert.ToByte(‘A’);
buffer[ptr++] = Convert.ToByte(‘T’);
buffer[ptr++] = Convert.ToByte(‘A’);
buffer[ptr++] = Convert.ToByte(0);

byte[] ind = BitConverter.GetBytes(25);

for (int i = 0; i < ind.Length; i++)
buffer[ptr++] = ind[i];

for (int i = 0; i < 8; i++)
{
byte[] bt = BitConverter.GetBytes(1.0f);
for (int j = 0; j < bt.Length; j++)
buffer[ptr++] = bt[j];
}

this.Send(buffer, ptr);
}

private void Send(byte[] buffer, int ptr)
{

const int ProtocolPort = 49000;
Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPAddress sendTo = IPAddress.Parse(«10.8.2.10»);
EndPoint sendEndPoint = new IPEndPoint(sendTo, ProtocolPort);

sendSocket.SendTo(buffer, ptr, SocketFlags.None, sendEndPoint);
}
}
}

Если не секрет, с какой целью это делается?

Посмотреть сообщениеasso (19.05.2009 15:51) написал:

Если не секрет, с какой целью это делается?

Мы на кафедре пытаемся написать систему управления бпла. Буквально 20 минут назад научился еще и получать данные из x-plane-а

Цитата

Мы на кафедре пытаемся написать систему управления бпла.

Разумно. Чем пасти сферических коней, лучше поиграться с чем-то, хоть немного похожим на реальное изделие.
А где такие кафедры бывают, если не секрет?

Московский Авиационный Институт, кафедра теоретической механики факультета «Прикладная математика и физика»

Так вот ещё проблема: когда в x-plane в окне ‘Ввод и вывод данных’ отмечаю несколько индексов (например, 3,5,8,24), то доходит по udp только первый индекс (3), т.е. по одиночке данные приходят отлично, а в комплексе как-то не очень. Бывает иногда что приходят сразу 2 индекса, но редко.

Что это может быть? Известные недостатки Udp или ещё что-то?

Странно. Сколько раз использовал, ходило всегда все — от 1 до 128. Может в коде что-то напутано?

Посмотреть сообщениеGhost-V (29.05.2009 23:16) написал:

Странно. Сколько раз использовал, ходило всегда все — от 1 до 128. Может в коде что-то напутано?

Да, согласен. Здесь всё путём. Только вот теперь такая беда: размер массива 1024b, т.е. если прикинуть что каждый параметр ‘весит’ около 36b, то выходит что единовременно мы можем получить не более 28 параметров(или около того)
Так ли это?

А что мешает сделать массив большего размера? На текущий момент максимальное количество параметров — 130. Если массив будет размером 4685b (5+130*36), в него влезет вся информация 🙂

Посмотреть сообщениеGhost-V (9.06.2009 23:33) написал:

А что мешает сделать массив большего размера? На текущий момент максимальное количество параметров — 130. Если массив будет размером 4685b (5+130*36), в него влезет вся информация 🙂

Во я дятел) Что-то не допёр сразу)) Спасибо…