Дата в миллисекундах на OpenWRT на Arduino YUN

Я использую OpenWRT на Arduino YUN, и я пытаюсь получить точную дату в миллисекундах (DD / MM / YYYY h: min: sec: ms), получая время на сервере времени.

К сожалению, date +%N просто возвращает %N , но не наносекунды. Я слышал, что +%N не включено в дату OpenWRT.

Итак, есть ли способ получить дату (включая миллисекунды), как я ее хочу?

5 Solutions collect form web for “Дата в миллисекундах на OpenWRT на Arduino YUN”

В OpenWRT date is busybox , которая имеет ограничения, но это не является строго одним из них. Основная проблема заключается в том, что libc (uClibc) не поддерживает это расширение GNU strftime . (Хотя и не glibc, ни о чем ниже).

По умолчанию у вас должен быть lua , но это не поможет без некоторых других модулей, не относящихся к стандарту.

hwclock вызывает gettimeofday() для сравнения / установки RTC (аппаратных часов), но он не будет выводить разрешение второй секунды (доступ к RTC может быть достаточно медленным, что в любом случае это может быть бесполезно). Помимо того, что OpenWRT предоставляет только древнее rdate , которое имеет только целое разрешение.

Кажется, нет простого способа получить точную /proc/timer_list времени непосредственно из /proc , наиболее полезная метка времени находится в /proc/timer_list (3-я строка), которая является /proc/timer_list безотказной работы в наносекундах (разрешение будет зависеть от платформы).

Если ваш busybox был создан с CONFIG_BUSYBOX_CONFIG_ADJTIMEX набора CONFIG_BUSYBOX_CONFIG_ADJTIMEX , вы должны иметь возможность использовать adjtimex для чтения часов ядра (хотя обратите внимание, что версия busybox имеет как разные аргументы, так и различные выходные данные для стандартного adjtimex.

Нормальная версия, adjtimex -p , последняя строка вывода:

  raw time: 1416419719s 146628us = 1416419719.146628 

Версия Busybox, adjtimex (без -p !), Последние 3 строки:

  [...] time.tv_sec: 1416420386 time.tv_usec: 732653 return value: 0 (clock synchronized) 

Goldilocks – прекрасное решение, предполагая, что у вас есть функция сборки кросс-сборки OpenWRT (настоятельно рекомендуется!). Решение coreutils-date работает, потому что в то время как coreutils хорошо осведомлен о glibc, это не исключительно glibc. Он поставляется с собственной автономной реализацией strftime (полученной из glibc) и использует это для завершения (через strftime_case() ) базового strftime чтобы поддерживать различные расширения (и в противном случае возвращается к версии uClibc).

Даже glibc (вплоть до текущего 2.23) не поддерживает %N , coreutils strftime() полученный из канонической версии glibc, добавляет %N и %:z и несколько других изменений. Вариации и исправленные версии strftime() изобилуют (включая версии в bash и gawk).

Если у вас есть компилятор C и он не может найти что-либо еще, это будет сообщать, например

 > millitime && sleep 1 && millitime 14/11/2014 9:39:49:364 14/11/2014 9:39:50:368 
 #include <errno.h> #include <stdio.h> #include <string.h> #include <sys/time.h> #include <time.h> int main (void) { struct timeval now; struct tm *parsed; if (gettimeofday(&now, NULL) == -1) { fprintf ( stderr, "gettimeofday() failed: %s\n", strerror(errno) ); return 1; } parsed = localtime((const time_t*)&now.tv_sec); if (!parsed) { fprintf ( stderr, "localtime() failed: %s\n", strerror(errno) ); return 1; } printf ( "%d/%d/%d %d:%02d:%02d:%03d\n", parsed->tm_mday, parsed->tm_mon + 1, parsed->tm_year + 1900, parsed->tm_hour, parsed->tm_min, parsed->tm_sec, now.tv_usec / 1000 ); return 0; } 

С gcc просто скомпилируйте его gcc whatever.c -o millitime . Если есть ошибка (что было бы очень странно), она сообщает stderr и выходит со статусом 1. В противном случае он отправляется на stdout и выходит 0.

Миллисекунды округляются с микросекунд.

На самом деле есть также пакет под названием coreutils-date ! Не знал об этом! Там все стандартные функции включены!

 #include <stdio.h> #include <time.h> void main (void){ long ms; time_t s; struct timespec spec; clock_gettime(CLOCK_REALTIME, &spec); s = spec.tv_sec; ms = (spec.tv_nsec / 1.0e6); printf("%d%03d\n", s, ms); return 0; } 

Это на языке C и работает как dateutut date +%s%3N . Он скомпилирован для маршрутизатора OpenWrt с OpenWrt-SDK.

Решение adjtimex не работает для меня, потому что я получаю adjtimex: Operation not permitted (я использую контейнер для альпийских докеров). Но я нашел еще одно причудливое, но nmeter решение, используя nmeter который может отображать до микросекунд.

 #-d0 means print every 0 seconds ie immediately # head -n1 makes sure it only does it once nmeter -d0 '%3t' | head -n1 

Поэтому, комбинируя это с командой date:

 date -u +%FT$(nmeter -d0 '%3t' | head -n1)Z # 2017-05-03T04:10:57.863Z 

Мы получаем строку rtc3339 UTC datetime с миллисекундами!

  • Невозможно добавить службу запуска для openWRT из init.d
  • Как использовать геймпад PS с OpenWRT?
  • Настройка точки доступа OpenWRT Archer C7v2
  • Linux перестает загружаться после ссылки eth0. Как заставить его показывать больше журнала?
  • Как добавить метки в iptables (цели MARK и CONNMARK)
  • Создание ключей openvpn-client на основе asuswrt ca
  • Как настроить маршрутизатор OpenWrt 10.03 для перенаправления подключения IPv6 к клиентам?
  • Как настроить PPPoE с OpenWrt
  • Найти соединения на ip на маршрутизаторе OpenWRT?
  • Маршрутизаторы Flash OpenWrt от Telnet
  • Режим n на "iwlist wlan0 scan"
  • Interesting Posts

    Скажите Python использовать альтернативную библиотеку

    автоматическая замена vim

    некоторые функциональные кнопки не распознаются (даже на уровне scancode) после возобновления сна

    Как я могу изменить действие по умолчанию на экране Ca на просто обратную сторону `?

    Arch Linux продолжает печатать странные символы в tty

    Почему добавление не-VLAN-интерфейса к мосту нарушает VLAN-интерфейсы?

    Посмотрите, сколько слов имеют одинаковые буквы

    Поймите вывод nslookup.

    Сенсорный экран для ncurses, кроме мыши?

    «Sudo service uwsgi restart» возвращает , однако журналы uwsgi показывают, что процессы были созданы и запущено приложение python

    LDAP: локальный и удаленный пользователь с одинаковым именем пользователя

    После изменения разрешения пиксельный экран

    Как изменить значок Firefox на панели и меню?

    Rfkill отказывается разблокировать WiFi-устройство

    Ubuntu Не удалось очистить пакет

    Linux и Unix - лучшая ОС в мире.