составить пакет для подключения

 
 
 
Сообщения:10
Всем доброго времени суток.Есть трудность.Необходимо подключится к аппарату эвл его ip (192.168.1.15) порт 5050 тип socket.Есть протокол по которому нужно подключится (файл я выложил протокол) и получить данные .но сперва необходимо составить пакет для подключения .прошу помочь.


Протокол обмена с аппаратом искусственной вентиляции легких «АВЕНТА-М»

Обмен данными с аппаратом осуществляется по протоколу TCP/IP. IP адрес у аппарата фиксированный «192.168.1.15».
На приемной стороне необходимо реализовать буферизацию поступающих данных с целью плавного отображения графиков.

Формат данных (прикладной уровень)

Байты Поле Примечание
0 ADDR. Адрес получателя пакета. (0…127) << 1
Бит 0 = 0
1 CMD. Команда (0…127) << 1
Бит 0 = 1
2 … 3 SIZE. Размер блока данных (0…16383) << 1
Бит 0 = 1
N+1 … N+1+SIZE DATA. Блок данных Бит 0 = 1
4… N = 4+(SIZE+6)/7 EXT. Байты расширения Бит 0 = 1
Биты 1…7 каждого байта расширения содержат значения младших битов соответствующих байтов блока данных.
N+1+SIZE … N+1+SIZE+1 CRC. Контрольная сумма Бит 0 = 1

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


Рисунок 1.

Команды аппарату

Адрес аппарата (поле ADDR) всегда равен 1.


1. Запуск потоковой передачи данных

Поле Значение
CMD 1
SIZE 0

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

Формат заголовка:

Байты Поле Описание
0 cntPacket Счётчик пакетов (для определения пропусков и синхронизации с блоком мониторинга)
1 cntCommand Счётчик команд.
2…5 STATUS Состояние блока управления
Биты:
0…7 – биты поля hwErrors из пакета данных измерительного контроллера
8 – низкое давление воздуха
9 – низкое давление кислорода
10 – требуется калибровка пропорционального клапана воздуха
11 – требуется калибровка пропорционального клапана кислорода
12 – требуется калибровка клапана выдоха
13 – требуется проведение тестов
14 – нет данных от измерительного контроллера
15 – разгерметизация (при CONTENT = 0)
16 – окклюзия
17 – Ошибка подачи воздуха в контур
18 – Ошибка подачи кислорода в контур
19 – высокое давление воздуха
20 – высокое давление кислорода
21 – ошибка клапана выдоха
22 – высокое сопротивление в контуре выдоха
23 – не удаётся оценить параметры пациента для обеспечения PAV
24 – PV манёвр
25 – ошибка во время выполнения PV маневра
26 – ошибка датчика SpiroQuant
27 – невозможно достичь целевого объема
31 – готов к выключению (принята и обработана команда shutdown)
6 CONTENT Формат данных
1 – вентиляция (рабочий режим)



Формат данных в рабочем режиме (CONTENT = 1).

Байты Поле Описание
0,1 MODE Режим вентиляции
Биты:
0…1 – тип подключения (=0 эндотрахеальная трубка, =1 трахеостомическая трубка, =2 маска)
2…5 – режим (=0 А/С, =1 SIMV, =2 SPONT, =3 DUAL-LEVEL, =13 APNEA, =14 IDLE , =15 STANDBY)
6…8 – тип принудительных вдохов (=0 PC, =1 VC, =2 PCVG)
9…11 – тип спонтанных вдохов(=0 PS, =1 PSVG, =2 TC)
12 – тип триггера (=0 Flow, =1 Pressure)
13..14 – пациент (=0 взрослый, =1 детский, =2 новорожденный)
15 – параметры режима валидны
2…5 Pressure[2] Два текущих значения кривой давления в контуре.
Биты:
0…10 – значение давления в контуре (мм H2O)
11…12 – тип текущего вдоха (=0 C, =1 A, =2 S, =3 HFO)
13 – вентиляция 100% кислородом
14 – распыление (небулайзер)
15 – признак вдох/выдох ( =0 выдох, =1 вдох)
6…9 Flow[2] Два текущих значения кривой потока (10 мл/мин)
10…13 Volume[2] Два текущих значения кривой объёма (мл)
14…17 Debug[2] Кривая для отладки
18 ParIndexBC Индекс параметра дыхательного цикла(0…N)
19,20 ParValueBC Значение параметра дыхательного цикла
21 ParIndex Индекс мониторируемого параметра (0…N)
22,23 ParValue Значение мониторируемого параметра
24 CtrlParIndex Индекс управляющего параметра (0…N)
25,26 CtrlParValue Значение управляющего параметра

Параметры, передающиеся поочерёдно через поля ParIndexBC и ParValueBC.

Индекс Параметр Описание
0 VTI Объём последнего принудительного или спонтанного вдоха (мл)
1 VTE Объём последнего принудительного или спонтанного выдоха (мл)
2 TI Время вдоха (мс)
3 TE Время выдоха (мс)
4 MV Минутная вентиляция (мл/мин*100)
5 MVSPONT Минутная объем спонтанных вдохов (мл/мин*100)
6 PPEAK Максимальное давление, измеренное в ходе предыдущего дыхательного цикла (cmH2O*10)
7 PEEP Положительное давление в конце выдоха (см H2O*10)
8 PPL Давление в контуре измеренной в конце инспираторной паузы (cmH2O*10)
9 fTOT Общее количество принудительных и спонтанных вдохов доставленных пациенту за последнюю минуту
10 fSPONT Количество спонтанных вдохов сделанных пациентом за последнюю минуту
11 TISPONT Время спонтанного вдоха (сек*100)
12 PINSP Давление вдоха – среднее давление на вдохе минус давление в конце выдоха (смН2О*10)

Параметры, передающиеся поочерёдно через поля ParIndex и ParValue.

Индекс Параметр Описание
0 PMEAN Среднее давление в контуре за последнюю минуту (см H2O*10)
1 СSTAT Статическая податливость лёгких (мл/см H2O*10)
2 RSTAT Сопротивление дыхательных путей (cм H2O/л/с*10)
3 СDYN Динамический комплайнс (на вдохе мл/см H2O*10)
4 %FiO2 Концентрация кислорода на вдохе (%)
5 PBARO Атмосферное давление (мм.рт.ст.)
6 RCEXP Постоянная времени выдоха (мс)
7 RESERV_1
8 RESERV_2
9 RESERV_3
10 RESERV_4
11 RDYN Динамическое сопротивление дыхательных путей (cм H2O/л/с*10)
12 FANFREQ Частота вращения вентилятора (Гц)
13 AIRPRES Давление сжатого воздуха на входе в аппарат (bar*100) (для пневмоприводного аппарата)
14 O2PRES Давление сжатого кислорода на входе в аппарат (bar*100)
15 RESERV_5
16 PEEP_I Значение авто ПДКВ (смН2О*10)
17 PEEP_TOT Давление в конце выдоха измеренное в процессе экспираторной паузы – истинное давление в легких в конце выдоха.
18 PLEAK Значение утечки в дыхательном контуре (%)
19 LEAK Поток утечки в дыхательном контуре (л/мин*100)
20 VTETARGET Целевой объем для режима AUTO_MVG (мл)
21 FTARGET Целевая частота вентиляции для режима AUTO_MVG
22 P01 Давление респираторного усилия в первые 100мс (смН2О*10)
23 AMVGFMAX Максимально допустимая частота дыхания для режима AUTO_MVG
24 AMVGVTMAX Максимально допустимый объем вдоха для режима AUTO_MVG (мл)
25 RCINSP Постоянная времени вдоха (мс)
26 WOBIMP Работа выполняемая пациентом для совершения попытки вдоха (Дж/л*100)
27 HWERRORS Аппаратные ошибки. Описание Битов
0 – Ошибка калибровки датчика давления на выдохе
1 - резерв
2 – Нет связи с датчиком потока на выдохе
28 SIMVMTIME Время триггерного окна в режиме SIMV (для версии 5.10 и выше)
29 EEF Поток в конце выдоха (л/мин*100) (для версии 5.10 и выше)
30 EIF Поток в конце вдоха (л/мин*100) (для версии 5.10 и выше)
31 EIPRES Давление в конце вдоха (смН2О*10) (для версии 5.10 и выше)

Если в единицах измерения стоит множитель, например, если указано мл/мин*100, это означает, что передаваемое значение умножено на 100. Например, полученное значение равно 956, тогда на экране нужно отображать 9,56 либо 9,6 (с округлением)

Параметры, передающиеся поочерёдно через поля CtrlParIndex и CtrlParValue.

Индекс Параметр Описание
0 F Частота дыхания
1 VT Заданный дыхательный объем (мл)
2 I:E Соотношение времени вдоха к времени выдоху
3 TPL Длительность плато (сек*100)
4 FIO2 Концентрация кислорода в подаваемой на вдох воздушной смеси
5 PEEP Положительное давление в конце вдоха
6 TI Время вдоха
7 FTRIG Триггер по потоку (л/мин*10)
8 PTRIG Триггер по давлению (смН2О*10)
9 PEAK_F Пиковый поток на вдохе для принудительных вдохов контролируемых по объему
10 PI Давление создаваемое в тройнике пациента при выполнении принудительного вдохоа
11 PSUP Давление создаваемое в тройнике пациента при спонтанной поддержке вдохоа
12 ESENS Чувствительность для завершения спонтанного вдоха
13 RT Скорость нарастания давления на вдохе
14 FLOWPAT Форма потока для принудительных вдохов контролируемых по объему
15 SIGH Дополнительный объем вдоха (1 – вкл, 0 – выкл)
16 TH Длительность высокого уровня давления в режиме DUAL-LEVEL
17 TH:TL Отношение длительности высокого уровня давления к низкому в режиме DUAL-LEVEL
18 PEEP_H Значение высокого уровня давления в режиме DUAL-LEVEL
19 IBW Идеальный вес пациента (кг)
20 VPI Целевой объем для принудительных вдохов с контролем по давлению и гарантированным объемом)
21 VPSUP Целевой объем для спонтанных вдохов с гарантированным объемом)
22 TCSUP Степень компенсации сопротивления интубационной трубки для спонтанных вдохов TC (%)
23 TUBE_ID Диаметр интубационной трубки (мм*10)


Формат данных в рабочем режиме (CONTENT = 2).

Байты Поле Описание
0 SIZE Размер фрейма
1…(SIZE+1) DATA Данные фрейма

Каждый фрейм состоит из пакетов данных от модулей пульсоксиметрии и капнометрии.

Первый байт каждого пакета содержит адрес устройства в старшей тетраде и 0 в младшей тетраде.
Последний байт каждого пакета содержит контрольную сумму. Контрольная сумма вычисляется простым суммированием байтов пакета по модулю 256.

Алгоритм разбора данных фрейма на пакеты

Первый байт данных он же первый байт пакета данных от модуля.

1. По значению старшей тетрады определяем тип устройства (ECG, OXI, NIBP и т. д.).
2. Зная тип устройства, определяем размер пакета (он фиксированный для каждого устройства).
3. Вычисляем и проверяем контрольную сумму. Если контрольная сумма не сошлась берём следующий байт и повторяем пункты 1-3.
4. Если не достигнут конец фрейма, берём следующий за пакетом байт и повторяем пункты 1-3.




Модуль Пульсоксиметрии


#define OEM_OXI_ADDR 0x50 // Адрес модуля Пульсоксиметрии

Формат пакета от модуля Пульсоксиметрии:
typedef struct
{
unsigned char Addr; // Адрес модуля
unsigned char SpO2; // Значение SpO2. Код 255 - не измерено или недостоверно.
unsigned char HR; // Значение ЧП. Код 255 - не измерено или недостоверно.
unsigned char ToeA; // Наполнение Пульса. Код 255 - не измерено или недостоверно.
unsigned char Res; // Резерв
unsigned char Status; // Байт состояния модуля (описание см. ниже)
unsigned char Mode; // Байт режимов работы (описание см. ниже).
signed char PleIR; // Фотоплетизмограмма (кривая ФПГ).
unsigned char Ksum; // Контрольная сумма всего пакета (алгебраическая 8-разрядная сумма всех байтов).
} OxiPacketStruct;

Размер пакета - 9 байт. Рекомендуемый период опроса - 20 мс

Описание байта состояния модуля (Status):

Биты
7 6 5 4 3 2 1 0
Резерв Резерв Пульс
1 - обнаруж.
пульс.
(с кажд.удар.)
Резерв Нет пульса:
1 - нет пульса
(> 8 секунд)
Палец
0 - в датчике
1 - отсутств Датчик
0 - одключен
1 - отключен
Режим:
0 - работа
1 -подстройка
тока в датч.

Бит “Пульс” устанавливается в “1” при каждом обнаружении нового удара сердца (пульса). Обычно используется для выдачи звуковых сигналов с каждым ударом сердца. Длительность “1” - один пакет.
Когда бит “Пульс” установлен в “1”, в полях SpO2, HR, ToeA передаются мгновенные значения соответствующих параметров (по последнему удару сердца). А когда этот бит сброшен в “0”, в этих полях передаются усредненные значения параметров.
Бит “Нет пульса” устанавливается в “1” при отсутствии пульса в течение 8 секунд.

Описание байта режимов работы модуля (Mode):

Ст. бит
7 6 5 4 3 2 1 0
Резерв Резерв Резерв Резерв Резерв Цифр. ФВЧ.
0 - выключен
1 – включен Фильтр артеф.
0 - мягкий
1 – жесткий Усреднение:
0 - 8 уд.
1 - 16 уд.

Модуль Капнометрии

#define CO2_ADDR 0x20 // Адрес модуля капнометрии

Формат пакета от модуля капнометрии
typedef struct
{
BYTE addr; // Адрес модуля
BYTE status; // Байт состояния модуля
WORD co2; // Капнограмма
WORD res; // Резерв
BYTE parIndex; // Индекс параметра
WORD parValue; // Значение параметра
}CO2PACKET;


Описание байта состояния модуля (Status):

Биты
7 6 5 4 3 2 1 0
Резерв Резерв Резерв Резерв Резерв Резерв Не достоверные данные Вдох
1 - обнаруж.
пульс.
(с кажд.удар.)


Бит «Не достоверные данные» устанавливается при ошибках измерения капнограммы либо при отсутствии или неисправности датчика.

Бит «Вдох» устанавливается в момент обнаружения вдоха на капнограмме.

Значения измеренных параметров передаются через поля «parIndex» и «parValue».

Индекс Параметр Описание
0 FiCO2 Значение в mmHg уровня углекислого газа во вдыхаемой смеси
1 EtCO2 Значение в mmHg уровня углекислого газа в выдыхаемом воздухе
2 FiCO2_prc Значение в % уровня углекислого газа во вдыхаемой смеси
3 EtCO2_prc Значение в % уровня углекислого газа в выдыхаемом воздухе

Остановка потоковой передачи данных

Поле Значение
CMD 2
SIZE 0

2. Установка режима вентиляции и значений управляющих параметров

Поле Значение
CMD 3
SIZE 0

Формат поля DATA в пакете запроса:



Байты Поле Описание
0,1 MODE Режим вентиляции
Биты:
0 – тип подключения (=0 трубка, =1 маска)
1...3 – режим (=0 А/С, =1 SIMV, =2 SPONT, =3 DUAL-LEVEL, =4 AUTO-MVG)
4…6 – тип принудительных вдохов (=0 PC, =1 VC, =2 PRVC)
7…9 – тип спонтанных вдохов(=0 PS, =1 TC, =2 VS)
10 – тип триггера (=0 Flow, =1 Pressure)
11 – пациент (=0 взрослый, =1 детский)
2,3 FTOT Частота вентиляции
4,5 VT Объём принудительного вдоха (мл)
Он же целевой объем для принудительных вдохов с гарантированным объемом (мл)
6,7 RESERV
8 Tpl Время (пауза) между концом вдоха и началом выдоха (100 мс)
9,10 Fmax

AMVGMV Максимальный поток на вдохе (при VC) (л/мин*100)
Минутная вентиляция для режима AUTO-MVG (%)
11 Pi Давление принудительных вдохов
12 F-trig Чувствительность
триггера по потоку
13 P-trig Чувствительность триггера по давлению
14 FlowPat Форма потока
15 RT Скорость нарастания потока
16 Esens % от пикового потока на вдохе, при котором происходит переключение с вдоха на выдох
17 Sigh

maxVTkg искусственный вдох (1 – вкл, 0 – выкл)
Максимально допустимый объем вдоха (мл/кг)
18 FiO2 Содержание кислорода на вдохе
19 PEEP Положительное давление в конце выдоха
20,21 TI Время вдоха (мс)
22 PSUP Давление поддержки спонтанных вдохов
23,24 VTSUP Объем для спонтанных вдохов с гарантированным объемом (мл)
25 TUBE_ID Диаметр интубационной трубки (мм*10)

Для формирования данных можно использовать следующую структуру:

typedef struct
{
WORD mode;
WORD f;
WORD Vt;
WORD IE; // Not currently used!!!!!!!!!!!!!!!
BYTE Tpl;
union{
WORD Fmax;
WORD amvg_MV;
};
BYTE Pi;
BYTE Ftrig;
BYTE Ptrig;
BYTE FlowPat;
BYTE riseTime;
BYTE Esens;
union{
BYTE Sigh;
BYTE maxVt_kg;
};
BYTE FiO2;
BYTE PEEP;
WORD Ti;
BYTE Psup;
WORD VTsupp;
BYTE tubeID;
union{
BYTE PAsupp;
BYTE TCsupp;
};
WORD Ti_ms;
BYTE res1[2];
}IVLMODE;


3. Запрос информации

Поле Значение
CMD 4
SIZE 0

Формат поля DATA в ответном пакете:

Байты Поле Описание
0,1 VER Версия программного обеспечения аппарата (например, значение 0х0501 соответствует версии 5.1)
2,3 NUM Сетевой номер аппарата (задается в настройках аппарата)
4,5 HW_VER Версия прошивки контроллера блока управления (например, значение 0х0501 соответствует версии 5.1)
6,7 RES1 зарезервировано
8-11 RES2 зарезервировано
12-15 RES3 зарезервировано
16-19 RES4 зарезервировано
20-23 RES5 зарезервировано
24-27 RES6 зарезервировано
28-31 RES7 зарезервировано
Изменен:20 мар 2018 15:13
 
 
Сообщения:595
работа не сложная, тем более что все спеки в наличии, но долгая, муторная и кропотливая.

1. выявить все возможные типы пакетов.
2. прикинуть можно ли их привести к одному типу или разница слишком большая.
3. к каждому типу прикинуть какие данные там должны храниться.(вещи имеющие несколько фиксированных значений лучше всего сделать энумами)
4. создать интерфейс AventaM_Packet с методой createPacket():byte[] и имплементировать в каждом типе.

как справишься будем думать дальше.
 
 
Сообщения:10
прошу помочь с кодом
 
 
Сообщения:595
ты издеваешься?
это работа для опытного джуна, максимум миделя. но работы этой недели на две-три.
 
 
Сообщения:10
для начала хотя бы составить пакет подключения.
 
 
Сообщения:10
как
windruf:
ты издеваешься?
это работа для опытного джуна, максимум миделя. но работы этой недели на две-три.

как я могу отправить сетевой пакет он должен выглядеть byte [] mas={00000000,00000101,00000001,00000001,00000011}
прошу помочь
 
 
Сообщения:595
        try(Socket socket = new Socket("192.168.1.15", 5050 ) )
        {
            OutputStream os = socket.getOutputStream();
            
            byte[] mas = {0b00000000,0b00000101,0b00000001,0b00000001,0b00000011};
            
            os.write( mas );
            os.flush();
            
            InputStream in = socket.getInputStream();
            
            int r;
            
            while( (r = in.read()) >= 0 )
                System.out.printf( "%02X ", r );
            
        }
        catch( IOException ex )
        {
            ex.printStackTrace( System.out);
        }

 
 
Сообщения:10
windruf:
        try(Socket socket = new Socket("192.168.1.15", 5050 ) )
        {
            OutputStream os = socket.getOutputStream();
            
            byte[] mas = {0b00000000,0b00000101,0b00000001,0b00000001,0b00000011};
            
            os.write( mas );
            os.flush();
            
            InputStream in = socket.getInputStream();
            
            int r;
            
            while( (r = in.read()) >= 0 )
                System.out.printf( "%02X ", r );
            
        }
        catch( IOException ex )
        {
            ex.printStackTrace( System.out);
        }


спасибо за помощь но вот теперь снова прошу помочь .Есть код на си для формирования пакета ,необходимо переписать на java
Вот пример кода на C. Чтобы было понятно как сформировать запрос.

typedef struct

{

BYTEaddr;

BYTEcmd;

WORDlen;

void*buf;

}IVLPACKET;

//---******************************************************************************

// converts two byte 14 bit integer value to 16 bit code to send via protocol

USHORT Set14to16(USHORT n) { return (((n&0xFF80)<<2) | 0x0100) | (((n&0x007F)<<1) | 0x0001);}

//---******************************************************************************

// reverse converion, two byte 16 bit code to 14 bit integer value

USHORT Set16to14(USHORT n) { return (((n&0xFC00)>>2) | ((n&0x00FE)>>1)); }

//---******************************************************************************

/*

CheckSumCalc calculates checkSum

*/

USHORT CheckSumCalc(BYTE *buf, DWORD len)

{

USHORT s = 0;

for(DWORD i = 0; i < len; i++)

s += buf[i];

return Set14to16(s);

}

//---******************************************************************************

/*

ConvSend fills the *buf according to the content in *pac structure

maxlen is the size of the buf. Used to avoid buf overfull

returns the length of filled data

*/

long ConvSend(BYTE *buf, IVLPACKET *pac, long maxlen)

{

if(maxlen < pac->len + 4 + (pac->len + 6)/7 + 2)

return 0;

USHORT n; // 16 bit unsigned integer

int bi;

buf[0] = ((pac->addr & 0x7F)<<1);

buf[1] = ((pac->cmd & 0x7F)<<1) | 1;

n = Set14to16(pac->len);

buf[2] = n&0xFF;

buf[3] = n>>8;

bi = 4+pac->len;

if(pac->buf && pac->len)

{

memcpy(buf+4, pac->buf, pac->len);

memset(buf+bi, 1, (pac->len + 6)/7);

for(USHORT i = 0; i < pac->len; i++)

if(!(buf[4+i]&1))

{

buf[4+i] |= 1;

buf[bi+i/7] |= 1<<((i%7) + 1);

}

bi += (pac->len + 6)/7;

}

n = CheckSumCalc(buf, bi);

buf[bi] = n&0xFF;

buf[bi + 1] = n>>8;

return (bi+2);

}
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет