Вдруг понадобилось мне с компьютера отправлять пакеты
ArtNet по сети. Желательно, чтобы это было просто, удобно и достаточно гибко. Для подобного рода задач (что-то сделать на компьютере) я в последнее время предпочитаю C#. Там дофига готовых проверенных библиотек и заниматься велосипедостроением не надо.
читать дальшеВообще, отправить широковещательный UDP-пакет достаточно просто:
Но интересно не это, интереснее мне, как же удобнее представлять пакеты внутри кода? В языке Си есть структуры, которые могут задать расположение объектов в памяти. В C# ничего такого нет, и всю разборку на байты и их расположение надо выполнять вручную.
В идеале класс должен давать доступ к полям структуры, как для записи, так и для чтения. Пусть не всем, но самым важным, которые непременно будут раз от раза меняться.
Для первого опыта я выбрал достаточно простой пакет: ArtDMX.
Принцип создания пакета дубовый: записываем в массив байт по нужным смещениям числа. Для удобства можно создать функции, которые бы записывали по смещению в массив строки заданной длины, массивы, числа разного размера (1, 2, 4 байт) и формата (Big/Little Endian).
Поля ID, OpCode, ProtVer (H), Length здесь будут всегда одними и теми же, потому можно их жёстко захардкодить в инициализации класса.
Остальные поля можно представить уже в виде свойств класса, которые читают и записывают этот массив так, как надо:
Получение пакета для внешнего кода:
Для внешнего кода работа с полями будет такой же, как и в Си:
Добавление конструктора класса, принимающего сырой пакет (и копирущего этот пакет во внутренний буфер), без каких-либо ещё лишних телодвижений позволит читать его содержимое через такие удобные свойствочки.
Внизу предложены мои варианты исходников, использовать просто:
private ArtNet.ArtNetNode Node = new ArtNet.ArtNetNode();
Node.Start();
В итоге в сети появится поток 0-0, в котором на 239 канале будет пила. Выбор канала объясняется просто: тут стоит башка, у которой стартовый адрес 239. И при запуске программы она начинает крутиться вокруг вертикальной оси. Для просмотра потоков ArtNet можно воспользоваться программой DMX Workshop.
Файлы:
ArtNetNode.cs
ArtDMX.cs
OpCodes.cs
Helper.cs
П.С. Я язык C# знаю весьма посредственно, потому может существовать 100500 куда как лучших решений оной проблемы, просто я о них пока не знаю.