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.

[参考译文] CC3200:WiFi 重新连接问题

Guru**** 2769425 points

Other Parts Discussed in Thread: CC3200, CC3200SDK, CC3100

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1056913/cc3200-wifi-reconnection-issue

器件型号:CC3200
Thread 中讨论的其他部件:CC3100

尊敬的团队:

下面是 我使用的设置详细信息:  

  1. CC3200 Wi-Fi 芯片。
  2. SDK: CC3200SDK_1.3.0
  3. 服务包:CC3100_CC3200_ServicePack_1.0.1.11-2.10.0.0

目标:收集振动数据并将其发布在 MQTT 服务器上。

  • 振动传感器(SPI 协议)
  • WPA2 Wi-Fi  安全性

参考示例代码:

  • 我正在使用 MQTT 客户端代码、并根据要求进行了更改

问题:重新连接到同一网络

  • 设备连接到网络并仅在几分钟内开始发送数据(10/20分钟)
  • 随后、它断开连接并尝试重新连接、但它绝不会重新连接
  • 如果我们 在10分钟前关闭"路由器"、设备将重新连接到网络
  • 同样、如果我们在10/20分钟后关闭"路由器"、则设备永远不会重新连接到网络  
  • 需要将其关闭并再次打开才能连接到同一网络

这可能是什么问题?希望您能尽快与上述问题取得联系。

以下是我使用的 MQTT 客户端代码的代码片段、 我请求您  提供正确的解决方案?  

//*****************************************************************************
//
//! Task implementing MQTT client communication to other web client through
//!    a broker
//!
//! \param  none
//!
//! This function
//!    1. Initializes network driver and connects to the default AP
//!    2. Initializes the mqtt library and set up MQTT connection configurations
//!    3. set up the button events and their callbacks(for publishing)
//!    4. handles the callback signals
//!
//! \return None
//!
//*****************************************************************************

void MqttClient(void *pvParameters)
{
	long lRetVal = -1;
	int iCount = 0;
	int iNumBroker = 0;
	int iConnBroker = 0;
	unsigned char policyVal;

//	connect_config *local_con_conf = (connect_config *)app_hndl;
	local_con_conf = (connect_config *)app_hndl;

	// Reset The state of the machine
	Network_IF_ResetMCUStateMachine();

	// Start the driver
	lRetVal = Network_IF_InitDriver(ROLE_STA);
	if(lRetVal < 0)
	{
		LOOP_FOREVER();
	}

	// switch on Yellow LED to indicate Simplelink is properly up
	MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, GPIO_PIN_4);	//Yellow LED ON


	// Start Timer to blink Red LED till AP connection
	LedTimerConfigNStart();

	// Initialize AP security params
	SecurityParams.Key = (signed char *)SECURITY_KEY;
	SecurityParams.KeyLen = strlen(SECURITY_KEY);
	SecurityParams.Type = SECURITY_TYPE;

	//
	// Connect to the Access Point
	//
	lRetVal = Network_IF_ConnectAP(SSID_NAME, SecurityParams);
	if(lRetVal < 0)
	{
		UART_PRINT("Connection to an AP failed\n\r");
		LOOP_FOREVER();
	}

	lRetVal = sl_WlanProfileAdd(SSID_NAME,strlen(SSID_NAME),0,&SecurityParams,0,1,0);



	//set AUTO policy
	lRetVal = sl_WlanPolicySet(SL_POLICY_CONNECTION,
			SL_CONNECTION_POLICY(1,1,0,0,0),
			&policyVal, 1 /*PolicyValLen*/);		//SL_CONNECTION_POLICY is set to auto and fast config connection mode.

	g_uiSimplelinkRole =  sl_Start(NULL,NULL,NULL);

	//waiting for the device to Auto Connect
	while ( (!IS_IP_ACQUIRED(g_ulStatus))&&
			g_ucConnectTimeout < AUTO_CONNECTION_TIMEOUT_COUNT)
	{
		//Turn RED LED On
		MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, GPIO_PIN_4);	//Yellow LED ON
		osi_Sleep(50);

		//Turn RED LED Off
		MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, 0);	//Yellow LED OFF
		osi_Sleep(50);

		g_ucConnectTimeout++;
	}


	// Disable the LED blinking Timer as Device is connected to AP
	LedTimerDeinitStop();

	// Switch ON RED LED to indicate that Device acquired an IP
	MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, GPIO_PIN_4);	//Yellow LED ON
	UtilsDelay(20000000);
	MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, 0);	//Yellow LED OFF

	// Register Push Button Handlers
	Button_IF_Init(pushButtonInterruptHandler2,pushButtonInterruptHandler3);
	ReconnectNow:
	if(boolRestart)
	{
//		sl_ExtLib_MqttClientDisconnect((void*)local_con_conf[iCount].clt_ctx);
		/* Clear all stored profiles and reset the policies */
		lRetVal = sl_WlanProfileDel(0xFF);
//		ASSERT_ON_ERROR(lRetVal);
		sl_WlanDisconnect();


		MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, GPIO_PIN_4);	//Yellow LED ON
		UtilsDelay(100000);
		MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, 0);	//Yellow LED OFF
		UtilsDelay(100000);
		MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, GPIO_PIN_4);	//Yellow LED ON

		// Start Timer to blink Red LED till AP connection
		LedTimerConfigNStart();
		SetConnectionPolicy();
		// Disable the LED blinking Timer as Device is connected to AP
		LedTimerDeinitStop();

		MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, 0);	//Yellow LED OFF
		boolRestart = false;
	}

	connect_to_broker:
	// Initialze MQTT client lib
	lRetVal = sl_ExtLib_MqttClientInit(&Mqtt_Client);
	if(lRetVal != 0)
	{
		// lib initialization failed
		LOOP_FOREVER();
	}

	/******************* connection to the broker ***************************/
	iNumBroker = sizeof(usr_connect_config)/sizeof(connect_config);
	if(iNumBroker > MAX_BROKER_CONN)
	{
		LOOP_FOREVER();
	}

//	connect_to_broker:
	while(iCount < iNumBroker)
	{
		//create client context
		local_con_conf[iCount].clt_ctx =
				sl_ExtLib_MqttClientCtxCreate(&local_con_conf[iCount].broker_config,
						&local_con_conf[iCount].CallBAcks,
						&(local_con_conf[iCount]));

		// Set Client ID
		sl_ExtLib_MqttClientSet((void*)local_con_conf[iCount].clt_ctx,
				SL_MQTT_PARAM_CLIENT_ID,
				local_con_conf[iCount].client_id,
				strlen((char*)(local_con_conf[iCount].client_id)));

		// Set will Params
		if(local_con_conf[iCount].will_params.will_topic != NULL)
		{
			sl_ExtLib_MqttClientSet((void*)local_con_conf[iCount].clt_ctx,
					SL_MQTT_PARAM_WILL_PARAM,
					&(local_con_conf[iCount].will_params),
					sizeof(SlMqttWill_t));
		}

		// setting username and password
		if(local_con_conf[iCount].usr_name != NULL)
		{
			sl_ExtLib_MqttClientSet((void*)local_con_conf[iCount].clt_ctx,
					SL_MQTT_PARAM_USER_NAME,
					local_con_conf[iCount].usr_name,
					strlen((char*)local_con_conf[iCount].usr_name));

			if(local_con_conf[iCount].usr_pwd != NULL)
			{
				sl_ExtLib_MqttClientSet((void*)local_con_conf[iCount].clt_ctx,
						SL_MQTT_PARAM_PASS_WORD,
						local_con_conf[iCount].usr_pwd,
						strlen((char*)local_con_conf[iCount].usr_pwd));
			}
		}

		// connectin to the broker
		if((sl_ExtLib_MqttClientConnect((void*)local_con_conf[iCount].clt_ctx,
				local_con_conf[iCount].is_clean,
				local_con_conf[iCount].keep_alive_time) & 0xFF) != 0)
		{

			//delete the context for this connection
			sl_ExtLib_MqttClientCtxDelete(local_con_conf[iCount].clt_ctx);

			break;
		}
		else
		{
			local_con_conf[iCount].is_connected = true;
			iConnBroker++;
		}

		// Subscribe to topics
		if(sl_ExtLib_MqttClientSub((void*)local_con_conf[iCount].clt_ctx,
				local_con_conf[iCount].topic,
				local_con_conf[iCount].qos, TOPIC_COUNT) < 0)
		{
			sl_ExtLib_MqttClientDisconnect(local_con_conf[iCount].clt_ctx);
			local_con_conf[iCount].is_connected = false;

			//delete the context for this connection
			sl_ExtLib_MqttClientCtxDelete(local_con_conf[iCount].clt_ctx);
			iConnBroker--;
			break;
		}
		else
		{
			int iSub;
			for(iSub = 0; iSub < local_con_conf[iCount].num_topics; iSub++)
			{
			}
		}
		iCount++;
	}


	if(iConnBroker < 1)
	{
		// no succesful connection to broker
		goto end;
	}

	iCount = 0;

	for(;;)
	{
		if(boolSmartConfig)             //Conditional entry check for Force Smart Configuration
		{
			boolRestart=true;
			boolSmartConfig = false;
			goto ReconnectNow;
		}

		//Check If AP is disconnected
		if(boolBrokerDisconnected)
		{
			//Jumps to Reconnection Wait state
			goto end;
		}

		ReadData();  //Read the vibration Sensor data



#ifdef RS485_SERIAL
		sprintf(dataBuffer,"{\"Vibration,VID\": \"%s\", \"x\": \"%s\", \"y\": \"%s\", \"z\": \"%s\" }\n\r",charDeviceID,ucXaxisBuffer,ucYaxisBuffer,ucZaxisBuffer);
#endif

		sl_ExtLib_MqttClientSend((void*)local_con_conf[iCount].clt_ctx,      //MQTT Send Function
				pub_topic,(char *)dataBuffer,strlen(dataBuffer),QOS2,RETAIN);

		osi_Sleep(50);			//50ms delay
	}

	end:
		lRetVal = CheckInternetConnection();
		//Wait Untill AP/Internet connection is established
		while(lRetVal < 0)
		{

			IS_IP_ACQUIRED(g_ulStatus);
			IS_CONNECTED(g_ulStatus);
			lRetVal = CheckInternetConnection();

			MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, GPIO_PIN_4);	//Yellow LED ON
			osi_Sleep(12000);
			MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, 0);	//Yellow LED OFF
			osi_Sleep(3000);

			cReconnectCntr++;		//Count no of attempts of reconnection

			if(boolSmartConfig)
			{
				lRetVal = 1;
				lRetVal = sl_WlanProfileDel(0xFF);
				sl_WlanDisconnect();
				boolRestart=true;
				boolSmartConfig = false;
				goto ReconnectNow;
			}

			if( cReconnectCntr > 8 )		// 1 count = 15 secs therefore 4 count = 1 mins
			{
				cReconnectCntr = 0;
				PowerCycleDevice();	// soft resets the device - data is lost
			}

		}

		MAP_GPIOPinWrite(GPIOA3_BASE, GPIO_PIN_4, 0);	//Yellow LED OFF
		local_con_conf->is_connected = true;
		boolBrokerDisconnected = false;
		//If AP connection is sucessfull jump to reintiate MQTT broker Connection
//		PowerCycleDevice();
		goto connect_to_broker;
}

如果我错了、请告诉我。 提前感谢。

   

寻求快速响应。

谢谢、此致、

Shivaprasad。

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

    您能说出断开连接的原因吗?(断开连接事件中的原因代码)。 您是否因为路由器关闭而断开连接?

    您是否将自动连接/快速连接用于连接策略?

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

    感谢您尽早研究这个问题。

    您是否因为路由器关闭而断开连接?

    ->是的、因为我正在创建一个测试到同一网络的重新连接的方案。 示例:如果没有网络、则器件应进入重新连接状态并等待、直至网络启动。  请通过以下步骤了解测试方案。

    • 我将设备连接到网络、设备已连接、数据正在发布。
    • 有时我会关闭网络(路由器)。
    • 现在设备进入重新连接状态并等待重新连接到同一网络。
    • 如果我在10/20分钟内打开路由器、设备将连接到网络 并发布数据。
    • 但是、如果我在20分钟后打开路由器、设备根本无法重新连接到网络。 我每次都需要重新启动设备以使其连接到网络。

    您是否将自动连接/快速连接用于连接策略?

    ->可以。 我将使用这两者的组合、如下所示、

    lRetVal = sl_WlanPolicySet (sl_policy_connection、sl_connection_policy (1、1、0、0)、&policyVal、1/* PolicyVallen*/);

     

    如果我遗漏了任何东西、请告诉我。  

    感谢你能抽出时间。

    谢谢、此致、

    Shivaprasad。

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

    您好!

    通常、周期性扫描是可伸缩的、即当无法找到 AP 时、它会以增加的间隔触发扫描、直到在扫描之间达到14秒的间隔、并始终保持这种状态。

    我在当地进行了测试、然后用这种方法测试了30分钟、直到我停止测试。 如果我将其保持原样30分钟、然后插入 AP、它将按预期重新连接。

    我使用的是最新的 SP、而您使用的是更旧的 SP 2.10。

    是否可以升级以进行测试并试用?

     您可以在 https://www.ti.com/tool/download/CC3200SDK 上找到它

    Shlomi