Jump to content
43oh

electrotwelve

Members
  • Content Count

    18
  • Joined

  • Last visited

Posts posted by electrotwelve

  1. I've been tinkering with AWS IoT in conjunction with CC3200 + Energia for a while now with varying degrees of success. The purpose of this post is using the RESTful API to update a "thing" status in the cloud. The code is listed below and I'm seeing some authentication errors. I was hoping someone can correct me if there are any errors in the way I'm using "client.ssConnect". I used a slightly modified WiFiClient.cpp and WiFiClient.h from here. I know its not a library issue since I'm able to connect using MQTT. 

    char aws_endpoint[] = "xxxxxxxxxxxxxx.iot.us-east-1.amazonaws.com";
     
    if (client.sslConnect(aws_endpoint, 443))
      {
        Serial.println("Connected to server");
     
        String PostData = "{\"value1\" : \"testValue\", \"value2\" : \"Hello\", \"value3\" : \"World!\" }";
     
        request = "POST /things/";
        request += thingname;
        request += "/shadow";
        request += " HTTP/1.1";
        Serial.print("Request:\t"); Serial.println(request);
        Serial.print("Post data:\t"); Serial.println(PostData);
     
        client.println(request);
        client.println("Host: ");
        client.println(aws_endpoint);
        //client.println(":443");
        client.println("User-Agent: Energia/1.1");
        client.println("Connection: close");
        client.println("Content-Type: application/json");
        client.print("Content-Length: "); client.println(PostData.length());
        client.println();
        client.println(PostData);
        client.println();
      }
      else
      {
        Serial.println("Connection failed");
     
      }
     
      Serial.println(); 
     
      // Capture response from the server. (10 second timeout)
      long timeOut = 5000;
      long lastTime = millis();
      
      while((millis()-lastTime) < timeOut)
      { // Wait for incoming response from server
        while (client.available()) 
        { // Characters incoming from the server
          char c = client.read();            // Read characters
          Serial.write(c);
        }
      }
    

    Here is the output that I see:

    RootCA found!
    Client certificates found!
    
    Device ID is:	3250763216
    
    Attempting to connect to WiFi network .
    Connected to WiFi network: ABCDEFGH
    Waiting for IP 
    IP is: 192.168.1.107
    Connected to server
    Request:	POST /things/MyCC3200/shadow HTTP/1.1
    Post data:	{\"value1\" : \"testValue\", \"value2\" : \"Hello\", \"value3\" : \"World!\" }
    
    HTTP/1.1 403 Forbidden
    content-type: application/json
    content-length: 91
    date: Tue, 26 Jul 2016 11:46:59 GMT
    x-amzn-RequestId: 4d5388a9-e3c4-460a-b674-c3f971f3330d
    connection: Keep-Alive
    x-amzn-ErrorType: ForbiddenException:
    
    {"message":"Missing Authentication Token","traceId":"4d5388a9-e3c4-460a-b674-c3f971f3330d"}
    
    
  2. OK I got this figured. The challenge was switching back to AP once STA mode was activated. This code switches back to AP from whatever earlier mode was set. 'ssid' and 'wifipw' is the SSID and password defined for the AP.

    extern "C" {
        #include "utility/udma_if.h"
    }
    
    void switchToAP()
    {
      UDMAInit();
      sl_Start(NULL, NULL, NULL);
    
      sl_WlanDisconnect();
      
      sl_NetAppMDNSUnRegisterService(0, 0);
      
      sl_WlanRxStatStart();
    
      sl_WlanSetMode(ROLE_AP);
      
      sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID, strlen(ssid),
                                  (unsigned char *)ssid);
      
      unsigned char  val = SL_SEC_TYPE_WPA;
      sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, 1, (unsigned char *)&val);
    
      sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, strlen(wifipw),
                                  (unsigned char *)wifipw);
    
      /* Restart Network processor */
      sl_Stop(30);
    
      sl_Start(NULL, NULL, NULL);
    }
    
    

    To switch to the STA mode it was suggested in an earlier post to add WiFi._initialized = false; and WiFi._connecting = false; before doing a WiFi.being() but this was a hit and miss with my LP (rev 4.1). So this code switches it to STA mode. This is still not very reliable. Out of every 6 attempts to connect to a WiFi network, 1 attempt fails but here is the code anyway:

    void switchToSTA()
    {
      UDMAInit();
      sl_Start(NULL, NULL, NULL);
    
      sl_WlanDisconnect();
      
      sl_NetAppMDNSUnRegisterService(0, 0);
      
      sl_WlanRxStatStart();
      
      sl_WlanSetMode(ROLE_STA);
    
      /* Restart Network processor */
      sl_Stop(30);
    
      sl_Start(NULL, NULL, NULL);
    }
    
    
  3. I know this is an old topic but I'm facing similar issues. I started up in AP mode, started a webserver and got the network credentials from the user. Switched to STA mode (using the fixes listed earlier in this post) and then connected to my local wifi network. Now this works great till a power cycle happens. When that happens, the CC3200 is supposed to start back up in AP mode and this is where it freezes. I have to reflash the service pack and then it goes back to the AP mode. Any solutions or ideas?

  4. Been working on an application that would:

     

    1. Start the CC3200 and setup a webserver on 192.168.1.1 on port 80.

    2. The user connects to the WiFi networks created by the CC3200 and subsequently this webserver and enters their network credentials.

    3. The CC3200 parses these credentials and stores it in a buffer called credential_buffer and the SSID and password are pointed to by accSSID and accPWD. 

     

    I now want to use these credentials to connect to the users WiFi network and this is where I run aground. I swtich the CC3200 from the AP to STN mode using sl_WlanSetMode(ROLE_STA) but that does not seem to be working. Any ideas? The code is listed below: 

     

    EDIT: I kinda found the solution here: http://forum.43oh.com/topic/6250-cc3200-cant-connect-to-wlan-after-being-set-as-ap/. However, this is not implemented in the recent Energia release. Any particular reason?

    // AP credentials.
    const char ssid[] = "MyCC3200AP";
    const char wifipw[] = "password";
    
    // Buffer for the new credentials acquired from the user.
    char credential_buffer[MAX_STORE_BUFFER_LEN];
    
    // pointers to the actual credential values in the buffer
    char *accSSID;
    char *accPWD;
    
    boolean isConnected;
    
    boolean connectCompleteFlag = false;
    
    WiFiServer server(SERVER_PORT); // Server port is defined as 80
    
    void setup()
    {
      byte counter;
      unsigned long t_time;
      
      // Begin serial comms.
      Serial.begin(115200);
    
      // Switch OFF all LaunchPad LEDs.
      pinMode(RED_LED, OUTPUT);
      digitalWrite(RED_LED, LOW);
    
      pinMode(GREEN_LED, OUTPUT);
      digitalWrite(GREEN_LED, LOW);
    
      pinMode(YELLOW_LED, OUTPUT);
      digitalWrite(YELLOW_LED, LOW);
    
      // Setup an AP.
      Serial.print("Setting up Access Point named: ");
      Serial.println(ssid);
      Serial.print("AP uses WPA and password is: ");
      Serial.println(wifipw);
      
      WiFi.beginNetwork((char *)ssid, (char *)wifipw);
    
      while (WiFi.localIP() == INADDR_NONE) {
        // print dots while we wait for the AP config to complete
        Serial.print('.');
        delay(500);
      }
    
      Serial.println("AP active.");
    
      // start the web server on port 80
      server.begin();
      Serial.print("Webserver started on http://");
      Serial.print( WiFi.localIP() );
      Serial.print(" port: ");
      Serial.println(SERVER_PORT);
      Serial.println("\n");
    
      // Let the user connect to the webserver and enter their network credentials.
      // We exit this loop with the credentials stored in credential_buffer
      while (!connectCompleteFlag)
      {
        connectClient(); // This function reads credentials from the user and stores them in the credential_buffer.
      }
      
      // Try to connect to the new WiFi network
      counter = 0;
    
      // Disconnect first, if currently connected
      
      sl_WlanDisconnect();
      sl_WlanSetMode(ROLE_STA);
      
      Serial.print("Attempting to connect to WiFi network...");
      
      // Open connection to WiFi
      WiFi.begin(accSSID, accPWD);
      while ( WiFi.status() != WL_CONNECTED)
      {
        Serial.print(".");
        delay(500);
        counter++;
        if(counter==10)
        {
          break;
        }
      }
      
      if(counter==10)
      {
        Serial.println("\nUnable to connect to wifi");
        isConnected = false;
        failure_state(); // This function just blinks the red LED at 1 sec intervals indefinitely.
      }
      
      Serial.println("\nConnected to wifi");
      isConnected = true;  
    
      // Try to get local IP     
      Serial.print("Waiting for IP...");
      
      t_time = millis();
    
      while( WiFi.localIP() == INADDR_NONE )
      {
        Serial.print(".");
        delay(500);
        
        if( ( millis() - t_time ) > 5000 )
        {
          Serial.println("Timeout! Unable to get IP...");
          failure_state();
        }
      }
    
      // Print out local IP
      Serial.print("\nMy IP is: ");
      Serial.println( WiFi.localIP() );
    
    }
    
  5. My subnet is 255.255.255.0 and my broadcast IP is 192.168.1.255. I'm trying to broadcast UDP packets using this code but I'm not sure its working. When I open my IP and port on SocketTest, I don't see anything on the console. What am I missing?

    unsigned int localPort = 2390;
    char sendBuffer[] = {"pullingyourhairoutisnotthesolution"};
    
    WiFiUDP BroadcastSendUDP;
    
    void sendBroadcastPacket() { 
      IPAddress sendIP(192, 168, 1, 101);
    
      int counter = (sizeof(sendBuffer)/sizeof(sendBuffer[0]));
    
      BroadcastSendUDP.beginPacket(sendIP, localPort);
      for (int i=0; i<counter; i++) {
        BroadcastSendUDP.write(sendBuffer[i]);
      }
      BroadcastSendUDP.endPacket();
    
      Serial.print("Packet sent: ");
      Serial.println(sendBuffer);
      Serial.println();
    }
    
  6. Thanks Robert. This however, returns the profile security type as a positive number. Is there any way to get the actual SSID? 

     

     

    I've used SmartConfig very successfully on a project.

    See http://embeddedcomputing.weebly.com/isup2c-smartwifi-smart-device.html

     

    @@Rei Vilo, Could you walk me through how you've implemented this in real-life? Perhaps share the code? I thought of setting up the CC3200 in AP mode when its out of the box, and then connecting to it and sending it WiFi creds of the local network. However, after this it would switch to Station mode and my problem is how would it recognize the mobile app that sent it the creds in the first place. Essentially how would it communicate with the app after becoming another device on the local wifi network.

  7. Hi @@Fmilburn,

     

    I think I've got this working for now. There seem to be two variants for the encrytionType function and the default Energia example is calling the one which does not accept arguments:

    uint8_t WiFiClass::encryptionType()
    {
        return 0;
    }
    I changed the return value to verify this and it is indeed this one that is being called. The other variant accepts an integer value as an argument presumably the SSID number. I borrowed code sections from the ScanNetworks example. I compared the string returned by WiFi.encryptionType with the defined SSID and when they matched I printed out the encryption type. 
    int numSsid = WiFi.scanNetworks();
    
    if (numSsid == -1)
    {
      Serial.println("Couldn't get a wifi connection");
      while (true);
    }
    
    for (int thisNet = 0; thisNet < numSsid; thisNet++) {
      if (strcmp(WiFi.SSID(thisNet),ssid) == 0) {
        Serial.print("Encryption: ");
        printEncryptionType(WiFi.encryptionType(thisNet));
      }
    }

    The printEncryptionType function is the same one from ScanNetworks example.

  8. Nope, no dots in the serial monitor and nothing after "AP uses WPA and password is: xxxx". Also I don't see the AP in my list of Wifi networks. I have the 4.1 version of the launchpad as well.

     

    I was tinkering with CCS just before this. Would that have something to do with this? I did make the appropriate jumper connections once I switched to Energia. 

  9. Hi, I'm fairly well versed with the Arduino but still a noob with the CC3200 platform. I was playing around with the APWatchConnectDisconnect example and ran into a few problems. I cannot seem to setup the AP. I specify the ssid and the password and on the serial monitor it does show that its creating an AP with the given creds but nothing happens after that. I never get to the "AP active" part. What am I missing here? The board is a CC3200 Launchpad from TI. 

×
×
  • Create New...