Geração dos dados
O processo de geração de dados simulados é realizado através do script generator.py
, que utiliza a classe Reading e seus parâmetros predefinidos para criar leituras fictícias de sensores.
Classe Reading
A classe Reading é definida para representar leituras de sensores com parâmetros específicos. Os parâmetros incluem o tipo de sensor, unidade de medida, valores mínimo e máximo, valor médio e a probabilidade de gerar valores discrepantes (outliers). Diversas instâncias dessa classe são criadas para diferentes tipos de sensores e armazenadas em uma lista chamada sensors
.
Para cada tipo de sensor, são definidos parâmetros específicos em forma de dicionários. Abaixo estão os parâmetros para alguns sensores específicos:
CO2 Sensor (co2_sensor_params)
Tipo: CO2
Unidade: ppm
Mínimo: 300, Máximo: 1000
Valor Médio: 400
Probabilidade de Valor Discrepante: 0.05
CO Sensor (co_sensor_params)
Tipo: CO
Unidade: ppm
Mínimo: 0, Máximo: 10
Valor Médio: 1
Probabilidade de Valor Discrepante: 0.05
PM10 Sensor (pm10_sensor_params)
Tipo: PM10
Unidade: ug/m³
Mínimo: 0, Máximo: 100
Valor Médio: 20
Probabilidade de Valor Discrepante: 0.05
Em suma, geramos valores para os sensores 'co_sensor', 'co2_sensor', 'no2_sensor', 'pm10_sensor', 'pm25_sensor', 'solar_intensity_sensor' e 'noise_sensor'.
Função generate_mock_sensor_value
def generate_mock_sensor_value(min_value, max_value, average_value, outlier_probability):
# Calculate interquartile range
iqr = (max_value - min_value) / 2
# Check if outlier should be generated
if np.random.rand() < outlier_probability:
# Generate outlier value outside the interquartile range
outlier_value = np.random.normal(loc=average_value, scale=iqr * 1.5)
# Ensure the outlier value does not exceed the bounds
outlier_value = min(max_value, max(min_value, outlier_value))
return outlier_value
else:
# Generate normal sensor value within the interquartile range
normal_value = np.random.normal(loc=average_value, scale=iqr)
# Ensure the normal value does not exceed the bounds
normal_value = min(max_value, max(min_value, normal_value))
return normal_value
Esta função é crucial para a criação de valores sintéticos de sensores com base nos parâmetros definidos. Ela considera os valores mínimo, máximo, médio e a probabilidade de gerar outliers. A lógica utiliza a distribuição normal para gerar valores dentro ou fora do intervalo interquartil, dependendo da probabilidade de outliers.
Armazenamento local de dados
O loop final percorre cada sensor na lista sensors e para cada região (east, west, north, south, center), gera 100 leituras simuladas. Estas leituras são armazenadas em arquivos CSV específicos para cada sensor e região dentro do diretório data/
.
Além disso, são criados arquivos de configuração JSON para cada sensor e região, contendo detalhes como tipo de sensor, região, taxa de transmissão, unidade e qualidade de serviço (QoS). Esses arquivos de configuração são cruciais para integrar eficientemente os dados simulados com o AWS IoT Core.
Em suma, o processo gera a seguinte organização de arquivos:
├── data
│ ├── center
│ │ ├── CO2.csv
│ │ ├── CO2.json
│ │ ├── CO.csv
│ │ ├── CO.json
│ │ ├── NO2.csv
│ │ ├── NO2.json
│ │ ├── noise.csv
│ │ ├── noise.json
│ │ ├── PM10.csv
│ │ ├── PM10.json
│ │ ├── PM2.5.csv
│ │ ├── PM2.5.json
│ │ ├── solar.csv
│ │ └── solar.json
│ ├── east
│ │ ├── CO2.csv
│ │ ├── CO2.json
│ │ ├── CO.csv
│ │ ├── CO.json
│ │ ├── NO2.csv
│ │ ├── NO2.json
│ │ ├── noise.csv
│ │ ├── noise.json
│ │ ├── PM10.csv
│ │ ├── PM10.json
│ │ ├── PM2.5.csv
│ │ ├── PM2.5.json
│ │ ├── solar.csv
│ │ └── solar.json
│ ├── north
│ │ ├── CO2.csv
│ │ ├── CO2.json
│ │ ├── CO.csv
│ │ ├── CO.json
│ │ ├── NO2.csv
│ │ ├── NO2.json
│ │ ├── noise.csv
│ │ ├── noise.json
│ │ ├── PM10.csv
│ │ ├── PM10.json
│ │ ├── PM2.5.csv
│ │ ├── PM2.5.json
│ │ ├── solar.csv
│ │ └── solar.json
│ ├── south
│ │ ├── CO2.csv
│ │ ├── CO2.json
│ │ ├── CO.csv
│ │ ├── CO.json
│ │ ├── NO2.csv
│ │ ├── NO2.json
│ │ ├── noise.csv
│ │ ├── noise.json
│ │ ├── PM10.csv
│ │ ├── PM10.json
│ │ ├── PM2.5.csv
│ │ ├── PM2.5.json
│ │ ├── solar.csv
│ │ └── solar.json
│ └── west
│ ├── CO2.csv
│ ├── CO2.json
│ ├── CO.csv
│ ├── CO.json
│ ├── NO2.csv
│ ├── NO2.json
│ ├── noise.csv
│ ├── noise.json
│ ├── PM10.csv
│ ├── PM10.json
│ ├── PM2.5.csv
│ ├── PM2.5.json
│ ├── solar.csv
│ └── solar.json
Este processo de geração de dados proporciona uma abordagem eficaz para testar o sistema em diferentes cenários antes da implementação com dispositivos IoT reais.
Publicação dos dados
A publicação se dá pelo script publisher.py
, localizado na pasta generic_sensor
. Este script é responsável pela conexão com o AWS IoT Core, leitura da configuração do sensor a partir de um arquivo JSON, obtenção dos dados do sensor de um arquivo CSV e publicação desses dados em um tópico MQTT.
Para executar o script publisher.py
, é necessário fornecer dois argumentos de linha de comando:
--sensor: Especifica o tipo de sensor a ser publicado.
--region: Define a região associada ao sensor.
Exemplo de Uso:
python publisher.py --sensor CO2 --region east
Fluxo de Execução
Leitura de Configuração:
- O script lê as configurações do sensor a partir do arquivo JSON associado à região e ao tipo de sensor fornecidos como argumentos. Em resumo, ele procura dinamicamente os valores e configurações associados a esse sensor na pasta
data
. - Cria uma instância da classe Configuration para armazenar essas configurações.
Leitura de Dados CSV:
- Obtém dados simulados do sensor a partir do arquivo CSV associado à região e ao tipo de sensor fornecidos como argumentos.
- Armazena esses dados em uma lista.
Conexão MQTT com AWS IoT Core:
- Estabelece uma conexão segura com o AWS IoT Core usando certificados TLS.
- Utiliza os parâmetros de região, certificados e chaves associados ao sensor, disponíveis na pasta
authentication_keys
.
Publicação de Dados:
- Itera sobre os dados do sensor.
- Arredonda os valores e cria uma mensagem JSON com base nas configurações do sensor.
- Publica essa mensagem no tópico MQTT específico para o sensor, região e AWS IoT Core.
Detalhes de Conexão
- Intervalo de Publicação (interval): O tempo entre as publicações é calculado com base na taxa de transmissão configurada para o sensor.
- Tópico MQTT (topic): Construído com base na região e no tipo de sensor, este é o canal onde os dados são publicados no AWS IoT Core (padrão
sensor/região/sensor
)