This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3220SF-LAUNCHXL:调用 MQTTClient_connect()会阻止所有任务(已编辑);警告(如&quot);#48-D 不兼容宏&quot 的重新定义;O_creat"(在&quot 的第59行声明;C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.12.0.LTS/include/file.h "

Guru**** 2017140 points
Other Parts Discussed in Thread: CC3220SF, SYSBIOS
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/848364/cc3220sf-launchxl-call-to-mqttclient_connect-blocks-all-tasks-edited-warnings-like-48-d-incompatible-redefinition-of-macro-o_creat-declared-at-line-59-of-c-ti-ccsv8-tools-compiler-ti-cgt-arm_18-12-0-lts-include-file-h

器件型号:CC3220SF-LAUNCHXL
Thread 中讨论的其他器件:CC3220SFSYSBIOS

各位专家、您好!

我有一个应用、其中 CC3220SF Launchpad 通过 UART1连接到另一个控制器、通过 UART0连接到 PC、SD 卡、现在我想将其连接到 MQTT 代理"broker.hivemq.com

首先,为了了解 MQTT,我尝试更改 SDK 中提供的 MQTT 演示中的代理 URL,添加了要发布的主题,代码运行正常。

到目前为止、我只实现了 SL 设备连接到 WiFi 网络的部分、然后它尝试连接到 MQTT 代理、正如我在上面所说的那样。

  1. 详细说明我得到的警告:

为了在我的应用程序中实现 MQTT,添加了正确的包含,添加了 ARM 链接器的包含路径和库位置,并编译了代码,但我会收到类似的警告  

"说明资源路径位置类型
#48-D 不兼容的宏"O_creat"重定义(在"C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.12.0.LTS/include/file.h "的第59行声明).ccsproject /Dahipuri 第80行、外部位置:C:\ti\simplelink_cc32xx_sdk_3_20_00_06\sources\ti\posix\ccs\mqueue.h C/C++ problem  

对于 O_CREAT、O_Excl, O_RDONLY、O_RDWR、O_WRONLY,总共有5个与 mqueue.h 相关的警告。

2.现在继续到 MQTTClient_connect(),不返回:  

首先,我已经在应用程序的主文件中添加了 MQTT 示例 MQTT_CLIENT_APP.c 文件中的所有全局包括、声明。我已经在项目目录中添加了 network_if 和 client_CBS,并将它们包含在主目录中

我在名为 dahipuriMain()的主文件中运行了一个任务,它是在 SYSBIOS 启动后立即准备好运行的唯一任务(其他任务在信标后面)。

在该任务中,我添加了:

SlNetIf 初始化(0);
SlNetIf_add (SLNETIF_ID_1、"CC32xx"、
(const SlNetIf _Config_t *) SlNetIfConfigWifi、
SLNET_IF_WIFI_PRIO);
SlNetSock_init (0);
SlNetUtil_init (0);

后跟:  


pthread_attr_init (&pAttrs_spawn); priParam.sched_priority = sawn_task_priority; retc = pthread_attr_setschedparam (&pAttrs_spawn、&priParam); retc |= pthread_attr_setstacksize (&pAttrs_sprawn、TASKSTACKSIZE); retc |= pthread_attr_setdetachstate (&pAttrs_sprawn、pthread_create_detachstate); retc = pthread_create (&spawn_thread、&pAttrs_spawn、sl_Task、NULL) gAppConnectionState = MQTT_IF_Connect (); if (gApConnectionState<0){ System_printf ("连接到 AP\r\n 时出现问题"); } if (!MQTT_START()){ System_printf ("消息队列已固定\r\n); } retc=MQTT_CLIENT_CONNECT(); if (!retc) { System_printf ("MQTT 连接失败\r\n); } while (1){ UART_READ (uart0、&INPUT、1); UART_READ (uart1、&input1、1); system_flush(); }


我已通过删除显示横幅更改了 MQTT 演示中的一些功能。

MQTT_IF_Connect()如下所示:

int32_t MQTT_IF_Connect ()
{
int32_t lRetVal;
char SSID_Remote_Name[32];
INT8_t Str_Length;

memset (SSID_Remote_Name、'\0'、sizeof (SSID_Remote_Name));
STR_Length = strlen (SSID_NAME);

IF (StR_Length)
{
/*将默认 SSID 复制到局部变量 *
strncpy (SSID_Remote_Name、SSID_NAME、Str_Length);
}

/*显示应用程序横幅 //
//显示横幅(application_name);

/*重置机器的状态 *
network_if_ResetMCUStateMachine();

/*启动驱动程序 *
lRetVal = Network_IF_InitDriver (Role_STA);
if (lRetVal < 0)
{
System_printf ("无法启动 SimpleLink 器件\n\r"、lRetVal);
return(-1);
}

/*打开 Board_GPIO_LED2以指示 Simplelink 已正确启动。 //
GPIO_write (Board_GPIO_LED2、Board_GPIO_LED_ON);

/*启动计时器使 Board_GPIO_LED0闪烁,直至接入点连接 //
// LedTimerConfigNStart();

/*初始化 AP 安全参数 *
SecurityParams.Key =(signed char *) security_key;
SecurityParams.KeyLen = strlen (security_key);
SecurityParams.Type = SECURITY_TYPE;

/*连接到接入点 *
lRetVal = Network_IF_ConnectAP (SSID_Remote_Name、SecurityParams);
if (lRetVal < 0)
{
System_printf ("连接到 AP 失败\n\r\n);
return(-1);
}

睡眠(2);

返回(0);
}

MQTT_START()如下所示:  

bool MQTT_START(){
mq_attr 属性;
无符号模式= 0;

/*sync 对象,用于线程间通信 *
ATTR.MQ_maxmsg = 10;
attr.mq_msgsize = sizeof (struct msgQueue);
G_PBQueue = MQ_open ("g_PBQueue"、O_creat、mode、&attr);

if (g_PBQueue ==空)
{
System_printf ("MQTT 消息队列创建失败\n\r\n);
//gInitState &=~MQTT_INIT_STATE;
返回 false;
}


返回 true;
}

MQTT_CLIENT_CONNECT ()如下所示:

int32_t MQTT_CLIENT_CONNECT (){
int32_t lRetVal =-1;
int32_t iCount = 0;
MqttClientExample_params.clientId = ClientID;
MqttClientExample_params.connParams =&MQTT_ClientCtx;
MqttClientExample_params.mqttMode31 = MQTT_3_1;
MqttClientExample_params.blockingSend = true;
gMqttClient = MQTTClient_create (MqttClientCallback、
&MqttClientExample_params);
if (gMqttClient =NULL)
{

System_printf ("MQTT 连接失败\r\n);
return(-1);
}
MQTTClient_set (gMqttClient、MQTTClient_Will 参数、will _param、&will _param、
sizeof (will _param));
system_flush();
lRetVal = MQTTClient_connect (gMqttClient);
UART_PRINT ("lRetVal =%d"、lRetVal);
if (0 > lRetVal)
{
/*lib 初始化失败 *
UART_PRINT ("连接到代理失败、错误代码:%d\n\r\n、
lRetVal);

gUiConnFlag = 0;
}
其他
{
gUiConnFlag = 1;
}
/*在服务器未存储会话时订阅主题 *
if ((gUiConnFlag = 1)&&(0 = lRetVal))
{
uint8_t 子索引;
MQTTClient_SubscribeParams 下标信息[
subscription_topic_count];

for (子索引= 0;子索引< subIndex_topic_count;子索引++)
{
subscriptionInfo[subIndex].topic = topic[subIndex];
subscriptionInfo[subIndex].QoS = QOS[subIndex];
}

if (MQTTClient_subscribe (gMqttClient、下标信息、
subscription_topic_count)< 0)
{
UART_PRINT ("\n\r 订阅错误\n\r");
MQTTClient_DISCONNECT (gMqttClient);
gUiConnFlag = 0;
}
其他
{
for (iCount = 0;iCount < subscription_topic_count;iCount++)
{
UART_PRINT ("已在%s\n\r 上订阅客户端"、Topic[iCount]);
}
}

返回0;
} 


当我在控制台上获得输出时、我可以成功连接到 Wifi、并声明已接收到 IP (因为我已连接)
在 ROV 签入后,我的所有任务都被阻止,并且只有空闲任务在调用 MQTTClient_Connect()后运行;
我要添加应用程序的主文件(它包含我当前编写的所有代码)和 CIO 控制台输出

我使用的软件版本:

CCS v8.3;Simple SDK 3.20.00.06;ARM 18.12.0编译器;XDC 版本:3.51.3.28

请帮帮我。
谢谢、
Vedant

e2e.ti.com/.../5633.Dahipuri_5F00_Main.c





  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于时区问题、我可能需要7-8小时的时间来回答、请不要关闭此主题、因为我严重需要有关此方面的帮助

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Vedant、

    如果我理解正确、您就能够使用 SDK 示例连接您的代理(broker.hivemq.com)并与之合作。

    您为何更改了 MQTT 相关代码?

    请从正在工作的 MQTT 示例开始、并将其他接口添加到其中。

    如果您逐步更新、您 应该能够找到警告和连接问题的原因。

    BR、

    Kobi  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Kobi、

    是的、我能够使用 SDK 示例与我的代理连接

    有一个预开发的应用、我必须在其上添加通过 MQTT 传输数据的功能

    我不需要 TI 提供的基于 UART 命令行的应用程序、而只需要 其中一些通过 MQTT 进行数据传输绝对必要的部分、除此之外什么都没有、因此我认为使用与 SLWifi 和 MQTT 直接相关的函数就足够了。

    这些是我更改 MQTT 相关代码的原因,我的意思是我几乎尽可能删除命令行横幅,只将这些调试语句替换为 system_printf();

    此致、

    Vedant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    kobi、大家好、我再次检查了我的代码、在调用 MQTTClient_Connect()后、所有其他任务都被阻止、只有空闲任务保持运行

    有什么关于这种情况发生的原因的见解?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     WiFi 连接后的 ROV 视图。 请提出问题,我现在不能弄清楚

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    使用#include 在具有 Mqueue 的项目中、开始发出我提到的警告

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已开始添加 MQTT 示例接口、它现在似乎正在工作。