目录
MQTT
MQTT(Message Queuing Telemetry Transport)是一种轻量级的、开放式的通信协议,设计用于在低带宽、不稳定的网络环境下进行高效的设备间通信。它采用发布/订阅(Publish/Subscribe)模式,允许一端(发布者)向多个端点(订阅者)发送消息,而不需要直接知道这些端点的身份或位置。
esp8266连接wifi
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
int isConnect = 0;
设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "WiFi名字";
const char* password = "WiFi密码";
const char* mqttServer = "服务器域名";
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
int count; // Ticker计数用变量
void setup(void) {
Serial.begin(9600);
//初始化WIFI
WiFi.mode(WIFI_STA);
connectWifi();
void loop(void) {
}
// ESP8266连接wifi
void connectWifi(){
WiFi.begin(ssid, password);
//等待WiFi连接,成功连接后输出成功信息
while (WiFi.status() != WL_CONNECTED){
delay(1000);
}
}
连接MQTT、WiFi
总和实现代码,订阅相应主题,串口回调函数。
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
int isConnect = 0;
设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "WiFi名字";
const char* password = "WiFi密码";
const char* mqttServer = "服务器域名";
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
int count; // Ticker计数用变量
void setup(void) {
Serial.begin(9600);
//初始化WIFI
WiFi.mode(WIFI_STA);
connectWifi();
mqttClient.setServer(mqttServer, 1883);
mqttClient.setCallback(receiveCallback);
// 连接MQTT服务器
connectMQTTServer();
while(1)
{
if(mqttClient.connected()) { // 如果开发板成功连接服务器
mqttClient.loop();// 处理信息以及心跳
delay(1000);
break;
}
else { // 如果开发板未能成功连接服务器
connectMQTTServer();
}
}
}
void loop(void) {
if(mqttClient.connected()) { // 如果开发板成功连接服务器
mqttClient.loop();// 处理信息以及心跳
}
}
void connectMQTTServer(){
String clientId = "esp8266-" + WiFi.macAddress();
// 连接MQTT服务器
if (mqttClient.connect(clientId.c_str())) {
subscribeTopic(); // 订阅指定主题
} else {
delay(100);
}
}
// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) {
String top = topic;
char p[length];
memcpy(p, (char*)payload,length);
String pay = (char*)p;
Serial.println(pay);
delay(1000);
}
String receivedData; // 假设串口接收到的数据存储在这个变量中
// 串口接收回调函数
void serialEvent() {
while (Serial.available()) {
char c = Serial.read();
receivedData += c;
// 如果接收到换行符,则将数据上传到 MQTT
if (c == '\n') {
sendToMQTT(receivedData);
receivedData = ""; // 清空接收到的数据
}
}
}
// 将数据上传到 MQTT
void sendToMQTT(String data) {
mqttClient.publish("douya", data.c_str());
}
void subscribeTopic(){
// 建立订阅主题。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。
// 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同
String topicString = "douya";
char subTopic[topicString.length() + 1];
strcpy(subTopic, topicString.c_str());
// 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
mqttClient.subscribe(subTopic);
}
// ESP8266连接wifi
void connectWifi(){
WiFi.begin(ssid, password);
//等待WiFi连接,成功连接后输出成功信息
while (WiFi.status() != WL_CONNECTED){
delay(1000);
}
}
MQTT.fx
连接
服务器地址
订阅主题,与代码订阅要一致
HT32串口接收函数
main.c
#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "USART.h"
#include "IIC.h"
#include "SHT30.h"
//#include "modbus485.h"
#include "motor.h"
#include "DC_Motor.h"
//#include "Timer.h"
#include "Lock.h"
int temp1;
u16 humi;
volatile u32 milliseconds = 10;
volatile u32 seconds = 20;
u8 led_flag,light_in;
void Send_Data(void)
{
//printf("{\"light\":\"%d\",\n \"led\":\"%d\",\n}",milliseconds,seconds);
}
int main()
{
USART0_Configuration();
LED_Init();
while(1)
{
}
}
//串口接收跳线帽要接到DAP上
void USART0_IRQHandler(void)
{
if(USART_GetFlagStatus(HT_USART0, USART_FLAG_RXDR)) // 检查接收数据寄存器非空标志位
{
u8 data = USART_ReceiveData(HT_USART0); // 从接收数据寄存器读取数据
// printf("Received data: %c\n", data); // 添加调试输出语句,打印接收到的数据
// 进行接收数据的处理
// 例如:可以根据接收到的数据执行相应的操作
switch(data)
{
case '1':
GPIO_WriteOutBits(HT_GPIOC,LED1_PIN,RESET);
//printf("on\n");
break;
case '0':
GPIO_WriteOutBits(HT_GPIOC,LED1_PIN,SET);
// printf("off\n");
break;
}
USART_ClearFlag(HT_USART0,USART_FLAG_RXDR);
}
}
串口函数已经在上篇博客有介绍,有需要的朋友可以去了解一下。
视频演示
mqtt