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

WiFiTracker.cpp

Committer:
jehoon
Date:
2016-06-03
Revision:
0:d9bcf96e0ce9

File content as of revision 0:d9bcf96e0ce9:

#include "mbed.h"
#include "WiFiTracker.h"



WiFiTracker::WiFiTracker() : led(LED3), wifi(P23, P24)
{
    wifi.baud(115200);
//    dbg.baud(115200);
    led = 0;
//    dbg.printf("make wifi tracker!\n"); 
    g_store_cnt = 0;
    isPrinted = false;
    //mkdir("/sd/mydir", 0777);
    
    LedBlink(5, 20);
    
}


WiFiTracker::~WiFiTracker()
{
    printf("destroy\n");

}


void WiFiTracker::init()
{

    //char cmd[] = "AT+MWPACKET=3,1,1,0,4000,,11010111";
    char cmd[] = "AT+MWPACKET=3,1,3,0,4000,,10010001";
    int8_t ret = -1;
    
    ret = send_command(cmd);
    printf("init ret: %d",ret);    
}

// 0x4000/04:1b:ba:21:6d:a1/-66
int8_t WiFiTracker::tracking(int method)
{
    char buf[30] = {0,};
    struct WiFiProbe probe;
    bool ret;
    
    if(wifi.readable())
    {
        wifi.scanf("%s",&buf);
        
        ret = isValidData(&probe, buf);
        
        if( ret == true )
        {
            if( !strcmp(PreProbe.mac, probe.mac) )
            {   
                isPrinted = true;
                //dbg.printf("non print mac (%s)\n",probe.mac);
                return -1;
            }
            else
            {
                memcpy(&PreProbe, &probe, sizeof(WiFiProbe));
                isPrinted = false;
                return 0;
            }
            
            //switch(method)
//            {
//                case MQTT_PUBLISH:
//                    
//                case JUST_PRINT:
//                    dbg.printf("(%s, %d)\n",probe.mac, probe.rssi);
//                    break;
//            }
        }
        else return -1;   
    }
    return 0;
}
bool WiFiTracker::isValidData(WiFiProbe* probe,char* str)
{
    char *p, *p1;
    char char_rssi[3] = {0,};
    
    p = strstr(str, probe_filter);
    
    if( p == NULL )
    {
        return false;
    }
    else
    {    
        memset(probe,'\0',sizeof(WiFiProbe));
        
        p = strstr(str, delimiter);
        p1 = strstr(p+1, delimiter);
        
        strncpy(probe->mac,p+1,(p1-p-1));
        
        delete_char(probe->mac,':',strlen(probe->mac));
        
        strcpy(probe->rssi, p1+2);
        
//        strcpy(char_rssi, p1+2);
//        probe->rssi = atoi(char_rssi);
        //dbg.printf("(%s, %d)\n",probe->mac, probe->rssi);
        return true;
    }
}

int8_t WiFiTracker::getProbe(char* mac, char* rssi)
{
    
    
    memcpy(mac, PreProbe.mac, sizeof(PreProbe.mac));   
    memcpy(rssi, PreProbe.rssi, sizeof(PreProbe.rssi));
    
    if( isPrinted )
        return -1;
    else
    {
        isPrinted = true;
        return 0;
    }
}

//uint8_t WiFiTracker::store_probe_request(WiFiProbe wp)
//uint8_t WiFiTracker::store_probe_request(char c)
uint8_t WiFiTracker::write_sdcard(char c)
{
//    dbg.printf("store\n"); 
    
    return 0;
}

uint8_t WiFiTracker::write_sdcard(char* str, int len)
{    
    char temp_str[30] = {0,};
    
    //dbg.printf("%s, (%d)", str, len);
    
    if(char_cnt(str,'/') && len == 30 )
    {
        strncpy(temp_str, str, len);
        char_change(temp_str, '/', ',');
//        dbg.printf("(%d), %s", len, temp_str);
        g_store_cnt++;  
    }
    
    
    if(g_store_cnt % 100 == 0)
    {
//        dbg.printf("\r\n[100]\r\n");
        
        LedBlink(2,50);
    }
    
    //dbg.printf("\r\nwrite sd card\r\n"); 
    return 0;
}


// count the number of c in str
int WiFiTracker::char_cnt(char* str, char c)
{
    int i = 0;
    char* tmp = str;
    
    while( *tmp )
    {
        if( *tmp++ == c )
            i++;
    }
    
    return i;
}

// change dst_char to new_char in str
int WiFiTracker::char_change(char* str, char dst_char, char new_char)
{
    int i = 0;
    char* tmp = str;
    
    while( *tmp )
    {
        if( *tmp == dst_char )
            *tmp = new_char;
        tmp++;
    }
    
    return i;    
    
} 


void WiFiTracker::delete_char(char *src, char c, int len)
{

    char *dst;

    int i;
    // Do not remove NULL characters.
    if ( c == 0 )
        return;
        
    // Small attempt to control a buffer overflow if the
    // the string is not null-terminated and a proper length
    // is not specified.

    if ( len <= 0 )
        len = 17;

    dst = src;

    for ( i = 0; i < len && *src != 0; i++, src++ )
    {
        if ( *src != c )
            *dst++ = *src;

    }
    // Ensure the string is null-terminated.

    *dst = 0;

    return;

}

// delete_char()

void WiFiTracker::LedBlink(int cnt, int interval)
{
    int i;
    
    for(i=0; i<cnt; i++)
    {
        led = 1;
        wait_ms(interval);
        led = 0;
    }
}


int8_t WiFiTracker::send_command(char* cmd)
{
    wifi.printf("%s\r",cmd);    
    return 0;
}

//int8_t WiFiTracker::wait_response(char* rsp)
//{
//}