alexsis_76, Попробую задать вопрос на этой ветке - если есть возможность помогите с аяксом, уже мозги плавятся ничего не получается. У меня RPI соединён по UART с ардуино, дальше ардуино по RS485 общается с контроллерами (не модбас). Ардуино периодически отдаёт RPI строчку со всеми переменными типа P11001001111...... Да, ещё вопрос - принять данные получается, а передать с помощью питона не могу:
# Управление каналом №1 # Включить @webiopi.macro
def getContr1_ch1_on(): serial = Serial("ttyAMA0", 9600) serial.write(":01DO1S100.00") # Отключить @webiopi.macro def getContr1_ch1_off(): serial = Serial("ttyAMA0", 9600) serial.write(":01DO1S000.00") #=============================
В чем ошибка? Если с HTML отправляю onClick=serial.write(":03DO2S000.00") всё получается.
Вашу ссылку посмотрел вроде маленько помогла, но вопросы остались. Если можете ответьте. олег
OlegM, А в момент "когда не получается", что происходит в браузере? (ctrl+shift+i) А еще приложите кусок кода из файла .html для вызова этого макроса. И пожалуйста всегда прячьте код под кат и оформляйте как код!!! Спасибо.
Вообщем дела обстоят так ну или примерно так. Во главу угла в веб интерфейсе ставится webiopi.js через нее идет все взаимодействие с сервером библиотека использует jquery. обратите внимание на кучки разных функций в библиотеке например
эта функция шлет данные методом POST плюса означают контактенцию(слияние строк),все что в кавычках передается как есть,а вместо gpio вставляется значение переменной после получения ответа будет вызвана функция обратного вызова(ваша) callback(gpio, data);с полученными данными,вы пишите ее сами и она делает все что вам нужно теперь нужно обработать ваш запрос на стороне сервера и выдать ответ в webiopi.py есть такое
Код
def do_POST(self): if not self.checkAuthentication(): return relativePath = self.path.replace(self.server.context, "") if (relativePath.startswith("/")): relativePath = relativePath[1:]; if (relativePath.startswith("GPIO/")): (mode, s_gpio, operation, value) = relativePath.split("/") gpio = int(s_gpio) if (operation == "value"): if GPIO.getFunction(gpio) != GPIO.OUT: self.send_error(400, "Not Output") return; if (value == "0"): GPIO.output(gpio, GPIO.LOW) elif (value == "1"): GPIO.output(gpio, GPIO.HIGH) else: self.send_error(400, "Bad Value") return self.send_response(200) self.send_header("Content-type", "text/plain"); self.end_headers() self.wfile.write(value.encode()) elif (operation == "function"): value = value.lower() if value == "in": GPIO.setFunction(gpio, GPIO.IN) elif value == "out": GPIO.setFunction(gpio, GPIO.OUT) elif value == "pwm": GPIO.setFunction(gpio, GPIO.PWM) else: self.send_error(400, "Bad Function") return value = GPIO.getFunctionString(gpio) self.send_response(200) self.send_header("Content-type", "text/plain"); self.end_headers() self.wfile.write(value.encode()) elif (operation == "sequence"): if GPIO.getFunction(gpio) != GPIO.OUT: self.send_error(400, "Not Output") return; (period, sequence) = value.split(",") period = int(period) GPIO.outputSequence(gpio, period, sequence) self.send_response(200) self.send_header("Content-type", "text/plain"); self.end_headers() self.wfile.write(sequence[-1].encode()) elif (operation == "pwm"): if value == "enable": GPIO.enablePWM(gpio) elif value == "disable": GPIO.disablePWM(gpio) if GPIO.isPWMEnabled(gpio): result = "enabled" else: result = "disabled" self.send_response(200) self.send_header("Content-type", "text/plain"); self.end_headers() self.wfile.write(result.encode()) elif (operation == "pulse"): GPIO.pulse(gpio) self.send_response(200) self.send_header("Content-type", "text/plain"); self.end_headers() self.wfile.write("OK".encode()) elif (operation == "pulseRatio"): ratio = float(value) GPIO.pulseRatio(gpio, ratio) self.send_response(200) self.send_header("Content-type", "text/plain"); self.end_headers() self.wfile.write(value.encode()) elif (operation == "pulseAngle"): angle = float(value) GPIO.pulseAngle(gpio, angle) self.send_response(200) self.send_header("Content-type", "text/plain"); self.end_headers() self.wfile.write(value.encode()) else: # operation unknown self.send_error(404, operation + " Not Found") return elif (relativePath.startswith("macros/")): (mode, fname, value) = relativePath.split("/") if (fname in self.server.callbacks): if ',' in value: args = value.split(',') else: args = [value]callback = self.server.callbacks [fname]self.send_response(200) self.send_header("Content-type", "text/plain"); self.end_headers() self.wfile.write(callback(*args).encode()) else: self.send_error(404, fname + " Not Found") return else: # path unknowns self.send_error(404, "Not Found")
который отправляет ответ скриптупримерно таким нехитрым способом происходит общение одно обращение к WebIOPi.prototype.pulse генерирует один запрос,чтобы повторять запрос нужно вызывать WebIOPi.prototype.pulse через определенные промежутки времении setInterval (pulse"(gpio,callback)", 5000);{ } будет вызываться раз в 5 сенунд для выбранного gpio,и будет выполнятся ваша callback описанное относится к оригинальным файлам webiopi,в файлах от Admina может быть по другому но смысл тот же.
Сообщение отредактировал Zoolu - Пятница, 09.06.2017, 11:28
Спасибо за информацию, я предполагал, что аякс реализован уже, но тогда вопрос - почему при подключении двух, трёх клиентов к серверу происходит затык. Судя по МегаСерверу, аякс должен решать эту проблему? олег
Сообщение отредактировал Zoolu - Вторник, 13.06.2017, 05:26
почему при подключении двух, трёх клиентов к серверу происходит затык
Странно, а я пробовал подключаться через WebIOPi одновременно с компа и смартфона и при этом была возможность "паралельной работы" клиентов. Но я наоборот считаю, что это не есть хорошо. Более оптимальный вариант - работа только с одним клиентом, а если в это время пытается подключится второй, то выводить сообщение, что сессия занята.
почему при подключении двух, трёх клиентов к серверу происходит затык. Судя по МегаСерверу, аякс должен решать эту проблему?
не знаю как там на мегасервере но аякс при неправильном применении как раз способен вызвать проблемы указанные выше
Цитата
то выводить сообщение, что сессия занята.
в этом случае помогает индентификатор сессии
посмотрел код Zoolu насчитал 9 setInterval и такие строки
setInterval ("callMacro_getCelsius_0()", 10000);{ } setInterval ("callMacro_getCelsius_1()", 10000);{ } как я понимаю это два датчика температуры получать их можно одним запросом и вообще посылать всего один аякс запрос,а ответ отдавать в виде json а как производится выдача результата по запросу ,ответ берется из буфера или устройство по получении запроса обращается к датчику и потом выдается ответ?
Сообщение отредактировал alexsis_76 - Вторник, 13.06.2017, 07:22
А я уже привык. Сейчас сервер на ESP, внизу постоянно планшет лежит, на втором этаже другой. Они выступают в роли дистанций, удобно светом управлять и т д. Кто в доме свободно управляют независимо друг от друга. олег
Так вроде бы для массива данных у автора так и сделано? А несколько setInterval нужно, если устанавливать разное время опроса у разных датчиков. Если время олинаковое, то можно и в одном запросе