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 で設定を開く ↓
この中から使用するモジュールを選択してチェックする必要があります。取り合えず、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
- Wi-fi設定
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側の設定
- モノの作成 AWS IoT > 管理 > 作成 > 単一のモノを作成する
任意の名前とタイプを作成。 タイプは特別な設定はなし。 他の、グループ、属性などは指定なし。
で、次へ。
1-Click 証明書作成 (推奨)の[証明書の作成]で証明書を作成したら、4つすべてダウンロード。 この時しかダウンロードできないので、thingの名称とセットで保存しておくこと。 (パグリックキーは使わない?)
証明書をダウンロードしたら、[有効化]して完了。ポリシーのアタッチは後ほど。
ポリシーの作成とアタッチ
AWS IoT > 安全性 > ポリシー の画面右上の[作成] 任意の名前を入力して、アドバンストモードに変更 以下の内容で、ポリシーを作成
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:*", "Resource": "*" } ] }
作成。
先に作成したモノに、ポリシーをアタッチします。 AWS IoT > 管理 > モノ で先ほど作成したモノを選択。
セキュリティ > 証明書を選択 > ポリシー
画面右上の、アクション > ポリシーのアタッチ 作成した、ポリシーにチェックを入れてアタッチ。
以上で、完了。 これで、ダウンロードした証明書の類を使って、ESP32などのIoTデバイスからアクセスできるはず。
次回、ESP32から、MQTT接続、shadowを操作する方法を書きたいと思います。
AWS LambdaへDyanmoDBのトリガ設定をする
概要
Dynamodbが 更新 された時に、特定のLambda関数を実行したい。と、いうことでLmabda関数を作って、DynamoDBをトリガ設定したのですが、思った通りに動いていないときがある。
思った通りに動くときもある、というのが厄介でした。
Lambda関数の設定が面でトリガDynamodbの設定を開くと↓の画像の様な感じ。。。
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
以上