【C#】 GPS 신호를 사용하여 현재 시간을 얻습니다.

2290 단어 C#GPS

왜 그렇게 하는 거야?



단말기가 인터넷에 접속할 수 없는 경우, 서버로부터 현재 시각을 취득할 수 없습니다.
GPS 신호 (NMEA 포맷 데이터)에는 UTC 시간이 포함되어 있기 때문에,
인터넷에는 연결되지 않지만 GPS는 주울 수 있는 특수한 환경인 경우, 선택사항이 될지도 모릅니다.

Microsoft.WindowsAPICodePack.Sensors 사용



.Net표준인 GeoCoordinateWatcher로 취득할 수 있는 정보는, 위도·경도에 한정되어 있으므로,
Microsoft.WindowsAPICodePack.Sensors 네임스페이스의 Sensor 클래스를 사용합니다.

GPS 센서 준비



Sensor 클래스를 사용하려면 GPS 센서가 필요합니다.
이마도키의 Windows 단말에는 기본적으로 GPS 센서가 탑재되어 있지 않으므로, 준비할 필요가 있습니다.

일단 작동을 시도하면 amazon 저렴한 센서 ( htps //w w. 아마존. 이. jp/gp/p 로즈 ct/B01마 21TSX/ )로 충분합니다.
소스를 이동하려면 장치 관리자의 센서에 GPS 센서를 추가하면 문제가 없습니다.


소스 코드


using Microsoft.WindowsAPICodePack.Sensors;

// 位置情報GUID
// 参考:https://docs.microsoft.com/en-us/windows/desktop/sensorsapi/sensor-category-location
private static Guid SENSOR_DATA_TYPE_LOCATION_GUID = new Guid("055C74D8-CA6F-47D6-95C6-1ED3637A0FF4");

// GPSセンサの取得
Sensor GeolocationSensor = SensorManager.GetSensorsByTypeId(SensorTypes.LocationGps)[0];

// GPS信号を取得する度に、イベント実行
GeolocationSensor.DataReportChanged += DataReportChanged;

        // GPS信号受信時の処理
        private void DataReportChanged(Sensor sender, EventArgs e)
        {
            // NMEAフォーマットデータ
            string[] gpsData = sender.DataReport.Values[SENSOR_DATA_TYPE_LOCATION_GUID][25].ToString().Split(',');

            // gpsData[1]:HHmmss.00 gpsData[9]:yyMMdd
            // NMEAフォーマットデータに含まれる時刻は、UTC時刻となる
            DateTimeOffset dto = new DateTimeOffset(
                DateTime.ParseExact(string.Format("{0}{1}", gpsData[9], gpsData[1].Substring(0, 6)), "yyMMddHHmmss", null), TimeSpan.Zero);
        }


GPS 신호 데이터는 DataReportChanged 이벤트의 sender를 통해 얻습니다.

위의 GPS 센서를 사용한 환경에서는,
sender.DataReport.Values[SENSOR_DATA_TYPE_LOCATION_GUID]는 [0] : 경도, [1] : 위도 다음에, [25]에 NMEA 형식의 원시 데이터 (\$GPRMC,\$GPVTG,\$GPGNS... )가 저장됩니다.

좋은 웹페이지 즐겨찾기