[C++] 379 SwitchBot管理アプリの製作 その6 浴室乾燥チェック実装 wxWidgets

[Mac M2 Pro 12CPU, Sonoma 14.5, wxWidgets 3.2.5]

洗濯物が乾燥しているであろう絶対湿度まで下がる過程で段階的にアプリの表示が変わるようにしました。

絶対湿度は5分間の移動平均値(右側の数値)で判定しています。

あとは実際の浴室乾燥でテストしながらアプリを調整していきます。

これでガス代を少しは節約できそうです。また浴室の相対湿度を70%以下に近づけるよう意識することでカビの発生を低減できます。

[C++] 378 SwitchBot管理アプリの製作 その5 APIリクエスト wxWidgets

[Mac M2 Pro 12CPU, Sonoma 14.5, wxWidgets 3.2.5]

エアコンを操作するAPIリクエストのところでつまづきました。

Pythonでは100%成功していましたが、C++では成功率50%以下になりました。色々調べた結果、HMAC_CTXによる署名生成に問題があることが判明し、これを使わずに署名生成して解決しました。

Pythonではシンプルに正常なコードになる場合でも、C++に移植するのは容易ではないことがたまにあります。

#include "signGenerate.h"
#include <openssl/hmac.h>
#include <openssl/sha.h>
#include <openssl/buffer.h>
#include <uuid/uuid.h>

std::string generate_uuid() {
    uuid_t uuid;
    uuid_generate_random(uuid);
    char uuid_str[37];
    uuid_unparse(uuid, uuid_str);
    return std::string(uuid_str);
}

std::string base64_encode(const unsigned char* input, int length) {
    BIO *bmem, *b64;
    BUF_MEM *bptr;

    b64 = BIO_new(BIO_f_base64());
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bmem);

    BIO_write(b64, input, length);
    BIO_flush(b64);
    BIO_get_mem_ptr(b64, &bptr);

    std::string output(bptr->data, bptr->length - 1);
    BIO_free_all(b64);

    return output;
}

std::string hmac_sha256(const std::string& key, const std::string& data) {
    unsigned char* digest;
    digest = HMAC(EVP_sha256(), key.c_str(), key.length(), (unsigned char*)data.c_str(), data.length(), NULL, NULL);

    return std::string((char*)digest, SHA256_DIGEST_LENGTH);
}