〇、参考文章
一、原理
上一篇文章使用的是Apollo
创建MQTT
服务器,这次换一个,用EMQ
创建本地的MQTT
同样的,下载好EMQ解压到一个不带中文路径的文件夹下F:\MQTT\emqttd\bin
,在该文件夹下右键打开cmd
窗口输入命令emqttd console
出现该窗口以及窗口内的log
就是创建成功
接着打开控制台http://127.0.0.1:18083,登录用户名是admin
,密码是public
ESP8266工程代码相对应的修改,在上一篇文章的基础上修改
#define MQTT_PORT 1883
#define MQTT_PASS public
二、应用代码的修改
mqttConnectedCb
是成功连接到MQTT
的回调函数
MQTT_OnConnected(&mqttClient, mqttConnectedCb);
修改为:
void mqttConnectedCb(uint32_t *args)
{
MQTT_Client* client = (MQTT_Client*)args;
INFO("MQTT: Connected\r\n");
MQTT_Subscribe(client, "/mqtt/topic/led", 1); // 订阅主题/mqtt/topic/led,服务质量是1
}
mqttDataCb
是接收到数据的回调函数
MQTT_OnData(&mqttClient, mqttDataCb);
修改为:
void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len)
{
MQTT_Client* client = (MQTT_Client*)args;
os_printf("********************\n");
os_printf("Rec Data:%s\n", data);
os_printf("********************\n");
if (os_strncmp(data, "ON", strlen("ON")) == 0) {
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);
MQTT_Publish(client, "/mqtt/topic/callback", "LED is open ...", strlen("LED is open ..."), 0, 0);
}
if (os_strncmp(data, "OFF", strlen("OFF")) == 0) {
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);
MQTT_Publish(client, "/mqtt/topic/callback", "LED is colse ...", strlen("LED is colse ..."), 0, 0);
}
os_memset(data, 0, 3); // 每次都清除接收到的最大位
}
os_memset(data, 0, 3);
至少清除3
位的数据,不然先发OFF
然后发ON
会打印出ONF
三、实验的结果
打开左边的Websocket
看到下面的订阅主题,订阅ESP8266收到控制信号之后的推送信息主题,也就是/mqtt/topic/callback
接下来就是推送消息了,可以看到左边是推送给ESP8266
的消息,分别推送了两条,同时也就收到ESP8266
推送的反馈消息,如果在GPIO12
接上灯可以看到灯亮和灭