ALPR

Automatic License Plate Recognition based on OpenALPR

Comandos Interessantes

Uploading a file to AVD using ADB:

$ ~/Android/Sdk/platform-tools/adb push ~/Desktop/placa-us-4.jpg /sdcard/Download

Running Java code which depends on native libraries via JNI:

$ java -Djava.library.path=/usr/lib/

Running command line AVD (Be careful to not run to wrong emulator dir).

$ cd ~/Android/Sdk/emulator/

$ ./emulator -avd Pixel_2_API_30 -camera-back webcam1

To check open TPC/UDP ports:

$ netstat -tulpn

Bibliografia:

• Padrão BR: https://github.com/openalpr/openalpr/blob/master/runtime_data/postprocess/br.patterns

• The Java Native Interface (livro gratuito)

https://github.com/LeoUfimtsev/jniBasicExample

https://github.com/openalpr/openalpr/releases

https://www.javatips.net/api/openalpr-android-master/app/src/main/java/org/openalpr/AlprJNIWrapper.java

https://developer.android.com/studio/debug/dev-options

Versão Android

Aplicativo exemplo

Fazer download a partir de https://github.com/SandroMachado/openalpr-android. Vamos usar o exemplo (sample) que está em Sample/OpenALPRSample/.

Descompacte o arquivo e copie (ou mova) o projeto para um local adequado:

$ unzip openalpr-android-master.zip

$ mv openalpr-android-master GoogleDrive/Doutorado/Android/openalpr-android

Copie o projeto que está em Sample/OpenALPRSample/ para o destino final. Crie um diretório chamado ALPR dentro de OpenALPRSample. Copie o diretório app que está na raiz do arquivo descompactado para dentro do diretório OpenALPRSample. Abra o projeto OpenALPRSample/ com o Android Studio.

Abra o projeto que está em Sample/OpenALPRSample/ com o Android Studio.

Edite o arquivo settings.gradle e modifique para que fique como listado a seguir:

include ':app', ':OpenALPR'


// to include OpenALPR

project(':OpenALPR').projectDir = new File('OpenALPR/app')

Verifique se a seguinte mensagem de erro aparece ao tentar executar o projeto:

Edite o arquivo gradle-wrapper.properties e modifique o distributionUrl de acordo com o apresentado a seguir:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-rc-1-all.zip

Modifique também o plugin do Gradle para classpath 'com.android.tools.build:gradle:3.0.0-beta1' e inclua o Google Maven como repositório como mostrado a seguir:

Plugin:

classpath 'com.android.tools.build:gradle:3.0.0-beta1'

Google Maven:

repositories {

maven {

url 'https://maven.google.com'

}

jcenter()

maven { url 'https://maven.fabric.io/public' }

}

Sincronize agora o projeto (se você sincronizou antes, provavelmente terá que refazer alguns dos passos anteriores).

Verifique se o seguinte erro aparece ao sincronizar o projeto:

Se aparecer, remova a linha mostrada a seguir do arquivo build.grade do módulo OpenALPR (não sei de onde tirei isso, mas funcionou):

apply plugin: 'com.github.dcendents.android-maven'

E tente sincronizar novamente agora.

Pode ser que agora seja necessário instalar o Build Tools 26.0.0. Sem problemas, apenas clique no link e instale:

Se aparecer a mensagem Device supports x86, but APK only supports armeabi-v7a junto ao nome do dispositivo Android no topo do Android Studio, inclua a seguinte linha no build.gradle do module:app:

defaultConfig {

...

ndk { abiFilters "armeabi-v7a", "x86" }

...

}

Arquivo gradle-wrapper.properties:

#Wed Sep 16 13:43:42 BRT 2020

distributionBase=GRADLE_USER_HOME

distributionPath=wrapper/dists

zipStoreBase=GRADLE_USER_HOME

zipStorePath=wrapper/dists

distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

Arquivo build.gradle(:app)

apply plugin: 'com.android.application'


android {

compileSdkVersion 23

buildToolsVersion "23.0.1"


defaultConfig {

applicationId "com.sandro.openalprsample"

minSdkVersion 16

targetSdkVersion 23

versionCode 1

versionName "1.1.2"

// multiDexEnabled true

ndk { abiFilters "armeabi-v7a", "x86" }

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

}


repositories {

google()

maven { url 'https://maven.fabric.io/public' }

maven {

url 'https://maven.google.com'

}

jcenter()

}


dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

compile project(':OpenALPR')

compile 'com.android.support:appcompat-v7:23.1.1'

compile 'com.google.code.gson:gson:2.5'

compile 'com.squareup.picasso:picasso:2.5.2'

}

Arquivo build.gradle(OpenALPRSample):

// Top-level build file where you can add configuration options common to all sub-projects/modules.


buildscript {

repositories {

google()

maven { url 'https://maven.fabric.io/public' }

maven {

url 'https://maven.google.com'

}

jcenter()

}

dependencies {

classpath 'com.android.tools.build:gradle:4.0.1'

classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'


// NOTE: Do not place your application dependencies here; they belong

// in the individual module build.gradle files

}

}


allprojects {

repositories {

google()

jcenter()

}

}


task clean(type: Delete) {

delete rootProject.buildDir

}

Se aparecer, edite o arquivo build.gradle do módulo OpenALPR e inclua a seguinte linha para permitir exceder o limite de 65k métodos como mostrado a seguir:

defaultConfig {

...

multiDexEnabled true

...

}

Site com Placas que Funcionam

From: https://www.boredpanda.com/funny-license-plates/?utm_source=google&utm_medium=organic&utm_campaign=organic





Versão Desktop

Compilar e instalar as bibliotecas:

From: http://doc.openalpr.com/compiling.html#compiling-openalpr

Install prerequisites:

$ sudo apt update

$ sudo apt install -y libopencv-dev libtesseract-dev git cmake build-essential libleptonica-dev liblog4cplus-dev libcurl3-dev beanstalkd wget

Aparentemente libcurl3-dev agora faz parte de libcurl4-openssl-dev (https://packages.ubuntu.com/focal/libcurl3-dev)

Clone the latest code from GitHub:

$ git clone https://github.com/openalpr/openalpr.git

Setup the build directory:

$ cd openalpr/src

$ mkdir build

$ cd build

Setup the compile environment:

$ cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_INSTALL_SYSCONFDIR:PATH=/etc ..

Compile the library:

$ make

Install the binaries/libraries to your local system (prefix is /usr):

$ sudo make install

Test the library:

$ wget http://plates.openalpr.com/h786poj.jpg -O lp.jpg

$ alpr lp.jpg

plate0: 10 results

- 786P0 confidence: 89.1473

- 786PO confidence: 79.1358

- 786PQ confidence: 78.6103

- 786PD confidence: 77.5103

- 7860 confidence: 73.9904

- 786PB confidence: 72.9523

- 786PU confidence: 71.1389

- 786PG confidence: 70.8614

- 786P confidence: 69.5352

- 786O confidence: 63.9789

plate1: 10 results

- 11D1 confidence: 79.2288

- 11DI confidence: 78.4472

- D1D1 confidence: 75.9261

- 1DD1 confidence: 75.3219

- D1DI confidence: 75.1445

- 1DDI confidence: 74.5404

- 11O1 confidence: 74.1402

- 11OI confidence: 73.3586

- 11B1 confidence: 73.3425

- 11U1 confidence: 73.1953

No final da compilação, as bibliotecas estarão instaladas em /usr/lib:

Configuração do Eclipse


Crie um projeto Java. Clique com o botão direito do mouse no projeto dentro do Package Explorer, selecione Build Path e depois Configure Build Path...:

Clique na aba Libraries, expanda a entrada JRE System Library, selecione Native library location e clique em Edit...:

Na janela Native Library Folder Configuration, clique em External Folder:

Navegue até /usr/lib e clique em OK:

E depois em OK. E depois novamente em OK:

A biblioteca também pode ser configurada em tempo de execução:

$ java -Djava.library.path=<path_to_dll> <main_class>

Ou através de programação (código):

System.setProperty(“java.library.path”, “/path/to/library”);

Ou usando a variável de ambiente LD_LIBRARY_PATH (não testado).

Programa:

Copie o diretório openalpr/src/bindings/java/src/com para o seu projeto:

Exemplo de código fonte:

/**

* From: http://doc.openalpr.com/bindings.html

*/


package br.com.meslin.openalpr.main;


import com.openalpr.jni.Alpr;

import com.openalpr.jni.AlprException;

import com.openalpr.jni.AlprPlate;

import com.openalpr.jni.AlprPlateResult;

import com.openalpr.jni.AlprResults;


public class Example {


public Example() {

// TODO Auto-generated constructor stub

}


public static void main(String[] args) throws AlprException {

// Alpr alpr = new Alpr("us", "/path/to/openalpr.conf", "/path/to/runtime_data");

Alpr alpr = new Alpr("us", "/etc/openalpr/openalpr.conf", "/usr/share/openalpr/runtime_data");


// Set top N candidates returned to 20

alpr.setTopN(20);


// Set pattern to Maryland

alpr.setDefaultRegion("md");


AlprResults results = alpr.recognize("/home/meslin/Desktop/temp/openalpr/src/build/lp.jpg");

System.out.format(" %-15s%-8s\n", "Plate Number", "Confidence");

for (AlprPlateResult result : results.getPlates())

{

for (AlprPlate plate : result.getTopNPlates()) {

if (plate.isMatchesTemplate())

System.out.print(" * ");

else

System.out.print(" - ");

System.out.format("%-15s%-8f\n", plate.getCharacters(), plate.getOverallConfidence());

}

}


// Make sure to call this to release memory

alpr.unload();

}

}


Coletando Dados


Instalando e configurando SNMP (SNMPd nos Agentes)

Instale o deamon SNMP:

$ sudo apt install snmpd

Configure o SNMPd para aceitar conexões de qualquer IP (!!!). Edite o arquivo snmpd.conf:

$ sudo cp /etc/snmp/snmpd.conf{,.velho}

$ sudo vi /etc/snmp/snmpd.conf

Comente e descomente as seguintes linhas (resultado final):

# Listen for connections from the local system only

#agentAddress udp:127.0.0.1:161

# Listen for connections on all interfaces (both IPv4 *and* IPv6)

agentAddress udp:161,udp6:[::1]:161

Por segurança (???), troque a rocommunity de public para musanet como mostrado a seguir:

# Default access to basic system info

rocommunity musanet default -V systemonly

# rocommunity6 is for IPv6

rocommunity6 musanet default -V systemonly

Inclua a seguinte linha em ACCESS CONTROL:

###############################################################################

#

# ACCESS CONTROL

#


# system + hrSystem groups only

view systemonly included .1.3.6.1.2.1.1

view systemonly included .1.3.6.1.2.1.25.1

view systemonly included .1.3.6.1.2.1

No final do arquivo, inclua as interfaces no seguinte formato: interface NOME TIPO VELOCIDADE.

interface ens3 6 1000000000

Reinicie o serviço:

$ sudo service snmpd restart

ou

$ sudo systemctl start snmpd

$ sudo systemctl enable snmpd

Verifique se o deamon está rodando:

$ netstat -au | grep snmp

udp 0 0 0.0.0.0:snmp 0.0.0.0:*

udp6 0 0 localhost6.localdo:snmp [::]:*

Se necessário reconfigurar o firewall, use o comando a seguir para permitir acesso à porta 161:

$ sudo ufw allow from any to any port 161

Instalação e Configuração do MRTG

Instale o Apache e o cliente SNMP:

$ sudo apt install apache2 snmp

Se for necessário (e provavelmente será), troque a porta do Apache editando o arquivo /etc/apache2/ports.conf:

$ sudo cp /etc/apache2/ports.conf{,.velho}

$ sudo vi /etc/apache2/ports.conf

Modifique a linha com Listen para o valor desejado como mostrado a seguir:

# If you just change the port or add more ports here, you will likely also

# have to change the VirtualHost statement in

# /etc/apache2/sites-enabled/000-default.conf


Listen 5504


<IfModule ssl_module>

Listen 443

</IfModule>


<IfModule mod_gnutls.c>

Listen 443

</IfModule>


# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Inicie o serviço HTTP:

$ sudo systemctl start apache2

$ sudo systemctl enable apache2

ou

$ sudo service apache2 start

Instale o MRTG. Aparentemente a melhor opção é permitir que todos os usuários tenham acesso ao arquivos do MRTG.

$ sudo apt install mrtg

Crie o diretório dentro das raiz do Apache com permissão para acesso pelo MRTG:

$ sudo mkdir /var/www/mrtg

$ sudo chown -R www-data:www-data /var/www/mrtg

No gerente (manager) SMNP (onde está instalado o Apache), verifique se você tem conexão como deamon com o seguinte comando:

$ snmpwalk -v 1 -c musanet 172.16.0.211

iso.3.6.1.2.1.1.1.0 = STRING: "Linux vm000.cloud.inf.puc-rio.br 4.15.0-118-generic #119-Ubuntu SMP Tue Sep 8 12:30:01 UTC 2020 x86_64"

iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10

iso.3.6.1.2.1.1.3.0 = Timeticks: (645857) 1:47:38.57

iso.3.6.1.2.1.1.4.0 = STRING: "Me <me@example.org>"

iso.3.6.1.2.1.1.5.0 = STRING: "vm000.cloud.inf.puc-rio.br"

iso.3.6.1.2.1.1.6.0 = STRING: "Sitting on the Dock of the Bay"

iso.3.6.1.2.1.1.7.0 = INTEGER: 72

iso.3.6.1.2.1.1.8.0 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.1.9.1.2.1 = OID: iso.3.6.1.6.3.11.3.1.1

iso.3.6.1.2.1.1.9.1.2.2 = OID: iso.3.6.1.6.3.15.2.1.1

iso.3.6.1.2.1.1.9.1.2.3 = OID: iso.3.6.1.6.3.10.3.1.1

iso.3.6.1.2.1.1.9.1.2.4 = OID: iso.3.6.1.6.3.1

iso.3.6.1.2.1.1.9.1.2.5 = OID: iso.3.6.1.6.3.16.2.2.1

iso.3.6.1.2.1.1.9.1.2.6 = OID: iso.3.6.1.2.1.49

iso.3.6.1.2.1.1.9.1.2.7 = OID: iso.3.6.1.2.1.4

iso.3.6.1.2.1.1.9.1.2.8 = OID: iso.3.6.1.2.1.50

iso.3.6.1.2.1.1.9.1.2.9 = OID: iso.3.6.1.6.3.13.3.1.3

iso.3.6.1.2.1.1.9.1.2.10 = OID: iso.3.6.1.2.1.92

iso.3.6.1.2.1.1.9.1.3.1 = STRING: "The MIB for Message Processing and Dispatching."

iso.3.6.1.2.1.1.9.1.3.2 = STRING: "The management information definitions for the SNMP User-based Security Model."

iso.3.6.1.2.1.1.9.1.3.3 = STRING: "The SNMP Management Architecture MIB."

iso.3.6.1.2.1.1.9.1.3.4 = STRING: "The MIB module for SNMPv2 entities"

iso.3.6.1.2.1.1.9.1.3.5 = STRING: "View-based Access Control Model for SNMP."

iso.3.6.1.2.1.1.9.1.3.6 = STRING: "The MIB module for managing TCP implementations"

iso.3.6.1.2.1.1.9.1.3.7 = STRING: "The MIB module for managing IP and ICMP implementations"

iso.3.6.1.2.1.1.9.1.3.8 = STRING: "The MIB module for managing UDP implementations"

iso.3.6.1.2.1.1.9.1.3.9 = STRING: "The MIB modules for managing SNMP Notification, plus filtering."

iso.3.6.1.2.1.1.9.1.3.10 = STRING: "The MIB module for logging SNMP Notifications."

iso.3.6.1.2.1.1.9.1.4.1 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.1.9.1.4.2 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.1.9.1.4.3 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.1.9.1.4.4 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.1.9.1.4.5 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.1.9.1.4.6 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.1.9.1.4.7 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.1.9.1.4.8 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.1.9.1.4.9 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.1.9.1.4.10 = Timeticks: (10) 0:00:00.10

iso.3.6.1.2.1.25.1.1.0 = Timeticks: (646886) 1:47:48.86

iso.3.6.1.2.1.25.1.2.0 = Hex-STRING: 07 E4 0A 01 12 26 13 00 2D 03 00

iso.3.6.1.2.1.25.1.3.0 = INTEGER: 393216

iso.3.6.1.2.1.25.1.4.0 = STRING: "BOOT_IMAGE=/vmlinuz-4.15.0-118-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro maybe-ubiquity

"

iso.3.6.1.2.1.25.1.5.0 = Gauge32: 2

iso.3.6.1.2.1.25.1.6.0 = Gauge32: 120

iso.3.6.1.2.1.25.1.7.0 = INTEGER: 0

End of MIB

Crie a configuração do MRTG, substituindo o arquivo padrão:

$ sudo cp /etc/mrtg.cfg{,.velho}

$ sudo bash -c 'cfgmaker musanet@172.16.0.211 > /etc/mrtg.cfg'

Configure o MRTG para obter dados da interface do cliente. O exemplo mostra a interface ens3 da VM cliente1. Edite o arquivo mrtg.cfg e inclua as linhas de configuração.

$ sudo cp /etc/mrtg.cfg{,.velho}

$ sudo vi /etc/mrtg.cfg

O arquivo deverá se parecer como o seguinte exemplo:

# Created by

# /usr/bin/cfgmaker musanet@172.16.0.211



### Global Config Options


# for UNIX

# WorkDir: /home/http/mrtg


# for Debian

WorkDir: /var/www/mrtg


# or for NT

# WorkDir: c:\mrtgdata


### Global Defaults


# to get bits instead of bytes and graphs growing to the right

# Options[_]: growright, bits


EnableIPv6: no


######################################################################

# System: vm000.cloud.inf.puc-rio.br

# Description: Linux vm000.cloud.inf.puc-rio.br 4.15.0-76-generic #86-Ubuntu SMP Fri Jan 17 17:24:28 UTC 2020 x86_64

# Contact: Me <me@example.org>

# Location: Sitting on the Dock of the Bay

######################################################################


##

## Target ----------------------------------------

##

# With the "Target" keyword you tell mrtg what it should

# monitor. The "Target" keyword takes arguments in a wide

# range of formats:


# * The most basic format is "port:community@router"

# This will generate a traffic graph for port 'port'

# of the router 'router' and it will use the community

# 'community' for the snmp query.

Target[172.16.0.211_1]: 1:musanet@172.16.0.211

SetEnv[172.16.0.211_1]: MRTG_INT_IP="172.16.0.211" MRTG_INT_DESCR="ens3"

MaxBytes[172.16.0.211_1]: 1250000

Title[172.16.0.211_1]: : Client #1

PageTop[172.16.0.211_1]: <H1>Traffic Analysis for Client #1</H1>

<TABLE>

<TR><TD>System:</TD><TD>Client #1</TD></TR>

<TR><TD>Maintainer:</TD><TD></TD></TR>

<TR><TD>Interface:</TD><TD>ENS3</TD></TR>

<TR><TD>IP:</TD><TD>ENS3 (172.16.0.211)</TD></TR>

<!-- <TR><TD>Max Speed:</TD><TD>1250.0 kBytes/s</TD></TR> -->

</TABLE>

Crie o arquivo index.html do MRTG:

$ sudo bash -c 'indexmaker /etc/mrtg.cfg > /var/www/mrtg/index.html'

Crie um Virtual Host para o MRTG no Apache editando (criando) o arquivo mrtg.conf do Apache:

$ sudo vi /etc/apache2/sites-available/mrtg.conf

Inclua as seguintes linhas no arquivo:

<VirtualHost *:5504>

ServerAdmin admin@yourdomain.com

DocumentRoot "/var/www/mrtg"

ServerName yourdomain.com

<Directory "/var/www/mrtg/">

Options None

AllowOverride None

Order allow,deny

Allow from all

Require all granted

</Directory>

TransferLog /var/log/apache2/mrtg_access.log

ErrorLog /var/log/apache2/mrtg_error.log

</VirtualHost>

Habilite o Virtual Host:

$ sudo a2ensite mrtg

$ sudo systemctl restart apache2

Acesse a página do MRTG usando o endereço da máquina e a porta configurada (http://10.50.0.6:5504/):

Para instalar snmp-mibs-downloader é necessário habilitar os repositórios non-free e contrib. Para isso edite o arquivo /etc/apt/sources.list:

$ sudo cp /etc/apt/sources.list{,.velho}

$ sudo vi /etc/apt/sources.list

E inclua as seguintes linhas no final:

deb http://deb.debian.org/debian stretch main contrib non-free

deb-src http://deb.debian.org/debian stretch main contrib non-free


deb http://security.debian.org/debian-security/ stretch/updates main contrib non-free

deb-src http://security.debian.org/debian-security/ stretch/updates main contrib non-free


deb http://deb.debian.org/debian stretch-updates main contrib non-free

deb-src http://deb.debian.org/debian stretch-updates main contrib non-free

Atualize a lista de pacotes:

$ sudo apt update

Verifique se o seguinte erro acontece ao atualizar a lista de pacotes:

The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 9D6D8F6BC857C906 NO_PUBKEY AA8E81B4331F7F50

Nesse caso, é necessário executar o seguinte comando para cada chave faltando:

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 9D6D8F6BC857C906

Instale os pacotes:

$ sudo apt install snmp snmp-mibs-downloader

Edite o arquivo snmp.conf e comente a linha mibs ::

$ sudo cp /etc/snmp/snmp.conf{,.velho}

$ sudo vi /etc/snmp/snmp.conf

O arquivo ficará assim:

# As the snmp packages come without MIB files due to license reasons, loading

# of MIBs is disabled by default. If you added the MIBs you can reenable

# loading them by commenting out the following line.

#mibs :

Para configurar o SNMP+MRTG em uma imagem Docker:

$ sudo docker run -it -p 8080:8080 -p 80:80 ubuntu:16.04

E use os seguintes comandos para instalar e configurar o SNMPd:

$ apt update

$ apt upgrade -y

$ apt install -y snmpd vim net-tools snmp-mibs-downloader cron

$ cp /etc/snmp/snmpd.conf{,.velho}

$ vi /etc/snmp/snmpd.conf

Conteúdo do arquivo:

15: #agentAddress udp:127.0.0.1:161

17: agentAddress udp:161

40: view systemonly included .1.3.6.1.2.1

145: #defaultMonitors yes

147: #linkUpDownNotifications yes

Reinicie e teste o o deamon:

$ service snmpd restart

$ netstat -au | grep snmp

Para instalar e configurar o MRTG+Apache2:

$ apt install -y apache2 snmp mrtg

$ sudo cp /etc/apache2/ports.conf{,.velho}


$ service apache2 start


$ mkdir /var/www/mrtg

$ chown -R www-data:www-data /var/www/mrtg

$ snmpwalk -v 1 -c public localhost

$ cfgmaker public@localhost

$ bash -c 'cfgmaker public@localhost > /etc/mrtg.cfg'

$ indexmaker /etc/mrtg.cfg

$ bash -c 'indexmaker /etc/mrtg.cfg > /var/www/mrtg/index.html'

Teste de Tempo de Transferência

Para controlar as características da rede, usar o programa tc:

$ tc qdisc add dev ens3 root tbf rate 1mbit burst 1540 latency 10ms

$ tc qdisc delete dev ens3 root tbf rate 1mbit burst 1540 latency 10ms

Onde:

  • qdisc tells tc to modify the scheduler

  • add tells tc to add a new rule

  • dev ens3 tells tc the rules will be applied to device ens5

  • root tells tc to modify the outbound traffic scheduler

  • tbf rate 1024kbit tells tc to slow traffic down to the 1024kbit rate

  • latency 50ms tells tc we'll be delaying traffic by 50ms

  • burst 1540 tells tc the size of our bucket

Tabela de largura de banda:

From: https://en.wikipedia.org/wiki/IEEE_802.11#802.11a_(OFDM_waveform)

Tabela de Largura de Banda

TCP

Material necessário:

  • Cliente1

  • ContextNet1

  • Server-TCP

  • Client-TCP

  • rio.jpg

Obtenção dos dados:

Server:

$ java -jar Benchmark/Server-TCP.jar -p 8752

Client:

$ java -jar Benchmark/Client-TCP.jar -a 172.16.1.202 -f /home/meslin/rio.jpg -p 8752

MR-UDP

UDP

Não faz sentido transferir imagens via UDP porque se parte da imagem se perder, toda a imagem será perdida

Using the MUSANet Docker Image

At the command line, run the Docker image:

$ sudo docker run -it -p 5500:5500/udp --name musanet0 meslin/musanet

Visit our website at https://musanet.meslin.com.br/

This slice IP address: 172.17.0.2

Working Directory = /

Gateway started...

Gateway MR-UDP IP: 172.17.0.2:5500

Now, you can connect to a MUSANet slice on 172.17.0.2:5500 or use your computer IP address for remote access.

For file transfer, use musanet:musanet as credentials for login.

To run a command, try this:

$ sudo docker exec musanet0 java -jar /home/musanet/CoreServerMRUDP.jar