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

相关推荐
Truffle7电子30 分钟前
STM32CubeIDE/Programmer/Touch GFX 应用
stm32·单片机·嵌入式硬件
richxu202510012 小时前
嵌入式学习之路->stm32篇->(14)通用定时器(上)
stm32·单片机·嵌入式硬件·学习
Deitymoon4 小时前
STM32——外部中断按键控制led
stm32·单片机·嵌入式硬件
czwxkn4 小时前
7STM32(stdl)flash内部闪存
stm32·单片机·嵌入式硬件
咕噜咕噜啦啦4 小时前
STlink下载程序
stm32·单片机
Deitymoon5 小时前
STM32——串口中断接收
stm32·单片机·嵌入式硬件
Deitymoon7 小时前
STM32——串口通信发送数据
stm32·单片机·嵌入式硬件
czwxkn8 小时前
8STM32(stdl)低功耗模式
stm32·单片机·嵌入式硬件
czwxkn8 小时前
9STM32(stdl)看门狗
stm32·单片机·嵌入式硬件
胡楚昊10 小时前
借Polar IOTS一道困难挑战题简单入门蓝牙流量分析
物联网·蓝牙