AT_DEVICE 2.0.3版本 rtthread 4.0.2版本ESP8266和EC20各自用不同的三元组链接阿里云,在at_socket只会调用第一个注册的去链接阿里云,假如ESP8266先注册的AT_DEVICE,那么两个三元组都会通过ESP8266链接到阿里云,EC20这个设备根本不会被用到,现在想要独立开来使用,两个设备各链接一个三元组信息到阿里云
查看更多
这在逻辑上没有问题,你注册2个AT_DEVICE就好了,可以分别使用ESP8266和EC20。关键是你的代码逻辑有无问题,请展示你的关键代码。
这种情况就相当于双网卡了吧,这有个选网口通信的例程AT_Socket API比较有限,不一定能这样用,试试看吧
我尝试过用ESP32和Sim7600ce连接同一个MQTT服务器,通过切换默认网卡解决。用了kawaii-mqtt 1.1.0,at_device 2.0.4。
我的测试代码如下。但是,kawaii-mqtt有断线重连机制,建议在kawaii_mqtt_demo函数中,增加一个断线重连的回调函数,在回调函数中,根据任务的info再次进行默认网卡切换;否则,在断线重连后,依然只有一张网卡起作用。
typedef struct _client_info{ char netdev_name[64]; struct netdev *netdev; char cid[64]; char sub_topic[128]; char pub_topic[128];}client_info;static client_info esp32_demo_topics = {0};static client_info sim7600ce_demo_topics = {0};static int demo_mqtt(int argc, char *argv[]){ rt_thread_t tid_mqtt; client_info *info; struct netdev *netdev = RT_NULL; if (argc != 2) { rt_kprintf("demo_mqtt [default_netdev_name] --expected default network interface device.\n"); return -1; } rt_kprintf("input parameters are: %s %s \n", argv[0], argv[1]); netdev = netdev_get_by_name(argv[1]); if (netdev == RT_NULL) { rt_kprintf("not find network interface device name(%s).\n", argv[1]); return -1; } /* 设置线程名称 */ rt_snprintf(tid_name, sizeof(tid_name), "mqtt_%s", argv[1]); /* 设置默认网卡对象 */ netdev_set_default(netdev); rt_kprintf("demo_mqtt set default network interface device(%s) success.\n", argv[1]); /* 根据输入的网卡名称 设置MQTT topics相关信息*/ if (0 == strcmp(argv[1],"sim7600ce")) { info = &esp32_demo_topics; } else if (0 == strcmp(argv[1],"esp32")) { info = &sim7600ce_demo_topics; } rt_snprintf(info->netdev_name, sizeof(info->netdev_name), "%s", argv[1]); info->netdev = netdev; rt_snprintf(info->cid, sizeof(info->cid), "rtthread_%s", argv[1]); rt_snprintf(info->sub_topic, sizeof(info->sub_topic), "server/%s", info->cid); rt_snprintf(info->pub_topic, sizeof(info->pub_topic), "client/%s", info->cid); tid_mqtt = rt_thread_create(tid_name, kawaii_mqtt_demo, (void *)info, 2048, 17, 10); if (tid_mqtt == RT_NULL) { return -RT_ERROR; } /* only for test */ if (RT_FALSE == is_salof_init) { mqtt_log_init(); is_salof_init = RT_TRUE; } rt_thread_startup(tid_mqtt); return RT_EOK;}MSH_CMD_EXPORT(demo_mqtt, Kawaii MQTT client test program);
typedef struct _client_info{
char netdev_name[64];
struct netdev *netdev;
char cid[64];
char sub_topic[128];
char pub_topic[128];
}client_info;
static client_info esp32_demo_topics = {0};
static client_info sim7600ce_demo_topics = {0};
static int demo_mqtt(int argc, char *argv[])
{
rt_thread_t tid_mqtt;
client_info *info;
struct netdev *netdev = RT_NULL;
if (argc != 2)
rt_kprintf("demo_mqtt [default_netdev_name] --expected default network interface device.\n");
return -1;
}
rt_kprintf("input parameters are: %s %s \n", argv[0], argv[1]);
netdev = netdev_get_by_name(argv[1]);
if (netdev == RT_NULL)
rt_kprintf("not find network interface device name(%s).\n", argv[1]);
/* 设置线程名称 */
rt_snprintf(tid_name, sizeof(tid_name), "mqtt_%s", argv[1]);
/* 设置默认网卡对象 */
netdev_set_default(netdev);
rt_kprintf("demo_mqtt set default network interface device(%s) success.\n", argv[1]);
/* 根据输入的网卡名称 设置MQTT topics相关信息*/
if (0 == strcmp(argv[1],"sim7600ce"))
info = &esp32_demo_topics;
else if (0 == strcmp(argv[1],"esp32"))
info = &sim7600ce_demo_topics;
rt_snprintf(info->netdev_name, sizeof(info->netdev_name), "%s", argv[1]);
info->netdev = netdev;
rt_snprintf(info->cid, sizeof(info->cid), "rtthread_%s", argv[1]);
rt_snprintf(info->sub_topic, sizeof(info->sub_topic), "server/%s", info->cid);
rt_snprintf(info->pub_topic, sizeof(info->pub_topic), "client/%s", info->cid);
tid_mqtt = rt_thread_create(tid_name, kawaii_mqtt_demo, (void *)info, 2048, 17, 10);
if (tid_mqtt == RT_NULL) {
return -RT_ERROR;
/* only for test */
if (RT_FALSE == is_salof_init)
mqtt_log_init();
is_salof_init = RT_TRUE;
rt_thread_startup(tid_mqtt);
return RT_EOK;
MSH_CMD_EXPORT(demo_mqtt, Kawaii MQTT client test program);
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
这里调用的是PAHO_MQTT,都是通过这个接口返回来的
EC20和ESP8266都是调用的这个线程,这个线程在创建的时候名字是不一样的
在at_socket这里默认调用的是注册的第一个设备