Установка фильтра сообщений
Последнее изменение:
Перед началом приёма или передачи сообщений, необходимо установить фильтры сообщений. Если ни один фильтр не установлен, то все сообщения блокируются. Для протокола ISO 15765 доступен только один тип фильтра FLOW_CONTROL_FILTER. Его нельзя устанавливать для других протоколов. Для каждого СhannelID можно создать до 64 фильтров FLOW_CONTROL_FILTER и до 10 PASS_FILTER или BLOCK_FILTER. Для каждого выбранного типа фильтра необходимо указать параметры фильтра. Для FLOW_CONTROL_FILTER указывается три параметра pMaskMsg, pPatternMsg, pFlowControlMsg. Для PASS_FILTER или BLOCK_FILTER указывается два параметра pMaskMsg и pPatternMsg. Длина параметров может быть от 1 до 12 байт.
long PassThruStartMsgFilter(unsigned long ChannelID, unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *FilterID)
| Название константы | Описание |
|---|---|
| PASS_FILTER | Если условия фильтра заданные параметрами фильтра удовлетворяются, то сообщение пропускается. Этот фильтр не действителен для ISO 15765 протоколов. |
| BLOCK_FILTER | Если условия фильтра заданные параметрами фильтра удовлетворяются, то сообщение блокируется. Этот фильтр не действителен для ISO 15765 протоколов. |
| FLOW_CONTROL_FILTER | Если условия фильтра заданные параметрами фильтра удовлетворяются, то сообщение пропускается. Этот фильтр действителен только для ISO 15765 протоколов. |
| Код | Описание | Возможные причины и решения |
|---|---|---|
| STATUS_NOERROR | Функция выполнена успешно | — |
| ERR_DEVICE_NOT_CONNECTED | Нет соединения с адаптером |
|
| ERR_INVALID_DEVICE_ID | Недействительный идентификатор устройства |
|
| ERR_INVALID_CHANNEL_ID | Недействительный идентификатор канала |
|
| ERR_INVALID_MSG | Неправильная структура сообщения |
|
| ERR_NULL_PARAMETER | Передан NULL вместо обязательного указателя |
|
| ERR_NOT_UNIQUE | CAN ID уже используется в другом FLOW_CONTROL_FILTER |
|
| ERR_EXCEEDED_LIMIT | Превышен лимит фильтров |
|
| ERR_MSG_PROTOCOL_ID | Несоответствие протокола |
|
| ERR_FAILED | Неопределённая ошибка |
|
#include "j2534_lib.hpp"
// ... ChannelID получен от PassThruConnect ...
PASSTHRU_MSG MaskMsg, PatternMsg, FlowControlMsg;
unsigned long FilterID;
long Ret;
// Маска: сравниваем первые 4 байта (CAN ID)
MaskMsg.ProtocolID = ISO15765;
MaskMsg.DataSize = 4;
memset(MaskMsg.Data, 0xFF, 4);
// Шаблон: принимаем сообщения с CAN ID 0x7E8
PatternMsg.ProtocolID = ISO15765;
PatternMsg.DataSize = 4;
PatternMsg.Data[0] = 0x00;
PatternMsg.Data[1] = 0x00;
PatternMsg.Data[2] = 0x07;
PatternMsg.Data[3] = 0xE8;
// Ответ FlowControl: отправляем на CAN ID 0x7E0
FlowControlMsg.ProtocolID = ISO15765;
FlowControlMsg.DataSize = 4;
FlowControlMsg.Data[0] = 0x00;
FlowControlMsg.Data[1] = 0x00;
FlowControlMsg.Data[2] = 0x07;
FlowControlMsg.Data[3] = 0xE0;
Ret = PassThruStartMsgFilter(ChannelID, FLOW_CONTROL_FILTER,
&MaskMsg, &PatternMsg, &FlowControlMsg, &FilterID);
if (Ret != STATUS_NOERROR)
{
// Обработка ошибки
}
// channelID получен ранее от ptConnect
val mask = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Маска для CAN ID (сравниваем все 4 байта)
data = byteArrayOf(0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte())
)
val pattern = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Принимаем ответы от ЭБУ с CAN ID 0x7E8
data = byteArrayOf(0x00, 0x00, 0x07, 0xE8.toByte())
)
val flowControl = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Отправляем FlowControl на CAN ID 0x7E0
data = byteArrayOf(0x00, 0x00, 0x07, 0xE0.toByte())
)
val resFilter = j2534.ptStartMsgFilter(channelID, FLOW_CONTROL_FILTER, mask, pattern, flowControl)
if (resFilter.status == STATUS_NOERROR) {
val filterID = resFilter.filterId
// Фильтр успешно установлен
Log.i("J2534", "Фильтр FLOW_CONTROL_FILTER установлен, ID: $filterID")
} else {
// Обработка ошибки
Log.e("J2534", "Ошибка установки фильтра: ${resFilter.status}")
}
from ctypes import *
# channelID получен ранее от PassThruConnect
# Создаём структуры сообщений
mask = PASSTHRU_MSG()
mask.ProtocolID = ISO15765
mask.DataSize = 4
mask.Data[0:4] = [0xFF, 0xFF, 0xFF, 0xFF]
pattern = PASSTHRU_MSG()
pattern.ProtocolID = ISO15765
pattern.DataSize = 4
pattern.Data[0:4] = [0x00, 0x00, 0x07, 0xE8]
flow_control = PASSTHRU_MSG()
flow_control.ProtocolID = ISO15765
flow_control.DataSize = 4
flow_control.Data[0:4] = [0x00, 0x00, 0x07, 0xE0]
filter_id = c_ulong()
ret = j2534.PassThruStartMsgFilter(
channel_id, FLOW_CONTROL_FILTER,
byref(mask), byref(pattern), byref(flow_control), byref(filter_id)
)
if ret == 0: # STATUS_NOERROR
print(f"Фильтр установлен, ID: {filter_id.value}")
else:
print(f"Ошибка: {ret}")
// channelID получен ранее от PassThruConnect
var mask = new PASSTHRU_MSG {
ProtocolID = ISO15765,
DataSize = 4,
Data = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }
};
var pattern = new PASSTHRU_MSG {
ProtocolID = ISO15765,
DataSize = 4,
Data = new byte[] { 0x00, 0x00, 0x07, 0xE8 }
};
var flowControl = new PASSTHRU_MSG {
ProtocolID = ISO15765,
DataSize = 4,
Data = new byte[] { 0x00, 0x00, 0x07, 0xE0 }
};
uint filterId;
int ret = J2534.PassThruStartMsgFilter(
channelId, FLOW_CONTROL_FILTER,
ref mask, ref pattern, ref flowControl, out filterId
);
if (ret == 0) // STATUS_NOERROR
{
Console.WriteLine($"Фильтр установлен, ID: {filterId}");
}
#include "j2534_lib.hpp"
// ... ChannelID получен от PassThruConnect ...
PASSTHRU_MSG MaskMsg, PatternMsg;
unsigned long FilterID;
long Ret;
// Маска: сравниваем первый байт (формат)
MaskMsg.ProtocolID = ISO14230;
MaskMsg.DataSize = 1;
MaskMsg.Data[0] = 0x80;
// Шаблон: пропускаем все сообщения с битом формата = 1
PatternMsg.ProtocolID = ISO14230;
PatternMsg.DataSize = 1;
PatternMsg.Data[0] = 0x80;
Ret = PassThruStartMsgFilter(ChannelID, PASS_FILTER, &MaskMsg, &PatternMsg, NULL, &FilterID);
if (Ret != STATUS_NOERROR)
{
// Обработка ошибки
}