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://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)
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