WiFi Tracker, scan WiFi probe packer and publish message to broker

Committer:
jehoon
Date:
Fri Jun 03 08:04:50 2016 +0000
Revision:
0:d9bcf96e0ce9
WiFiTracker_mqtt;

Who changed what in which revision?

UserRevisionLine numberNew 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