udp_tcp_http

dev
IoTcat 3 years ago
parent e8c7e9b82b
commit 3db6fc1bf5
  1. 23
      examples/http.js
  2. 1
      examples/pwm_operate_adc.js
  3. 25
      examples/redis.js
  4. 134
      src/cli/compiler.js
  5. 24
      src/director/modules/nodetable.js
  6. 14
      src/director/test.js
  7. BIN
      src/drivers/nodemcu/lua/lfs.img
  8. BIN
      src/drivers/nodemcu/lua/lfs.zip
  9. 18
      src/drivers/nodemcu/lua/lfs/wiot.lua

@ -0,0 +1,23 @@
//import wiot compiler
const wiot = require('../../src/cli/compiler.js');
//node ID array
let nids = ['7534c', 'b840a', '1d17a', '9f163', '8908c',
'39747', '308b4', 'd689e', '30e3f', '0d672'];
//node object array constructed from the above node IDs
let nodes = nids.map(nid=>new wiot.node.nodemcu(nid));
//create a virtual wire
let w = new wiot.wire(0),
w1 = new wiot.wire(),
w3 = new wiot.wire(),
w2 = new wiot.wire();
let node = nodes[0];
let node1 = nodes[1];
wiot.gpio(wiot.INPUT, node.D3, w1, node);
//wiot.gpio(wiot.INPUT, node1.D3, w2, node1);
//wiot.print(node, w1, w1);
wiot.operate(`'http://192.168.3.100:5001/?value='..$0`, node, w3, w1);
wiot.http(w, w2, w3, node)

@ -31,6 +31,7 @@ let node1 = nodes[1];
//wiot.gpio(wiot.OUTPUT, node.D4, w, node);
//wiot.operate('math.floor($0/600)', node, w, w1);
wiot.operate('($0/2)+300', node, w, w1);
//wiot.operate(wiot.if(wiot.if(`$0<400`, false, true), 700, 0), node, w, w1);
wiot.pwm(nodes[0].D4, w, new wiot.wire(500), nodes[0]);

@ -0,0 +1,25 @@
//import wiot compiler
const wiot = require('../../src/cli/compiler.js');
//node ID array
let nids = ['7534c', 'b840a', '1d17a', '9f163', '8908c',
'39747', '308b4', 'd689e', '30e3f', '0d672'];
//node object array constructed from the above node IDs
let nodes = nids.map(nid=>new wiot.node.nodemcu(nid));
//create a virtual wire
let w = new wiot.wire(0),
w1 = new wiot.wire(),
w3 = new wiot.wire(),
w2 = new wiot.wire();
let node = nodes[0];
let node1 = nodes[1];
wiot.gpio(wiot.INPUT, node.D3, w1, node);
//wiot.gpio(wiot.INPUT, node1.D3, w2, node1);
//wiot.print(node, w1, w1);
wiot.redis(w2, w1, node, '192.168.3.4', 'test2');
wiot.print(node, w2)

@ -188,17 +188,24 @@ const wiot = {
D7: 7,
D8: 8
}
wiot.__[nid].method = wiot.__udpMethod(wiot.__[nid]);
wiot.__[nid].method = wiot.__primitiveMethod(wiot.__[nid]);
shortcut(wiot.__[nid], wiot.__[nid].method);
return wiot.__[nid];
}
},
__systemPrimitive: {
},
__udpMethod: (node) => ({
__primitiveMethod: (node) => ({
trigger: function(wire, cmd){
node.regs[wire.reg].trigger.push(cmd);
if(Array.isArray(wire) && wire.length > 1){
let func = Reg();
node.setReg(func);
node.prepare(`${func}=function()${cmd}end;`);
wire.forEach(item=>{
node.regs[item.reg].trigger.push(`${func}();`);
});
}else{
if(Array.isArray(wire)) node.regs[wire[0].reg].trigger.push(cmd);
else node.regs[wire.reg].trigger.push(cmd);
}
},
unique: function(){
node.head = uniqueArr(node.head);
@ -234,13 +241,16 @@ const wiot = {
},
prepare: function(cmd){
node.body.push(cmd);
},
finale: function(cmd){
node.footer.push(cmd);
}
}),
__systemMethod: {
Reg: Reg
},
newUDP: (type, getObj, genCode) => {
wiot.udp[type] = function(){
newPrimitive: (type, getObj, genCode) => {
wiot.primitive[type] = function(){
let o =getObj(...arguments);
o.type = type;
o.__hash = md5(Math.random());
@ -257,20 +267,20 @@ const wiot = {
sync();
return o;
};
shortcut(wiot, wiot.udp)
shortcut(wiot, wiot.primitive)
},
newOperator: (type, genExpression) => {
wiot.operator[type] = genExpression;
shortcut(wiot, wiot.operator)
},
udp: {},
primitive: {},
operator: {}
}
/* wire shortcut */
wiot.newUDP('wire', (default_value = 0, isPersist = false) => ({
wiot.newPrimitive('wire', (default_value = 0, isPersist = false) => ({
reg: Reg(),
default: default_value,
isPersist: isPersist,
@ -296,7 +306,7 @@ wiot.newUDP('wire', (default_value = 0, isPersist = false) => ({
/* pre-installed udp defination */
wiot.newUDP('gpio', (mode, pin, wire, node) => ({
wiot.newPrimitive('gpio', (mode, pin, wire, node) => ({
node: node,
pin: pin,
mode: mode,
@ -314,7 +324,7 @@ wiot.newUDP('gpio', (mode, pin, wire, node) => ({
});
wiot.newUDP('buffer', (wire_output, wire_input, node, delay_s = 0) => ({
wiot.newPrimitive('buffer', (wire_output, wire_input, node, delay_s = 0) => ({
node: node,
delay_s: delay_s,
input: [wire_input],
@ -329,7 +339,7 @@ wiot.newUDP('buffer', (wire_output, wire_input, node, delay_s = 0) => ({
});
wiot.newUDP('operate', (expression, node, wire_output, ...wires_input) => ({
wiot.newPrimitive('operate', (expression, node, wire_output, ...wires_input) => ({
node: node,
expression: expression,
input: wires_input,
@ -340,18 +350,19 @@ wiot.newUDP('operate', (expression, node, wire_output, ...wires_input) => ({
o.input.forEach((wire, index) => {
s = s.replace(new RegExp('\\$'+index, 'g'), wire.reg);
});
let func = method.Reg();
node.setReg(func);
node.prepare(`${func}=function()${o.output[0].reg}=${s};end;`);
o.input.forEach(wire => {
node.trigger(wire, `${func}();`);
});
node.trigger(o.input, `${o.output[0].reg}=${s};`);
});
wiot.newPrimitive('print', (node, ...wires_input) => ({
node: node,
input: wires_input
}), (o, method) => {
let node = o.node;
let s = `print(`;
node.trigger(o.input, `print(${o.input.map(wire=>wire.reg).join(',')});`);
});
wiot.newUDP('pwm', (pin, wire_duty, wire_clock, node) => ({
wiot.newPrimitive('pwm', (pin, wire_duty, wire_clock, node) => ({
node: node,
pin: pin,
input: [wire_duty, wire_clock]
@ -364,7 +375,7 @@ wiot.newUDP('pwm', (pin, wire_duty, wire_clock, node) => ({
});
wiot.newUDP('adc', (wire_output, node) => ({
wiot.newPrimitive('adc', (wire_output, node) => ({
node: node,
pin: 0,
output: [wire_output]
@ -373,11 +384,84 @@ wiot.newUDP('adc', (wire_output, node) => ({
node.always(`${o.output[0].reg}=adc.read(${o.pin});`);
});
wiot.newPrimitive('http', (wire_statusCode, wire_res, wire_url, node, wire_body = new wiot.wire(`''`), header = 'nil', method = 'GET') => ({
node: node,
header: header,
method: method,
output: [wire_statusCode, wire_res],
input: [wire_url, wire_body]
}), (o, method) => {
let node = o.node;
node.trigger(o.input, `http.request(${o.input[0].reg},'${o.method}','${o.header}',${o.input[1].reg},function(c,d)${o.output[0].reg}=c;${o.output[1].reg}=d;end);`);
});
wiot.newPrimitive('redis', (wire_res, wire_send, node, host, channel, port = 6379) => ({
node: node,
host: host,
port: port,
channel: channel,
output: [wire_res],
input: [wire_send]
}), (o, method) => {
let node = o.node;
let vpub = method.Reg(),
vsub = method.Reg();
node.setReg(vpub);
node.setReg(vsub);
node.prepare(`${vpub}=node.LFS.redis().connect('${o.host}',${o.port});`);
node.prepare(`${vsub}=node.LFS.redis().connect('${o.host}',${o.port});`);
node.finale(`${vsub}:subscribe('${o.channel}',function(c,m)${o.output[0].reg}=m;end);`);
node.trigger(o.input, `${vpub}:publish('${o.channel}',tostring(${o.input[0].reg}));`);
});
wiot.newPrimitive('udp', (wire_res_ip, wire_res_port, wire_res_data, wire_send_ip, wire_send_port, wire_send_data, node, localport = parseInt(Math.random()*20000)+10000) => ({
node: node,
localport: localport,
output: [wire_res_ip, wire_res_port, wire_res_data],
input: [wire_send_ip, wire_send_port, wire_send_data]
}), (o, method) => {
let node = o.node;
let v = method.Reg()
node.setReg(v);
node.prepare(`${v}=net.createUDPSocket();`);
node.prepare(`${v}:listen(${o.localport});`);
node.trigger(o.input[2], `${v}:send(${o.input[1].reg},${o.input[0].reg},tostring(${o.input[2].reg}));`);
node.finale(`${v}:on('receive',function(s,d,p,i)${o.output[2].reg}=d;${o.output[1].reg}=p;${o.output[0].reg}=i;end);`);
});
wiot.newPrimitive('tcp', (wire_res_data, wire_send_data, node, host, port) => ({
node: node,
host: host,
port: port,
output: [wire_res_data],
input: [wire_send_data]
}), (o, method) => {
let node = o.node;
let v = method.Reg()
let status = method.Reg();
node.setReg(v);
node.setReg(status, false);
node.prepare(`${v}=net.createConnection(net.TCP,0);`);
node.finale(`${v}:connect(${o.port},'${o.host}');`);
node.trigger(o.input[0], `if ${status} then ${v}:send(tostring(${o.input[0].reg}));end;`);
node.prepare(`${v}:on('receive',function(s,d)${o.output[0].reg}=d;end);`);
node.prepare(`${v}:on('connection',function()${status}=true;end);`);
node.prepare(`${v}:on('disconnection',function()${status}=false;tmr.create():alarm(1000,tmr.ALARM_SINGLE,function()${v}:connect(${o.port},'${o.host}');end);end);`);
});
wiot.newOperator('if', (condition, ifTrue, ifFalse) => {
return `((${condition})and{${ifTrue}}or{${ifFalse}})[1]`;
});
/*
wiot.newOperator('strIndexOf', (str, segment) => {
return `string.find(${str},${segment})`;
});
@ -385,6 +469,8 @@ wiot.newOperator('strIndexOf', (str, segment) => {
wiot.newOperator('strSubStr', (str, pos, length) => {
return `string.sub(${str},${pos}${length?`,${length}`:``})`;
});
*/
module.exports = wiot;

@ -24,7 +24,29 @@ module.exports = (logger, host = '0.0.0.0', port = 6789) => {
return false;
}
try{
nidtable[nid].socket.write(JSON.stringify(data));
let raw = JSON.stringify(data);
if(raw.length>1300){
let rawArr = [];
let flag = require('md5')(Math.random()).substring(0,1);
let n = 1300;
for (let i = 0; i < raw.length/n; i++) {
let prefix = '&';
if(i == 0){
prefix = '^';
}
if(i >= raw.length/n - 1){
prefix = '$';
}
setTimeout(()=>{
console.log(prefix + flag + raw.slice(n*i, n*(i+1)))
nidtable[nid].socket.write(prefix + flag + raw.slice(n*i, n*(i+1)));
}, i*2);
}
}else{
nidtable[nid].socket.write(raw);
}
if(!isudp) nidtable[nid].status = false;
}catch(e){
flow.error('[OUTGOING]', '<nid lookup failure>', data.to+'<--'+data.from, data.name, data.body);

@ -0,0 +1,14 @@
const express = require('express')
const app = express()
const port = 5001;
app.get('/', (req, res) => {
res.send('Hello World!')
console.log(req.query)
})
app.listen(port, () => {
})

Binary file not shown.

Binary file not shown.

@ -284,14 +284,30 @@ __main = coroutine.create(function(__run)
end
end
});
--msgLongMsgReceive
local cache_longData = nil;
local cache_flag = nil;
--MSG Reg Method
msgReg_run = function(data) --(string incomingData) => nil
if string.sub(data, 1, 1) == '^' then
cache_flag = string.sub(data, 2, 2);
cache_longData = string.sub(data, 3);
return;
elseif string.sub(data, 1, 1) == '&' and string.sub(data, 2, 2) == cache_flag then
cache_longData = cache_longData..string.sub(data, 3);
return;
elseif string.sub(data, 1, 1) == '$' and string.sub(data, 2, 2) == cache_flag then
data = cache_longData..string.sub(data, 3);
cache_longData = nil;
cache_flag = nil;
end
--decode data
local data = pack.decode(data);
--check data
if type(data) ~= 'table' or type(data.from) ~= 'string' or type(data.name) ~= 'string' or data.to ~= config.nid then
return nil;
end;
end
--Search mached methods in MSG register
local method = msgReg[data.name];
if type(method) == 'function' then

Loading…
Cancel
Save