Синхронизация времени

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Gibyte, 5 фев 2017.

  1. Gibyte

    Gibyte Нуб

    Добрый день!

    Подскажите как на Iskra js синхронизировать время с компьютером или сервером точного времени?
     
  2. mcureenab

    mcureenab Гуру

  3. Gibyte

    Gibyte Нуб

    Извиняюсь за настойчивость.

    Установил "ntp-client" вылезла ошибка: ERROR: SD card must be setup with E.connectSDCard first
    WARNING: Module "dgram" not found

    dgram модуль никак найти не могу.

    Помогите решить проблему.

    Библиотеки находятся на локальной машине устанавливал по статье
     
  4. mcureenab

    mcureenab Гуру

    Для этого шилда разработана могучая библиотека, которая включает поддержку сокетов

    http://www.espruino.com/WIZnet

    Другие реализации UDP смахивают на какие-то извращения.

    Как вариант, время можно забирать по http:// с какого нибудь web сервера с часами. Точность будет не ахти какая, но в секунду, я думаю уложитесь.
     
  5. Morgan

    Morgan Гик

    А вам точно NTP нужен?

    Если нет, то самый простой способ: отправить get-запрос на http://api.geonames.org/timezoneJSON?lat=55.45&lng=37.36&username=demo
    вернётся json, в поле time будет значение текущего времени.
    Но это не NTP, конечно.
     
  6. mcureenab

    mcureenab Гуру

    Или с GPS время получать.
     
  7. Gibyte

    Gibyte Нуб

    Спасибо за ответы.

    Хотелось бы подытожить все выше сказанное.

    Получается что без ethernet модуля "нифига" не получится?

    Как я понимаю вот этот модуль должен подойти для решения моей задачи.
     
  8. ИгорьК

    ИгорьК Гуру

    Или этот.
     
  9. mcureenab

    mcureenab Гуру

    А где у него поддержка UDP?
     
  10. ИгорьК

    ИгорьК Гуру

    Эммм.... Внутри!
    Ashampoo_Snap_2017.02.07_16h39m17s_010_.jpg
     
    Последнее редактирование: 7 фев 2017
  11. rkit

    rkit Гуру

    Можно с компьютером по проводу синхронизировать. Только софт для компьютера придется писать самостоятельно.
     
  12. mcureenab

    mcureenab Гуру

    Нужно не внутри, а в API. В функциях модуля.
     
  13. ИгорьК

    ИгорьК Гуру

    Ну да, где-то там...
    Ashampoo_Snap_2017.02.07_16h39m17s_010_.jpg
     
    Konkery нравится это.
  14. mcureenab

    mcureenab Гуру

  15. ИгорьК

    ИгорьК Гуру

    Это один из нескольких способов добыть на ESP-8266 время.
    В данном случае это обращение к ntp серверу и преобразование UNIX к текущей дате всего двумя строками кода. После чего время можно выплюнуть в UART.
    Есть еще варианты.
    Обратиться к любому HTTP серверу и прочитать время в заголовке ответа.
    Можно распарсить JSON ответ, который указал Мроган.
    Можно добыть и через модуль UDP, но я не в теме как.
    И задача была у ТС найти время, а не UDP.

    Ashampoo_Snap_2017.02.07_17h08m08s_011_.jpg
     
    Последнее редактирование: 7 фев 2017
  16. Mihail Vasilev

    Mihail Vasilev Нерд

    ntp все же поточнее будет, чем http. И парсится проще - там просто UTC по определённому смещению.
     
  17. ИгорьК

    ИгорьК Гуру

    Там секунды Unix-time. Я бы не сказал что парсится проще. Проще всего json. Не думаю что ТС считает угловые секунды перемещения спутников с точностью до трех знаков.
     
  18. Mihail Vasilev

    Mihail Vasilev Нерд

    Я, честно говоря, не совсем понял, зачем автору время. Но если задача хоть чуточку сложнее, чем "вывести строку с текущим временем при включении питания" - ну хоть какой-то арифметикой с этим самым временем надо заниматься, то unix-time здорово облегчает жизнь.

    У меня это как-то так выглядит - привожу ключевые обрывки. Если надо/интересно, могу всю прожку выложить.
    (на C, не на js, правда) :


    Код (C++):
       unsigned long epoch=0;
       udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

       unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
       unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
        // combine the four bytes (two words) into a long integer
        // this is NTP time (seconds since Jan 1 1900):
           unsigned long secsSince1900 = highWord << 16 | lowWord;
           const unsigned long seventyYears = 2208988800UL;
           epoch = secsSince1900 - seventyYears;

        int h=((epoch+TZadd ) % 86400L) / 3600;
        int m=((epoch % 3600) / 60);
        int s=epoch % 60;
        sprintf(buf,"%02d:%02d:%02d",h,m,s);
     
    Накопипасчено по инету, но работает вполне.
     
    Konkery нравится это.
  19. Mihail Vasilev

    Mihail Vasilev Нерд

    Другое дело, что про всякие leap seconds еще помнить надо, по хорошему.
     
  20. ИгорьК

    ИгорьК Гуру

    Код (Lua):
    do
    function getTime(tz)
        tz = tz or 3
        conn=net.createConnection(net.TCP, 0)
        conn:on("connection",function(conn, payload)
            conn:send("HEAD / HTTP/1.1\r\n"..
                     "Accept: */*\r\n"..
                     "\r\n\r\n")
        end)
        conn:on("receive", function(conn, payload)
                 time = string.sub(payload,string.find(payload,"Date: ")+23,string.find(payload,"Date: ")+31)
                 hour = string.sub(time, 0, 2) + tz
                 if hour >= 24 then hour = tonumber(hour) - 24 end
                 minute = string.sub(time, 4,5)
                 second = string.sub(time, 7,9)
                 print("\n\n"..hour.."-"..minute.."-"..second)
                 conn:close()
         end)
         conn:connect(80,'ya.ru')
    end
    getTime()
    end
     
    sys и Konkery нравится это.