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 Launchpad 通过 UART1连接到另一个控制器、通过 UART0连接到 PC、SD 卡、现在我想将其连接到 MQTT 代理"broker.hivemq.com
首先,为了了解 MQTT,我尝试更改 SDK 中提供的 MQTT 演示中的代理 URL,添加了要发布的主题,代码运行正常。
到目前为止、我只实现了 SL 设备连接到 WiFi 网络的部分、然后它尝试连接到 MQTT 代理、正如我在上面所说的那样。
为了在我的应用程序中实现 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()后、所有其他任务都被阻止、只有空闲任务保持运行
有什么关于这种情况发生的原因的见解?
使用#include 在具有 Mqueue 的项目中、开始发出我提到的警告
我已开始添加 MQTT 示例接口、它现在似乎正在工作。