Разумно ли выводить данные со встроенного устройства в формате xml? - PullRequest
4 голосов
/ 20 ноября 2010

Наша компания производит много встроенных устройств, которые взаимодействуют с ПК через приложения, которые я пишу на C # .net.Я рассматривал различные способы улучшения передачи данных, чтобы приложение ПК было легче синхронизировать с текущим состоянием устройств (которое в некоторых случаях постоянно меняется).

Я думал о подходе, при которомустройство форматирует свое описание и сообщения о состоянии в сообщение в формате xml перед отправкой через последовательный порт, USB, сокет Ethernet и т. д. Я подумал, что это может сделать процесс передачи всех этих данных в мои классы C # более простым.

Альтернативой является подход, при котором хост-приложение отправляет команду, подобную GETSTATUS, и устройство отвечает массивом байтов, каждый из которых представляет свое свойство, показание датчика и т. Д.

Я не знаюУ меня нет большого опыта работы с xml, но из того, что я видел, можно сделать с LINQ to XML, кажется, что это может быть хорошей идеей.Что, вы парни, думаете?Это то, что обычно делается?Это ужасная идея?!?

Ответы [ 6 ]

4 голосов
/ 20 ноября 2010

Во-первых, в любом случае, убедитесь, что возвращенные данные имеют встроенный номер версии, чтобы вы могли пересмотреть структуру данных.

Является ли оба варианта?Серьезно, всегда есть ситуации, когда отправка данных в более читаемой форме предпочтительнее, а в других - более плотное представление (это меньше, чем думает большинство людей, но я не хочу начинать религиозную войну по этому поводу).Люди будут страстно спорить за оба, потому что они оптимизируют для разных вещей.Предоставление обоих вариантов удовлетворит оба лагеря.

Хороший, понятный статус XML определенно может понизить планку для людей, которые начинают работать с вашими устройствами.Вы также можете создать объект C #, который можно десериализовать из возвращаемых двоичных данных.

2 голосов
/ 20 ноября 2010

Это не ужасная идея, но, вероятно, это чрезмерный дизайн. Я бы предпочел использовать формат, который встроенное устройство будет генерировать проще и быстрее. Затем на стороне ПК я бы вставил слой, чтобы преобразовать его в удобный формат. Вы также можете использовать LINQ с объектами. Почему бы не отправить данные в двоичном виде или в простом протоколе ASCII, а затем преобразовать их в объекты C #? Вы можете использовать LINQ для доступа к данным. На мой взгляд, в этом случае XML вносит ненужную сложность.

1 голос
/ 21 ноября 2010

В любом случае возможны компромиссы, поэтому правильный выбор зависит от вашего приложения, насколько мощно ваше устройство и кто будет использовать этот протокол.

Вы упоминаете, что альтернативой является двоично-сериализованный подход запрос-ответ.Я думаю, что здесь есть два отдельных измерения: формат сериализации (двоичный или XML) и стиль связи.Вы можете использовать любой желаемый формат сериализации либо в протоколе push, либо в протоколе запрос-ответ.

XML может быть хорошим выбором, если

  • Читаемость важна
  • Если есть различия между устройствами, т.е. если у вас разные устройства, которые имеют разные свойства, так какXML имеет тенденцию к самоописанию.
  • Или если вы хотите опубликовать данные вашего устройства в Интернете.

Конечно, XML является многословным, и, безусловно, есть способы выполнить все вышеперечисленное с помощью двоичного протокола (например, с помощью теговых значений можно использовать, чтобы сделать ваш двоичный протокол более описательным).

0 голосов
/ 28 ноября 2010

Создание и передача файлов XML - это пустая трата драгоценного встроенного ЦП.Вместо этого я просто использовал бы массив двоичных байтов, представляющих данные, но я бы использовал структуры, чтобы помочь интерпретировать данные.Структурная особенность C # позволяет легко интерпретировать массив байтов как значимые данные.Вот пример:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DeviceStatus
{
    public UInt16 position;    // Byte 0 and 1
    public Byte counter;       // Byte 2
    public Fruit currentFruit; // Byte 3
};

enum Fruit : Byte
{
    Off = 0,
    Apple = 1,
    Orange = 2,
    Banana = 3,
}

Тогда у вас будет функция, которая преобразует ваш массив байтов в эту структуру:

public unsafe DeviceStatus getStatus()
{
    byte[] dataFromDevice = fetchStatusFromDevice();
    fixed (byte* pointer = dataFromDevice)
    {
        return *(DeviceStatus*)pointer;
    }
}

По сравнению с XML этот метод сэкономит процессорное время наустройство и на ПК, и это проще в обслуживании, чем схема XML, с дополнительными функциями для создания и анализа файла XML.Все, что вам нужно сделать, - это убедиться, что определения struct и enum в вашем встроенном устройстве совпадают с определениями в вашем коде C #, чтобы программа и устройство C # согласовали используемый протокол.

ВыВозможно, вы захотите использовать атрибут «упакованные» как на C #, так и на встроенной стороне, чтобы все элементы структуры располагались предсказуемым образом.

0 голосов
/ 28 ноября 2010

В предыдущем проекте с ПК я делал нечто очень похожее на микропроцессорную связь с использованием формата XML. Он хорошо работал на стороне ПК, поскольку Adobe Flex (то, что мы использовали) мог очень легко интерпретировать XML, и я подозреваю, что .Net может сделать то же самое очень легко.

Более сложная часть была на стороне микропроцессора. Синтаксический анализ XML должен был выполняться вручную, что на самом деле было не так сложно, а просто требовало много времени. Создание строки XML также может быть довольно много кода в зависимости от того, что вы делаете.

В целом - если бы мне пришлось делать это снова, я все еще думаю, что XML был хорошим выбором, потому что это очень гибкий протокол. ОЗУ не было большой проблемой для хранения нескольких пакетов в нашем буфере FIFO на стороне микропроцессора, но это может быть чем-то, что следует учитывать в вашем приложении.

0 голосов
/ 22 ноября 2010

У одного из основателей этого сайта есть несколько здравомыслящих и забавных мнений о XML в XML: налог на угловые скобки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...