Other Parts Discussed in Thread: CC3200, CC3200SDK, CC3100
Thread 中讨论的其他部件:、 CC3100
尊敬的团队:
下面是 我使用的设置详细信息:
- CC3200 Wi-Fi 芯片。
- SDK: CC3200SDK_1.3.0
- 服务包: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。