ESP-WROOM-02를 Bluemix에 연결하고 Subscribe합니다.
소개
ESP-WROOM-02라는 WiFi 부착 센서 허브는 염가이다. 우편 주문 및 아키하바라의 매장에서 500엔 정도로 손에 든다. 사용하기 쉬운 브레이크 아웃 보드에 탑재 된 것도 1000 엔 이내에서 얻을 수 있습니다.
이하의 사진은, 브레이크 아웃 보드에 탑재되고 있는 타입으로, 아키즈키 전자로 650엔으로 팔고 있다. 싸다!
이 센서 허브를 사용하면, 염가 센서 시스템을 작성하는 것이 가능할 것. 싸고 간편하게 IoT를 할 수 있다면 이것은 브레이크 틀림없다.
그래서 WROOM-02를 IBM Bluemix에 연결해 센서 데이터의 송신과 커맨드의 수신(Publish와 Subscribe)을 해 보려고 했다.
센서 데이터의 송신(Publish)은 Check! IoT가 가능할 때까지 ~ ESP-WROOM-02를 IoT Foundation에서 Bluemix에 연결! 을 참고로 트러블에 휩쓸리면서도 몇 시간에 어떻게든 되었지만, 명령의 수신(Subscribe)은 빠져 성공까지 며칠 걸렸다.
본 투고에서는 커멘드의 수신(Subscribe)을 할 수 있을 때까지의 포인트를 해설합니다.
전제
본 투고에서는 벌써 WROOM-02가 시리얼 통신할 수 있게 되어 있어, ArduinoIDE로 WROOM-02에 프로그램을 태워, Bluemix에 접속해 Publish가 되어 있는 것을 상정하고 있다. 그러므로, 이하(또는 각종 사이트)를 참고로 하고 그 전제를 정돈해 주세요.
본 투고에서는 벌써 WROOM-02가 시리얼 통신할 수 있게 되어 있어, ArduinoIDE로 WROOM-02에 프로그램을 태워, Bluemix에 접속해 Publish가 되어 있는 것을 상정하고 있다. 그러므로, 이하(또는 각종 사이트)를 참고로 하고 그 전제를 정돈해 주세요.
갑자기 완제품
우선은 완성한 것을 내버리자. 어디가 포인트인가라는 것은 그 후에.
코드
샘플 코드는 다음과 같은 느낌. Bluemix로부터 커맨드를 수신(Subscribe)하면 시리얼 모니터에 「callback invoked」라고 표시한다.
샘플.ino/**
* This source code refer to the recipe of IBM developerWorks, https://developer.ibm.com/recipes/tutorials/connect-an-esp8266-with-the-arduino-sdk-to-the-ibm-iot-foundation/ .
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//-------- Customise these values -----------
const char* ssid = "<SSID>";
const char* password = "<暗号化キー>";
#define ORG "<組織ID>" // 組織ID
#define DEVICE_TYPE "<デバイス・タイプ>" // デバイス・タイプ
#define DEVICE_ID "<デバイスID>" // デバイスID
#define TOKEN "<認証トークン>" // 認証トークン
//-------- Customise the above values --------
char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char topic[] = "iot-2/evt/status/fmt/json";
char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;
WiFiClient wifiClient;
PubSubClient client(wifiClient);
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("callback invoked");
}
void setup() {
Serial.begin(115200);
Serial.println();
Serial.print("Connecting to ");
Serial.print(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected, IP address: ");
Serial.println(WiFi.localIP());
client.setServer(server, 1883);
client.setCallback(callback);
}
int counter = 0;
void loop() {
if (!!!client.connected()) {
Serial.print("Reconnecting client to ");
Serial.println(server);
while (!!!client.connect(clientId, authMethod, token)) {
Serial.print(".");
delay(500);
}
if (client.subscribe("iot-2/cmd/cid/fmt/json")) {
Serial.println("Subscribe ok");
} else {
Serial.println("Subscribe failed");
}
Serial.println();
}
String payload = "{\"d\":{\"myName\":\"";
payload += DEVICE_TYPE;
payload += ".";
payload += DEVICE_ID;
payload += "\",\"count\":";
payload += counter;
payload += "}}";
Serial.print("Sending payload: ");
Serial.println(payload);
if (client.publish(topic, (char*) payload.c_str())) {
Serial.println("Publish ok");
} else {
Serial.println("Publish failed");
}
client.loop();
if (1000 < counter) {
counter = 0;
}
else {
++counter;
}
delay(10000);
}
Bluemix 측 설정
Bluemix측의 Node-RED의 흐름은 이런 느낌.
Function의 「test command」의 내용의 예.
IBM IoT App Out의 내용의 예.
포인트 해설
코드측
client.loop() 실행을 잊어서는 안됩니다.
loop 함수 안에서 client.loop();
를 실행하도록 한다.
나는 이것을 모르고 이틀 동안 고민했다. 그러니까 제일의 포인트로서 꼽아 두자.client.loop();
는 Bluemix로부터의 수신을 처리하는 명령 인 것 같습니다.
발췌.inovoid loop() {
<...略...>
client.loop();
<...略...>
}
수신시 실행되는 함수 준비
Subscribe를 수신했을 때의 처리를 함수로서 써 둔다.
발췌.inovoid callback(char* topic, byte* payload, unsigned int length) {
Serial.println("callback invoked");
}
수신시 실행되는 함수 등록
Subscribe를 받았을 때 실행하는 함수의 이름을 client.setCallback(callback);
와 같이 설정한다.
발췌.inovoid setup() {
<...略...>
client.setServer(server, 1883);
client.setCallback(callback);
}
Subscribe 시작 명령 실행
접속 처리 직후에 client.subscribe("iot-2/cmd/cid/fmt/json")
와 같이 subscribe를 실시한다.
Bluemix에서 수신하는 경우 iot-2/cmd/<任意の文字列>/fmt/json
형식의 주제를 지정합니다.
임의의 캐릭터 라인은, Node-RED의 「IBM IoT App Out」의 내용의 Command Type와 맞출 필요가 있다.
발췌.ino <...略...>
while (!!!client.connect(clientId, authMethod, token)) {
Serial.print(".");
delay(500);
}
//接続成功後
if (client.subscribe("iot-2/cmd/cid/fmt/json")) {
Serial.println("Subscribe ok");
} else {
Serial.println("Subscribe failed");
}
Serial.println();
}
Bluemix 측
DeviceType의 이름에주의하십시오.
Node-RED의 「IBM IoT App Out」의 내용의 Device Type과 등록 기기의 「디바이스 타입」을 맞춘다. Bluemix측의 포인트는 이만큼.
실행 예
제대로 되어 있으면 시리얼 모니터에 "callback invoked"라고 표시되어야 합니다.
그 밖에 참고로 한 투고
이하도 참고로 하면 좋다고 생각한다. Bluemix측의 설정은 여기를 참고로 했다.
/**
* This source code refer to the recipe of IBM developerWorks, https://developer.ibm.com/recipes/tutorials/connect-an-esp8266-with-the-arduino-sdk-to-the-ibm-iot-foundation/ .
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//-------- Customise these values -----------
const char* ssid = "<SSID>";
const char* password = "<暗号化キー>";
#define ORG "<組織ID>" // 組織ID
#define DEVICE_TYPE "<デバイス・タイプ>" // デバイス・タイプ
#define DEVICE_ID "<デバイスID>" // デバイスID
#define TOKEN "<認証トークン>" // 認証トークン
//-------- Customise the above values --------
char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char topic[] = "iot-2/evt/status/fmt/json";
char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;
WiFiClient wifiClient;
PubSubClient client(wifiClient);
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("callback invoked");
}
void setup() {
Serial.begin(115200);
Serial.println();
Serial.print("Connecting to ");
Serial.print(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected, IP address: ");
Serial.println(WiFi.localIP());
client.setServer(server, 1883);
client.setCallback(callback);
}
int counter = 0;
void loop() {
if (!!!client.connected()) {
Serial.print("Reconnecting client to ");
Serial.println(server);
while (!!!client.connect(clientId, authMethod, token)) {
Serial.print(".");
delay(500);
}
if (client.subscribe("iot-2/cmd/cid/fmt/json")) {
Serial.println("Subscribe ok");
} else {
Serial.println("Subscribe failed");
}
Serial.println();
}
String payload = "{\"d\":{\"myName\":\"";
payload += DEVICE_TYPE;
payload += ".";
payload += DEVICE_ID;
payload += "\",\"count\":";
payload += counter;
payload += "}}";
Serial.print("Sending payload: ");
Serial.println(payload);
if (client.publish(topic, (char*) payload.c_str())) {
Serial.println("Publish ok");
} else {
Serial.println("Publish failed");
}
client.loop();
if (1000 < counter) {
counter = 0;
}
else {
++counter;
}
delay(10000);
}
코드측
client.loop() 실행을 잊어서는 안됩니다.
loop 함수 안에서
client.loop();
를 실행하도록 한다.나는 이것을 모르고 이틀 동안 고민했다. 그러니까 제일의 포인트로서 꼽아 두자.
client.loop();
는 Bluemix로부터의 수신을 처리하는 명령 인 것 같습니다.발췌.ino
void loop() {
<...略...>
client.loop();
<...略...>
}
수신시 실행되는 함수 준비
Subscribe를 수신했을 때의 처리를 함수로서 써 둔다.
발췌.ino
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("callback invoked");
}
수신시 실행되는 함수 등록
Subscribe를 받았을 때 실행하는 함수의 이름을
client.setCallback(callback);
와 같이 설정한다.발췌.ino
void setup() {
<...略...>
client.setServer(server, 1883);
client.setCallback(callback);
}
Subscribe 시작 명령 실행
접속 처리 직후에
client.subscribe("iot-2/cmd/cid/fmt/json")
와 같이 subscribe를 실시한다.Bluemix에서 수신하는 경우
iot-2/cmd/<任意の文字列>/fmt/json
형식의 주제를 지정합니다.임의의 캐릭터 라인은, Node-RED의 「IBM IoT App Out」의 내용의 Command Type와 맞출 필요가 있다.
발췌.ino
<...略...>
while (!!!client.connect(clientId, authMethod, token)) {
Serial.print(".");
delay(500);
}
//接続成功後
if (client.subscribe("iot-2/cmd/cid/fmt/json")) {
Serial.println("Subscribe ok");
} else {
Serial.println("Subscribe failed");
}
Serial.println();
}
Bluemix 측
DeviceType의 이름에주의하십시오.
Node-RED의 「IBM IoT App Out」의 내용의 Device Type과 등록 기기의 「디바이스 타입」을 맞춘다. Bluemix측의 포인트는 이만큼.
실행 예
제대로 되어 있으면 시리얼 모니터에 "callback invoked"라고 표시되어야 합니다.
그 밖에 참고로 한 투고
이하도 참고로 하면 좋다고 생각한다. Bluemix측의 설정은 여기를 참고로 했다.
이하도 참고로 하면 좋다고 생각한다. Bluemix측의 설정은 여기를 참고로 했다.
IBM Bluemix에서 IoT (1) - Python에서 publish/subscribe
Reference
이 문제에 관하여(ESP-WROOM-02를 Bluemix에 연결하고 Subscribe합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Cheap-Engineer/items/b855aa9e66c5f2b26364텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)