Vor kurzem habe ich an einem IoT-Projekt mit einem MSP430F5529-Mikrocontroller und einem CC3100-Netzwerkprozessor von Texas Instrument gearbeitet. Zur Auswertung verwende ich die Startrampe MSP430F5529 und das Boosterpack CC3100 . Ich versuche, das Gerät dazu zu bringen, eine Verbindung zur Cloud herzustellen. Ich habe die CC3100 Get Weather- Beispielanwendung erfolgreich implementiert, die eine Verbindung zu www.openweathermap.org herstellt . Dieses Beispiel stammt aus CC3100 SDK-Beispielanwendungen . Das Programm erhält und antwortet erfolgreich von der Website www.openweathermap.org . Die Anwendung verwendet die GET-Methode, um eine Anfrage von der Website zu stellen.
Ich habe den Code auch erfolgreich gegen www.mocky.io getestet . Das Gerät erhält eine Statuscode 200 OK-Antwort. Wenn ich jedoch gegen requestb.in test site teste, erhalte ich weder einen 408 Timeout-Fehlerantwortcode noch einen URL-Umleitungsantwortcode von 302.
#define WEATHER_SERVER "api.openweathermap.org"
#define TEST_SERVER "requestb.in"
//#define TEST_SERVER "www.mocky.io"
#define PREFIX_BUFFER "GET /data/2.5/weather?q="
#define POST_BUFFER "&APPID=xxxxxxxxxxxxxxxxxx&mode=xml&units=imperial HTTP/1.1\r\nHost:api.openweathermap.org\r\nAccept: */"
#define POST_BUFFER2 "*\r\n\r\n"
#define PREFIX_BUFFER_TEST "GET /1m75pgt1"
#define POST_BUFFER_TEST_1 " HTTP/1.1\r\nHost:requestb.in\r\nAccept: */"
#define POST_BUFFER_TEST_2 "\r\n\r\n"*
//#define PREFIX_BUFFER_TEST "GET /v2/5967a65d1100007d16b6c2b4"
//#define POST_BUFFER_TEST_1 " HTTP/1.1\r\nHost:www.mocky.io\r\nAccept: */"
//#define POST_BUFFER_TEST_2 "\r\n\r\n"*
Nachfolgend finden Sie die wichtigsten Informationen zu einigen Einrichtungsbedingungen. Ein Teil des Fehlerbehandlungscodes wurde der Kürze halber entfernt.
int main(int argc, char** argv)
{
_i32 retVal = -1;
retVal = initializeAppVariables();
ASSERT_ON_ERROR(retVal);
/* Stop WDT and initialize the system-clock of the MCU */
stopWDT();
initClk();
/*
* Following function configures the device to default state by cleaning
* the persistent settings stored in NVMEM (viz. connection profiles &
* policies, power policy etc)
*
* Applications may choose to skip this step if the developer is sure
* that the device is in its default state at start of application
*
* Note that all profiles and persistent settings that were done on the
* device will be lost
*/
retVal = configureSimpleLinkToDefaultState();
/*
* Assumption is that the device is configured in station mode already
* and it is in its default state
*/
retVal = sl_Start(0, 0, 0);
/* Connecting to WLAN AP */
retVal = establishConnectionWithAP();
retVal = getCredentials();
retVal = disconnectFromAP();
return 0;
}
Unten finden Sie den Code getCredentials (), mit dem Aufrufdaten abgerufen werden.
<!-- language: lang-c -->
static _i32 getCredentials()
{
_i32 retVal = -1;
pal_Strcpy((char *)g_DeviceData.HostName, TEST_SERVER);
retVal = getHostIP_Device();
g_DeviceData.SockID = createConnection();
ASSERT_ON_ERROR(g_DeviceData.SockID);
retVal = getData();
ASSERT_ON_ERROR(retVal);
retVal = sl_Close(g_DeviceData.SockID);
ASSERT_ON_ERROR(retVal);
return 0;
}
Unten ist eine Funktion getdata () , bei der der Fehler angezeigt wird.
/*!
\brief This function Obtains the required data from the server
\param[in] none
\return 0 on success, -ve otherwise
\note
\warning
*/
static _i32 getData()
{
_u8 *p_startPtr = NULL;
_u8 *p_endPtr = NULL;
_u8* p_bufLocation = NULL;
_i32 retVal = -1;
pal_Memset(g_DeviceData.Recvbuff, 0, sizeof(g_DeviceData.Recvbuff));
/* Puts together the HTTP GET string. */
p_bufLocation = g_DeviceData.SendBuff;
pal_Strcpy(p_bufLocation, PREFIX_BUFFER_TEST);
p_bufLocation += pal_Strlen(PREFIX_BUFFER_TEST);
pal_Strcpy(p_bufLocation, POST_BUFFER_TEST_1);
p_bufLocation += pal_Strlen(POST_BUFFER_TEST_1);
pal_Strcpy(p_bufLocation, POST_BUFFER_TEST_2);
/* Send the HTTP GET string to the open TCP/IP socket. */
retVal = sl_Send(g_DeviceData.SockID, g_DeviceData.SendBuff, pal_Strlen(g_DeviceData.SendBuff), 0);
if(retVal != pal_Strlen(g_DeviceData.SendBuff))
ASSERT_ON_ERROR(HTTP_SEND_ERROR);
/* Receive response */
retVal = sl_Recv(g_DeviceData.SockID, &g_DeviceData.Recvbuff[0], MAX_SEND_RCV_SIZE, 0);
if(retVal <= 0)
ASSERT_ON_ERROR(HTTP_RECV_ERROR);
g_DeviceData.Recvbuff[pal_Strlen(g_DeviceData.Recvbuff)] = '\0';
return SUCCESS;
}
Die Sicherheit für den Access Point ist eingerichtet als
#define SEC_TYPE SL_SEC_TYPE_WPA_WPA2 /* Security type of the Access point */
Schließlich gibt es nur wenige mit CC3100 hergestellte POC-Sensorgeräte, die Daten in die Cloud übertragen müssen. Der Einfachheit halber verwenden wir das Boosterpack. Schließlich müssen die POC-Sensorgeräte über WLAN mit der Cloud kommunizieren.