作者:霦槟哊禮kc | 来源:互联网 | 2023-06-16 23:01
设备与阿里云完成发布订阅的功能,接下来就是将设备状态如温湿度,PM2.5值上报更新至阿里云。1.查看Topic。在阿里云平台上设备-Topic列表中查看。在产品中也可以看到对应的
设备与阿里云完成发布订阅的功能,接下来就是将设备状态如温湿度,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上报设备数据时不需要加转义字符。
-------------------今天也是充满希望的一天~