ESP8266とAWS IoTの接続について
環境
ESP8266(SWITCHSCIENCE ESPr Developer ESP-WROOM-02開発ボード)
AT version:1.7.0.0(Aug 16 2018 00:57:04)
SDK version:3.0.0(d49923c)
compile time:Aug 23 2018 16:58:12
Bin version(Wroom 02):v1.7.0
Arduino IDE
Version:1.8.7
Arduino IDEの準備
以下のURLよりArduino IDEをダウンロード
https://www.arduino.cc/en/Main/Software
今回は「ARDUINO 1.8.7 Windows ZIP file for non admin install」を使用しました。
ボード(ESP8266)の設定
Arduino IDEを起動して以下の手順でボードの設定を実行
http://arduino.esp8266.com/stable/package_esp8266com_index.json
esp8266 by ESP8266 Community バージョン2.4.2
・aws-mqtt-websockets
https://github.com/odelot/aws-mqtt-websockets
・aws-sdk-arduino
https://github.com/svdgraaf/aws-sdk-arduino
・Paho MQTT for Arduino
https://projects.eclipse.org/projects/technology.paho/downloads
・WebSockets for Arduino
検索で「WebSockets for Arduino」でヒットしたWebSockets for Arduino(Server + Client)のバージョン2.1.0をインストール
・AWS-SDK-ESP8266
検索で「AWS-SDK-ESP8266」でヒットしたバージョン1.0.0をインストール
CPU Frequency : 160MHz
Crystal Frequency : 26MHz
Flash Size : 2M(1M SPIFFS)
Flash Mode : QIO
Flash Frequency : 40MHZ
Reset Method : ck
Debug port : Disabled
Debug Level : なし(无)
IxIP Variant : v2 Lower Memory
VTables : Flash
Builtin Led : 2
Erase Flash : All Flash Contents
シリアルポート : OSで認識したポート番号
以下の製品の設定
https://www.amazon.co.jp/HiLetgoR-モノのインターネット開発ボード-無線受信発信モジュール-WIFIモジュール-Arduinoに適用/dp/B072K7P4JL/ref=sr_1_3_sspa?ie=UTF8&qid=1542672230&sr=8-3-spons&keywords=ESP8266&psc=1&smid=A1XEAMF1H64GNM
インストール手順:(安装程序:) 1、IDEをダウンロード(下载IDE) 2、IDEをインストール(安装IDE) 3、arduino IDEを設置: Go to File->Preferences。URLをコピーして、ESPボードマネージャの拡張機能を入手:arduino.esp8266.com/stable/package_esp8266com_index.json 4、Go to Tools > Board > Board Manager> Type "esp8266"。ESP8266をダウンロードしてインストールする(下载并安装ESP 8266) 5、チップを設置:(设置芯片) Tools -> Board -> NodeMCU 1.0 (ESP-12E Module) Tools -> Flash Size -> 4M (3M SPIFFS) Tools -> CPU Frequency -> 80 Mhz Tools -> Upload Speed -> 921600 Tools-->Port--> (whatever it is) 6、Githubで32ビットフラッシャーexeをダウンロードして実行する(godubでnodemcu / nodemcu-flasher / tree / master /を検索する)(在Gitrob下载32位faccexe(在gidub搜索nidemcu / nidemcu-fasher / tree / master /的)) github.com/nodemcu/nodemcu-flasher/tree/master/Win32/Release または、64ビットフラッシャーexeをダウンロードして実行してください: github.com/nodemcu/nodemcu-flasher/tree/master/Win64/Release 7. Arduino IDEで、旧式のBlinkプログラムを探します。 ロード、コンパイル、アップロード。 (Arduino IDE,老式的Blink程序找。卢德编译,提高卢德。) 8. FILE> EXAMPLES> ESP8266> BLINKに進み、点滅を開始します。 ウェブサイトへのデータダウンロードアクセス:(到网站的数据下载访问:) http://www.nodemcu.com/index_en.html ファームウェアリンク:(固件链接) https://github.com/nodemcu/nodemcu-firmware ご注意:ドライバを必要な場合、または使用時に問題が発生した場合は、当社にご連絡ください。 私たちはお客様に質の高いサービスを提供しています。 (注意:如果需要驱动程序,或使用时发生问题,请联系本公司。我们提供给客户质量高的服务。) |
ESP8266へサンプルコードの書き込み
スケッチに以下のコードを入力します。
//#### 从这里开始 ####//
#include
#include
#include
#include
//AWS
#include "sha256.h"
#include "Utils.h"
//WEBSockets
#include
#include
//MQTT PAHO
#include
#include
#include
#include
//AWS MQTT Websocket
#include "Client.h"
#include "AWSWebSocketClient.h"
#include "CircularByteBuffer.h"
extern "C" {
#include "user_interface.h"
}
//AWS IOT config, change these:
char wifi_ssid[] = "WiFiのSSID";
char wifi_password[] = "WiFiのパスワード";
char aws_endpoint[] = "awt17y725ehng-ats.iot.ap-northeast-1.amazonaws.com";
char aws_key[] = "AKIAIHCQKJ2JFXBGNPEA";
char aws_secret[] = "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";
char aws_region[] = "ap-northeast-1";
const char* aws_topic = "$aws/things/espwroom02/shadow/update";
int port = 443;
//MQTT config
const int maxMQTTpackageSize = 512;
const int maxMQTTMessageHandlers = 1;
ESP8266WiFiMulti WiFiMulti;
wl_status_t prevWifiStatus = WL_IDLE_STATUS;
AWSWebSocketClient awsWSclient(1000);
IPStack ipstack(awsWSclient);
MQTT::Client
//# of connections
long connection = 0;
//generate random mqtt clientID
char* generateClientID () {
char* cID = new char[23]();
for (int i = 0; i < 22; i += 1)
cID[i] = (char)random(1, 256);
return cID;
}
//count messages arrived
int arrivedcount = 0;
//callback to handle mqtt messages
void messageArrived(MQTT::MessageData& md)
{
MQTT::Message &message = md.message;
Serial.print("Message ");
Serial.print(++arrivedcount);
Serial.print(" arrived: qos ");
Serial.print(message.qos);
Serial.print(", retained ");
Serial.print(message.retained);
Serial.print(", dup ");
Serial.print(message.dup);
Serial.print(", packetid ");
Serial.println(message.id);
Serial.print("Payload ");
char* msg = new char[message.payloadlen + 1]();
memcpy (msg, message.payload, message.payloadlen);
Serial.println(msg);
delete msg;
}
//connects to websocket layer and mqtt layer
bool connect () {
if (client.isConnected ()) {
client.disconnect ();
}
//delay is not necessary... it just help us to get a "trustful" heap space value
delay (1000);
Serial.print (millis ());
Serial.print (" - conn: ");
Serial.print (++connection);
Serial.print (" - (");
Serial.print (ESP.getFreeHeap ());
Serial.println (")");
int rc = ipstack.connect(aws_endpoint, port);
if (rc != 1) {
Serial.println("error connection to the websocket server");
return false;
} else {
Serial.println("websocket layer connected");
}
Serial.println("MQTT connecting");
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.MQTTVersion = 4;
char* clientID = generateClientID ();
data.clientID.cstring = clientID;
rc = client.connect(data);
delete[] clientID;
if (rc != 0) {
Serial.print("error connection to MQTT server");
Serial.println(rc);
return false;
}
Serial.println("MQTT connected");
return true;
}
//subscribe to a mqtt topic
void subscribe () {
//subscript to a topic
int rc = client.subscribe(aws_topic, MQTT::QOS0, messageArrived);
if (rc != 0) {
Serial.print("rc from MQTT subscribe is ");
Serial.println(rc);
return;
}
Serial.println("MQTT subscribed");
}
//send a message to a mqtt topic
void sendmessage () {
//send a message
MQTT::Message message;
char buf[100];
strcpy(buf, "{\"state\":{\"reported\":{\"LANG\":\"日本\"},\"desired\":{\"test\":\"TEST_DATA\"}}}");
message.qos = MQTT::QOS0;
message.retained = false;
message.dup = false;
message.payload = (void*)buf;
message.payloadlen = strlen(buf) + 1;
int rc = client.publish(aws_topic, message);
}
void setup() {
wifi_set_sleep_type(NONE_SLEEP_T);
Serial.begin (115200);
delay (2000);
Serial.setDebugOutput(1);
//fill with ssid and wifi password
WiFiMulti.addAP(wifi_ssid, wifi_password);
Serial.println ("connecting to wifi");
wl_status_t wifiStatus = WiFiMulti.run();
while (wifiStatus != WL_CONNECTED) {
delay(100);
if ( prevWifiStatus != wifiStatus ) {
prevWifiStatus = wifiStatus;
} else {
if ( wifiStatus == WL_NO_SHIELD ) {
Serial.println ("*WL_NO_SHIELD*");
} else if (wifiStatus == WL_IDLE_STATUS) {
Serial.println ("*WL_IDLE_STATUS*");
} else if (wifiStatus == WL_NO_SSID_AVAIL) {
Serial.println ("*WL_NO_SSID_AVAIL*");
} else if (wifiStatus == WL_SCAN_COMPLETED) {
Serial.println ("*WL_SCAN_COMPLETED*");
} else if (wifiStatus == WL_CONNECT_FAILED) {
Serial.println ("*WL_CONNECT_FAILED*");
} else if (wifiStatus == WL_CONNECTION_LOST) {
Serial.println ("*WL_CONNECTION_LOST*");
} else if (wifiStatus == WL_NO_SHIELD) {
Serial.println ("*WL_NO_SHIELD*");
} else if (wifiStatus == WL_DISCONNECTED) {
Serial.println ("*WL_DISCONNECTED*");
}
wifiStatus = WiFiMulti.run();
}
}
Serial.println ("\nconnected");
Serial.println("SSID: ");
Serial.println(WiFi.SSID());
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
//fill AWS parameters
awsWSclient.setAWSRegion(aws_region);
awsWSclient.setAWSDomain(aws_endpoint);
awsWSclient.setAWSKeyID(aws_key);
awsWSclient.setAWSSecretKey(aws_secret);
awsWSclient.setUseSSL(true);
if (connect ()) {
Serial.println("subscribe() START: ");
subscribe ();
Serial.println("subscribe() END: ");
Serial.println("sendmessage() START: ");
sendmessage ();
Serial.println("sendmessage() END: ");
}
}
void loop() {
//keep the mqtt up and running
if (awsWSclient.connected ()) {
client.yield(50);
} else {
//handle reconnection
if (connect ()) {
subscribe ();
}
}
}
//#### ここまで ####//
なお、コード内にてAWS IoTとWiFiへの接続のために以下の情報をコード内へ組み込んであります。
(另外,在代码内为了AWIoT和WiFi的连接,将以下的信息编入代码内)
aws_endpoint
awt17y725ehng-ats.iot.ap-northeast-1.amazonaws.com
aws_key
AKIAIHCQKJ2JFXBGNPEA
aws_secret
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
aws_region
ap-northeast-1
aws_topic
$aws/things/espwroom02/shadow/update
wifi_ssid
インターネットに接続できる環境のSSID
wifi_password
上記WiFiのパスワード
WifiについてはHidden SSIDの環境への接続はできませんでした。ANY接続を許可したWiFiが必要と思われます。(关于Wifi,不能连接Hidden SSID的环境。允许无线连接的WiFi需要)
上記コードをコンパイルの上ESP8266へ書き込むことでESP8266の電源を投入後にAWS IoTコンソールにテキストメッセージが送信されることが確認できました。(通过将上述代码写入转换器上ESP 8266,通过投入ESP 8266的电源后,确认了文本信息将在AWW IoT转换器上发送。)