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가 되어 있는 것을 상정하고 있다. 그러므로, 이하(또는 각종 사이트)를 참고로 하고 그 전제를 정돈해 주세요.
  • Check! IoT가 가능할 때까지 ~ 우선 시리얼 통신을 사용할 수 있게 된다
  • Check! IoT가 가능할 때까지 ~ ESP-WROOM-02에 프로그램을 굽는다
  • Check! IoT가 가능할 때까지 ~ ESP-WROOM-02를 IoT Foundation에서 Bluemix에 연결!

  • 갑자기 완제품



    우선은 완성한 것을 내버리자. 어디가 포인트인가라는 것은 그 후에.

    코드



    샘플 코드는 다음과 같은 느낌. 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로부터의 수신을 처리하는 명령 인 것 같습니다.

    발췌.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측의 설정은 여기를 참고로 했다.

  • IBM Bluemix에서 IoT (1) - Python에서 publish/subscribe
  • 좋은 웹페이지 즐겨찾기