Мой дневник

12.01.2017

Mongoose-iot и все-все-все

Filed under: Uncategorized — sae762 @ 10:50

…или мой обзор технологий для SoC

Традиционно, начал я с arduino и соответствующего IDE. Все было просто: пишем скетч – компилим – заливаем – работает. Или не работает. Отладка и заливка тут же на столе через serial порт.

Дальше появилась esp8266. И началось…

В целом Arduino IDE с модулем для esp8266 вполне работоспособное решение. Но специфика такова, что для прошивки нужно подпаять провода, замкнуть gpio0 на землю и только тогда прошить. Да и компиляция скетча выдает полностью новую прошивку. Все равно что при замене кнопки в ворде нужно было бы переустановить виндовс 😉 Словом, не очень гибкое решение, и мысль начала двигаться в сторону скриптовых языков.

Интересно было посмотреть на MicroPython. Реализация доступна для целого ряда систем, проект выглядит достаточно зрелым. Но язык мне не очень нравится, в частности его позиционность.

Солидно выглядит решение NodeMCU с их LUA script: можно насыпать разных скриптов в файловую систему и вызывать их по мере необходимости. Большое community, солидная документация. Забегая вперед, скажу, что считаю ее второй по удобству для себя, рзервом. Почему второй: как жависту мне не очень нравится язык LUA (особенно nil ;)), и, что более важно, NodeMCU все же ориентирован на свой контроллер, хотя конечно может развиться в многоплатформенный стандарт.

Тут же на глаза попался и весьма интересный проект Espruino. Система выгодно отличается от предыдущих наличием JavaScript. О самом языке можно конечно спорить, и мне в нем тоже не все нравится, но распространенность его, наверное, вне конкуренции. Espruino в свою очередь имеет встроенную telnet-консоль, что позволяет работать с чипом через wifi. К недостаткам следует отнести отсутствие файловой системы (можно добавить micro-sd, но это другая история), что не позволяет вызывать разные модули. Кроме того, espruino – прежде всего продвигает свой модуль на базе esp8266, так что портирование на другие чипы не входит в приоритеты.

Наконец, поиск довел меня до платформы mongoose-iot. Система имеет встроенный веб-сервер mongoose и самую компактную JS-машину. Как утверждают разработчики, этот код давно используется в микро-системах, даже в космосе. В отличие от espruino здесь встроена SPIFFS – файловая система, файлы можно заливать через веб-интерфейс. К сожалению, здесь тоже есть недостатки. Первый – это недостаток поддержки и документации. Community пока небольшое, но думаю потенциал есть. Второй недостаток, по моему мнению – мало средств для работы с системой через wifi: не видно консоли, нельзя послать команду кроме веб-страницы. Но этот вопрос решается достаточно просто, я дописал телнет-сервер и “веб-консоль”, куда можно отправить javascipt, он будет выполнен посредством eval(), и результат будет отправлен на страницу.

15873223_1285223501559758_2809025836598146840_n

//app.js – этот файл запускается системой при старте. try-catch обязателен, иначе любая ошибка в коде выведет из строя всю js-машину

try {
File.eval(“telnetd.js”);
File.eval(“httpd.js”);
File.eval(“main.js”);
}
catch (e) {
print(e);.
}

telnetd.js – моя попытка сделать телнет-консоль. в целом работает, но вывод реальной консоли уходит в serial, попытка подцепить UART закомментирована

var telnetd = tcp.createServer({}, function(sock) {
sock.write(“welcome, use sock.end() to close\n”);
//blocked console! UART(0).onRecv(function() { var u=UART(0).recv(); sock.write(u); });
sock.on(“data”, function(data) {
var res;
try {
res=eval(data);
} catch (e) {
res=e;
}
sock.write(res+”\n”, null, function() { });
});
sock.on(“close”, function() {sock.end();});
sock.on(“error”, function() {sock.end();});
sock.on(“timeout”, function() {sock.end();});
});

telnetd.listen(23, “0.0.0.0”, 0, function() {
print(“telnetd started”);
});

httpd.js – веб-консоль. по мне наиболе удобный инструмент. url /eval обрабатывает все поступающие на контроллер команды

//from beta4/docs/examples/http-server.md
var parse = function(query) {
var obj = {};
var pairs = query.split(‘&’);
for (var i = 0; i < pairs.length; i++) {
var x = pairs[i].split(‘=’, 2);
obj[x[0]] = x[1];
}
return obj;
}

//

var httpd = Http.createServer(function(req, res) {
// print(req);
if (req.url == ‘/eval’) {
var query = parse(req.body);
var cmd = query.cmd;
var rc;
try {
rc=eval(cmd);
} catch (e) {
rc=e;
}
res.writeHead(200, {‘Access-Control-Allow-Origin’: ‘*’}); //for cross-scripting
res.write(rc);
res.end();
} else {
res.serve();
}
});httpd.listen(80, function() {
print(“httpd started”);
});

main.js – скрипт для инициализации GPIO в нашем случае (см пост о моем проекте по освещению комнаты). может отсутствовать.

GPIO.setMode(12, GPIO.OUT);
GPIO.setMode(13, GPIO.OUT);
GPIO.setMode(14, GPIO.OUT);
GPIO.setMode(5, GPIO.OUT);
GPIO.setMode(2, GPIO.OUT);//test led

GPIO.write(12,0);
GPIO.write(13,0);
GPIO.write(14,0);
GPIO.write(5,0);
GPIO.write(2,1);

К сожалению, веб-консоль пока не полноценная. Сообщения системы поступают на serial-консоль и я не разобрался как их перехватить.

Тем не менее, этого функционала достаточно, чтобы использовать в домашней автоматизации.

Advertisements

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: