设备与阿里云完成发布订阅的功能,接下来就是将设备状态如温湿度,PM2.5值上报更新至阿里云。

  

1.查看Topic。

  在阿里云平台上 设备->Topic列表中查看。在产品中也可以看到对应的Topic类列表,将其中的"${deviceName}"替换成设备的名字,在这个列表中通过后方的描述可以清楚的知道每个Topic对应的系统功能。显然这里上报的Topic是/sys/a1IVGQbttJv/MyFirstALIYUN/thing/event/property/post

关于STM32F103+ESP8266+阿里云过程之设备状态更新至阿里云(三)-LMLPHP

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格式的数据:(位置: 监控运维->在线调试 )

    关于STM32F103+ESP8266+阿里云过程之设备状态更新至阿里云(三)-LMLPHP

   可以看到设备下发时收到的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上报设备数据时不需要加转义字符。

    

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

  

    

04-30 09:02