modified demo app to work on Nucleo STM32F302R8 with Adafruit CC3000 wifi shield and report RSSI
Dependencies: M2XStreamClient cc3000_hostdriver_mbedsocket jsonlite mbed-rtos mbed
Fork of m2x-demo-all by
main.cpp@1:e5cbc3ffb8ec, 2014-10-24 (annotated)
- Committer:
- lwrnc
- Date:
- Fri Oct 24 22:48:45 2014 +0000
- Revision:
- 1:e5cbc3ffb8ec
- Parent:
- 0:38a7a8cae773
modify to work with CC3000 and report RSSI
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jb8414 | 0:38a7a8cae773 | 1 | #include <jsonlite.h> |
jb8414 | 0:38a7a8cae773 | 2 | #include "M2XStreamClient.h" |
jb8414 | 0:38a7a8cae773 | 3 | |
jb8414 | 0:38a7a8cae773 | 4 | #include "mbed.h" |
lwrnc | 1:e5cbc3ffb8ec | 5 | #include "cc3000.h" |
lwrnc | 1:e5cbc3ffb8ec | 6 | |
lwrnc | 1:e5cbc3ffb8ec | 7 | #define DEBUG 1 |
lwrnc | 1:e5cbc3ffb8ec | 8 | #if DEBUG |
lwrnc | 1:e5cbc3ffb8ec | 9 | #define dprintf printf |
lwrnc | 1:e5cbc3ffb8ec | 10 | #else |
lwrnc | 1:e5cbc3ffb8ec | 11 | #define dprintf(...) |
lwrnc | 1:e5cbc3ffb8ec | 12 | #endif |
jb8414 | 0:38a7a8cae773 | 13 | |
jb8414 | 0:38a7a8cae773 | 14 | char feedId[] = "<feed id>"; // Feed you want to post to |
jb8414 | 0:38a7a8cae773 | 15 | char m2xKey[] = "<m2x api key>"; // Your M2X access key |
jb8414 | 0:38a7a8cae773 | 16 | char streamName[] = "<stream name>"; // Stream you want to post to |
jb8414 | 0:38a7a8cae773 | 17 | |
lwrnc | 1:e5cbc3ffb8ec | 18 | char SSID[] = "your_ssid"; |
lwrnc | 1:e5cbc3ffb8ec | 19 | char KEY[] = "your_key"; |
lwrnc | 1:e5cbc3ffb8ec | 20 | //Adafruit CC3000 shield on Arduino pin definitions. |
lwrnc | 1:e5cbc3ffb8ec | 21 | cc3000 net(D3, D5, D10, SPI(D11, D12, D13), SSID, KEY, WPA2, false); |
lwrnc | 1:e5cbc3ffb8ec | 22 | Serial pc(USBTX, USBRX); |
jb8414 | 0:38a7a8cae773 | 23 | |
jb8414 | 0:38a7a8cae773 | 24 | Client client; |
jb8414 | 0:38a7a8cae773 | 25 | M2XStreamClient m2xClient(&client, m2xKey); |
jb8414 | 0:38a7a8cae773 | 26 | |
lwrnc | 1:e5cbc3ffb8ec | 27 | typedef struct scanResults { |
lwrnc | 1:e5cbc3ffb8ec | 28 | unsigned long numNetworksFound; |
lwrnc | 1:e5cbc3ffb8ec | 29 | unsigned long results; |
lwrnc | 1:e5cbc3ffb8ec | 30 | unsigned isValid:1; |
lwrnc | 1:e5cbc3ffb8ec | 31 | unsigned rssi:7; |
lwrnc | 1:e5cbc3ffb8ec | 32 | unsigned securityMode:2; |
lwrnc | 1:e5cbc3ffb8ec | 33 | unsigned ssidLength:6; |
lwrnc | 1:e5cbc3ffb8ec | 34 | unsigned short frameTime; |
lwrnc | 1:e5cbc3ffb8ec | 35 | unsigned char ssid_name[32]; |
lwrnc | 1:e5cbc3ffb8ec | 36 | unsigned char bssid[6]; |
lwrnc | 1:e5cbc3ffb8ec | 37 | } scanResults; |
lwrnc | 1:e5cbc3ffb8ec | 38 | |
lwrnc | 1:e5cbc3ffb8ec | 39 | /** return RSSI in dBm for given ssid if found. returns 0 on failure */ |
lwrnc | 1:e5cbc3ffb8ec | 40 | int8_t getRSSI(char *ssid, int len) { |
lwrnc | 1:e5cbc3ffb8ec | 41 | int ret; |
lwrnc | 1:e5cbc3ffb8ec | 42 | scanResults sr; |
lwrnc | 1:e5cbc3ffb8ec | 43 | int apCounter; |
lwrnc | 1:e5cbc3ffb8ec | 44 | |
lwrnc | 1:e5cbc3ffb8ec | 45 | //TODO request a scan |
lwrnc | 1:e5cbc3ffb8ec | 46 | |
lwrnc | 1:e5cbc3ffb8ec | 47 | if ((ret = net._wlan.ioctl_get_scan_results(2000, (unsigned char *)&sr)) != 0) { |
lwrnc | 1:e5cbc3ffb8ec | 48 | printf("get scan results failed ret=%d\r\n", ret); |
lwrnc | 1:e5cbc3ffb8ec | 49 | return 0; |
lwrnc | 1:e5cbc3ffb8ec | 50 | } |
lwrnc | 1:e5cbc3ffb8ec | 51 | apCounter = sr.numNetworksFound; |
lwrnc | 1:e5cbc3ffb8ec | 52 | dprintf("APs found: %d\r\n", apCounter); |
lwrnc | 1:e5cbc3ffb8ec | 53 | |
lwrnc | 1:e5cbc3ffb8ec | 54 | do { |
lwrnc | 1:e5cbc3ffb8ec | 55 | if (sr.isValid) { |
lwrnc | 1:e5cbc3ffb8ec | 56 | if (DEBUG) { |
lwrnc | 1:e5cbc3ffb8ec | 57 | char ssidbuf[32]; |
lwrnc | 1:e5cbc3ffb8ec | 58 | memcpy(ssidbuf, sr.ssid_name, sr.ssidLength); |
lwrnc | 1:e5cbc3ffb8ec | 59 | ssidbuf[sr.ssidLength] = 0; |
lwrnc | 1:e5cbc3ffb8ec | 60 | dprintf("ssid=%s rssi=%3d\r\n", ssidbuf, sr.rssi); |
lwrnc | 1:e5cbc3ffb8ec | 61 | } |
lwrnc | 1:e5cbc3ffb8ec | 62 | if (memcmp(ssid, sr.ssid_name, len) == 0) { |
lwrnc | 1:e5cbc3ffb8ec | 63 | return sr.rssi - 128; |
lwrnc | 1:e5cbc3ffb8ec | 64 | } |
lwrnc | 1:e5cbc3ffb8ec | 65 | } |
lwrnc | 1:e5cbc3ffb8ec | 66 | if (--apCounter> 0) { |
lwrnc | 1:e5cbc3ffb8ec | 67 | if ((ret = net._wlan.ioctl_get_scan_results(2000, (unsigned char *)&sr)) != 0) { |
lwrnc | 1:e5cbc3ffb8ec | 68 | printf("get scan results failed ret=%d\r\n", ret); |
lwrnc | 1:e5cbc3ffb8ec | 69 | return 0; |
lwrnc | 1:e5cbc3ffb8ec | 70 | } |
lwrnc | 1:e5cbc3ffb8ec | 71 | } |
lwrnc | 1:e5cbc3ffb8ec | 72 | } while (apCounter > 0); |
lwrnc | 1:e5cbc3ffb8ec | 73 | dprintf("End of AP list.\r\n"); |
lwrnc | 1:e5cbc3ffb8ec | 74 | return 0; |
lwrnc | 1:e5cbc3ffb8ec | 75 | } |
jb8414 | 0:38a7a8cae773 | 76 | |
jb8414 | 0:38a7a8cae773 | 77 | void on_data_point_found(const char* at, const char* value, int index, void* context) { |
lwrnc | 1:e5cbc3ffb8ec | 78 | //TODO value is wrong. check m2x library |
jb8414 | 0:38a7a8cae773 | 79 | printf("Found a data point, index: %d\r\n", index); |
jb8414 | 0:38a7a8cae773 | 80 | printf("At: %s Value: %s\r\n", at, value); |
jb8414 | 0:38a7a8cae773 | 81 | } |
jb8414 | 0:38a7a8cae773 | 82 | |
lwrnc | 1:e5cbc3ffb8ec | 83 | int main() { |
lwrnc | 1:e5cbc3ffb8ec | 84 | pc.baud(115200); |
lwrnc | 1:e5cbc3ffb8ec | 85 | |
lwrnc | 1:e5cbc3ffb8ec | 86 | if (DEBUG) { |
lwrnc | 1:e5cbc3ffb8ec | 87 | // allow time to get a serial console |
lwrnc | 1:e5cbc3ffb8ec | 88 | for (int i=10; i>=0; i--) { |
lwrnc | 1:e5cbc3ffb8ec | 89 | wait(0.5); |
lwrnc | 1:e5cbc3ffb8ec | 90 | dprintf("Starting in %d\r\n", i); |
lwrnc | 1:e5cbc3ffb8ec | 91 | } |
lwrnc | 1:e5cbc3ffb8ec | 92 | } |
jb8414 | 0:38a7a8cae773 | 93 | |
lwrnc | 1:e5cbc3ffb8ec | 94 | printf("net.init...\r\n"); |
lwrnc | 1:e5cbc3ffb8ec | 95 | net.init(); |
lwrnc | 1:e5cbc3ffb8ec | 96 | printf("net.init done\r\n"); |
lwrnc | 1:e5cbc3ffb8ec | 97 | if (net.connect() == -1) { |
lwrnc | 1:e5cbc3ffb8ec | 98 | printf("Failed to connect. Please verify connection details and try again.\r\n"); |
lwrnc | 1:e5cbc3ffb8ec | 99 | } else { |
lwrnc | 1:e5cbc3ffb8ec | 100 | printf("net.connect done. IP address: %s \r\n", net.getIPAddress()); |
lwrnc | 1:e5cbc3ffb8ec | 101 | } |
jb8414 | 0:38a7a8cae773 | 102 | |
lwrnc | 1:e5cbc3ffb8ec | 103 | int rssi; |
lwrnc | 1:e5cbc3ffb8ec | 104 | int i = 0; |
jb8414 | 0:38a7a8cae773 | 105 | |
lwrnc | 1:e5cbc3ffb8ec | 106 | while (++i < 10) { |
jb8414 | 0:38a7a8cae773 | 107 | |
lwrnc | 1:e5cbc3ffb8ec | 108 | // read RSSI |
lwrnc | 1:e5cbc3ffb8ec | 109 | rssi = getRSSI(SSID, sizeof(SSID) - 1); |
lwrnc | 1:e5cbc3ffb8ec | 110 | if (rssi == 0) { |
lwrnc | 1:e5cbc3ffb8ec | 111 | printf("Failed to get RSSI\r\n"); |
lwrnc | 1:e5cbc3ffb8ec | 112 | delay(30000); |
lwrnc | 1:e5cbc3ffb8ec | 113 | continue; |
lwrnc | 1:e5cbc3ffb8ec | 114 | } |
lwrnc | 1:e5cbc3ffb8ec | 115 | |
lwrnc | 1:e5cbc3ffb8ec | 116 | // post RSSI |
lwrnc | 1:e5cbc3ffb8ec | 117 | dprintf("Posting rssi=%d\r\n", rssi); |
lwrnc | 1:e5cbc3ffb8ec | 118 | int response = m2xClient.post(feedId, streamName, rssi); |
jb8414 | 0:38a7a8cae773 | 119 | printf("Post response code: %d\r\n", response); |
jb8414 | 0:38a7a8cae773 | 120 | if (response == -1) while (true) ; |
jb8414 | 0:38a7a8cae773 | 121 | |
lwrnc | 1:e5cbc3ffb8ec | 122 | // read RSSI |
lwrnc | 1:e5cbc3ffb8ec | 123 | dprintf("Reading rssi\r\n"); |
lwrnc | 1:e5cbc3ffb8ec | 124 | response = m2xClient.fetchValues(feedId, streamName, on_data_point_found, NULL, NULL, NULL, "5"); |
jb8414 | 0:38a7a8cae773 | 125 | printf("Fetch response code: %d\r\n", response); |
jb8414 | 0:38a7a8cae773 | 126 | if (response == -1) while (true) ; |
jb8414 | 0:38a7a8cae773 | 127 | |
lwrnc | 1:e5cbc3ffb8ec | 128 | // wait 30 secs and then loop |
lwrnc | 1:e5cbc3ffb8ec | 129 | delay(30000); |
jb8414 | 0:38a7a8cae773 | 130 | } |
lwrnc | 1:e5cbc3ffb8ec | 131 | dprintf("Exiting\r\n"); |
lwrnc | 1:e5cbc3ffb8ec | 132 | net.disconnect(); |
jb8414 | 0:38a7a8cae773 | 133 | } |