sensor mqtt data refactor

This commit is contained in:
Miro Zmrzli 2024-06-24 12:18:36 -07:00
parent 2344f6efd0
commit 800aa8fbe1
14 changed files with 325 additions and 166 deletions

View File

@ -15,3 +15,18 @@ need root certificates
openssl s_client -showcerts -connect www.bigfoot-inc.com:443
openssl s_client -showcerts -connect mqtt-dev-server.westus2-1.ts.eventgrid.azure.net:8883
to get full certificate and save it to pem file:
openssl s_client -showcerts -connect mqtt-dev-server.westus2-1.ts.eventgrid.azure.net:8883 </dev/null 2>/dev/null|openssl x509 -outform PEM >mycertfile.pem
openssl s_client -showcerts -verify 5 -connect mqtt-dev-server.westus2-1.ts.eventgrid.azure.net:8883 < /dev/null
openssl s_client -showcerts -verify 5 -connect mqtt-dev-server.westus2-1.ts.eventgrid.azure.net:8883 < /dev/null |
awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/{ if(/BEGIN CERTIFICATE/){a++}; out="cert"a".pem"; print >out}'
for cert in *.pem; do
newname=$(openssl x509 -noout -subject -in $cert | sed -nE 's/.*CN ?= ?(.*)/\1/; s/[ ,.*]/_/g; s/__/_/g; s/_-_/-/; s/^_//g;p' | tr '[:upper:]' '[:lower:]').pem
echo "${newname}"; mv "${cert}" "${newname}"
done
convert crl to pem
openssl crl -in "Microsoft Azure ECC TLS Issuing CA 08 - xsign.crt" -inform PEM -out "Microsoft Azure ECC TLS Issuing CA 08 - xsign.pem"

View File

@ -43,7 +43,17 @@ void MqttService::task()
{
ESP_LOGI(TAG, "connecting to mqtt broker...");
if (m_mqtt_client->connect("Esp32 client", "client1-authn-ID", NULL))
{
ESP_LOGI(TAG, "connected");
if(m_mqtt_client->subscribe("my_topic"))
{
ESP_LOGI(TAG, "subscribed");
}
else
{
ESP_LOGE(TAG, "subscribe failed");
}
}
else
{
ESP_LOGE(TAG, "failed with state %d", m_mqtt_client->state());

View File

@ -10,7 +10,6 @@ void createHeader(struct MESSAGE_HEADER * header)
{
struct timeval tv;
gettimeofday(&tv, NULL);
header->type = MESSAGE_TYPE_HEADER;
header->sec = tv.tv_sec;
header->usec = tv.tv_usec;
header->group_id = SETTINGS.device.group_id;

View File

@ -6,143 +6,89 @@
#pragma pack(push, 1)
struct MESSAGE_HEADER // 19 bytes
struct MESSAGE_HEADER // 18 bytes
{
uint8_t type;
uint32_t sec;
uint32_t usec;
uint8_t mac[6];
uint32_t group_id;
};
struct MESSAGE_TYPE_VAL_REASON
struct MESSAGE_RADAR_BLOCK // 67 bytes
{
uint8_t type;
uint32_t val;
uint8_t reason;
};
struct RADAR // 49
{
uint8_t type;
struct MESSAGE_HEADER header;
uint8_t id;
uint16_t vals[24];
};
struct GAS_HEADER // 2 bytes
{
uint8_t type;
uint8_t num_measurements;
};
struct GAS_DATA //5 bytes
struct GAS_DATA
{
uint8_t index;
float gas_resistance;
float resistance;
};
struct OTHERS
struct MESSAGE_SENSORS_BLOCK
{
struct MESSAGE_HEADER header;
uint8_t id;
float pressure;
float temp;
float temperature;
uint16_t light;
float humidity;
uint8_t num_data;
struct GAS_DATA data[0];
};
struct GAS // 6 + num_gas_data * 5
struct MESSAGE_NOTIFY_PRESSURE
{
struct GAS_HEADER header;
float humidity;
struct GAS_DATA data[0];
struct MESSAGE_HEADER header;
uint8_t id;
float value;
};
struct MESSAGE_NOTIFY_TEMPERATURE
{
struct MESSAGE_HEADER header;
uint8_t id;
float value;
};
struct MESSAGE_NOTIFY_HUMIDITY
{
struct MESSAGE_HEADER header;
uint8_t id;
float value;
};
struct MESSAGE_NOTIFY_LIGHT // 21 bytes
{
struct MESSAGE_HEADER header;
uint8_t id;
uint16_t value;
};
#pragma pack(pop)
#define HEADER_MESSAGE(name_) \
struct MESSAGE_HEADER name_; \
createHeader(&name_);
#define MQTT_MESSAGE_BLOCK_RADAR(msgaddr_) \
createHeader(&(*msgaddr_).header); \
(msgaddr_)->id = MESSAGE_TYPE_BLOCK_RADAR;
#define HEADER_MESSAGE_P(addr_) \
createHeader(addr_);
#define MQTT_MESSAGE_BLOCK_SENSOR(msgaddr_) \
createHeader(&(*msgaddr_).header); \
(msgaddr_)->id = MESSAGE_TYPE_BLOCK_SENSOR;
#define PRESSURE_MESSAGE(name_, val_, reason_) \
struct MESSAGE_TYPE_VAL_REASON name_; \
name_.type = MESSAGE_TYPE_PRESSURE; \
name_.val = val_; name_.reason = reason_;
#define MQTT_MESSAGE_NOTIFY_LIGHT(msgaddr_) \
createHeader(&(msgaddr_)->header); \
(msgaddr_)->id = MESSAGE_TYPE_NOTIFY_LIGHT;
#define PRESSURE_MESSAGE_P(addr_, val_, reason_) \
(addr)->type = MESSAGE_TYPE_PRESSURE; \
(addr)->val = val_; (addr)->reason = reason_;
#define LIGHT_MESSAGE(name_, val_, reason_) \
struct MESSAGE_TYPE_VAL_REASON name_; \
name_.type = MESSAGE_TYPE_LIGHT; \
name_.val = val_; name_.reason = reason_;
#define MESSAGE_TYPE_NOTIFY_PRESSURE 0x01
#define MESSAGE_TYPE_NOTIFY_TEMPERATURE 0x02
#define MESSAGE_TYPE_NOTIFY_HUMIDITY 0x03
#define MESSAGE_TYPE_NOTIFY_LIGHT 0x04
#define LIGHT_MESSAGE_P(addr_, val_, reason_) \
(addr_)->type = MESSAGE_TYPE_LIGHT; \
(addr_)->val = val_; (addr_)->reason = reason_;
#define TEMP_MESSAGE(name_, val_, reason_) \
struct MESSAGE_TYPE_VAL_REASON name_; \
name_.type = MESSAGE_TYPE_TEMP; \
name_.val = val_; name_.reason = reason_;
#define TEMP_MESSAGE_P(addr_, val_, reason_) \
(addr_)->type = MESSAGE_TYPE_TEMP; \
(addr_)->val = val_; (addr_)->reason = reason_;
#define HUM_MESSAGE(name_, val_, reason_) \
struct MESSAGE_TYPE_VAL_REASON name_; \
name_.type = MESSAGE_TYPE_HUMIDITY; \
name_.val = val_; name_.reason = reason_;
#define HUM_MESSAGE_P(addr_, val_, reason_) \
(addr_)->type = MESSAGE_TYPE_HUMIDITY; \
(addr_)->val = val_; (addr_)->reason = reason_;
#define GAS_IX_MESSAGE(name_, val_, reason_) \
struct MESSAGE_TYPE_VAL_REASON name_; \
name_.type = MESSAGE_TYPE_GAS_IX; \
name_.val = val_; name_.reason = reason_;
#define GAS_IX_MESSAGE_P(addr_, val_, reason_) \
(addr_)->type = MESSAGE_TYPE_GAS_IX; \
(addr_)->val = val_; (addr_)->reason = reason_;
#define GAS_VAL_MESSAGE(name_, val_, reason_) \
struct MESSAGE_TYPE_VAL_REASON name_; \
name_.type = MESSAGE_TYPE_GAS_VAL; \
name_.val = val_; name_.reason = reason_;
#define GAS_VAL_MESSAGE_P(addr_, val_, reason_) \
(addr_)->type = MESSAGE_TYPE_GAS_VAL; \
(addr_)->val = val_; (addr_)->reason = reason_;
#define RADAR_MESSAGE(name_) \
struct RADAR name_; \
name_.type = MESSAGE_TYPE_RADAR;
#define RADAR_MESSAGE_P(addr_) \
(addr_)->type = MESSAGE_TYPE_RADAR;
#define GAS_MESSAGE(name_, num_vals_) \
struct GAS name_; \
name_.header.type = MESSAGE_TYPE_GAS; \
name_.header.num_measurements = num_vals_;
#define GAS_MESSAGE_P(addr_, num_vals_) \
(addr_)->header.type = MESSAGE_TYPE_GAS; \
(addr_)->header.num_measurements = num_vals_;
#define MESSAGE_TYPE_HEADER 0xa5
#define MESSAGE_TYPE_PRESSURE 0x04
#define MESSAGE_TYPE_RADAR 0x37
#define MESSAGE_TYPE_LIGHT 0x06
#define MESSAGE_TYPE_TEMP 0x07
#define MESSAGE_TYPE_HUMIDITY 0x08
#define MESSAGE_TYPE_GAS_IX 0x09 // deprecated
#define MESSAGE_TYPE_GAS_VAL 0x0a // deprecated
#define MESSAGE_TYPE_GAS 0x0b
#define MESSAGE_TYPE_SENSOR_BLOCK 0x0c
#define MESSAGE_TYPE_BLOCK_RADAR 0x10
#define MESSAGE_TYPE_BLOCK_SENSOR 0x11
void createHeader(struct MESSAGE_HEADER * header);

View File

@ -55,8 +55,6 @@ bool Bme68x::read(struct BME_DATA * data)
{
int ix = _min(bdata.gas_index, 9);
ESP_LOGW(TAG, "index: %d", ix);
data->measurement_bitmask |= (1 << ix);
if(ix == 0)

View File

@ -16,7 +16,7 @@ bool Bmp280::init()
uint8_t status = m_sensor->begin(0x76);
m_sensor->setPresOversampling(OVERSAMPLING_X4); // Set the pressure oversampling to X4
m_sensor->setTempOversampling(OVERSAMPLING_X1); // Set the temperature oversampling to X1
m_sensor->setIIRFilter(IIR_FILTER_2); // Set the IIR filter to setting 4
m_sensor->setIIRFilter(IIR_FILTER_4); // Set the IIR filter to setting 4
m_sensor->setTimeStandby(TIME_STANDBY_62MS);
m_sensor->startNormalConversion(); // Start BMP280 continuous conversion in NORMAL_MODE
@ -28,9 +28,7 @@ bool Bmp280::init()
bool Bmp280::read(float & temp, float & pressure)
{
if(m_sensor->getTempPres(temp, pressure))
{
return true;
}
return true;
return false;
}

View File

@ -51,42 +51,47 @@ void SensorService::start()
pinMode(LIGHT_SENSOR_PIN, INPUT);
}
void::SensorService::processPressure(float pressure)
{
static float filtered = 0;
static uint64_t previous = esp_timer_get_time();
if(filtered == 0 && pressure != 0)
filtered = pressure;
uint64_t now = esp_timer_get_time();
ESP_LOGI(TAG, "delta T: %d", (uint32_t)((now-previous)/1000));
filtered = 0.95 * filtered + 0.05 * pressure;
previous = now;
ESP_LOGI(TAG, "%0.3f \t%0.3f", pressure, filtered);
}
void SensorService::postBme68xData(float pressure, float temp)
{
struct msg
{
struct MESSAGE_HEADER header;
struct OTHERS others;
struct GAS gas;
};
uint8_t msg_buffer[100];
struct msg *data_to_send = (struct msg *)msg_buffer;
HEADER_MESSAGE_P(&data_to_send->header);
GAS_MESSAGE_P(&data_to_send->gas, 0);
data_to_send->others.light = m_light_value;
data_to_send->others.pressure = pressure;
data_to_send->others.temp = temp;
uint8_t msg_buffer[sizeof(struct MESSAGE_SENSORS_BLOCK) + 10*sizeof(struct GAS_DATA)];
struct MESSAGE_SENSORS_BLOCK * msg = (struct MESSAGE_SENSORS_BLOCK *)msg_buffer;
MQTT_MESSAGE_BLOCK_SENSOR(msg);
msg->humidity = m_bme_data.humidity;
msg->light = m_light_value;
msg->pressure = pressure;
msg->temperature = temp;
int num_total = 0;
struct GAS_DATA * p = data_to_send->gas.data;
struct GAS_DATA * p = msg->data;
for(int n = 0; n < 10; n++)
{
if(m_bme_data.measurement_bitmask & (1 << n))
{
p[num_total].gas_resistance = m_bme_data.measurement[n].resistance;
p[num_total].resistance = m_bme_data.measurement[n].resistance;
p[num_total++].index = n;
}
}
msg->num_data = num_total;
data_to_send->gas.header.num_measurements = num_total;
data_to_send->gas.humidity = m_bme_data.humidity;
m_app_if.getBuffer()->putBlock((uint8_t*)&data_to_send, sizeof(*data_to_send) + num_total * sizeof(struct GAS_DATA));
m_app_if.getBuffer()->putBlock((uint8_t*)msg, sizeof(*msg) + num_total * sizeof(struct GAS_DATA));
// clear the blackboard
memset(&m_bme_data, 0, sizeof(m_bme_data));
@ -109,22 +114,15 @@ void SensorService::processLight(int light_value)
if(now - last_time >= 2000000) // >= 2s
{
ESP_LOGI(TAG, "light: %d", min_light_val);
if(last_light_val >= 0)
{
if(abs(min_light_val - last_light_val) > 4096*5/100)
{
ESP_LOGI(TAG, "light tripped");
struct msg
{
struct MESSAGE_HEADER header;
struct MESSAGE_TYPE_VAL_REASON light;
};
struct msg m;
HEADER_MESSAGE_P(&m.header);
LIGHT_MESSAGE_P(&m.light, min_light_val, 1);
m_app_if.getBuffer()->putBlock((uint8_t*)&m, sizeof(m));
struct MESSAGE_NOTIFY_LIGHT msg;
MQTT_MESSAGE_NOTIFY_LIGHT(&msg);
msg.value = min_light_val;
m_app_if.getBuffer()->putBlock((uint8_t*)&msg, sizeof(msg));
}
}
last_light_val = min_light_val;
@ -139,14 +137,14 @@ void SensorService::run_i2c_1()
{
while(true)
{
m_bmp280->read(m_bmp_data.temp, m_bmp_data.pressure);
if(m_bmp280->read(m_bmp_data.temp, m_bmp_data.pressure))
processPressure(m_bmp_data.pressure);
bool bme_cycle_finished = m_bme68x->read(&m_bme_data);
uint16_t read_light_val = analogRead(LIGHT_SENSOR_PIN);
if(bme_cycle_finished)
{
postBme68xData(m_bmp_data.pressure, m_bmp_data.temp);
}
processLight(read_light_val);
@ -170,25 +168,18 @@ void SensorService::run_uart()
if(m_ld2410->stationary_energy[0] != 0)
{
struct msg
{
struct MESSAGE_HEADER header;
struct RADAR radar;
};
struct msg m;
HEADER_MESSAGE_P(&m.header);
RADAR_MESSAGE_P(&m.radar);
struct MESSAGE_RADAR_BLOCK msg;
MQTT_MESSAGE_BLOCK_RADAR(&msg);
for(int n = 0; n < 24; n++)
{
if(n < 14)
m.radar.vals[n] = m_ld2410->motion_energy[n] > 0xffff ? 0xffff : (uint16_t)m_ld2410->motion_energy[n];
msg.vals[n] = m_ld2410->motion_energy[n] > 0xffff ? 0xffff : (uint16_t)m_ld2410->motion_energy[n];
else
m.radar.vals[n] = m_ld2410->stationary_energy[n-14] > 0xffff ? 0xffff : (uint16_t)m_ld2410->stationary_energy[n-14];
msg.vals[n] = m_ld2410->stationary_energy[n-14] > 0xffff ? 0xffff : (uint16_t)m_ld2410->stationary_energy[n-14];
}
m_app_if.getBuffer()->putBlock((uint8_t*)&m, sizeof(m));
m_app_if.getBuffer()->putBlock((uint8_t*)&msg, sizeof(msg));
ESP_LOGI(TAG, "delta t: %lld", (now - last_read)/1000);
last_read = now;

View File

@ -30,7 +30,7 @@ protected:
void postBme68xData(float pressure, float temp);
void processLight(int light_value);
void processHumidity(float humidity);
void processPressure(float pressure);
uint16_t m_light_value = 0;
public:

View File

@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE-----
MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
sycX
-----END CERTIFICATE-----

38
utils/c1.txt Normal file
View File

@ -0,0 +1,38 @@
-----BEGIN CERTIFICATE-----
MIIGZTCCBeugAwIBAgITMwAAF5dJwzxVQmn/kwAAAAAXlzAKBggqhkjOPQQDAzBd
MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS4w
LAYDVQQDEyVNaWNyb3NvZnQgQXp1cmUgRUNDIFRMUyBJc3N1aW5nIENBIDA4MB4X
DTI0MDYwNjEwNDYzMloXDTI1MDYwMTEwNDYzMlowbDELMAkGA1UEBhMCVVMxCzAJ
BgNVBAgTAldBMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
Q29ycG9yYXRpb24xHjAcBgNVBAMMFSouZXZlbnRncmlkLmF6dXJlLm5ldDB2MBAG
ByqGSM49AgEGBSuBBAAiA2IABCROnPe0MEoTPo7mZV7qBXj/gNaEhuTiIfoqzkkE
mayyKiKUh3M8kcNMFKA6Cw5FQpKcJnFgNdHhgK2an2bY16k1Rl+BGdH7cgeW4KxJ
/8BZGCUrcF0XqVYqU1ta2tPSe6OCBFwwggRYMIIBfgYKKwYBBAHWeQIEAgSCAW4E
ggFqAWgAdgDPEVbu1S58r/OHW9lpLpvpGnFnSrAX7KwB0lt3zsw7CAAAAY/tMX1g
AAAEAwBHMEUCIDvK/oTF+17QrKCyrkP+aJu5OOkWwWcdvW+fo0yuDj5TAiEAhIDF
m1B7P4TRY+80nE3klxMaDpXz13W/GFGLu3b/CC0AdwB9WR4S4XgqexxhZ3xe/fjQ
h1wUoE6VnrkDL9kOjC55uAAAAY/tMX5iAAAEAwBIMEYCIQC4AVpEBPNMlmXA6Rgm
jwbxZ12dY4t0y+d3zVmERPSpkQIhAL4eN6aJcxc7AbfCpRVq9MVmmaAgpcin33Ab
Kub+uVlxAHUA4JKz/AwdyOdoNh/eYbmWTQpSeBmKctZyxLBNpW1vVAQAAAGP7TF+
1gAABAMARjBEAiAmSpLfPIgdhcYH4KeElGfrQAp3mv2UeqXsc+g6Zrl2VgIgP9xH
zAwKA1JmO+GQgQWacfy3opms5EvuTyUL33uw/6UwJwYJKwYBBAGCNxUKBBowGDAK
BggrBgEFBQcDAjAKBggrBgEFBQcDATA8BgkrBgEEAYI3FQcELzAtBiUrBgEEAYI3
FQiHvdcbgefrRoKBnS6O0AyH8NodXYKE5WmC86c+AgFkAgEmMIG0BggrBgEFBQcB
AQSBpzCBpDBzBggrBgEFBQcwAoZnaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
aW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBBenVyZSUyMEVDQyUyMFRMUyUyMElzc3Vp
bmclMjBDQSUyMDA4JTIwLSUyMHhzaWduLmNydDAtBggrBgEFBQcwAYYhaHR0cDov
L29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMB0GA1UdDgQWBBSd0gLTJBBooJfu
lBbYLw4ogSVu0zAOBgNVHQ8BAf8EBAMCB4AwZQYDVR0RBF4wXIIVKi5ldmVudGdy
aWQuYXp1cmUubmV0giIqLndlc3R1czItMS50cy5ldmVudGdyaWQuYXp1cmUubmV0
gh8qLndlc3R1czItMS5ldmVudGdyaWQuYXp1cmUubmV0MAwGA1UdEwEB/wQCMAAw
agYDVR0fBGMwYTBfoF2gW4ZZaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w
cy9jcmwvTWljcm9zb2Z0JTIwQXp1cmUlMjBFQ0MlMjBUTFMlMjBJc3N1aW5nJTIw
Q0ElMjAwOC5jcmwwZgYDVR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEF
BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9z
aXRvcnkuaHRtMAgGBmeBDAECAjAfBgNVHSMEGDAWgBStVB0DVHHGL17WWxhYzm4k
xdaiCjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwCgYIKoZIzj0EAwMD
aAAwZQIxAIljbWjBlPPC1hJQEy1Pq4V5fPe+F0zNNuk6paj1ZCoqHahiBpvKpYTp
tZlJVKZtpAIwWnTO0WileYRCYWSniZFtliF/HZvgrLoAWd+NGZzdmhjoavdVYZho
0VvfpbsVVech
-----END CERTIFICATE-----

21
utils/c2.txt Normal file
View File

@ -0,0 +1,21 @@
-----BEGIN CERTIFICATE-----
MIIDXDCCAuOgAwIBAgIQDvLl2DaBUgJV6Sxgj7wv9DAKBggqhkjOPQQDAzBhMQsw
CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
Fw0yMzA2MDgwMDAwMDBaFw0yNjA4MjUyMzU5NTlaMF0xCzAJBgNVBAYTAlVTMR4w
HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLjAsBgNVBAMTJU1pY3Jvc29m
dCBBenVyZSBFQ0MgVExTIElzc3VpbmcgQ0EgMDgwdjAQBgcqhkjOPQIBBgUrgQQA
IgNiAATlQzoKIJQIe8bd4sX2x9XBtFvoh5m7Neph3MYORvv/rg2Ew7Cfb00eZ+zS
njUosyOUCspenehe0PyKtmq6pPshLu5Ww/hLEoQT3drwxZ5PaYHmGEGoy2aPBeXa
23k5ruijggFiMIIBXjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBStVB0D
VHHGL17WWxhYzm4kxdaiCjAfBgNVHSMEGDAWgBSz20ik+aHF2K42QcwRY2liKbxL
xjAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
MHYGCCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl
cnQuY29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v
RGlnaUNlcnRHbG9iYWxSb290RzMuY3J0MEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6
Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMy5jcmwwHQYD
VR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMAoGCCqGSM49BAMDA2cAMGQCMD+q
5Uq1fSGZSKRhrnWKKXlp4DvfZCEU/MF3rbdwAaXI/KVM65YRO9HvRbfDpV3x1wIw
CHvqqpg/8YJPDn8NJIS/Rg+lYraOseXeuNYzkjeY6RLxIDB+nLVDs9QJ3/co89Cd
-----END CERTIFICATE-----

View File

@ -0,0 +1,72 @@
-----BEGIN CERTIFICATE-----
MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
sycX
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGZTCCBeugAwIBAgITMwAAF5dJwzxVQmn/kwAAAAAXlzAKBggqhkjOPQQDAzBd
MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS4w
LAYDVQQDEyVNaWNyb3NvZnQgQXp1cmUgRUNDIFRMUyBJc3N1aW5nIENBIDA4MB4X
DTI0MDYwNjEwNDYzMloXDTI1MDYwMTEwNDYzMlowbDELMAkGA1UEBhMCVVMxCzAJ
BgNVBAgTAldBMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
Q29ycG9yYXRpb24xHjAcBgNVBAMMFSouZXZlbnRncmlkLmF6dXJlLm5ldDB2MBAG
ByqGSM49AgEGBSuBBAAiA2IABCROnPe0MEoTPo7mZV7qBXj/gNaEhuTiIfoqzkkE
mayyKiKUh3M8kcNMFKA6Cw5FQpKcJnFgNdHhgK2an2bY16k1Rl+BGdH7cgeW4KxJ
/8BZGCUrcF0XqVYqU1ta2tPSe6OCBFwwggRYMIIBfgYKKwYBBAHWeQIEAgSCAW4E
ggFqAWgAdgDPEVbu1S58r/OHW9lpLpvpGnFnSrAX7KwB0lt3zsw7CAAAAY/tMX1g
AAAEAwBHMEUCIDvK/oTF+17QrKCyrkP+aJu5OOkWwWcdvW+fo0yuDj5TAiEAhIDF
m1B7P4TRY+80nE3klxMaDpXz13W/GFGLu3b/CC0AdwB9WR4S4XgqexxhZ3xe/fjQ
h1wUoE6VnrkDL9kOjC55uAAAAY/tMX5iAAAEAwBIMEYCIQC4AVpEBPNMlmXA6Rgm
jwbxZ12dY4t0y+d3zVmERPSpkQIhAL4eN6aJcxc7AbfCpRVq9MVmmaAgpcin33Ab
Kub+uVlxAHUA4JKz/AwdyOdoNh/eYbmWTQpSeBmKctZyxLBNpW1vVAQAAAGP7TF+
1gAABAMARjBEAiAmSpLfPIgdhcYH4KeElGfrQAp3mv2UeqXsc+g6Zrl2VgIgP9xH
zAwKA1JmO+GQgQWacfy3opms5EvuTyUL33uw/6UwJwYJKwYBBAGCNxUKBBowGDAK
BggrBgEFBQcDAjAKBggrBgEFBQcDATA8BgkrBgEEAYI3FQcELzAtBiUrBgEEAYI3
FQiHvdcbgefrRoKBnS6O0AyH8NodXYKE5WmC86c+AgFkAgEmMIG0BggrBgEFBQcB
AQSBpzCBpDBzBggrBgEFBQcwAoZnaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
aW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBBenVyZSUyMEVDQyUyMFRMUyUyMElzc3Vp
bmclMjBDQSUyMDA4JTIwLSUyMHhzaWduLmNydDAtBggrBgEFBQcwAYYhaHR0cDov
L29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMB0GA1UdDgQWBBSd0gLTJBBooJfu
lBbYLw4ogSVu0zAOBgNVHQ8BAf8EBAMCB4AwZQYDVR0RBF4wXIIVKi5ldmVudGdy
aWQuYXp1cmUubmV0giIqLndlc3R1czItMS50cy5ldmVudGdyaWQuYXp1cmUubmV0
gh8qLndlc3R1czItMS5ldmVudGdyaWQuYXp1cmUubmV0MAwGA1UdEwEB/wQCMAAw
agYDVR0fBGMwYTBfoF2gW4ZZaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w
cy9jcmwvTWljcm9zb2Z0JTIwQXp1cmUlMjBFQ0MlMjBUTFMlMjBJc3N1aW5nJTIw
Q0ElMjAwOC5jcmwwZgYDVR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEF
BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9z
aXRvcnkuaHRtMAgGBmeBDAECAjAfBgNVHSMEGDAWgBStVB0DVHHGL17WWxhYzm4k
xdaiCjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwCgYIKoZIzj0EAwMD
aAAwZQIxAIljbWjBlPPC1hJQEy1Pq4V5fPe+F0zNNuk6paj1ZCoqHahiBpvKpYTp
tZlJVKZtpAIwWnTO0WileYRCYWSniZFtliF/HZvgrLoAWd+NGZzdmhjoavdVYZho
0VvfpbsVVech
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDXDCCAuOgAwIBAgIQDvLl2DaBUgJV6Sxgj7wv9DAKBggqhkjOPQQDAzBhMQsw
CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
Fw0yMzA2MDgwMDAwMDBaFw0yNjA4MjUyMzU5NTlaMF0xCzAJBgNVBAYTAlVTMR4w
HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLjAsBgNVBAMTJU1pY3Jvc29m
dCBBenVyZSBFQ0MgVExTIElzc3VpbmcgQ0EgMDgwdjAQBgcqhkjOPQIBBgUrgQQA
IgNiAATlQzoKIJQIe8bd4sX2x9XBtFvoh5m7Neph3MYORvv/rg2Ew7Cfb00eZ+zS
njUosyOUCspenehe0PyKtmq6pPshLu5Ww/hLEoQT3drwxZ5PaYHmGEGoy2aPBeXa
23k5ruijggFiMIIBXjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBStVB0D
VHHGL17WWxhYzm4kxdaiCjAfBgNVHSMEGDAWgBSz20ik+aHF2K42QcwRY2liKbxL
xjAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
MHYGCCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl
cnQuY29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v
RGlnaUNlcnRHbG9iYWxSb290RzMuY3J0MEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6
Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMy5jcmwwHQYD
VR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMAoGCCqGSM49BAMDA2cAMGQCMD+q
5Uq1fSGZSKRhrnWKKXlp4DvfZCEU/MF3rbdwAaXI/KVM65YRO9HvRbfDpV3x1wIw
CHvqqpg/8YJPDn8NJIS/Rg+lYraOseXeuNYzkjeY6RLxIDB+nLVDs9QJ3/co89Cd
-----END CERTIFICATE-----

56
utils/mqtt.py Executable file
View File

@ -0,0 +1,56 @@
#!/usr/bin/env python
from paho.mqtt import client as mqtt_client
import time
mqtt_broker = "mqtt-dev-server.westus2-1.ts.eventgrid.azure.net"
mqtt_port = 8883
mqtt_topic = "wellnuotopics/topic1"
mqtt_client_id = "client1-authn-ID"
connected = False
def connect_mqtt(client_id):
def on_connect(client, userdata, flags, rc):
global connected
if rc == 0:
print("Connected to MQTT Broker!")
connected = True
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION1, "client_id")
client.tls_set(
ca_certs='eventgrid.azure_full.pem',
certfile='../certs/client1-authn-ID.pem',
keyfile='../certs/client1-authn-ID.key'
)
client.username_pw_set(client_id, "")
client.on_connect = on_connect
client.connect(mqtt_broker, mqtt_port)
return client
def publish(client, topic, msg):
result = client.publish(topic, msg)
# result: [0, 1]
status = result[0]
if status == 0:
print(f"Sent `{msg}` to topic `{topic}`")
else:
print(f"Failed to send message to topic {topic}")
def main() -> None:
client = connect_mqtt(mqtt_client_id)
client.loop_start()
while(connected == False):
time.sleep(1)
publish(client, "wellnuotopics/topic1", "hello")
time.sleep(2)
client.disconnect()
if __name__ == "__main__":
main()