打印
[N32G45x]

【N32G45x】N32G45x在RT-Thread中的应用

[复制链接]
1568|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51xlf|  楼主 | 2022-2-11 23:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
@21小跑堂
简单介绍N32G45x在RT-Thread中的应用,通过配置ESP8266建立WIFI与路由器之间的连接,并调通相关的网络,验证MQTT broker和N32G45x之间的通信功能。至于ESP8266要使用的AT指令和AT指令是什么,就需要自己去探索了,这里就不在赘述了,这里直接演示的是如何使用ESP8266上网了。
还有MQTT是什么和mqtt的通信机制,也不需要太详细的去了解,因为RT-Thread已经建立完成了底层,只需要知道如何去应用就行了。
后面可以使用mqtt.fx测试与终端设备的通信效果了。
N32G45x和RT-Thread的简单入门

1、下载RT-Thread studio的相关系统

通过https://www.rt-thread.org/page/studio.html下载RT-Thread studio,安装RT-threadstudio的过程就不再赘述了,傻瓜式安装即可。

2、打开RT-Thread studio软件,并点击建立新工程。选择RT-Thread 项目。

3、填写项目名称,选择要保存项目的位置,并且选择使用开发板。

4、在开发板选项中,选择N32G45的开发板。

如果选项中没有该开发板。则点击选择更多,去下载对应的开发板资料。并在打开的选项中选择N32G45的开发板并点击加载资源。我这里已经添加了N32G45的开发板,所以就不在选择和添加,加载按钮为灰色。

5、点击完成,创建工程文件。

6、生成的工程文件,如图所示,这里只是RT-Thread的验证工程文件,下载该程序以后,对应的LED会闪烁。

7、点击箭头1对工程文件进行编译,点击箭头2对下载工程文件。

8、选择DAP-link,并查看下载进度,如绿色框所示。这时,观察开发板,绿色的LED会按照每秒5次的频率进行闪烁。



二 配置ESP8266,并联网。
1、双击RT-Thread -settings ,会弹出RT-Thread的软件包界面。

2、点击界面中的立即添加,出现安装包的界面,搜索AT_Device ,并点击安装。
返回界面以后,点击详细配置,这就会配置ESP8266和wifi了。

3、在这个界面,找到乐鑫ESP8266的选项,并填写wifi的账号和密码,并选择要使用的串口,我这里选择的时候uart2.

4、点击保存,会重新生成工程文件

5、差点忘了,需要激活串口2,重新进入该界面,找到硬件哪里,在UART选项处选择UART2,并使能UART,并重新保存。

6、重新编译该程序,并下载。对于ESP8266的更新AT固件就不在这里赘述了,可以搜索有大量的教程可以参考。
并ESP8266的引脚与PA2和PA3进行连接,当然肯定是ESP8266的TX-PA3,ESP8266的RX-PA2。
在编译的过程中会弹出这个错误的。因为在这个文件中缺少了两个头文件
#include "stdio.h"  
#include "string.h"
在文件中添加就没有问题了。


7、打开RT-Thread字典的终端,验证ESP8266是否连接成功呢

当出现这个的时候证明没有问题了。
[I/at.dev.esp] esp0 device wifi is connected.
[I/at.dev.esp] esp0 device network initialize successfully.
下面这个问题不需要管它
please check and update esp0 device firmware to support the "AT+CIPDNS_CUR?" cmd.
我们在终端中输入,测试一下网络是不是连接成功了。
ping www.baidu.com
百度对该命令有了回应,这里就证明,N32G45x已经通过esp8266与网络建立了链接,后续就可以开展相关的网络应用代码了。

这个参考代码在at_sample-esp8266文件下了。测试的代码
#include <at_device_esp8266.h>

#define LOG_TAG                        "at.sample.esp"
#include <at_log.h>

#define ESP8266_SAMPLE_DEIVCE_NAME     "esp0"

static struct at_device_esp8266 esp0 =
{
    ESP8266_SAMPLE_DEIVCE_NAME,
    ESP8266_SAMPLE_CLIENT_NAME,

    ESP8266_SAMPLE_WIFI_SSID,
    ESP8266_SAMPLE_WIFI_PASSWORD,
    ESP8266_SAMPLE_RECV_BUFF_LEN,
};

static int esp8266_device_register(void)
{
    struct at_device_esp8266 *esp8266 = &esp0;

    return at_device_register(&(esp8266->device),
                              esp8266->device_name,
                              esp8266->client_name,
                              AT_DEVICE_CLASS_ESP8266,
                              (void *) esp8266);
}
INIT_APP_EXPORT(esp8266_device_register);



三 测试MQTT

按照上述同样的方法,按照paho-mqtt的库,


在packages中找到paho-mqtt中的test文件夹,修改里面需要MQTT broker的信息,如下所示。
#define MQTT_URI                "tcp://iot.eclipse.org:1883"
#define MQTT_USERNAME           "admin"
#define MQTT_PASSWORD           "admin"
#define MQTT_SUBTOPIC           "/mqtt/test"
#define MQTT_PUBTOPIC           "/mqtt/test"
#define MQTT_WILLMSG            "Goodbye!"
将服务器的地址 用户名 密码和账号替换为自己的服务器的地址。

输入下面的命令
msh />mqtt_test start
测试MQTT测试是否完成

在终端平台上显示出这个数据,证明mqtt已经测试完成了。
QoS   : 1
Cannot find a RTC device to provide time!
Test duration(sec)            : 0
Number of published  packages : 4
Number of subscribed packages : 4
Packet loss rate              : 0.00%
Number of reconnections       : 0


如何接收到mqtt发送过来的数据呢?测试代码中没有详细的介绍,
需要修改这个代码。
static void mqtt_sub_callback(MQTTClient *c, MessageData *msg_data)
{
    sub_count ++;
    return;
}
修改为
static void mqtt_sub_callback(MQTTClient *c, MessageData *msg_data)
{
    rt_kprintf("msg_data: %s\n",(char *)msg_data->message->payload);
    sub_count ++;
    return;
}
你就可以在终端看到过来的数据了。
附上测试文件的详细代码。
myPrj.rar (12.91 MB)
#define MQTT_TEST_SERVER_URI    "tcp://106.54.182.59:1883"
#define MQTT_CLIENTID           "123455"
#define MQTT_USERNAME           "BearPi"
#define MQTT_PASSWORD           "123456"
#define MQTT_SUBTOPIC           "/mqtt/test"
#define MQTT_PUBTOPIC           "/mqtt/test"
#define MQTT_WILLMSG            "Goodbye!"
#define MQTT_TEST_QOS           1
#define MQTT_PUB_SUB_BUF_SIZE   1024

#define CMD_INFO                "'mqtt_test <start|stop>'"
#define TEST_DATA_SIZE          256
#define PUB_CYCLE_TM            1000

static rt_thread_t pub_thread_tid = RT_NULL;

static char *pub_data = RT_NULL;

/* define MQTT client context */
static MQTTClient client;

static rt_uint32_t pub_count = 0, sub_count = 0;
static int recon_count = -1;
static int test_start_tm = 0;
static int test_is_started = 0;

static void mqtt_sub_callback(MQTTClient *c, MessageData *msg_data)
{
    sub_count ++;
    return;
}

static void mqtt_connect_callback(MQTTClient *c)
{
    return;
}

static void mqtt_online_callback(MQTTClient *c)
{
    recon_count ++;
    return;
}

static void mqtt_offline_callback(MQTTClient *c)
{
    return;
}

/**
* This function create and config a mqtt client.
*
* @param void
*
* @return none
*/
static void mq_start(void)
{
    /* init condata param by using MQTTPacket_connectData_initializer */
    MQTTPacket_connectData condata = MQTTPacket_connectData_initializer;

    rt_memset(&client, 0, sizeof(MQTTClient));

    /* config MQTT context param */
    {
        client.uri = MQTT_TEST_SERVER_URI;

        /* config connect param */
        memcpy(&client.condata, &condata, sizeof(condata));
        client.condata.clientID.cstring = MQTT_CLIENTID;
        client.condata.keepAliveInterval = 60;
        client.condata.cleansession = 1;
        client.condata.username.cstring = MQTT_USERNAME;
        client.condata.password.cstring = MQTT_PASSWORD;

        /* config MQTT will param. */
        client.condata.willFlag = 1;
        client.condata.will.qos = MQTT_TEST_QOS;
        client.condata.will.retained = 0;
        client.condata.will.topicName.cstring = MQTT_PUBTOPIC;
        client.condata.will.message.cstring = MQTT_WILLMSG;

        /* malloc buffer. */
        client.buf_size = client.readbuf_size = MQTT_PUB_SUB_BUF_SIZE;
        client.buf = rt_malloc(client.buf_size);
        client.readbuf = rt_malloc(client.readbuf_size);
        if (!(client.buf && client.readbuf))
        {
            rt_kprintf("no memory for MQTT client buffer!\n");
            goto _exit;
        }

        /* set event callback function */
        client.connect_callback = mqtt_connect_callback;
        client.online_callback = mqtt_online_callback;
        client.offline_callback = mqtt_offline_callback;

        /* set subscribe table and event callback */
        client.messageHandlers[0].topicFilter = rt_strdup(MQTT_SUBTOPIC);
        client.messageHandlers[0].callback = mqtt_sub_callback;
        client.messageHandlers[0].qos = MQTT_TEST_QOS;

        /* set default subscribe event callback */
        client.defaultMessageHandler = mqtt_sub_callback;
    }

    /* run mqtt client */
    paho_mqtt_start(&client);

    return;

_exit:
    if (client.buf)
    {
        rt_free(client.buf);
        client.buf = RT_NULL;
    }
    if (client.readbuf)
    {
        rt_free(client.readbuf);
        client.readbuf = RT_NULL;
    }
    return;
}

static void show_test_info(void)
{
    char temp[50] = {0};
    rt_kprintf("\r==== MQTT Stability test ====\n");
    rt_kprintf("Server: "MQTT_TEST_SERVER_URI"\n");
    rt_kprintf("QoS   : %d\n", MQTT_TEST_QOS);

    rt_kprintf("Test duration(sec)            : %d\n", time((time_t *)RT_NULL) - test_start_tm);
    rt_kprintf("Number of published  packages : %d\n", pub_count);
    rt_kprintf("Number of subscribed packages : %d\n", sub_count);
    snprintf(temp, sizeof(temp), "Packet loss rate              : %.2f%%   \n", (float)((float)(pub_count - sub_count) * 100.0f / pub_count));
    rt_kprintf(temp);
    rt_kprintf("Number of reconnections       : %d\n", recon_count);
    /* up the cursor 8 line */
    rt_kprintf("\033[8A");
}

static void thread_pub(void *parameter)
{
    pub_data = rt_malloc(TEST_DATA_SIZE * sizeof(char));
    if (!pub_data)
    {
        rt_kprintf("no memory for pub_data\n");
        return;
    }
    rt_memset(pub_data, '*', TEST_DATA_SIZE * sizeof(char));

    test_start_tm = time((time_t *)RT_NULL);
    rt_kprintf("test start at '%d'\r\n", test_start_tm);

    while (1)
    {
        if (!paho_mqtt_publish(&client, QOS1, MQTT_PUBTOPIC, pub_data))
        {
            ++ pub_count;
        }

        rt_thread_delay(PUB_CYCLE_TM);

        show_test_info();
    }
}

static void mqtt_test_start(void)
{
    if (test_is_started)
    {
        return;
    }

    mq_start();

    while (!client.isconnected)
    {
        rt_kprintf("Waiting for mqtt connection...\n");
        rt_thread_delay(1000);
    }

    pub_thread_tid = rt_thread_create("pub_thread", thread_pub, RT_NULL, 1024, 8, 100);
    if (pub_thread_tid != RT_NULL)
    {
        rt_thread_startup(pub_thread_tid);
    }

    test_is_started = 1;

    return;
}

static void mqtt_test_stop(void)
{
    MQTTClient *local_client = &client;

    if (pub_thread_tid)
    {
        rt_thread_delete(pub_thread_tid);
    }

    if (pub_data)
    {
        rt_free(pub_data);
        pub_data = RT_NULL;
    }

    if (local_client)
    {
        paho_mqtt_stop(local_client);
    }

    /* up the cursor 1 line */
    rt_kprintf("\033[1A");

    show_test_info();

    /* down the cursor 10 line */
    rt_kprintf("\033[10B");

    pub_count = sub_count = recon_count = 0;
    test_is_started = 0;

    rt_kprintf("==== MQTT Stability test stop ====\n");
}

static void mqtt_test(uint8_t argc, char **argv)
{
    if (argc >= 2)
    {
        if (!strcmp(argv[1], "start"))
        {
            mqtt_test_start();
        }
        else if (!strcmp(argv[1], "stop"))
        {
            mqtt_test_stop();
        }
        else
        {
            rt_kprintf("Please input "CMD_INFO"\n");
        }
    }
    else
    {
        rt_kprintf("Please input "CMD_INFO"\n");
    }
}
MSH_CMD_EXPORT(mqtt_test, MQTT test CMD_INFO);

















使用特权

评论回复
沙发
duo点| | 2022-2-17 19:12 | 只看该作者
国民技术真不错哟

使用特权

评论回复
板凳
guijial511| | 2022-2-18 07:54 | 只看该作者
学习下,多谢分享。

使用特权

评论回复
地板
qiangtech| | 2022-2-18 15:57 | 只看该作者
MARK,多谢分享!

使用特权

评论回复
5
51xlf|  楼主 | 2022-2-20 13:39 | 只看该作者
duo点 发表于 2022-2-17 19:12
国民技术真不错哟

单片机的性能不错的。  

使用特权

评论回复
6
51xlf|  楼主 | 2022-2-20 17:27 | 只看该作者
guijial511 发表于 2022-2-18 07:54
学习下,多谢分享。

多多交流,这个RT-Thread也好用。  

使用特权

评论回复
7
daichaodai| | 2022-2-21 08:15 | 只看该作者
RT-Thread编译速度咋样?稳定吗?

使用特权

评论回复
8
51xlf|  楼主 | 2022-2-21 22:41 | 只看该作者
可以,集成的功能比较多了。   

使用特权

评论回复
9
xyz549040622| | 2022-4-21 16:26 | 只看该作者
不错,RTT的官方已经做了很多工作了,让我们可以很快的入门。

使用特权

评论回复
10
51xlf|  楼主 | 2022-4-21 19:50 | 只看该作者
xyz549040622 发表于 2022-4-21 16:26
不错,RTT的官方已经做了很多工作了,让我们可以很快的入门。

主要是集成的模块都是关联的。   

使用特权

评论回复
11
keer_zu| | 2022-4-22 09:24 | 只看该作者
是参考那个bsp包设计的?有没有原始的bsp包?

使用特权

评论回复
12
biechedan| | 2022-4-27 20:01 | 只看该作者
以后有机会测试一下。  

使用特权

评论回复
13
chenci2013| | 2022-4-27 20:10 | 只看该作者
N32G45x怎么样?

使用特权

评论回复
14
i1mcu| | 2022-4-27 20:24 | 只看该作者
如何区分AT指令的?

使用特权

评论回复
15
sdlls| | 2022-4-27 20:46 | 只看该作者
RT-Thread应用很多了。

使用特权

评论回复
16
htmlme| | 2022-4-27 21:12 | 只看该作者
这个使用的是wifi吗  

使用特权

评论回复
17
sanxingnote7| | 2022-4-27 21:38 | 只看该作者
RT-Thread nano版本吗?

使用特权

评论回复
18
louliana| | 2022-4-27 22:07 | 只看该作者
RT-Thread?

使用特权

评论回复
19
cashrwood| | 2022-4-27 22:36 | 只看该作者
这个自己开发的程序吗?

使用特权

评论回复
20
kmzuaz| | 2022-4-27 23:03 | 只看该作者
ESP8266怎么集成了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

535

主题

9597

帖子

23

粉丝