Qt4 ⇒ Qt5

今更ですが、開発環境の変更メモです。

これまでのC++の開発環境は主に、

Visual Studio 2010 + Qt4.0

だったんですが、以前Qt5に乗換を測りました。 新環境は、

Visual Studio 2015 + Qt5.6

なぜ今、VS2015なのかとか、なぜ今Qt5.6なのかとかもありますが。


そこまで大きくは変わりませんが、引っかかった点は3つ。

  • 日本語デコーダの変更
  • Qtftpの削除(qnetworkaccessmanagerへ変更)
  • VSアドインが使いやすく

日本語デコーダの変更

これまでQlabelとかで日本語使うために、決まり文句として、メイン関数の頭に↓

QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

を書いてましたが、このままではエラーになります。 ので、この一文は削除。 代りは、、、忘れました。 思い出したら追記します。

Qtftpの削除

たまたまFPTを使ったプログラムの移行だったので。 調べたら、qt5になってqftpが削除されたとのこと。 qnetworkaccessmanager.h へ移行とのこですが、詳細は使っていないので、わかりません。

// #include <QtNetwork/qftp.h>
// ↓
#include <qnetworkaccessmanager.h>

VSアドインが使いやすく

Qtのバージョン変更、32-64bit変更などがアドオンで変更できるようになっており、かなり便利になっています。

一か所だけはまったのは、QtのVSアドオンでモジュールを選択しないといけない事。 ステータスメニューの QT5 -> Qt Project Settings -> Qt Modules で設定を開く ↓

f:id:singyestarday:20180327134430p:plain

この中から使用するモジュールを選択してチェックする必要があります。取り合えず、Core、Gui、Widgets、UI Tools を選択すれば基本は行けるような。

以上

ESP32でAWS IoT

環境は、esp-idf + Visual Studio CODE + PlatformIOです。

ESP32系の記事だとArduinoIDEが多いですが、PlatformIOだと、純粋にCなので、これまでの資産が使えるんじゃないかと思います。

あと、個人的にやりたいことに近いexampleが多くて良いです。example優秀です。

で、AWS IoTをやるには、まんまズバリ、「aws_iot」exampleを使いました。普通にインストールしていると↓の場所にあるかと。

C:\msys32\home\[USERNAME]\esp\esp-idf\examples\protocols\aws_iot

この中の、subscribe_publish  サンプル。

この中で書き換える場所は、5か所

  • エラー処理?

まず、私の環境のせいかもしれませんが、エラーが出たので、97-98行目をコメントアウト

static const char * DEVICE_CERTIFICATE_PATH = CONFIG_EXAMPLE_CERTIFICATE_PATH;
static const char * DEVICE_PRIVATE_KEY_PATH = CONFIG_EXAMPLE_PRIVATE_KEY_PATH;
static const char * ROOT_CA_PATH = CONFIG_EXAMPLE_ROOT_CA_PATH;

// #else
// #error "Invalid method for loading certs"
#endif

59-60行目を自分の環境に合わせて、SSID、PASSを書く。

#define EXAMPLE_WIFI_SSID [SSID]
#define EXAMPLE_WIFI_PASS [PASS]
  • モノの名前

227-228行目に、モノ(thing)の名前を書く。 この名前は、一意(ユニーク)である必要があります。 モノが一つだけならいいのですが、複数になって同時に同じ名称のノモとしてMQTTへ接続しようとすると、はじかれます。 ここに気が付いていなくてはまりました。。。。 あほだ。

ということで、一意な名称を設定。

    /* Client ID is set in the menuconfig of the example */
    connectParams.pClientID = [THING];
    connectParams.clientIDLen = (uint16_t) strlen([THING]);
    connectParams.isWillMsgPresent = false;
  • 証明書の設定

モノがAWSへ接続するための、証明書。 設定方法が、いくつかあるようですが、初心者なので、ファイル参照ではなく、ソースコードに直書き。 180-189行目辺りを変更。(私はif文消してしまいました)

// #if defined(CONFIG_EXAMPLE_EMBEDDED_CERTS)
//     mqttInitParams.pRootCALocation = (const char *)aws_root_ca_pem_start;
//     mqttInitParams.pDeviceCertLocation = (const char *)certificate_pem_crt_start;
//     mqttInitParams.pDevicePrivateKeyLocation = (const char *)private_pem_key_start;

// #elif defined(CONFIG_EXAMPLE_FILESYSTEM_CERTS)
//     mqttInitParams.pRootCALocation = ROOT_CA_PATH;
//     mqttInitParams.pDeviceCertLocation = DEVICE_CERTIFICATE_PATH;
//     mqttInitParams.pDevicePrivateKeyLocation = DEVICE_PRIVATE_KEY_PATH;
// #endif


mqttInitParams.pRootCALocation = ROOT_CA_PATH;
mqttInitParams.pDeviceCertLocation = DEVICE_CERTIFICATE_PATH;
mqttInitParams.pDevicePrivateKeyLocation = DEVICE_PRIVATE_KEY_PATH;

証明書の中身は、↓

static const char * DEVICE_PRIVATE_KEY_PATH = "-----BEGIN RSA PRIVATE KEY-----\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxn" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==" \
"-----END RSA PRIVATE KEY-----\n";

static const char * DEVICE_CERTIFICATE_PATH = "-----BEGIN CERTIFICATE-----\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"-----END CERTIFICATE-----\n";

static const char * ROOT_CA_PATH = "-----BEGIN CERTIFICATE-----\n" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"-----END CERTIFICATE-----\n";

私は、190行め以降に書いたが、.hファイルでも、#defineでもいいはず。どこかに証明書情報を記述。

以上。

ESP32でAWS IoT

目的

AWS IoTのShadowを操作して、クラウドとESP32で連携する。ということをやりたい。

おそらく↓の二つが必要

  • AWS IoTでthinkgを作成、証明書の発行
  • ESP32からshadowへアクセスするプログラムの作成

今回は、AWS IoT側の設定。

AWS側の設定

  1. モノの作成 AWS IoT > 管理 > 作成 > 単一のモノを作成する

f:id:singyestarday:20180314154732p:plain

任意の名前とタイプを作成。 タイプは特別な設定はなし。 他の、グループ、属性などは指定なし。

f:id:singyestarday:20180314154957p:plain

で、次へ。

1-Click 証明書作成 (推奨)の[証明書の作成]で証明書を作成したら、4つすべてダウンロード。 この時しかダウンロードできないので、thingの名称とセットで保存しておくこと。 (パグリックキーは使わない?)

証明書をダウンロードしたら、[有効化]して完了。ポリシーのアタッチは後ほど。 f:id:singyestarday:20180314155206p:plain

ポリシーの作成とアタッチ

AWS IoT > 安全性 > ポリシー の画面右上の[作成] 任意の名前を入力して、アドバンストモードに変更 以下の内容で、ポリシーを作成

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:*",
      "Resource": "*"
    }
  ]
}

作成。

先に作成したモノに、ポリシーをアタッチします。 AWS IoT > 管理 > モノ で先ほど作成したモノを選択。

セキュリティ > 証明書を選択 > ポリシー f:id:singyestarday:20180314161025p:plain

f:id:singyestarday:20180314161000p:plain

画面右上の、アクション > ポリシーのアタッチ 作成した、ポリシーにチェックを入れてアタッチ。

以上で、完了。 これで、ダウンロードした証明書の類を使って、ESP32などのIoTデバイスからアクセスできるはず。

次回、ESP32から、MQTT接続、shadowを操作する方法を書きたいと思います。

AWS LambdaへDyanmoDBのトリガ設定をする

概要

Dynamodbが 更新 された時に、特定のLambda関数を実行したい。と、いうことでLmabda関数を作って、DynamoDBをトリガ設定したのですが、思った通りに動いていないときがある。

思った通りに動くときもある、というのが厄介でした。

Lambda関数の設定が面でトリガDynamodbの設定を開くと↓の画像の様な感じ。。。 f:id:singyestarday:20180313104125p:plain

PROBLEM: Function call failed

これはどうやらDynamodbからの更新トリガは来ているんですが、Lambda関数の方でエラーになっているようです。

冒頭に太文字で書きましたが今回やりたかったのは、Dynamodbが「更新」された時の動作。なので、更新されたときの情報前提で関数を書いておりました。ので、更新以外の場合にエラーになっていたようです。

そもそも、Dynamodb更新時に、どんなイベント情報がハンドラに渡されているのか。

ハンドラ情報は後で書き足します。

RaspberryPiでsambaで共有

いつものコマンド sambaインストール

apt-get update
apt-get install samba

インストールしたら、設定。 設定ファイル

/etc/samba/smb.conf

の末尾に↓を追記。

[Share]
    comment = Raspi Share Directory
    path = /home/pi/share
    guest ok = yes
    read only = no
    public = yes
    browsable = yes
    force user = pi

大まかに項目 一番上が共有フォルダとして表示される名称 path は、RaspberryPi上の共有したいディレクトリパス guest ok = yes は、アカウント指定なしのゲストユーザがアクセスできるか否か。yes なら、何もなくみれる

ここを noにすると、RaspberryPi上のアカウントとパスワード?で入る?

RaspberryPiへのSSHアクセスを名前にする

RaspberryPiへSSH接続するのに、毎回IP指定するの面倒!!IP自動振りだから、変わっちゃうし。(固定IPにしろ)

ということで、ここを参照にやってみます。

ホスト名を変える

/etc/hostname を編集、raspberrypiを任意の名称へ変更。今回は、RasPi。

/etc/hosts を変更。最終行のみ。

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       RasPi

avahi-daemon のインストール

apt-get install avahi-daemon

ですが、すでにインストール済みでした。apt-get update やらやらで、インストールされるのも?

インストール後、再起動。 先起動後、SSHクライアントから、RasPi .local へ接続できれば成功。.local をつけるのを忘れない。

以上。

grep コマンドの罠。。。。

っていうほどでもないですが gpre した際に

バイナリー・ファイル(標準入力)は一致しました

と表示されて目的の文字列が取得できないことがあります。

これは、grep が取得テキストをバイナリと判断してしまったために、テキストが取得できていないとのこと。

なので、テキストでとりたいときは、 --text オプションをつける。

cat /var/log/syslog | grep --text hostapd

以上