Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Запрос времени из Интернта GetNetworkTime() (LUA)
SeregaB
сообщение 28.6.2022, 13:44
Сообщение #1


**

Neophyte
Сообщений: 47
Регистрация: 22.9.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.405



Подскажите пожалуйста, делал ли кто то запрос на время из интернета в LUA?
Как это сделать с помощью команды GetNetworkTime()?
NtpServers = { "time.windows.com", "pool.ntp.org", "time-a.nist.gov" }
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
SeregaB
сообщение 28.6.2022, 17:05
Сообщение #2


**

Neophyte
Сообщений: 47
Регистрация: 22.9.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.405



Цитата(SeregaB @ 28.6.2022, 13:44) *

Подскажите пожалуйста, делал ли кто то запрос на время из интернета в LUA?
Как это сделать с помощью команды GetNetworkTime()?
NtpServers = { "time.windows.com", "pool.ntp.org", "time-a.nist.gov" }

как пример есть некая функция для C++
Код

public static DateTime GetNetworkTime()
        {
            //default Windows time server
            const string ntpServer = "time.windows.com";

            // NTP message size - 16 bytes of the digest (RFC 2030)
            var ntpData = new byte[48];

            //Setting the Leap Indicator, Version Number and Mode values
            ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)

            var addresses = Dns.GetHostEntry(ntpServer).AddressList;

            //The UDP port number assigned to NTP is 123
            var ipEndPoint = new IPEndPoint(addresses[0], 123);
            //NTP uses UDP
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            socket.Connect(ipEndPoint);

            socket.Send(ntpData);
            socket.Receive(ntpData);
            socket.Close();

            //Offset to get to the "Transmit Timestamp" field (time at which the reply
            //departed the server for the client, in 64-bit timestamp format."
            const byte serverReplyTime = 40;

            //Get the seconds part
            ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);

            //Get the seconds fraction
            ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);

            //Convert From big-endian to little-endian
            intPart = SwapEndianness(intPart);
            fractPart = SwapEndianness(fractPart);

            var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);

            //**UTC** time
            var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);

            return networkDateTime;
        }

        // stackoverflow.com/a/3294698/162671
        static uint SwapEndianness(ulong x)
        {
            return (uint)(((x & 0x000000ff) << 24) +
                           ((x & 0x0000ff00) << 8) +
                           ((x & 0x00ff0000) >> 8) +
                           ((x & 0xff000000) >> 24));
        }

ее как то можно изменить и применить для LUA?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 28.6.2022, 18:04
Сообщение #3


****

Apprentice
Сообщений: 282
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8296
Пользователь №: 19.451
Возраст: 32



С ходу нагуглилось это https://gist.github.com/ericroy/453ecae379d...c2311d3b6bf49f0
в принципе работает только возвращает в таком формате NTP time: 1656428417.1801.
А для каких целей тебе это надо?
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
SeregaB
сообщение 28.6.2022, 18:35
Сообщение #4


**

Neophyte
Сообщений: 47
Регистрация: 22.9.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.405



Цитата(Madeus @ 28.6.2022, 18:04) *

С ходу нагуглилось это https://gist.github.com/ericroy/453ecae379d...c2311d3b6bf49f0
в принципе работает только возвращает в таком формате NTP time: 1656428417.1801.
А для каких целей тебе это надо?

хочу попробовать сделать ограничение по времени на использование бота, чтоб оно не было привязано к системному времени.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 28.6.2022, 18:43
Сообщение #5


****

Apprentice
Сообщений: 282
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8296
Пользователь №: 19.451
Возраст: 32



А какая разница какое время системное, даже если оно не синхронизированое с нтп, или нтп?
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 28.6.2022, 19:23
Сообщение #6


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



А где вы эту функцию вообще нашли? Какая дллка ее содержит?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
SeregaB
сообщение 29.6.2022, 11:54
Сообщение #7


**

Neophyte
Сообщений: 47
Регистрация: 22.9.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.405



Цитата(Madeus @ 28.6.2022, 18:43) *

А какая разница какое время системное, даже если оно не синхронизированое с нтп, или нтп?

Разница в том, что системное можно изменить, а время и дату из интернета не изменишь.
Тем самым сделать привязку работы скрипта в времени из инета.

Цитата(DarkMaster @ 28.6.2022, 19:23) *

А где вы эту функцию вообще нашли? Какая дллка ее содержит?

getNetworkTime() вшита в одну в"Вражескую программу", которая работает на LUA коде.
И время там можно определить так:
Код

local tNet = os.date("*t", getNetworkTime() / 1000)
print (tNet.year)
print (tNet.month)
print (tNet.day)
print (tNet.hour)

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 29.6.2022, 14:43
Сообщение #8


****

Apprentice
Сообщений: 282
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8296
Пользователь №: 19.451
Возраст: 32



Все то же самое из ссылке что давал выше, только дополнительно подключаем socket и меняем принты на логи.
code

Исходный код

--lua
local socket = require('socket')
local M = {}

local DEFAULT_NTP_HOSTS = { "time.windows.com", "pool.ntp.org", "time-a.nist.gov" }
local DEFAULT_NTP_PORT = 123

-- The seconds from Jan 1, 1900 to Jan 1, 1970
local SHIFT_TO_UNIX_EPOCH = 0x83AA7E80

-- Build a message. Set the first byte's bits to 00,011,011 for li = 0, vn = 3, and mode = 3
local NTP_TIME_QUERY = string. char(0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0)

local function read_uint32(s, offset)
local v = s:byte(offset + 1)
v = v * 256 + s:byte(offset + 2)
v = v * 256 + s:byte(offset + 3)
v = v * 256 + s:byte(offset + 4)
return v
end

local time_check_prototype = {
__gc = function(self)
self.s:close()
end,

-- timeout: Pass nil to block until ready, or a max number of seconds to wait
get = function(self, timeout)
if self.ts then
return self.ts
end
self.s:settimeout(timeout)
local packet, timed_out = self.s:receive()
if not timed_out and #packet >= 48 then
-- Get the txTm_s field (transmit time, in seconds)
-- Add the txTm_f value, converted to a fraction
local seconds = read_uint32(packet, 40) - SHIFT_TO_UNIX_EPOCH
local fraction = read_uint32(packet, 44) / 0xffffffff
self.ts = seconds + fraction
self.s:close()
end
return self.ts
end,
}

function M.start_time_check(hosts, port)
port = port or DEFAULT_NTP_PORT
hosts = hosts or DEFAULT_NTP_HOSTS
if type(hosts) == 'string' then
hosts = {hosts}
end

local s = socket.udp()
if not s then
return nil, 'NTP: Failed to create UDP socket'
end

-- Resolve ip addresses
local ips = {}
for _, host in ipairs(hosts) do
local ip = socket.dns.toip(host)
if ip then
table.insert(ips, ip)
end
end

if #ips == 0 then
return nil, 'NTP: Address resolution failed for all hosts in list'
end

-- Send a time request to each ip
local any_sent = false
for _, ip in ipairs(ips) do
if s:sendto(NTP_TIME_QUERY, ip, port) then
any_sent = true
end
end

if not any_sent then
return nil, 'NTP: sendto() failed'
end

return setmetatable({s = s}, {__index = time_check_prototype})
end

function M.test()
local t = assert(M.start_time_check())
local ts = assert(t:get(10), 'NTP: Check failed')
assert(type(ts == 'number') and ts > 1483228800)
return ts
end

--return M
local tNet = os.date("*t", M.test())
log(tNet.year)
log(tNet.month)
log(tNet.day)
log(tNet.hour)


Где то уже прикреплял socket сам найти не могу дублирую сюда, распаковать в папку пилота


Прикрепленные файлы
Прикрепленный файл  lua_socket.zip ( 2,72 мегабайт ) Кол-во скачиваний: 190
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 1.7.2022, 8:13
Сообщение #9


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Форма таймштампа лего преобразуется кстати.
Функция os.date([format[, time]])
%a abbreviated weekday name (e.g., Wed)
%A full weekday name (e.g., Wednesday)
%b abbreviated month name (e.g., Sep)
%B full month name (e.g., September)
%c date and time (e.g., 09/16/98 23:48:10)
%d day of the month (16) [01-31]
%H hour, using a 24-hour clock (23) [00-23]
%I hour, using a 12-hour clock (11) [01-12]
%M minute (48) [00-59]
%m month (09) [01-12]
%p either "am" or "pm" (pm)
%S second (10) [00-61]
%w weekday (3) [0-6 = Sunday-Saturday]
%x date (e.g., 09/16/98)
%X time (e.g., 23:48:10)
%Y full year (1998)
%y two-digit year (98) [00-99]
%% the character `%ґ
Код
log(os.date(nil, 1656428417.1801))
log(os.date("%Y", 1656428417.1801))
log(os.date("%m", 1656428417.1801))
log(os.date("%d", 1656428417.1801))
log(os.date("%H", 1656428417.1801))




По поводу той сишной функции. Если она видима для луа, то можно сделать так:
local ffi = require[[ffi]]
ffi.cdef[[
unsigned int GetNetworkTime();
]]
-- дальше спокойно вызываем функцию
log(os.date(nil, GetNetworkTime()))

Тем не менее обращаю ваше внимание, что в вашем луа коде getNetworkTime, а в сишном GetNetworkTime (с большой буквы G), а это разное написание и оно должно совпадать.

Сообщение отредактировал DarkMaster - 1.7.2022, 8:09


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 12:16
Designed by Nickostyle