Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
Таблица 7.1. Правила фаззификации, позволяющие преобразовать входные переменные в выходные
Мы использовали общий метод минимакса, показанный на рис. 7.34, чтобы получить значения членства для выходных переменных. То есть наибольшее из значений членства входных функций отображается в соответствующей выходной функции. Если после применения всех правил, и выходная функция имеет более одного значения, то для выходной функции выбирается наименьшее значение. Для дефаззификации выходного значения, все выходные функции и соответствующие значения членства используются, чтобы вычислить центральное выходное значение. Полученные значения выходных функций функций (показанные на оси X рис. 7.33), умножаются на значения членства, вычисленные по девяти правилам, результаты складываются и сумма делится на число членов. Конечное числовое значение и соответствующее сообщение распечатано на экране ЖК дисплее, чтобы сообщить пользователю состояние сеанса. Таким образом, для каждого сеанса, ЖК дисплей высвечивает три числа, характеризующих три типа активности вторжения: атаки на интерактивные сеансы туннелирования, атаки с помощью скриптов и внедрение видео и аудио потоков.
Рис. 7.34. Процедуры передачи членства оценивают, используя метод Минимакса
7.6.6. Обсуждение проекта
В последнее время среди различных систем обнаружения вторжения наибольший интерес проявляется к системе обнаружения атак на туннелирование HTTP. Основной причиной такого внимания служит широкое распространение трафика HTTP в Internet. Большинство брандмейстеров не выполняет обширных проверок, чтобы проверить все атаки на туннелирование HTTP. Такие проверки весьма трудоемки, поскольку трафик HTTP составляет наибольшую часть приходящего и уходящего трафика для любой большой организации.
Микроконтроллерная система может взять на себя часть функций системы обнаружения вторжения, связанных с атаками на туннелирование HTTP. Система использует свойства сессии, чтобы проверить данные трафика Internet, которые составляют сессию Internet — программные связи между двумя компьютерами для передачи данных. Хорошим примером сессии является набор адреса сети в браузере. Ваш компьютер запрашивает сессию у ведущего компьютера, который содержит страницу сети, которая вам необходима. Как только вы закрываете веб-сайт и переходите к другому сайту, вы закрываете одну сессию и запускаете другую.
7.6.7. Программный код
//********************************************************************
// Файл: micro.с
// Функция программы: Устанавливает шесть IDS оценок членства и создает
// оценку опасности вторжения
// Авторы: Даниэль Пак, Барри Муллинз, Стив Барретт
// Дата создания: 17 июня 2004
// Установки: Program=0x1000, Data=0x3000, Stack=0x4000
//********************************************************************
#include <stdio.h>
#include "hcs12dp256.h"
//********************************************************************
//функции поддержки
//====================================================================
// _HC12Setup: выключить сторожевой таймер COP
//====================================================================
void _HC12Setup(void) {
COPCTL = 0x00; // выключить сторожевой таймер COP
}
//********************************************************************
//delay: подпрограмма задержки
//********************************************************************
void delay(void) { //подпрограмма задержки
volatile unsigned n, m;
m = 10;
do {
n = 0;
do {
n--;
} while(n);
m--;
} while(m);
}
//********************************************************************
// status_wait: время ожидания подпрограмма установки связи с ЖКД
//********************************************************************
void status_wait(void) { //время ожидания подпрограмма установки связи с ЖК дисплеем
char temp = 0x00;
DDRA = 0x00;
PORTB = 0xF9;
while ((temp & 0x03) != 0x03) {
PORTB = 0xFF;
temp = PORTA;
PORTB = 0xF9;
}
PORTB = 0xFF;
DDRA = 0xFF;
}
//********************************************************************
// command: пересылка команд на ЖК дисплей
//********************************************************************
void command(unsigned char n) { // пересылка команд на ЖК дисплей
status_wait();
PORTA = n;
PORTB = 0xFF;
PORTB = PORTB & 0xFA;
PORTB = 0xFF;
}
//********************************************************************
//********************************************************************
//data: пересылка данных на ЖК дисплей
//********************************************************************
void data(unsigned char n) { // пересылка данных на ЖК дисплей
status_wait();
PORTA = n;
PORTB = PORTB & 0xF2;
PORTB = 0xFF;
}
//********************************************************************
// LCD_char: функция пересылки символа на ЖК дисплей
//********************************************************************
void LCD_char(unsigned char n) {
// функция пересылки символа на ЖК дисплей
data(n - 0x20);
command(0xC0);
}
//********************************************************************
// newline: пересылка новой строки на ЖК дисплей
//********************************************************************
void newline(void) {
// пересылка новой строки на ЖК дисплей
int i;
for (i=0; i<16; i++) LCD_char(' ');
}
//********************************************************************
// LCD_output: пересылка последовательности символов на ЖК дисплей
//********************************************************************
void LCD_output(char s[]) {
// пересылка последовательности символов на ЖК дисплей
int n = 0;
while (s[n] != ' ') {
LCD_char(s[n]);
++n;
}
}
//********************************************************************
// Reset_cursor: возврат курсора
//********************************************************************
void Reset_cursor(void) { // возврат курсора
data(0x00);
data(0x10);
command(0x24);
}
//********************************************************************
//Clearscreen: очистка экрана ЖКД
//********************************************************************
void Clearscreen(void) { // очистка экрана ЖКД
int i,j;
Reset_cursor();
for (i=0; i<16; i++) for(j=0; j<16; j++) LCD_char(' ');
Reset_cursor();
}
//********************************************************************
// Initlcd: инициализация ЖКД
//********************************************************************
void Initlcd(void) { // инициализация ЖКД
PORTB = 0xEF; //принудительный сброс
delay();
PORTB = 0xFF; //все линии команд на высоком уровне
status_wait();
command(0x80); // установить режим текста
data(0x00); // установить младший байт адреса текста (L)
data(0x10); // установить младший байт адреса текста (H)
command(0x40); //установить адрес команды текста
data(0x10); //установить область текста
data(0x00);
command(0x41);
command(0x94); //включить текстовый дисплей
command(0xA7); //курсор 8×8 позиций
Clearscreen();
Reset_cursor();
}
//********************************************************************
// InitMes: начальное сообщение
//********************************************************************
void InitMes(void) { // начальное сообщение
unsigned char k;
for(k=0; k<3; k++) newline();
LCD_output(" Portable HTTP");
newline();
LCD_output(" TAD System.");
newline();
LCD_output(" version 1.0");
}
//********************************************************************
// numdisplay: отображение чисел на ЖК дисплее
//********************************************************************
void numdisplay(char s) { //отображение чисел на ЖК дисплее
char k;
newline();
k = s;
s = s>>4;
if (s > 0x08) data(s + 0x17);
else data(s + 0x10);
command(0xC0);
k = k & 0x0F;
if (k > 0x08) data(k + 0x17);
else data(k + 0x10);
command(0xC0);
}
//********************************************************************
// Секция данных - инициализация табличных данных
//********************************************************************
#pragma abs_address 0x3000
char BeP[12] = {0x00, 0x70, 0x00, 0x10,