<?php
/**
 * Verify integrity of a GPS NMEA Sentence by extracting the data and the internal checksum, calculating the checksum of the data, and comparing it to the internal checksum
 *
 * @param STRING $GPS_NMEA_Sentence --The GPS NMEA sentence we are checking
 * @return BOOL --True if integrity is good, false if not
 * @author Jim Auldridge
 * @link http://www.codepedia.com/1/The+GPRMC+Sentence
 * @link http://www.codepedia.com/1/Calculating+and+Validating+NMEA+Checksums
 * @link http://www.tigoe.net/pcomp/code/category/code/processing/127
 * @link http://wiki.forum.nokia.com/index.php/NMEA_(GPS)_Location_Viewer
 */
function GPS_NMEA_Sentence_Integrity($GPS_NMEA_Sentence)
{
  
$return_value false;
  if(
is_string($GPS_NMEA_Sentence))
  {
    
preg_match('/^\$([^*]+)\*/',$GPS_NMEA_Sentence,$GPS_NMEA_Data);
    
preg_match('/\*([^,]+)(,|$)/',$GPS_NMEA_Sentence,$GPS_NMEA_Internal_Checksum);
    if(
is_array($GPS_NMEA_Data) && !empty($GPS_NMEA_Data[1]) && is_array($GPS_NMEA_Internal_Checksum) && !empty($GPS_NMEA_Internal_Checksum[1]))
    {
      
$GPS_NMEA_Data $GPS_NMEA_Data[1];
      
$GPS_NMEA_Internal_Checksum $GPS_NMEA_Internal_Checksum[1];
      
$Calculated_Checksum 0;
      for(
$i=0;$i<strlen($GPS_NMEA_Data);$i++)
        
$Calculated_Checksum = ($Calculated_Checksum ord($GPS_NMEA_Data{$i}));
      
$Calculated_Checksum dechex($Calculated_Checksum);
      
$return_value = !!($GPS_NMEA_Internal_Checksum===$Calculated_Checksum);
    }
  }
  return 
$return_value;
}
?>