none
ArduinoからAzureモバイルサービスのテーブルにデータを送信したい RRS feed

  • 質問

  • Arduino(マイコンボード)から、Azureモバイルサービスのテーブルに

    30秒ごとにデータを送信し格納しようと試みていますが、

    テーブルにデータがうまく格納されません。

    Arduinoがネットワークに接続できることは検証済みです。

    原因を教えていただけると幸いです。

    コードは下記のとおりです。

    (Azureのアプリケーションキーとネットワークのキーは隠しています)

    #include <SPI.h>
    #include <SFE_CC3000.h>
    #include <SFE_CC3000_Client.h>
    // Pins
    #define CC3000_INT      2   // Needs to be an interrupt pin (D2/D3)
    #define CC3000_EN       7   // Can be any digital pin
    #define CC3000_CS       10  // Preferred is pin 10 on Uno
    // Connection info data lengths
    #define IP_ADDR_LEN     4   // Length of IP address in bytes
    #define table_name      "data"
    #define ams_key         "***********************" //Azure Mobile Serviceのアプリケーションキー

    // Constants
    char ap_ssid[] = "tky-router";                  // SSID of network
    char ap_password[] = "*************";          // Password of network
    unsigned int ap_security = WLAN_SEC_WPA2; // Security of network
    unsigned int timeout = 30000;             // Milliseconds
    char server[] = "datatest007.azure-mobile.net";        // Remote host site
    int tempPin=A0;
    unsigned long prevTime=0;
    // Global Variables
    SFE_CC3000 wifi = SFE_CC3000(CC3000_INT, CC3000_EN, CC3000_CS);
    SFE_CC3000_Client client = SFE_CC3000_Client(wifi);
    void setup() {
      ConnectionInfo connection_info;
      int i;
     
      // Initialize Serial port
      Serial.begin(115200);
      Serial.println();
      Serial.println("---------------------------");
      Serial.println("SparkFun CC3000 - WebClient");
      Serial.println("---------------------------");
     
      // Initialize CC3000 (configure SPI communications)
      if ( wifi.init() ) {
        Serial.println("CC3000 initialization complete");
      } else {
        Serial.println("Something went wrong during CC3000 init!");
      }
     
      // Connect using DHCP
      Serial.print("Connecting to SSID: ");
      Serial.println(ap_ssid);
      if(!wifi.connect(ap_ssid, ap_security, ap_password, timeout)) {
        Serial.println("Error: Could not connect to AP");
      }
     
      // Gather connection details and print IP address
      if ( !wifi.getConnectionInfo(connection_info) ) {
        Serial.println("Error: Could not obtain connection details");
      } else {
        Serial.print("IP Address: ");
        for (i = 0; i < IP_ADDR_LEN; i++) {
          Serial.print(connection_info.ip_address[i]);
          if ( i < IP_ADDR_LEN - 1 ) {
            Serial.print(".");
          }
        }
        Serial.println();
      }

    void loop()
    {
      if((millis()-prevTime)>(unsigned long)(30000)){//30秒に一度
        int val = analogRead(tempPin);
        Serial.println("send_request try");   
        send_request();
        read_response();
        client.stop();
       
      
        prevTime=millis();
        delay(1000);
       
      }
      
     
     
    }
    void send_request()
    {
      char buffer[128] = "";
      char value_str[64];
     
      if (client.connect(server, 80)) {
        Serial.print("send-data:");
        sprintf(buffer, "POST https://datatest007.azure-mobile.net/tables/%s HTTP/1.1", table_name);
        client.println(buffer);
     
        sprintf(buffer, "Host: %s", server);
        client.println(buffer);
     
        sprintf(buffer, "X-ZUMO-APPLICATION: %s", ams_key);
        client.println(buffer);
     
        client.println("Content-Type: application/json");
     
        sprintf(buffer, "{\"item\": %s}",
            value_str, "abc");
     
        client.print("Content-Length: ");
        client.println(strlen(buffer));
     
        client.println();
     
        client.println(buffer);
        Serial.println("data have sent.");
       
      }
      else{
        Serial.println("Azure Connection failed.");
      }
    }

    void read_response()
    {
      bool print = true;
     
      while (client.available()) {
        char c = client.read();
        // Print only until the first carriage return
        if (c == '\n')
          print = false;
        if (print)
          Serial.println(c);
      }
    }

    Arduinoシリアルモニタ

    Azureモバイルサービスの設定

    2016年5月8日 14:10

回答

  • こんにちは。

    ご質問に記載のあるコードを確認したところ、REST API経由でAzure Tableへのアクセスを行おうとされているようですね。

    Arduinoからの接続に関する実装には詳しくないのですが、
    一般的な問題の切り分けとして、Arduino側のプログラムが悪いのか、
    ネットワーク環境が悪いのか、はAzure Tableへのアクセス方法が悪いのかなど、
    問題となる部分を切り分ける必要があるかと思います。

    一番わかりやすいところでは、まずAzure側は正常に稼働しているということであれば、
    REST APIの呼出方法が正しいかどうかが、一番確認しやすいのではないかと思います。

    つまり、プログラミングに記載されているREST APIの呼出方法が正しいか確認するほうがよさそうですね。

    インターネット接続できる環境から、ブラウザやFiddlerなどRESTのAPIを直接実行できる環境を作成して、
    実行しようとしているAPIが正しいかどうかを1つずつ実行して判定してみましょう。

    REST APIの呼出方法や実行順などが正しく指定されているかどうか、
    API1つずつ確認することで問題となっている箇所を特定することができるでしょう。

    もし、以上で問題がないようであれば、次は同じAPIをArduinoで利用しているネットワーク環境で実行します。

    同じネットワーク環境で意図した結果が得られるのであれば、
    次はArduinoでAPI呼出を行う箇所を確認します。

    Arduinoのネットワーク接続する部分のプログラムが問題ないのであれば、
    1APIずつ実行することで、どこが悪いか特定できるのではないかと思います。

    こんな感じで、まずは問題となっている箇所を切り分けるところから初めてみてはいかがでしょうか?


    森 博之(Hiroyuki Mori) http://www.kit-eng.com/hirom/

    • 回答の候補に設定 星 睦美 2016年5月9日 6:06
    • 回答としてマーク 星 睦美 2016年5月31日 1:44
    2016年5月9日 4:43

すべての返信

  • こんにちは。

    ご質問に記載のあるコードを確認したところ、REST API経由でAzure Tableへのアクセスを行おうとされているようですね。

    Arduinoからの接続に関する実装には詳しくないのですが、
    一般的な問題の切り分けとして、Arduino側のプログラムが悪いのか、
    ネットワーク環境が悪いのか、はAzure Tableへのアクセス方法が悪いのかなど、
    問題となる部分を切り分ける必要があるかと思います。

    一番わかりやすいところでは、まずAzure側は正常に稼働しているということであれば、
    REST APIの呼出方法が正しいかどうかが、一番確認しやすいのではないかと思います。

    つまり、プログラミングに記載されているREST APIの呼出方法が正しいか確認するほうがよさそうですね。

    インターネット接続できる環境から、ブラウザやFiddlerなどRESTのAPIを直接実行できる環境を作成して、
    実行しようとしているAPIが正しいかどうかを1つずつ実行して判定してみましょう。

    REST APIの呼出方法や実行順などが正しく指定されているかどうか、
    API1つずつ確認することで問題となっている箇所を特定することができるでしょう。

    もし、以上で問題がないようであれば、次は同じAPIをArduinoで利用しているネットワーク環境で実行します。

    同じネットワーク環境で意図した結果が得られるのであれば、
    次はArduinoでAPI呼出を行う箇所を確認します。

    Arduinoのネットワーク接続する部分のプログラムが問題ないのであれば、
    1APIずつ実行することで、どこが悪いか特定できるのではないかと思います。

    こんな感じで、まずは問題となっている箇所を切り分けるところから初めてみてはいかがでしょうか?


    森 博之(Hiroyuki Mori) http://www.kit-eng.com/hirom/

    • 回答の候補に設定 星 睦美 2016年5月9日 6:06
    • 回答としてマーク 星 睦美 2016年5月31日 1:44
    2016年5月9日 4:43
  • 森 様

    ご丁寧に対応いただきありがとうございます。

    教えて頂いた通り、まずFiddlerからREST APIを使用したところ、

    問題なくデータを格納することができました。

    おそらく、Arduino側のプログラムが問題のようですね…。

    次はこの辺を探ってみようと思います。

    2016年6月5日 14:06