關於STM32F103+ESP8266+阿里雲過程之設備狀態更新至阿里雲(三)


設備與阿里雲完成發布訂閱的功能,接下來就是將設備狀態如溫濕度,PM2.5值上報更新至阿里雲。

  

1.查看Topic。

  在阿里雲平台上 設備->Topic列表中查看。在產品中也可以看到對應的Topic類列表,將其中的"${deviceName}"替換成設備的名字,在這個列表中通過后方的描述可以清楚的知道每個Topic對應的系統功能。顯然這里上報的Topic是/sys/a1IVGQbttJv/MyFirstALIYUN/thing/event/property/post

 

2.ALINK JSON下的數據上報格式。

  貼上上報數據源碼:

    BOOL ICACHE_FLASH_ATTR
    MQTT_Publish(MQTT_Client *client, const char* topic, const char* data, int data_length, int qos, int retain)
    {
      uint8_t dataBuffer[MQTT_BUF_SIZE];
      uint16_t dataLen;
      client->mqtt_state.outbound_message = mqtt_msg_publish(&client->mqtt_state.mqtt_connection,
      topic, data, data_length,
      qos, retain,
      &client->mqtt_state.pending_msg_id);
      if (client->mqtt_state.outbound_message->length == 0) {
      INFO("MQTT: Queuing publish failed\r\n");
      return FALSE;
    }
    INFO("MQTT: queuing publish, length: %d, queue size(%d/%d)\r\n", client->mqtt_state.outbound_message->length, client->msgQueue.rb.fill_cnt, client-      >msgQueue.rb.size);
    while (QUEUE_Puts(&client->msgQueue, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length) == -1) {
        INFO("MQTT: Queue full\r\n");
        if (QUEUE_Gets(&client->msgQueue, dataBuffer, &dataLen, MQTT_BUF_SIZE) == -1) {
        INFO("MQTT: Serious buffer error\r\n");
        return FALSE;
      }
    }
    system_os_post(MQTT_TASK_PRIO, 0, (os_param_t)client);
    return TRUE;
    }

   簡要分析:mqtt_msg_publish里面將Topic和date進行字符串重組,將其組裝成json格式,QUEUE_Puts再將數據放入隊列中。

  其次來看看雲端下發的json格式的數據:(位置: 監控運維->在線調試 )

    

   可以看到設備下發時收到的json數據格式是method+id+params+version

   所以 MQTT_Publish(client, TOPIC, "hello", 6, 0, 0)函數中,我們將date的中的數據改為如圖上的數據

     整個函數下來是這樣的:

    #defined POSTSERVER  /sys/a1IVGQbttJv/MyFirstALIYUN/thing/event/property/post   // 需要修改對應的POSTSERVER 和函數中的字符串

    MQTT_Publish(client, POSTSERVER , "{\"method\":\"thing.event.property.post\",\"id\":\"964754367\",\"params\":{\"PM25\":101},\"version\":\"1.0.0\"}", 96, 0, 0);

   這里\"的意思是轉義字符,id中的數值是上報阿里雲對應的編號,上報時自定義數據編號,雲端下發命令時候由雲端自主產生,其次,需要注意的是MQTT_Publish中的數據大小直接用sizeof()函數算出,這里為了方便展示直接將字符串放在MQTT_Publish中,字符串的拼接函數自行編寫。

    注:MQTT_Publish中將thing.event.property.post -> thing/event/property/post也可成功上報.

  

  接下來就是編譯固件並燒寫了,燒寫完就可以在阿里雲上看到設備數值和時間都已更新,至此阿里雲更新設備狀態和發布訂閱完成。

 

  附:mqttfx的使用教程:https://help.aliyun.com/document_detail/86706.html?spm=a2c4g.11174283.2.44.ecc71668iTfIKk

      注:使用mqttfx上報設備數據時不需要加轉義字符。

    

                                        -------------------今天也是充滿希望的一天~

  

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM