基于MQTT物联网实例

本文介绍了一个基于MQTT的物联网项目,包括使用EMQX服务器的搭建,STM32和NodeMCU硬件端的MQTT连接,以及小程序端和Java、Python的数据交互。详细讲解了ESP8266的AT指令连接WIFI,Arduino的MQTT库使用,以及Python数据库插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目搭建

服务器搭建

emq

https://www.emqx.io/docs/zh/v4.4/getting-started/install.html

在这里插入图片描述

搭建视频

https://www.bilibili.com/video/BV1PE411L7JW

文档安装:

https://docs.emqx.cn/broker/v4.3/getting-started/install.html#shell-脚本一键安装-linux

ssl加密
https://www.bilibili.com/video/BV1pf4y1271u

mqtt.fx 调试工具

https://wws.lanzous.com/iT59Kkjqnle
密码:bvfa

打开是这样的(具体使用方法可百度)

image-20210118210233657.png

详情了解可移步这篇博客
https://blog.youkuaiyun.com/weixin_44772058/article/details/112796025?spm=1001.2014.3001.5501

MQTT的连接服务器代码

代码参考

https://mqtt.org/software/

在这里插入图片描述

硬件端

stm32
联网
  1. 通过esp8266AT指令连接WIFI(esp8266转串口)前提是已经配置好了串口外设

注: 代码仅供参考

wifi.h

#ifndef _ESP_H
#define _ESP_H

#include "stm32f1xx_hal.h"
#include "string.h"
#include "stdlib.h"
#include "usart.h"

#define SSID "P2P"
#define PASS "wifi密码"


#define IOT_DOMAIN_NAME "MQTT ip地址"
#define IOT_PORTNUM "1883"


uint8_t esp8266_send_cmd(char *cmd, char *ack, uint16_t wait_time);

uint8_t *esp8266_check_cmd(char *str);

uint8_t esp8266_Connect_IOTServer(void);

uint8_t esp8266_Connect_AP(void);

uint8_t esp8266_Connect_Server(char *host, char *port);

uint8_t esp8266_quit_trans(void);

uint8_t esp8266_consta_check(void);

#endif

wifi.c

#include "esp8266.h"

uint8_t esp8266_Connect_IOTServer(void) {
   
    user_main_info("准备配置模块");
    HAL_Delay(100);

    esp8266_send_cmd("AT", "OK", 50);
    user_main_info("准备退出透传模式\n");
    if (esp8266_quit_trans()) {
   
        user_main_info("退出透传模式失败,准备重启");
        return 6;
    } else
        user_main_info("退出透传模式成功");

    user_main_info("准备关闭回显");
    if (esp8266_send_cmd("ATE0", "OK", 50)) {
   
        user_main_info("关闭回显失败准备重启");
        return 1;
    } else
        user_main_info("关闭回显成功");

    user_main_info("查询模块是否在线");
    if (esp8266_send_cmd("AT", "OK", 50)) {
   
        user_main_info("模块不在线准备重启");
        return 1;
    } else
        user_main_info("设置查询在线成功");

    user_main_info("准备设置STA模式");
    if (esp8266_send_cmd("AT+CWMODE=1", "OK", 50)) {
   
        user_main_info("设置STA模式失败准备重启");
        return 1;
    } else
        user_main_info("设置STA模式成功");

    user_main_info("准备重启");
    if (esp8266_send_cmd("AT+RST", "OK", 50)) {
   
        user_main_info("重启失败,准备重启n");
        return 2;
    } else
        user_main_info("重启成功,等待三秒");

    HAL_Delay(1000);
    HAL_Delay(1000);
    HAL_Delay(1000);
    HAL_Delay(1000);


    user_main_info("准备取消自动连接");
    if (esp8266_send_cmd("AT+CWAUTOCONN=0", "OK", 50)) {
   
        user_main_info("取消自动连接失败,准备重启");
        return 3;
    } else
        user_main_info("取消自动连接成功");

    user_main_info("准备链接路由器");

    if (esp8266_Connect_AP()) {
   
        user_main_info("连接路由器失败,等待重启");
        return 4;
    } else
        user_main_info("连接路由器成功");

    HAL_Delay(1000);
    HAL_Delay(1000);
    HAL_Delay(1000);


    user_main_info("准备开启DHCP");
    if (esp8266_send_cmd("AT+CWDHCP=1,1", "OK", 100)) {
   
        user_main_info("开启DHCP失败,准备重启");
        return 7;
    } else
        user_main_info("设置DHCP成功");

    user_main_info("设置为关闭多路连接");
    if (esp8266_send_cmd("AT+CIPMUX=0", "OK", 100)) {
   
        user_main_info("关闭多路连接失败,准备重启");
        return 7;
    } else
        user_main_info("设置关闭多路连接成功");


    user_main_info("准备链接服务器");
    if (esp8266_Connect_Server(IOT_DOMAIN_NAME, IOT_PORTNUM)) {
   
        user_main_info("连接阿里云服务器失败,等待重启");
        return 8;
    } else
        user_main_info("连接阿里云服务器成功");

    user_main_info("准备退出透传模式\n");
    if (esp8266_quit_trans()) {
   
        user_main_info("退出透传模式失败,准备重启");
        return 6;
    } else
        user_main_info("退出透传模式成功");

    user_main_info("设置为透传模式");
    if (esp8266_send_cmd("AT+CIPMODE=1", "OK", 50)) {
   
        user_main_info("设置透传失败,准备重启");
        return 6;
    } else
        user_main_info("设置透传成功");


    user_main_info("设置开启透传模式");
    if (esp8266_send_cmd("AT+CIPSEND", "OK", 1000)) {
   
        user_main_info("开启透传失败,准备重启");
        return 9;
    } else
        user_main_info("开启透传成功");

    USART3_RX_STA = 0;
    memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN);

    return 0;
}

uint8_t esp8266_send_cmd(char *cmd, char *ack, uint16_t wait_time) {
   

    uint8_t res = 0;
    USART3_RX_STA = 0;
    memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN);
    u3_printf("%s\r\n", cmd);
    if (wait_time)        //需要等待应答
    {
   
        while (--wait_time)    //等待倒计时
        {
   
            HAL_Delay(10);
            if (USART3_RX_STA & 0X8000)//接收到期待的应答结果
            {
   
                if (esp8266_check_cmd(ack)) {
   
                    u1_printf("ack:%s", (uint8_t *) ack);
                    break;//得到有效数据
                }
                USART3_RX_STA = 0;
            }
        }
        if (wait_time == 0) {
    res = 1; }
    }
    return res;
}

uint8_t *esp8266_check_cmd(char *str) {
   

    char *strx = 0;
    if (USART3_RX_STA & 0X8000) {
   //接收到一次数据了

        USART3_RX_BUF[USART3_RX_STA & 0X7FFF] = 0;//添加结束符
        user_main_printf("%s", (char *) USART3_RX_BUF);
        strx = strstr((const char *) USART3_RX_BUF, (const char *) str);
    }
    return (uint8_t *) strx;
}

uint8_t esp8266_quit_trans(void) 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值