Дата в миллисекундах на 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 с миллисекундами!

  • Linux перестает загружаться после ссылки eth0. Как заставить его показывать больше журнала?
  • Как удалить openwrt ssl cert
  • Цифры с нулевым заполнением до 2 цифр с помощью sed
  • OpenWRT: сброс настроек iptables по умолчанию
  • Установленные пакеты библиотеки не могут быть найдены на OpenWRT
  • Как убить процесс в скрипте оболочки, который работает через cron?
  • OpenWRT: Как создать интерфейс для виртуальных PPP-интерфейсов pptpd?
  • Как обновить динамический DNS под OpenWRT?
  • Выбрав правильный пакет (я считаю), я не могу его установить. Как это исправить?
  • OpenWrt: запретить доступ к IP-адресу в сети, за исключением нескольких хостов
  • Изменение параметров командной строки ядра для следующей загрузки на OpenWRT
  • Interesting Posts

    Граф и сумма нет. появления каждой уникальной строки в файле

    Обход флэш-памяти NAND и сводка виртуальной памяти

    Как разместить сайт на виртуальной машине kali linux?

    Обработка строк строки bash bash

    Могу ли я заставить Linux загружать инициализацию параллельно?

    Sed целое слово с заменой отдельных букв, с BSD sed?

    Поиск функциональных параметров для функций в библиотеках общих объектов

    В Red Hat, как установить систему python 3.6.1, когда 2.7.5 уже установлен?

    Sony работает с операционной системой? Oracle Linux или Crestron Extron или Minix или OS X?

    Samba не показывает символические ссылки

    Как создать локального пользователя в Linux-системах с поддержкой LDAP

    Мультизагрузочный USB с дополнительным первым разделом

    GCC / G ++ компилирует код в общую библиотеку вместо исполняемого файла

    Командная строка для отправки электронной почты, если загрузка процессора высока

    Как заархивировать несколько файлов одновременно в определенную папку?

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