学习笔记-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' 发布

相关推荐
TDengine (老段)5 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)5 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
小莞尔7 小时前
【51单片机】【protues仿真】基于51单片机主从串行通信系统
c语言·单片机·嵌入式硬件·物联网·51单片机
Hello_Embed7 小时前
STM32 环境监测项目笔记(一):DHT11 温湿度传感器原理与驱动实现
c语言·笔记·stm32·单片机·嵌入式软件
骥龙11 小时前
2.5、物联网设备的“免疫系统”:深入解析安全启动与可信执行环境
物联网·安全
炸膛坦客11 小时前
Cortex-M3 内核 MCU-STM32F1 开发之路:(一)单片机 MCU 的构成,包括 FLASH 和 SRAM 的区别,以及引脚类型
stm32·单片机·嵌入式硬件
A9better11 小时前
嵌入式开发学习日志39——stm32之I2C总线物理层与常用术语
stm32·单片机·嵌入式硬件·学习
充哥单片机设计12 小时前
【STM32项目开源】基于STM32的智能衣柜系统
stm32·单片机·嵌入式硬件
Try1harder12 小时前
极海APM32F107V6 + 合宙Air780E
单片机·嵌入式硬件·物联网·合宙air780
刻BITTER14 小时前
用CMake 实现U8g2 的 SDL2 模拟环境
c++·stm32·单片机·嵌入式硬件·arduino