[应用相关]

STM32+W5500+MQTT+Android实现远程数据采集及控制

[复制链接]
880|33
手机看帖
扫描二维码
随时随地手机跟帖
東南博士|  楼主 | 2019-11-12 16:42 | 显示全部楼层 |阅读模式
STM32+W5500+MQTT+Android实现远程数据采集及控制

使用特权

评论回复
東南博士|  楼主 | 2019-11-12 16:42 | 显示全部楼层
1,STM32F405为主控芯片,它通过传感器采集环境数据,比如温度,湿度,光照度,大气压强等;
2,主控芯片通过W5500模块将测量的数据通过MQTT协议方式发布到MQTT服务器(服务器域名和IP见固件程序);
3,主控订阅LED灯控制的消息,当接收到对应的控制指令后点亮或者熄灭对应的LED灯;
4,安卓手机端订阅传感器数据的消息,当接收到消息后将传感器数据在界面显示;
5,安卓手机可发送点亮或者熄灭LED灯的指令到服务器,然后服务器会将该指令转发给STM32主控,然后STM32主控解析该指令并执行指令。

使用特权

评论回复
東南博士|  楼主 | 2019-11-12 16:44 | 显示全部楼层
1.1 MQTT的移植
MQTT的移植非常简单,将C/C++ MQTT Embedded clients的代码添加到工程中,然后我们只需要再次封装4个函数即可:



int transport_sendPacketBuffer(unsigned char* buf, int buflen);
int transport_getdata(unsigned char* buf, int count);
int transport_open(void);
int transport_close(void);
transport_sendPacketBuffer:通过网络以TCP的方式发送数据;
transport_getdata:TCP方式从服务器端读取数据,该函数目前属于阻塞函数;
transport_open:打开一个网络接口,其实就是和服务器建立一个TCP连接;
transport_close:关闭网络接口。

使用特权

评论回复
東南博士|  楼主 | 2019-11-12 16:44 | 显示全部楼层
/**
* @brief  通过TCP方式发送数据到TCP服务器
* @param  buf 数据首地址
* @param  buflen 数据长度
* @retval 小于0表示发送失败
*/
int transport_sendPacketBuffer(unsigned char* buf, int buflen)
{
return send(SOCK_TCPS,buf,buflen);
}

使用特权

评论回复
東南博士|  楼主 | 2019-11-12 16:44 | 显示全部楼层
/**
* @brief  阻塞方式接收TCP服务器发送的数据
* @param  buf 数据存储首地址
* @param  count 数据缓冲区长度
* @retval 小于0表示接收数据失败
*/
int transport_getdata(unsigned char* buf, int count)
{
return recv(SOCK_TCPS,buf,count);
}

使用特权

评论回复
東南博士|  楼主 | 2019-11-12 16:44 | 显示全部楼层
/**
* @brief  打开一个socket并连接到服务器
* @param  无
* @retval 小于0表示打开失败
*/
int transport_open(void)
{
int32_t ret;
//新建一个Socket并绑定本地端口5000
ret = socket(SOCK_TCPS,Sn_MR_TCP,5000,0×00);
if(ret != SOCK_TCPS){
printf(“%d:Socket Error\r\n”,SOCK_TCPS);
while(1);
}else{
printf(“%d:Opened\r\n”,SOCK_TCPS);
}

使用特权

评论回复
東南博士|  楼主 | 2019-11-12 16:44 | 显示全部楼层
//连接TCP服务器
ret = connect(SOCK_TCPS,domain_ip,1883);//端口必须为1883
if(ret != SOCK_OK){
printf(“%d:Socket Connect Error\r\n”,SOCK_TCPS);
while(1);
}else{
printf(“%d:Connected\r\n”,SOCK_TCPS);
}
return 0;
}

使用特权

评论回复
東南博士|  楼主 | 2019-11-12 16:45 | 显示全部楼层
/**
* @brief  关闭socket
* @param  无
* @retval 小于0表示关闭失败
*/
int transport_close(void)
{
close(SOCK_TCPS);
return 0;
}

使用特权

评论回复
東南博士|  楼主 | 2019-11-12 16:45 | 显示全部楼层
/**
* @brief  向代理(服务器)发送一个消息
* @param  pTopic 消息主题
* @param  pMessage 消息内容
* @retval 小于0表示发送失败
*/
int mqtt_publish(char *pTopic,char *pMessage)
{
int32_t len,rc;
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
unsigned char buf[200];
MQTTString topicString = MQTTString_initializer;
int msglen = strlen(pMessage);
int buflen = sizeof(buf);

data.clientID.cstring = “me”;
data.keepAliveInterval = 5;
data.cleansession = 1;
len = MQTTSerialize_connect(buf, buflen, &data); /* 1 */

topicString.cstring = pTopic;
len += MQTTSerialize_publish(buf + len, buflen – len, 0, 0, 0, 0, topicString, (unsigned char*)pMessage, msglen); /* 2 */

len += MQTTSerialize_disconnect(buf + len, buflen – len); /* 3 */
transport_open();
rc = transport_sendPacketBuffer(buf,len);
transport_close();
if (rc == len)
printf(“Successfully published\n\r”);
else
printf(“Publish failed\n\r”);
return 0;
}

使用特权

评论回复
東南博士|  楼主 | 2019-11-12 16:45 | 显示全部楼层
下面我们看下主函数的代码,思路也比较清晰:

int main(void)
{
static char meassage[200];
int rc;
char *led;
char led_value;
float temperature,humidity,light,pressure;
srand(0);
//配置LED灯引脚
LED_Config();
//初始化配置网络
network_init();
while(1){
memset(meassage,0,sizeof(meassage));
//订阅消息
rc = mqtt_subscrib(“pyboard_led”,meassage);
printf(“rc = %d\n\r”,rc);
if(rc >= 0){
printf(“meassage = %s\n\r”,meassage);
//解析JSON格式字符串并点亮相应的LED灯
cJSON *root = cJSON_Parse(meassage);
if(root != NULL){
led = cJSON_GetObjectItem(root,”led”)->valuestring;
printf(“led = %s\n\r”,led);
led_value = cJSON_GetObjectItem(root,”value”)->valueint;
if(!strcmp(led,”red”)){
if(led_value){
LED_On(LED_RED);
}else{
LED_Off(LED_RED);
}
}else if(!strcmp(led,”green”)){
if(led_value){
LED_On(LED_GREEN);
}else{
LED_Off(LED_GREEN);
}
}else if(!strcmp(led,”blue”)){
if(led_value){
LED_On(LED_BLUE);
}else{
LED_Off(LED_BLUE);
}
}else if(!strcmp(led,”yellow”)){
if(led_value){
LED_On(LED_YELLOW);
printf(“Yellow On\n\r”);
}else{
LED_Off(LED_YELLOW);
printf(“Yellow Off\n\r”);
}
}
// 释放内存空间
cJSON_Delete(root);
}else{
printf(“Error before: [%s]\n\r”,cJSON_GetErrorPtr());
}
}
delay_ms(500);
//获取传感器测量数据,该示例使用随机数
temperature = rand()%50;
humidity = rand()%100;
light = rand()%1000;
pressure = rand()%1000;
//将数据合成为JSON格式数据
sprintf(meassage,”{\”temperature\”:%.1f,\”humidity\”:%.1f,\”light\”:%.1f,\”pressure\”:%.1f}”,temperature,humidity,light,pressure);
//将数据发送出去
mqtt_publish(“pyboard_value”,meassage);
}
}

使用特权

评论回复
東南博士|  楼主 | 2019-11-12 16:46 | 显示全部楼层
现在的云服务 都是MQTT 标准的吗?

使用特权

评论回复
wowu| | 2019-12-9 16:42 | 显示全部楼层
非常感谢楼主分享

使用特权

评论回复
xiaoqizi| | 2019-12-9 16:45 | 显示全部楼层
非常感谢楼主分享

使用特权

评论回复
kkzz| | 2019-12-9 16:47 | 显示全部楼层
为什么不使用wifi呢  

使用特权

评论回复
hudi008| | 2019-12-9 16:48 | 显示全部楼层
有完成的设计方案吗

使用特权

评论回复
lzmm| | 2019-12-9 16:48 | 显示全部楼层
MQTT是什么?   

使用特权

评论回复
minzisc| | 2019-12-9 16:48 | 显示全部楼层
主要是数据的采集方案  

使用特权

评论回复
selongli| | 2019-12-9 16:48 | 显示全部楼层
没图没真相的。        

使用特权

评论回复
fentianyou| | 2019-12-9 16:49 | 显示全部楼层
W5500好久没有用过。   

使用特权

评论回复
xiaoyaodz| | 2019-12-9 16:49 | 显示全部楼层
STM32+W5500开发板上都有  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

367

主题

6048

帖子

34

粉丝