Main.py qulab tushgandan so'ng, ESP8266 MicroPython-ni qanday tiklashim mumkin?

MicroPython bilan ishlayotgan NodeMCU ESP8266 kengashim bor. Men ESP8266-dagi veb-serverni ishlayapman. Bu mening birinchi IOT loyihasimdan biri bu taxtalarga asoslanadi.

Quyida kodning parchasidir.

Ushbu kod main.py ichida amalga oshiriladi. Har hozir va keyin, biror narsa falokat kodini keltirib chiqaradi (ehtimol vaqt va talab asosida). main.py chiqqandan so'ng, nima sababdan python CLI-ga qo'yib yuborildim.

Men (agar yaxshiroq yo'l yo'q bo'lsa), bu sodir bo'lgach, forumni tiklashni xohlayman.

ESP8266'ni qayta ishga tushirish/qayta tiklashning eng yaxshi usuli qanday?

addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen(5)
print('listening on', addr)

while True:
    cl, addr = s.accept()
    print('client connected from', addr)
    cl_file = cl.makefile('rwb', 0)
    print("Request:")
    while True:
        line = cl_file.readline()
        print("Line:" , line)
        if not line or line == b'\r\n':
            print("breaking")
            break
        if line == b'GET /active HTTP/1.1\r\n':
3
hujjatlarni tekshirish , mashina degan fikrda. WDT watchdog taymerlari sp8266 uchun mavjud emas, bu forum post uning hozirgi asosiy shaklda amalga oshirilishini anglatadi. Ehtimol, bu birinchi narsa. (Sizning kodingizni qanday qilib to'xtatishni to'xtatish kerakligini aniqlab olish uchun zararli narsa, albatta). Ushbu mavzu da, bir watchdog'u yaratish haqida bir munozarasi bor. ESP.
qo'shib qo'ydi muallif nekomatic, manba
Bu veb-brauzer chiqishi bilan bog'liq xato. OSError: [Errno 104] ECONNRESET
qo'shib qo'ydi muallif user1600747, manba

6 javoblar

MicroPython machine.reset() funktsiyasiga ega. kartani qayta tiklash uchun.

Python (MicroPython emas, balki) xatoliklarni bartaraf qilish uchun noreferrer"> maxsus vaziyatlarni boshqarish dan foydalanadi.

Ikkalasini birlashtirganda, xohlaganingizga osongina erisha olasiz. Misol uchun:

a = 4
b = 2
try:
    a/b
except:
    machine.reset()

Yuqoridagi kodda siz b qiymatini 0 bilan o'zgartirsangiz, sizning kartangiz tiklanadi. Agar siz bu haqda biroz o'ylab ko'rsangiz, ehtimol, bu juda mantiqiy emasligini bilib olasiz - noto'g'ri yoki boshqa yo'l bilan faqatgina 0 ga bo'linib qolsangiz, forumni to'satdan bekor qilishni istamaysiz. Xatolar uchun yaxshiroq yo'llar bo'lishi kerak! Shunga o'xshab, siz o'zingizning ishingiz haqida o'ylab ko'rishingiz va boshqaruvni tiklashingiz, albatta, eng yaxshi tanlovdir. Agar siz ha deb hisoblasangiz, bu yaxshi, faqat siz sizning kartangizni to'satdan qayta tiklashni dasturlashtirilganini doim yodda tuting. Aks holda, sizning keyingi savolingiz bu erda bo'lishi mumkin "Mening to'sham birdan resetlanadi! Nima uchun ???" ;-)

3
qo'shib qo'ydi
Bu yaxshi javob, so'ralgan narsalarni bajarishning samarali usuli va yaxshi yondashuvlar yoki asosiy muammolarni hal qilish yo'llari haqida ba'zi fikrlar.
qo'shib qo'ydi muallif Ezekiel Kruglick, manba

MicroPython machine.reset() funktsiyasiga ega. kartani qayta tiklash uchun.

Python (MicroPython emas, balki) xatoliklarni bartaraf qilish uchun noreferrer"> maxsus vaziyatlarni boshqarish dan foydalanadi.

Ikkalasini birlashtirganda, xohlaganingizga osongina erisha olasiz. Misol uchun:

a = 4
b = 2
try:
    a/b
except:
    machine.reset()

Yuqoridagi kodda siz b qiymatini 0 bilan o'zgartirsangiz, sizning kartangiz tiklanadi. Agar siz bu haqda biroz o'ylab ko'rsangiz, ehtimol, bu juda mantiqiy emasligini bilib olasiz - noto'g'ri yoki boshqa yo'l bilan faqatgina 0 ga bo'linib qolsangiz, forumni to'satdan bekor qilishni istamaysiz. Xatolar uchun yaxshiroq yo'llar bo'lishi kerak! Shunga o'xshab, siz o'zingizning ishingiz haqida o'ylab ko'rishingiz va boshqaruvni tiklashingiz, albatta, eng yaxshi tanlovdir. Agar siz ha deb hisoblasangiz, bu yaxshi, faqat siz sizning kartangizni to'satdan qayta tiklashni dasturlashtirilganini doim yodda tuting. Aks holda, sizning keyingi savolingiz bu erda bo'lishi mumkin "Mening to'sham birdan resetlanadi! Nima uchun ???" ;-)

3
qo'shib qo'ydi
Bu yaxshi javob, so'ralgan narsalarni bajarishning samarali usuli va yaxshi yondashuvlar yoki asosiy muammolarni hal qilish yo'llari haqida ba'zi fikrlar.
qo'shib qo'ydi muallif Ezekiel Kruglick, manba

Flash tugmasi (GPIO pin 0) uchun shunday vaqt oralig'ini tekshirish mumkin:

import machine
pin = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)                                                                 
while pin.value():
    print('Put your code here...')
    print('..this will looping until the Flash button is pressed...')

print('...and then it continues here.')
1
qo'shib qo'ydi

Asl savol uchun kech bo'lishi mumkin, ammo men ishtirok etadigan javob boshqa kishilarga yordam berishi mumkin. Buning yakuniy yechim emasligini o'ylab ko'ring, lekin ko'p hollarda bir kunni qutqarishi mumkin. Sizning ishingizni tekshirishingiz mumkin.

Qaror, MicroPython'un ichki rejalashtirish funktsiyasidan foydalanadi. chunki uning bajarilishi kafolatlangan bo'lsa, unda xatti-harakati funktsional nazoratni taqqoslash uchun vosita sifatida ishlatilishi mumkin.

Quyidagi kod sizning holatingizda moslashtirilgan taymerlar va eshiklar bilan ishlaydi va agar u taymer o'z eshigiga etib borsa va wd_buffer qiymati o'sha vaqt uchun yangilanmasa, funksiya chaqirilishi mumkin va biz uni yana takrorlaymiz . Shunday qilib, ESPning 12 soniyadan keyin qayta ishlanishiga yo'l qo'ymaslik uchun sizning kodingizda joy olish kerak bo'ladi (muntazam ravishda (12 sekunddan qisqa yoki ehtiyojni hisobga olgan holda taymer va eshikni belgilang) Global wd_buffer o'zgaruvchining qiymatini yangilang . Umid qilamanki yordam beradi.

# Simple WD - Global Variable
wd_feeder = 0 
wd_buffer = 0
wd_counter = 0
wd_threshold = 4

def wd_checker(calledvalue):
    print('watchdog is checking... feeder= {} buffer= {}'.format(wd_feeder, wd_buffer))
    global wd_counter
    global wd_buffer
    global wd_feeder
    if wd_feeder == wd_buffer:
        print('state is suspicious ... counter is {} incrementing the counter'.format(wd_counter))
        wd_counter += 1
    else:
        wd_counter = 0
        wd_feeder = wd_buffer
    if wd_counter == wd_threshold:
        print('Counter is reached its threshold, following function will be called')
        wd_feeder = wd_buffer = wd_counter = 0
        machine.reset()


if __name__ == '__main__':
    scheduler_wd = machine.Timer(-1)
    scheduler_wd.init(period=3000, mode=machine.Timer.PERIODIC, callback=wd_checker)
1
qo'shib qo'ydi

You could execute your code (which should be outside of the main.py -> other file) from the boot or the main.py. if it drops out it should execute the following code, which could trigger a reset.

Avval xatoni qo'lga olishingiz kerak bo'lishi mumkin.

Umid qilamanki yordam berdim

0
qo'shib qo'ydi
Ehtimol, kod parchasi sizning javobingizni aniqlab berishga yordam beradi
qo'shib qo'ydi muallif gareththegeek, manba
Mana shu yondashuv. Mening asosiy kodimni boot.py ga ko'chirdim va keyin main.py ichida ESP8266 ni qayta tiklash uchun qo'ng'iroqni qo'shdim. Agar veb-xizmat aylanishining tugatilishiga biror narsa kelib chiqsa, boot.py chiqadi va main.py qurilmani o'chirib yuboradi. ESP8266-dagi lua va mqttga o'tishda va veb-xizmat komponentini boshqa hostda ishlaydigan haqiqiy apache serveriga ko'chirish bilan birga yanada yaxshiroq ishonchni topdim.
qo'shib qo'ydi muallif user1600747, manba

You could execute your code (which should be outside of the main.py -> other file) from the boot or the main.py. if it drops out it should execute the following code, which could trigger a reset.

Avval xatoni qo'lga olishingiz kerak bo'lishi mumkin.

Umid qilamanki yordam berdim

0
qo'shib qo'ydi
Ehtimol, kod parchasi sizning javobingizni aniqlab berishga yordam beradi
qo'shib qo'ydi muallif gareththegeek, manba
Mana shu yondashuv. Mening asosiy kodimni boot.py ga ko'chirdim va keyin main.py ichida ESP8266 ni qayta tiklash uchun qo'ng'iroqni qo'shdim. Agar veb-xizmat aylanishining tugatilishiga biror narsa kelib chiqsa, boot.py chiqadi va main.py qurilmani o'chirib yuboradi. ESP8266-dagi lua va mqttga o'tishda va veb-xizmat komponentini boshqa hostda ishlaydigan haqiqiy apache serveriga ko'chirish bilan birga yanada yaxshiroq ishonchni topdim.
qo'shib qo'ydi muallif user1600747, manba
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming