学习笔记-8MQTT-韦东山

54~62

一,platform_net_socket.c

二,

#include "nettype_tcp.h"的四个函数分别包含如下四个函数

platform_net_socket_recv_timeout收包

platform_net_socket_write_timeout发包

platform_net_socket_connect网络连接

platform_net_socket_close关闭连接

三,指定IP,不能指定域名

对于域名:向域名服务器发送域名,得到IP

AT+CWJAP="SSID","password"

err=ATSendCmd("AT+CWJAP=\""SSID"\",\""password"\"",NULL,0,2000);

四,使用宏,来实现函数

该文件在mqttClient.h里声明

该文件在mqttClient.c里实现

MQTT_ROBUSTNESS_CHECK做某个检查

/*client->mqtt_port="1883"*/

/*并且返回client->mqtt_port*/

mqtt_set_port(client, "1883");

五,

/*设置Client结构体里的*mqtt_host;(字符串)指针指向某IP/域名*/

mqtt_set_host(client, "www.jiejie01.top"); //ky设置IP(设置host成一个网址)

通过路由器 连接 服务器

六,\"表示"

七,断开TCP连接

AT+CIPCLOSE

八,发:AT+CIPSEND=4,要收到:>才算成功

发送AT命令时,把命令记录下来

九,单片机 服务器 手机

中断:读串口数据,写入环形缓冲区

解析线程:从环形缓冲区中读

ProcessSpecialATString(buf):把解析后的真正的数据 放入 环形缓冲区

platform_net_socket_recv_timeout:读

以前实现ATReadPacket,把数据整个拷贝过去

现在发现 别人上层读时,可能只读一个byte

把ATReadPacket换成ATReadData

臃肿的代码:

int ATReadData(char *c,int timeout)

{

int ret;

/*环形缓冲区有数据,读到*c后直接返回*/

if(0==ring_buffer_read((unsigned char *)c,&g_packet_buffer)) //100ask add

return AT_OK;

/*环形缓冲区无数据,阻塞*/

else

{

/*成功:返回pdTRUE;超时:返回pdFALSE*/

ret=platform_mutex_lock_timeout(&at_packet_mutex,timeout);

/*返回pdTRUE,可以再去读一次*/

if(pdFALSE==ret)

{

return AT_TIMEOUT;

}

else if(pdTRUE==ret)

{

ring_buffer_read((unsigned char *)c,&g_packet_buffer);

}

}

}

do...while优化后:

第一种:直接读出一个字符return AT_OK

第二种:停超过timeout毫秒,超时退出return AT_TIMEOUT

第三种:timeout毫秒内开锁,第二遍读出一个字符return AT_OK

int ATReadData(char *c,int timeout)

{

int ret;

do{

/*环形缓冲区有数据,读到*c后直接返回*/

if(0==ring_buffer_read((unsigned char *)c,&g_packet_buffer)) //100ask add

return AT_OK;

/*环形缓冲区无数据*/

else

{

/*成功:返回pdTRUE;超时:返回pdFALSE*/

ret=platform_mutex_lock_timeout(&at_packet_mutex,timeout);

/*返回pdTRUE,可以再去读一次*/

if(pdFALSE==ret)

{

return AT_TIMEOUT;

}

}

}while (ret)

}

十,printf本身写错了

Error: L6218E: Undefined symbol ptintf (referred from platform_net_socket.o).

错误:L6218E:未定义的符号ptintf(从platform_net_socket.o引用)

十一,32位单片机中 int buf[3];

buf[2]和*(buf+2)一样

(buf+1)和&buf[1]指向同一个内

十二,/*链接服务器*/

mqtt_connect(client);

static int mqtt_connect_with_results(mqtt_client_t* c)

{

if (CLIENT_STATE_CONNECTED == mqtt_get_client_state(c))

RETURN_ERROR(MQTT_SUCCESS_ERROR);//ky如果链接成功,返回0

}

RETURN_ERROR 是 return

MQTT_SUCCESS_ERROR 是 0 成功

MQTT_FAILED_ERROR 是 -0x0001 失败

十三,有问题的mosquitto链接

D:\ mosquito to MQTT\ mosquito to>.\ mosquito .exe

1740039973:蚊版本2.0.14启动

1740039973:使用默认配置。

1740039973:以本地模式启动。只有在这台机器上运行的客户端才能进行连接

1740039973:创建一个配置文件,定义一个监听器来允许远程访问。

1740039973:详细信息请参见https://mosquitto.org/documentation/authentication-methods/

1740039973:在端口1883上打开ipv4侦听套接字。

1740039973:在1883端口上打开ipv6监听套接字。

1740039973:蚊到2.0.14版本运行

十四,需要提供一个配置文件,正确的mosquitto链接

开启Mosquitto服务以后出现local only mode 的情况

解决:

1,

找到listener的配置,将#删除再在listener后面加一个固定的端口1883。

这个文件里的listener可能比较多,

找到#listener port-number [ip address/host name/unix socket path]这句后面的那个listener。

2,

然后找到allow_anonymous false,将false修改为true。 是true 不是ture

然后启动Mosquitto服务的时候使用配置文件启动

这样启动D:\mosquitto MQTT\mosquitto>mosquitto.exe -c mosquitto.conf -v

D:\ mosquito to MQTT\ mosquito to> mosquito .exe -c mosquito .conf -v

1740039599:蚊版本2.0.14启动

1740039599:从mosquito .conf加载配置。

1740039599:在1883端口上打开ipv6监听套接字。

1740039599:在端口1883上打开ipv4侦听套接字。

1740039599:蚊到2.0.14版本运行

如果还出现local only mode ,则MQTT服务就只能在一台主机上进行,别的客户端想要连到MQTT服务器进行MQTT通信是不行的

十五**,启动,订阅,发布**

mosquitto 启动

mosquitto_sub -t 'test/topic' -v 订阅

mosquitto_pub -t 'test/topic' -m 'hello world' 发布

相关推荐
2401_8534482323 分钟前
ESP8266蓝牙模块
stm32·蓝牙模块·esp8266
阿拉斯攀登43 分钟前
安卓工控机 OTA 升级方案(SpringBoot+MQTT)
android·spring boot·物联网·iot
许商1 小时前
【stm32】【printf】
java·前端·stm32
LaoZhangGong1232 小时前
以太网HTTP数据包格式分析
c语言·stm32·网络协议·http·tcp·arp
云山工作室2 小时前
用于电动汽车的永磁同步电机调速系统建模与仿真(论文+)
stm32·单片机·嵌入式硬件·毕业设计·毕设
DIY机器人工房4 小时前
嵌入式面试题:纹波率怎么计算;Buck 电路电感值的标准计算式是什么?
stm32·嵌入式硬件·面试题·diy机器人工房
DIY机器人工房4 小时前
嵌入式面试题:电容滤波,低频高频谁来滤?放置顺序怎么定?
stm32·单片机·嵌入式硬件·diy机器人工房
学术小白人6 小时前
会议第一轮投稿!2026年物联网、数据科学与先进计算国际学术会议(IDSAC2026)
人工智能·物联网·数据分析·能源·制造·教育·rdlink研发家
0***147 小时前
C在物联网中的Azure Sphere
物联网·microsoft·azure
d111111111d9 小时前
STM32外设--SPI读取W25Q64(学习笔记)硬件SPI
笔记·stm32·单片机·嵌入式硬件·学习