WiFi Tracker, scan WiFi probe packer and publish message to broker
WiFiTracker.cpp@0:d9bcf96e0ce9, 2016-06-03 (annotated)
- Committer:
- jehoon
- Date:
- Fri Jun 03 08:04:50 2016 +0000
- Revision:
- 0:d9bcf96e0ce9
WiFiTracker_mqtt;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jehoon | 0:d9bcf96e0ce9 | 1 | #include "mbed.h" |
jehoon | 0:d9bcf96e0ce9 | 2 | #include "WiFiTracker.h" |
jehoon | 0:d9bcf96e0ce9 | 3 | |
jehoon | 0:d9bcf96e0ce9 | 4 | |
jehoon | 0:d9bcf96e0ce9 | 5 | |
jehoon | 0:d9bcf96e0ce9 | 6 | WiFiTracker::WiFiTracker() : led(LED3), wifi(P23, P24) |
jehoon | 0:d9bcf96e0ce9 | 7 | { |
jehoon | 0:d9bcf96e0ce9 | 8 | wifi.baud(115200); |
jehoon | 0:d9bcf96e0ce9 | 9 | // dbg.baud(115200); |
jehoon | 0:d9bcf96e0ce9 | 10 | led = 0; |
jehoon | 0:d9bcf96e0ce9 | 11 | // dbg.printf("make wifi tracker!\n"); |
jehoon | 0:d9bcf96e0ce9 | 12 | g_store_cnt = 0; |
jehoon | 0:d9bcf96e0ce9 | 13 | isPrinted = false; |
jehoon | 0:d9bcf96e0ce9 | 14 | //mkdir("/sd/mydir", 0777); |
jehoon | 0:d9bcf96e0ce9 | 15 | |
jehoon | 0:d9bcf96e0ce9 | 16 | LedBlink(5, 20); |
jehoon | 0:d9bcf96e0ce9 | 17 | |
jehoon | 0:d9bcf96e0ce9 | 18 | } |
jehoon | 0:d9bcf96e0ce9 | 19 | |
jehoon | 0:d9bcf96e0ce9 | 20 | |
jehoon | 0:d9bcf96e0ce9 | 21 | WiFiTracker::~WiFiTracker() |
jehoon | 0:d9bcf96e0ce9 | 22 | { |
jehoon | 0:d9bcf96e0ce9 | 23 | printf("destroy\n"); |
jehoon | 0:d9bcf96e0ce9 | 24 | |
jehoon | 0:d9bcf96e0ce9 | 25 | } |
jehoon | 0:d9bcf96e0ce9 | 26 | |
jehoon | 0:d9bcf96e0ce9 | 27 | |
jehoon | 0:d9bcf96e0ce9 | 28 | void WiFiTracker::init() |
jehoon | 0:d9bcf96e0ce9 | 29 | { |
jehoon | 0:d9bcf96e0ce9 | 30 | |
jehoon | 0:d9bcf96e0ce9 | 31 | //char cmd[] = "AT+MWPACKET=3,1,1,0,4000,,11010111"; |
jehoon | 0:d9bcf96e0ce9 | 32 | char cmd[] = "AT+MWPACKET=3,1,3,0,4000,,10010001"; |
jehoon | 0:d9bcf96e0ce9 | 33 | int8_t ret = -1; |
jehoon | 0:d9bcf96e0ce9 | 34 | |
jehoon | 0:d9bcf96e0ce9 | 35 | ret = send_command(cmd); |
jehoon | 0:d9bcf96e0ce9 | 36 | printf("init ret: %d",ret); |
jehoon | 0:d9bcf96e0ce9 | 37 | } |
jehoon | 0:d9bcf96e0ce9 | 38 | |
jehoon | 0:d9bcf96e0ce9 | 39 | // 0x4000/04:1b:ba:21:6d:a1/-66 |
jehoon | 0:d9bcf96e0ce9 | 40 | int8_t WiFiTracker::tracking(int method) |
jehoon | 0:d9bcf96e0ce9 | 41 | { |
jehoon | 0:d9bcf96e0ce9 | 42 | char buf[30] = {0,}; |
jehoon | 0:d9bcf96e0ce9 | 43 | struct WiFiProbe probe; |
jehoon | 0:d9bcf96e0ce9 | 44 | bool ret; |
jehoon | 0:d9bcf96e0ce9 | 45 | |
jehoon | 0:d9bcf96e0ce9 | 46 | if(wifi.readable()) |
jehoon | 0:d9bcf96e0ce9 | 47 | { |
jehoon | 0:d9bcf96e0ce9 | 48 | wifi.scanf("%s",&buf); |
jehoon | 0:d9bcf96e0ce9 | 49 | |
jehoon | 0:d9bcf96e0ce9 | 50 | ret = isValidData(&probe, buf); |
jehoon | 0:d9bcf96e0ce9 | 51 | |
jehoon | 0:d9bcf96e0ce9 | 52 | if( ret == true ) |
jehoon | 0:d9bcf96e0ce9 | 53 | { |
jehoon | 0:d9bcf96e0ce9 | 54 | if( !strcmp(PreProbe.mac, probe.mac) ) |
jehoon | 0:d9bcf96e0ce9 | 55 | { |
jehoon | 0:d9bcf96e0ce9 | 56 | isPrinted = true; |
jehoon | 0:d9bcf96e0ce9 | 57 | //dbg.printf("non print mac (%s)\n",probe.mac); |
jehoon | 0:d9bcf96e0ce9 | 58 | return -1; |
jehoon | 0:d9bcf96e0ce9 | 59 | } |
jehoon | 0:d9bcf96e0ce9 | 60 | else |
jehoon | 0:d9bcf96e0ce9 | 61 | { |
jehoon | 0:d9bcf96e0ce9 | 62 | memcpy(&PreProbe, &probe, sizeof(WiFiProbe)); |
jehoon | 0:d9bcf96e0ce9 | 63 | isPrinted = false; |
jehoon | 0:d9bcf96e0ce9 | 64 | return 0; |
jehoon | 0:d9bcf96e0ce9 | 65 | } |
jehoon | 0:d9bcf96e0ce9 | 66 | |
jehoon | 0:d9bcf96e0ce9 | 67 | //switch(method) |
jehoon | 0:d9bcf96e0ce9 | 68 | // { |
jehoon | 0:d9bcf96e0ce9 | 69 | // case MQTT_PUBLISH: |
jehoon | 0:d9bcf96e0ce9 | 70 | // |
jehoon | 0:d9bcf96e0ce9 | 71 | // case JUST_PRINT: |
jehoon | 0:d9bcf96e0ce9 | 72 | // dbg.printf("(%s, %d)\n",probe.mac, probe.rssi); |
jehoon | 0:d9bcf96e0ce9 | 73 | // break; |
jehoon | 0:d9bcf96e0ce9 | 74 | // } |
jehoon | 0:d9bcf96e0ce9 | 75 | } |
jehoon | 0:d9bcf96e0ce9 | 76 | else return -1; |
jehoon | 0:d9bcf96e0ce9 | 77 | } |
jehoon | 0:d9bcf96e0ce9 | 78 | return 0; |
jehoon | 0:d9bcf96e0ce9 | 79 | } |
jehoon | 0:d9bcf96e0ce9 | 80 | bool WiFiTracker::isValidData(WiFiProbe* probe,char* str) |
jehoon | 0:d9bcf96e0ce9 | 81 | { |
jehoon | 0:d9bcf96e0ce9 | 82 | char *p, *p1; |
jehoon | 0:d9bcf96e0ce9 | 83 | char char_rssi[3] = {0,}; |
jehoon | 0:d9bcf96e0ce9 | 84 | |
jehoon | 0:d9bcf96e0ce9 | 85 | p = strstr(str, probe_filter); |
jehoon | 0:d9bcf96e0ce9 | 86 | |
jehoon | 0:d9bcf96e0ce9 | 87 | if( p == NULL ) |
jehoon | 0:d9bcf96e0ce9 | 88 | { |
jehoon | 0:d9bcf96e0ce9 | 89 | return false; |
jehoon | 0:d9bcf96e0ce9 | 90 | } |
jehoon | 0:d9bcf96e0ce9 | 91 | else |
jehoon | 0:d9bcf96e0ce9 | 92 | { |
jehoon | 0:d9bcf96e0ce9 | 93 | memset(probe,'\0',sizeof(WiFiProbe)); |
jehoon | 0:d9bcf96e0ce9 | 94 | |
jehoon | 0:d9bcf96e0ce9 | 95 | p = strstr(str, delimiter); |
jehoon | 0:d9bcf96e0ce9 | 96 | p1 = strstr(p+1, delimiter); |
jehoon | 0:d9bcf96e0ce9 | 97 | |
jehoon | 0:d9bcf96e0ce9 | 98 | strncpy(probe->mac,p+1,(p1-p-1)); |
jehoon | 0:d9bcf96e0ce9 | 99 | |
jehoon | 0:d9bcf96e0ce9 | 100 | delete_char(probe->mac,':',strlen(probe->mac)); |
jehoon | 0:d9bcf96e0ce9 | 101 | |
jehoon | 0:d9bcf96e0ce9 | 102 | strcpy(probe->rssi, p1+2); |
jehoon | 0:d9bcf96e0ce9 | 103 | |
jehoon | 0:d9bcf96e0ce9 | 104 | // strcpy(char_rssi, p1+2); |
jehoon | 0:d9bcf96e0ce9 | 105 | // probe->rssi = atoi(char_rssi); |
jehoon | 0:d9bcf96e0ce9 | 106 | //dbg.printf("(%s, %d)\n",probe->mac, probe->rssi); |
jehoon | 0:d9bcf96e0ce9 | 107 | return true; |
jehoon | 0:d9bcf96e0ce9 | 108 | } |
jehoon | 0:d9bcf96e0ce9 | 109 | } |
jehoon | 0:d9bcf96e0ce9 | 110 | |
jehoon | 0:d9bcf96e0ce9 | 111 | int8_t WiFiTracker::getProbe(char* mac, char* rssi) |
jehoon | 0:d9bcf96e0ce9 | 112 | { |
jehoon | 0:d9bcf96e0ce9 | 113 | |
jehoon | 0:d9bcf96e0ce9 | 114 | |
jehoon | 0:d9bcf96e0ce9 | 115 | memcpy(mac, PreProbe.mac, sizeof(PreProbe.mac)); |
jehoon | 0:d9bcf96e0ce9 | 116 | memcpy(rssi, PreProbe.rssi, sizeof(PreProbe.rssi)); |
jehoon | 0:d9bcf96e0ce9 | 117 | |
jehoon | 0:d9bcf96e0ce9 | 118 | if( isPrinted ) |
jehoon | 0:d9bcf96e0ce9 | 119 | return -1; |
jehoon | 0:d9bcf96e0ce9 | 120 | else |
jehoon | 0:d9bcf96e0ce9 | 121 | { |
jehoon | 0:d9bcf96e0ce9 | 122 | isPrinted = true; |
jehoon | 0:d9bcf96e0ce9 | 123 | return 0; |
jehoon | 0:d9bcf96e0ce9 | 124 | } |
jehoon | 0:d9bcf96e0ce9 | 125 | } |
jehoon | 0:d9bcf96e0ce9 | 126 | |
jehoon | 0:d9bcf96e0ce9 | 127 | //uint8_t WiFiTracker::store_probe_request(WiFiProbe wp) |
jehoon | 0:d9bcf96e0ce9 | 128 | //uint8_t WiFiTracker::store_probe_request(char c) |
jehoon | 0:d9bcf96e0ce9 | 129 | uint8_t WiFiTracker::write_sdcard(char c) |
jehoon | 0:d9bcf96e0ce9 | 130 | { |
jehoon | 0:d9bcf96e0ce9 | 131 | // dbg.printf("store\n"); |
jehoon | 0:d9bcf96e0ce9 | 132 | |
jehoon | 0:d9bcf96e0ce9 | 133 | return 0; |
jehoon | 0:d9bcf96e0ce9 | 134 | } |
jehoon | 0:d9bcf96e0ce9 | 135 | |
jehoon | 0:d9bcf96e0ce9 | 136 | uint8_t WiFiTracker::write_sdcard(char* str, int len) |
jehoon | 0:d9bcf96e0ce9 | 137 | { |
jehoon | 0:d9bcf96e0ce9 | 138 | char temp_str[30] = {0,}; |
jehoon | 0:d9bcf96e0ce9 | 139 | |
jehoon | 0:d9bcf96e0ce9 | 140 | //dbg.printf("%s, (%d)", str, len); |
jehoon | 0:d9bcf96e0ce9 | 141 | |
jehoon | 0:d9bcf96e0ce9 | 142 | if(char_cnt(str,'/') && len == 30 ) |
jehoon | 0:d9bcf96e0ce9 | 143 | { |
jehoon | 0:d9bcf96e0ce9 | 144 | strncpy(temp_str, str, len); |
jehoon | 0:d9bcf96e0ce9 | 145 | char_change(temp_str, '/', ','); |
jehoon | 0:d9bcf96e0ce9 | 146 | // dbg.printf("(%d), %s", len, temp_str); |
jehoon | 0:d9bcf96e0ce9 | 147 | g_store_cnt++; |
jehoon | 0:d9bcf96e0ce9 | 148 | } |
jehoon | 0:d9bcf96e0ce9 | 149 | |
jehoon | 0:d9bcf96e0ce9 | 150 | |
jehoon | 0:d9bcf96e0ce9 | 151 | if(g_store_cnt % 100 == 0) |
jehoon | 0:d9bcf96e0ce9 | 152 | { |
jehoon | 0:d9bcf96e0ce9 | 153 | // dbg.printf("\r\n[100]\r\n"); |
jehoon | 0:d9bcf96e0ce9 | 154 | |
jehoon | 0:d9bcf96e0ce9 | 155 | LedBlink(2,50); |
jehoon | 0:d9bcf96e0ce9 | 156 | } |
jehoon | 0:d9bcf96e0ce9 | 157 | |
jehoon | 0:d9bcf96e0ce9 | 158 | //dbg.printf("\r\nwrite sd card\r\n"); |
jehoon | 0:d9bcf96e0ce9 | 159 | return 0; |
jehoon | 0:d9bcf96e0ce9 | 160 | } |
jehoon | 0:d9bcf96e0ce9 | 161 | |
jehoon | 0:d9bcf96e0ce9 | 162 | |
jehoon | 0:d9bcf96e0ce9 | 163 | // count the number of c in str |
jehoon | 0:d9bcf96e0ce9 | 164 | int WiFiTracker::char_cnt(char* str, char c) |
jehoon | 0:d9bcf96e0ce9 | 165 | { |
jehoon | 0:d9bcf96e0ce9 | 166 | int i = 0; |
jehoon | 0:d9bcf96e0ce9 | 167 | char* tmp = str; |
jehoon | 0:d9bcf96e0ce9 | 168 | |
jehoon | 0:d9bcf96e0ce9 | 169 | while( *tmp ) |
jehoon | 0:d9bcf96e0ce9 | 170 | { |
jehoon | 0:d9bcf96e0ce9 | 171 | if( *tmp++ == c ) |
jehoon | 0:d9bcf96e0ce9 | 172 | i++; |
jehoon | 0:d9bcf96e0ce9 | 173 | } |
jehoon | 0:d9bcf96e0ce9 | 174 | |
jehoon | 0:d9bcf96e0ce9 | 175 | return i; |
jehoon | 0:d9bcf96e0ce9 | 176 | } |
jehoon | 0:d9bcf96e0ce9 | 177 | |
jehoon | 0:d9bcf96e0ce9 | 178 | // change dst_char to new_char in str |
jehoon | 0:d9bcf96e0ce9 | 179 | int WiFiTracker::char_change(char* str, char dst_char, char new_char) |
jehoon | 0:d9bcf96e0ce9 | 180 | { |
jehoon | 0:d9bcf96e0ce9 | 181 | int i = 0; |
jehoon | 0:d9bcf96e0ce9 | 182 | char* tmp = str; |
jehoon | 0:d9bcf96e0ce9 | 183 | |
jehoon | 0:d9bcf96e0ce9 | 184 | while( *tmp ) |
jehoon | 0:d9bcf96e0ce9 | 185 | { |
jehoon | 0:d9bcf96e0ce9 | 186 | if( *tmp == dst_char ) |
jehoon | 0:d9bcf96e0ce9 | 187 | *tmp = new_char; |
jehoon | 0:d9bcf96e0ce9 | 188 | tmp++; |
jehoon | 0:d9bcf96e0ce9 | 189 | } |
jehoon | 0:d9bcf96e0ce9 | 190 | |
jehoon | 0:d9bcf96e0ce9 | 191 | return i; |
jehoon | 0:d9bcf96e0ce9 | 192 | |
jehoon | 0:d9bcf96e0ce9 | 193 | } |
jehoon | 0:d9bcf96e0ce9 | 194 | |
jehoon | 0:d9bcf96e0ce9 | 195 | |
jehoon | 0:d9bcf96e0ce9 | 196 | void WiFiTracker::delete_char(char *src, char c, int len) |
jehoon | 0:d9bcf96e0ce9 | 197 | { |
jehoon | 0:d9bcf96e0ce9 | 198 | |
jehoon | 0:d9bcf96e0ce9 | 199 | char *dst; |
jehoon | 0:d9bcf96e0ce9 | 200 | |
jehoon | 0:d9bcf96e0ce9 | 201 | int i; |
jehoon | 0:d9bcf96e0ce9 | 202 | // Do not remove NULL characters. |
jehoon | 0:d9bcf96e0ce9 | 203 | if ( c == 0 ) |
jehoon | 0:d9bcf96e0ce9 | 204 | return; |
jehoon | 0:d9bcf96e0ce9 | 205 | |
jehoon | 0:d9bcf96e0ce9 | 206 | // Small attempt to control a buffer overflow if the |
jehoon | 0:d9bcf96e0ce9 | 207 | // the string is not null-terminated and a proper length |
jehoon | 0:d9bcf96e0ce9 | 208 | // is not specified. |
jehoon | 0:d9bcf96e0ce9 | 209 | |
jehoon | 0:d9bcf96e0ce9 | 210 | if ( len <= 0 ) |
jehoon | 0:d9bcf96e0ce9 | 211 | len = 17; |
jehoon | 0:d9bcf96e0ce9 | 212 | |
jehoon | 0:d9bcf96e0ce9 | 213 | dst = src; |
jehoon | 0:d9bcf96e0ce9 | 214 | |
jehoon | 0:d9bcf96e0ce9 | 215 | for ( i = 0; i < len && *src != 0; i++, src++ ) |
jehoon | 0:d9bcf96e0ce9 | 216 | { |
jehoon | 0:d9bcf96e0ce9 | 217 | if ( *src != c ) |
jehoon | 0:d9bcf96e0ce9 | 218 | *dst++ = *src; |
jehoon | 0:d9bcf96e0ce9 | 219 | |
jehoon | 0:d9bcf96e0ce9 | 220 | } |
jehoon | 0:d9bcf96e0ce9 | 221 | // Ensure the string is null-terminated. |
jehoon | 0:d9bcf96e0ce9 | 222 | |
jehoon | 0:d9bcf96e0ce9 | 223 | *dst = 0; |
jehoon | 0:d9bcf96e0ce9 | 224 | |
jehoon | 0:d9bcf96e0ce9 | 225 | return; |
jehoon | 0:d9bcf96e0ce9 | 226 | |
jehoon | 0:d9bcf96e0ce9 | 227 | } |
jehoon | 0:d9bcf96e0ce9 | 228 | |
jehoon | 0:d9bcf96e0ce9 | 229 | // delete_char() |
jehoon | 0:d9bcf96e0ce9 | 230 | |
jehoon | 0:d9bcf96e0ce9 | 231 | void WiFiTracker::LedBlink(int cnt, int interval) |
jehoon | 0:d9bcf96e0ce9 | 232 | { |
jehoon | 0:d9bcf96e0ce9 | 233 | int i; |
jehoon | 0:d9bcf96e0ce9 | 234 | |
jehoon | 0:d9bcf96e0ce9 | 235 | for(i=0; i<cnt; i++) |
jehoon | 0:d9bcf96e0ce9 | 236 | { |
jehoon | 0:d9bcf96e0ce9 | 237 | led = 1; |
jehoon | 0:d9bcf96e0ce9 | 238 | wait_ms(interval); |
jehoon | 0:d9bcf96e0ce9 | 239 | led = 0; |
jehoon | 0:d9bcf96e0ce9 | 240 | } |
jehoon | 0:d9bcf96e0ce9 | 241 | } |
jehoon | 0:d9bcf96e0ce9 | 242 | |
jehoon | 0:d9bcf96e0ce9 | 243 | |
jehoon | 0:d9bcf96e0ce9 | 244 | int8_t WiFiTracker::send_command(char* cmd) |
jehoon | 0:d9bcf96e0ce9 | 245 | { |
jehoon | 0:d9bcf96e0ce9 | 246 | wifi.printf("%s\r",cmd); |
jehoon | 0:d9bcf96e0ce9 | 247 | return 0; |
jehoon | 0:d9bcf96e0ce9 | 248 | } |
jehoon | 0:d9bcf96e0ce9 | 249 | |
jehoon | 0:d9bcf96e0ce9 | 250 | //int8_t WiFiTracker::wait_response(char* rsp) |
jehoon | 0:d9bcf96e0ce9 | 251 | //{ |
jehoon | 0:d9bcf96e0ce9 | 252 | //} |
jehoon | 0:d9bcf96e0ce9 | 253 | |
jehoon | 0:d9bcf96e0ce9 | 254 | |
jehoon | 0:d9bcf96e0ce9 | 255 |