Использовать Raspberry Pi в качестве сервера, скрипт
Он должен предоставлять данные по запросу другому устройству, клиенту, или выполнять программы по заказу.
Установка сервера служб и данных с помощью Node.js
Вам нужна последняя версия Node, а не версия 0.10 в Raspbian! Чтобы установить его автоматически, вот небольшой скрипт:
#!/bin/sh
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs
Сценарий должен быть выполнен на Raspberry, а не на Windows, так как оболочка чувствительна к кодам конца строки. Для этого введите:
leafpad instnode
Затем скопируйте приведенный выше код (предполагается, что эта страница загружена в браузер Pi). Также можно загрузить сценарий в zip-архив для распаковки на Pi.
Здесь нет sudo, потому что сценарий используется как пользователь, а не администратор. Затем необходимо изменить разрешения, чтобы сделать его исполняемым. Щелкните правой кнопкой мыши имя файла из диспетчера файлов, щелкните права доступа и измените «сделать исполняемым» на «всем».
Затем сценарий можно запустить с помощью:
./instnode
При необходимости можно создать папку для сервера на учетной записи пользователя по умолчанию в/home/pi.
mkdir www
Корень сервера будет:
/home/pi/www
Сервер - простая JavaScript-программа, которую запускают, чтобы вывести Pi в онлайн. Чтобы подключить Pi и другие компьютеры к сети, отправлять HTML-страницы - не цель, это прежде всего отправка команд и получение данных. Вот пример сервера, который выполняет команды и взамен отправляет информацию. Асинхронно.
1) Сервер Node.js
Этот сервисный сервер не отправляет файлы в браузер, скрипт, который это делает, представлен в другой статье, Создание сервера страниц с Node.js. Он получает имя команды и данные для перехода к этой команде и выполняет соответствующий сценарий.
var runner = require("child_process"),
http = require("http"),
path = require("path"),
url = require("url"),
fs = require("fs");
function sendError(errCode, errString, response)
{
response.writeHeader(errCode, {"Content-Type": "text/plain"});
response.write(errString + "\n");
response.end();
return;
}
function sendData(err, content, response)
{
if(err) return sendError(500, err, response);
response.writeHeader(200, {"Content-Type": "text/plain"});
response.write(content + "\n");
response.end();
}
/*
Run a script
This script will send data to the user when it wants.
*/
function runScript(params, response)
{
var command = "";
if(params.script == undefined) return;
if(params.data == undefined) return;
var child = runner.execFile("node",
[params.script, params.data],
function(error, stdout, stderr) {
console.log(error + " " + stdout);
sendData(error, stdout, response);
});
child.on('close', function(code) {
process.exit(1);
});
}
function getCommand(request, response)
{
if(request.method != "POST") {
console.log("POST only supported.");
return;
}
var data = "";
request.on("data", function(chunk) {
data += chunk;
});
request.on("end", function() {
var urlpath = url.parse(request.url).pathname;
if(urlpath == "favicon.ico") return;
var localpath = path.join(process.cwd(), urlpath);
console.log("Requested script: " + localpath);
fs.exists(localpath, function(result) {
var params = {
"script": localpath,
"data" : "\"" + data + "\""
};
runScript(params, response);
});
});
}
var server = http.createServer(getCommand);
server.listen(3000);
console.log("Server available...");
Код имеет необходимые функции для создания сервера, выполнения сценария и передачи данных на этот сценарий. В ответ на запрос он возвращает результат, отображаемый сценарием.
2) Пример очень базовой услуги
Этот демонстрационный сценарий получает и отображает данные, отправленные удаленным компьютером в raspi. В ответ он посылает сообщение «Hello computer!».
function processCommand(data) {
console.log("Received from computer: " + data);
var answer = "Hello computer!";
console.log("Answer:");
console.log(answer);
}
console.log("\nRaspberry: Starting script.js...");
var data = process.argv[2];
processCommand(data);
3) Код использования сервиса другим компьютером
Это снова JavaScript скрипт в командной строке, но может подойти любой другой язык или интерфейс. Он отправляет на сервер имя сценария (скрипт.js) и данные для обработки, в данном случае сообщение «Hello Raspi!».
Затем он отображает ответ, отправленный сценарием на raspi.
http = require("http");
var options = {
host: 'xxx.xxx.xxx.xxx', // the IP of your Raspberry Pi
path: '/script.js',
port: '3000',
method: 'POST'
};
function received(response) {
var message = ''
response.on('data', function (chunk) {
message += chunk;
});
response.on('end', function () {
console.log(message);
});
}
var req = http.request(options, received);
req.write("Hello Raspi!");
req.end();
Чтобы скрипт работал, нужно назначить IP-адресс вашего распи атрибуту host в опциях. Впоследствии вы также сможете выбрать из нескольких сценариев и отправить им данные по мере необходимости...
Этот код прекрасно работает, но добровольно упрощен. Можно улучшить сервер с помощью списка сценариев при выборе и обмене JSON-объектами, а не простыми сообщениями. Принцип тот же с применением стрингифных и парсистских методов. Еще одним улучшением было бы использование Wi-Fi, а не Интернета, что лучше подходит большинству проектов в Raspberry. Это станет предметом следующих статей.
Загрузить код:
Start.js и скрипт.js размещают себя на распи в пользовательском каталоге. Запускаем сервер по «node start.js».
Computer.js размещается на устройстве, которое хочет общаться с распи. Сценарий запускается как «node computer.js».