Использовать 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».