ESP8266 с Nodemcu и http-модулем: последовательность операции POST после сбоя GET. Нет callback-метода

я хочу сделать кнопку с моим ESP8266. Он должен взаимодействовать с моим локальным сервером Synapse (Matrix.org). Мне нужно получить мой access_key и room_id, а также войти в мой ESP8266.

Итак, у меня есть три http-метода. Каждый из них работает нормально, но когда они все три на моем ESP8266, он не работает. Кажется, что первый не получил ответа, а второй. А потом скрипт останавливается из-за того, что какая-то переменная равна нулю. Вот почему я не опубликовал третий метод.

My NodeMcu-Firmeware:
NodeMCU custom build by frightanic.com
   branch: master
   commit: 22e1adc4b06c931797539b986c85e229e5942a5f
   SSL: true
   modules: bit,cjson,crypto,encoder,file,gpio,http,net,node,sntp,tmr,uart,wifi,tls
  build     built on: 2017-05-01 14:03
powered by Lua 5.1.4 on SDK 2.0.0(656edbf)

Мой код:

`ok, jsonheader = pcall(cjson.encode, {Accept="application/json"})
 if ok then
    print(jsonheader)
 else
    print("failed to encode!")
 end

 ok, jsonbody = pcall(cjson.encode, {type="m.login.password",user="admin", password="admin"})
 if ok then
    print(jsonbody)
 else
    print("failed to encode!")
 end


http.post("http://localhost:8008/_matrix/client/r0/login", jsonheader, jsonbody  , function(code, data)
if (code< 0) then
        print("HTTP_GET request failed")

    else

        print(code, data)
        accessToken = cjson.decode(data).access_token
        print(accessToken)
    end
end)






http.get("http://localhost:8008/_matrix/client/r0/directory/room/%23ButtonPrinter%3Ahomeserver", jsonheader, function(code1, data1)
if (code1< 0) then
        print("HTTP_GET request failed")
else
        print("___________________________________")
        print(code1, data1)
        roomId = cjson.decode(data1).room_id
        print(roomId)

    end
end)

Распечатка показывает мне, что это не первый метод обратного вызова из http.post.

pin:6, level:1 
Calling: 00000001
LED On
Push Counter is: 3
___________________________________
 200    {"room_id":"!TpYsyBpFLoxXrbVBZv:homeserver","servers"["homeserver"]}
 !TpYsyBpFLoxXrbVBZv:homeserver

И лог-файл с сервера показывает, что:

2017-05-06 10:09:16,233 - synapse.storage.TIME - 215 - INFO - - Total database time: 0.000% {update_cached_last_access_time(0): 0.000%, store_device(0): 0.000%, get_users_in_room(0): 0.000%} {}
2017-05-06 10:09:18,246 - synapse.access.http.8008 - 59 - INFO - GET-6- 192.168.178.XX - 8008 - Received request: GET /_matrix/client/r0/directory/room/%23ButtonPrinter%3Ahomeserver
2017-05-06 10:09:18,249 - synapse.util.async - 201 - INFO - GET-6- Acquired linearizer lock 'state_resolve_lock' for key frozenset([17, 18])
2017-05-06 10:09:18,250 - synapse.util.async - 208 - INFO - GET-6- Releasing linearizer lock 'state_resolve_lock' for key frozenset([17, 18])
2017-05-06 10:09:18,251 - synapse.access.http.8008 - 91 - INFO - GET-6- 192.168.178.XX - 8008 - {None} Processed request: 4ms (0ms, 0ms) (0ms/2) 69B 200 "GET /_matrix/client/r0/directory/room/%23ButtonPrinter%3Ahomeserver HTTP/1.1" "None"
2017-05-06 10:09:18,253 - synapse.access.http.8008 - 59 - INFO - POST-7- 192.168.178.XX - 8008 - Received request: POST /_matrix/client/r0/login
2017-05-06 10:09:18,545 - synapse.handlers.auth - 433 - INFO - POST-7- Logging in user @admin:homeserver on device DWOVBGCIOD
2017-05-06 10:09:18,548 - synapse.access.http.8008 - 91 - INFO - POST-7- 192.168.178.XX - 8008 - {None} Processed request: 295ms (0ms, 0ms) (3ms/5) 364B 200 "POST /_matrix/client/r0/login HTTP/1.1" "None"
2017-05-06 10:09:21,198 - synapse.handlers.typing - 79 - INFO - - Checking for typing timeouts
2017-05-06 10:09:21,199 - synapse.handlers.presence - 329 - INFO - - Handling presence timeouts
2017-05-06 10:09:26,197 - synapse.handlers.typing - 79 - INFO - - Checking for typing timeouts
2017-05-06 10:09:26,198 - synapse.handlers.presence - 329 - INFO - - Handling presence timeouts
2017-05-06 10:09:26,232 - synapse.storage.TIME - 215 - INFO - - Total database time: 0.042% {store_device(2): 0.017%, add_device_change_to_streams(1): 0.010%, add_access_token_to_user(1): 0.009%} {}

Я так много пробовал, я завернул все в tail-метод, пробовал с будильником. Но ничего не работает. Мне нужны все ответы в правильной последовательности.

Что я делаю неправильно?


person Tatti_AnA    schedule 06.05.2017    source источник


Ответы (1)


Боюсь, это своего рода классика.

С помощью этого модуля невозможно выполнять одновременные HTTP-запросы.

Источник: https://nodemcu.readthedocs.io/en/latest/en/modules/http/

Поскольку все операции http.xxx являются асинхронными (все функции NodeMCU с обратными вызовами...), вы фактически пытаетесь запустить http.post и http.get параллельно.

Решение 1. Связывание запросов

http.post(url, jsonheader, jsonbody, function(code, data)
  if (code < 0) then
    print("HTTP request failed")
  else
    print(code, data)
    -- http.get()
  end
end)

Решение 2. Диспетчеризация задач

http.post(url, jsonheader, jsonbody, function(code, data)
  if (code < 0) then
    print("HTTP request failed")
  else
    print(code, data)
    node.task.post(function()
      -- http.get()
    end)
  end
end)

См. https://nodemcu.readthedocs.io/en/latest/en/modules/node/#nodetaskpost для получения подробной информации.

person Marcel Stör    schedule 06.05.2017
comment
во-первых, спасибо за ваш ответ. это то, что я через. и я прочитал цитату из документов NodeMcu. но я что-то понял, когда у вас есть http-метод, а в функции обратного вызова вы помещаете другой http-метод, как вы показали мне в решении. Я попробую оба ваших решения и напишу позже, подходит ли оно мне. Благодарность - person Tatti_AnA; 06.05.2017
comment
Мы добавили функцию цепочки в декабре прошлого года: github.com/nodemcu/nodemcu-firmware/pull/ 1629 - person Marcel Stör; 06.05.2017
comment
а, ладно, ладно, большое спасибо. первое решение теперь работает нормально. код выглядит не очень красиво, но теперь у меня есть решение, и с его помощью я могу сделать код более красивым, возможно, с помощью узла-модуля. большое спасибо мне очень помогло. :) - person Tatti_AnA; 06.05.2017
comment
код не так хорош - очевидно, что каждый HTTP-запрос может/должен выполнять свою собственную функцию. Это оставит вам довольно краткую структуру. В каждом обратном вызове HTTP вы затем просто вызываете другую функцию (которая инкапсулирует http.xxx). - person Marcel Stör; 06.05.2017
comment
да да, это то, что я пробовал в любом случае, сначала я имел в виду хвостовую функцию, но я не знаю, почему это не сработало. но я попробую еще раз. - person Tatti_AnA; 06.05.2017