Fábio, vamos por partos.
Primeiro, Javascript !=== Java (!=== quer dizer que é diferente e não tem nada a ver). Eu acredito que o Javascript venha a se tornar a linguagem de programação mais importante a se aprender, depois do C.
Bom, vamos falar de port forward. Uma conexão TCP/IP ou UDP/IP sempre tem um IP e uma porta relacionada. Assim, quando você quer acessar o site do
www.google.com, o teu navegador pergunta prá um servidor de DNS (que teu provedor de internet fornece) qual é o IP do domínio google.com. Sabendo deste IP, ele abre um socket (no caso, do tipo TCP) neste IP na porta 80 (porque se você não disse qual porta deseja, o browser sempre abre a porta 80 por padrão). Estabelecido este socket, ele envia umas informações padronizadas pelo protocolo HTTP, recebe respostas, e todo mundo fica mega feliz.
Todo computador conectado em uma rede tem um IP. E todo computador permite abrir 65.536 portas de conexão. Em cada uma destas portas você pode estabelecer um serviço. Um serviço nada mais é um programa que você escreve de forma que ele fique escutando numa determinada porta, num determinado protocolo (TCP ou UDP) e espera informações em um outro protocolo, que pode ser padrão (como HTTP, Telnet, SSH, FTP, etc), ou pode ser num protocolo que você inventar.
Do outro lado da rede, se um computador deseja acessar teu serviço, ele precisa estabelecer um socket (que é uma conexão)no IP do teu computador, na porta que teu serviço está escutando, no protocolo que ele está escutando, e enviar as informações no protocolo que você está usando ou inventou. Simples assim.
O problema é que temos dois tipos de IP: os IPs verdadeiros e os IPs falsos.
Os IPs verdadeiros são aqueles que não começam com 127.0.0.1, 192.168.X.X, 172.X.X.X, 10.X.X.X (obviamente, estou falando somente de IPV4). O pepino é que eles são poucos, e estão acabando. Assim, somente máquinas que estejam efetivamente na Internet, ganham IPs verdadeiros. Um macete utilizado prá conectar muito mais máquinas na Internet é usar redes com IPs falsos. Desta forma, você cria uma rede local ethernet, escolhe uma faixa de IPs falsos que preferir, e dá um IP falso prá cada uma. Porém, uma das máquinas terá duas placas de rede, uma ligada na Internet, outra ligada na rede local. Assim, somente esta máquina que está conectada na Internet (chamada de gateway), ganha IP verdadeiro. Nos outros computadores, é feita uma configuração do IP falso do gateway. Quando um computador quer acessar uma máquina na Internet (por exemplo, o google), ele manda a conexão para o gateway e pede educadamente que ele faça de conta que é ele que quer acessar o google, e repita tudo que receber do google de volta para ele.
A zica é: como uma máquina que esteja na Internet acessa o serviço que está rodando no teu computador que possui um IP falso? Não consegue.
Um truque para burlar esta limitação é criar um port forward. No gateway, é feita uma configuração, onde você escolhe uma porta que o gateway ficará escutando. E você configura para que qualquer conexão nesta porta ele reenvie para um determinado computador e porta dentro da rede local. Por exemplo, o IP e porta do teu serviço rodando no teu computador.
Tá, mas você não tem um computador com duas placas de rede, uma ligada na Internet e outra na rede lcal, certo? Errado, você tem sim. Este computador é teu modem. Um modem não passa de um computador dedicado para esta tarefa. No meu caso eu uso ADSL da GVT. Meu modem possui uma porta que ligo na linha telefônica, e ele possui uma porta de ethernet onde ele estáligado uma rede local, e mais uma saída wi-fi, que está em outra rede local.
Tá, mas você não configurou nada de IP, nem endereço de gateway nos teus computadores, certo? Errado, você fez sim, mas deixou que o modem fizesse isso tudo, por meio de um serviço chamado DHCP.
Pois então, vamos colocar em números. Suponha que você tem em casa uma rede local, cujos IPs são 192.168.0.X. Suponha que teu modem (que é o gateway) tenha IP 192.168.0.1, e suponha que você configurou tua BBB para o IP 192.168.0.30. É importante colocar um IP fixo na BBB, por motivos óbvios.
Aí suponha que você escreveu um programa que fica escutando na porta 14500 (eu inventei esse número agora, sem motivo nenhum). Beleza. Outros computadores dentro da tua rede local podem acessar este IP e porta.
Tá, mas como faz o port forward? Simples e complicado: você acessa a página de configurações do teu modem, procura as opções de port forward, e cria uma nova regra. Escolhe uma porta (que pode ser 14500, ou qualquer outra), e diz que conexões que cheguem nesta porta sejam redirecionados para o IP 192.168.0.30, na porta 14500. Pronto. Agora uma máquina na Internet, conectada pelo meio que for, se acessar o IP verdadeiro do teu modem na porta que você configurou a regra de forward, vai cair direto na tua BBB.
Tá, mas e a questão do IP do modem mudar o tempo todo? Prá isto, você usa um serviço de DynDNS (como por exemplo o no-ip). Se o modem suportar (tem que ver no manual dele se ele permite), é possível que ele converser com o seridor do no-ip e informe sempre que o IP dele mudar, e você pode acessar teu serviço por meio de um nome de domínio.
Tá, e como faz em javascript e no node.js um serviço rodando na BBB?
Aqui tem um exemplinho bobo (que usei recentemente num trabalho da faculdade):
- Código: Selecionar todos
var b = require('bonescript');
var led = 'P9_12';
var pot = 'P9_36';
b.pinMode(led, b.OUTPUT);
console.log("Sensor Iniciado");
var net = require('net');
net.createServer(conexao).listen(14500);
var leitura = 0;
var x = 0;
function converte()
{
b.analogRead(pot, function(valor)
{
var angulo = 0;
angulo = Math.round(valor.value * 270);
console.log("Leitura: " + angulo);
leitura = angulo;
});
if(x == 0)
{
x = 1;
b.digitalWrite(led, 1);
}
else
{
x = 0;
b.digitalWrite(led, 0);
}
}
function conexao(meia)
{
console.log("Conectado: " + meia.remoteAddress + ":" + meia.remotePort);
meia.on('data', function()
{
console.log("Realizando conversão");
converte();
meia.write(leitura.toString());
console.log("Valor convertido: " + leitura);
});
meia.on('close', function()
{
console.log("Encerrando conexao");
meia.destroy();
});
}
Neste programa, eu tenho um LED ligado no pino P9_12 e um potenciômetro no pino P9_36. Ele fica escutando na porta 14500, e se receber um dado qualquer, ele faz uma conversão AD do potenciômetro, inverte o led, e envia como ASC o valor desta conversão. Simples assim.
Acredite, TCP/IP é f*d@, eu tive que implementar num PIC e foi um trampo do além. Isso aí em cima é uma sonho.
Se quiser usar protocolo HTTP, basta usar um módulo no node chamado http, mas algumas coisas precisa fazer na mão. Ou usa um módulo chamado express, que faz quase tudo que você precisa sozinho. Se quser, tenho exemplo com http que pegava esta informação, colocava numa página web, e envia para um broswer, também em javascript sobre node.js.