Изменение имен файлов и добавление сборки для Windows
This commit is contained in:
parent
b10c418fc2
commit
b51338f60a
|
|
@ -0,0 +1,80 @@
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# TypeScript v1 declaration files
|
||||||
|
typings/
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# next.js build output
|
||||||
|
.next
|
||||||
|
|
||||||
|
# nuxt.js build output
|
||||||
|
.nuxt
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
# tibbo_uploader
|
# tibbo_uploader
|
||||||
ПО для программирования устройств tibbo из линукса.
|
ПО для программирования устройств tibbo из линукса.
|
||||||
|
|
||||||
Скачивать по ссылке - https://github.com/awarm/tibbo_uploader/raw/master/exec/tibbo_uploader
|
Скачивать по ссылке:
|
||||||
|
|
||||||
wget -c https://github.com/awarm/tibbo_uploader/raw/master/exec/tibbo_uploader
|
* Linux - https://github.com/awarm/tibbo_uploader/raw/master/exec/tibbo_uploader
|
||||||
|
* Windows - https://github.com/awarm/tibbo_uploader/raw/master/exec/tibbo_uploader.exe
|
||||||
|
|
||||||
После скачивания выполнить комманду
|
После скачивания выполнить комманду
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -219,19 +219,6 @@
|
||||||
"es5-ext": "~0.10.2"
|
"es5-ext": "~0.10.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"debug": {
|
|
||||||
"version": "4.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
|
|
||||||
"integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
|
|
||||||
"requires": {
|
|
||||||
"ms": "^2.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dgram": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"resolved": "http://registry.npmjs.org/dgram/-/dgram-1.0.1.tgz",
|
|
||||||
"integrity": "sha1-N/OyAPgDOl/3WTAwicgc42G2UcM="
|
|
||||||
},
|
|
||||||
"engine.io": {
|
"engine.io": {
|
||||||
"version": "3.2.1",
|
"version": "3.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz",
|
||||||
|
|
@ -570,11 +557,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
|
||||||
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
|
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
|
||||||
},
|
},
|
||||||
"ms": {
|
|
||||||
"version": "2.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
|
||||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
|
||||||
},
|
|
||||||
"mute-stream": {
|
"mute-stream": {
|
||||||
"version": "0.0.7",
|
"version": "0.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,379 +1,379 @@
|
||||||
//var net_addr = "192.168.123.255";
|
var net_addr = "192.168.123.255";
|
||||||
net_addr = "10.0.50.255";
|
//net_addr = "10.0.50.255";
|
||||||
|
|
||||||
|
|
||||||
const files_path = "./";
|
const files_path = "./";
|
||||||
|
|
||||||
const dgram = require('dgram'),
|
const dgram = require('dgram'),
|
||||||
clui = require('clui'),
|
clui = require('clui'),
|
||||||
// clc = require('cli-color'),
|
// clc = require('cli-color'),
|
||||||
// Line = clui.Line,
|
// Line = clui.Line,
|
||||||
Spinner = clui.Spinner,
|
Spinner = clui.Spinner,
|
||||||
Progress = clui.Progress,
|
Progress = clui.Progress,
|
||||||
inquirer = require('inquirer'),
|
inquirer = require('inquirer'),
|
||||||
fs = require('fs');
|
fs = require('fs');
|
||||||
|
|
||||||
const shortSearch = 2, longSearch = 8;
|
const shortSearch = 2, longSearch = 8;
|
||||||
const countdown = new Spinner('Поиск устройств. Найдено [0] Осталось 10 секунд... ', ['|', '/', '-', ' ']);// ['⣾','⣽','⣻','⢿','⡿','⣟','⣯','⣷']);
|
const countdown = new Spinner('Поиск устройств. Найдено [0] Осталось 10 секунд... ', ['|', '/', '-', ' ']);// ['⣾','⣽','⣻','⢿','⡿','⣟','⣯','⣷']);
|
||||||
const m2 = [
|
const m2 = [
|
||||||
"Загрузка прошивки" ,
|
"Загрузка прошивки" ,
|
||||||
{ name: "Загрузка firmware" },
|
{ name: "Загрузка firmware" },
|
||||||
"Перезагрузка",
|
"Перезагрузка",
|
||||||
new inquirer.Separator(),
|
new inquirer.Separator(),
|
||||||
"Выход",
|
"Выход",
|
||||||
];
|
];
|
||||||
// const confirmMenu = [
|
// const confirmMenu = [
|
||||||
// "Да", "Нет"
|
// "Да", "Нет"
|
||||||
// ]
|
// ]
|
||||||
const client = dgram.createSocket('udp4');
|
const client = dgram.createSocket('udp4');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var number = shortSearch;
|
var number = shortSearch;
|
||||||
var mode = 1; // work mode - 1: search devices, 2 - uploading
|
var mode = 1; // work mode - 1: search devices, 2 - uploading
|
||||||
var devices = []; // device list
|
var devices = []; // device list
|
||||||
var progressbar;
|
var progressbar;
|
||||||
var step = 1; //upload step
|
var step = 1; //upload step
|
||||||
var stopTimer;
|
var stopTimer;
|
||||||
var mac=""; // current device mac address
|
var mac=""; // current device mac address
|
||||||
var fdata =[]; // uploading file content
|
var fdata =[]; // uploading file content
|
||||||
var pageNumber = 0; // page of uploading file
|
var pageNumber = 0; // page of uploading file
|
||||||
var session = (Math.random() * 0xFFFFFFFF).toString(16); // work session
|
var session = (Math.random() * 0xFFFFFFFF).toString(16); // work session
|
||||||
var pr;
|
var pr;
|
||||||
var firmvare = 0;
|
var firmvare = 0;
|
||||||
|
|
||||||
|
|
||||||
// **
|
// **
|
||||||
// Get work network interface
|
// Get work network interface
|
||||||
// used for create disable stoofing filter command
|
// used for create disable stoofing filter command
|
||||||
// **
|
// **
|
||||||
function getInterface(){
|
function getInterface(){
|
||||||
var net = require('os').networkInterfaces();
|
var net = require('os').networkInterfaces();
|
||||||
for (var ifs in net) {
|
for (var ifs in net) {
|
||||||
var res = net[ifs].find(ip => {
|
var res = net[ifs].find(ip => {
|
||||||
return ip.address.includes(net_addr.substring(0,net_addr.length-3))
|
return ip.address.includes(net_addr.substring(0,net_addr.length-3))
|
||||||
});
|
});
|
||||||
if (res)
|
if (res)
|
||||||
return ifs;
|
return ifs;
|
||||||
}
|
}
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
// function confirm(message){
|
// function confirm(message){
|
||||||
// var deferred = Q.defer();
|
// var deferred = Q.defer();
|
||||||
// showMenu(confirmMenu, message, (choice)=>{
|
// showMenu(confirmMenu, message, (choice)=>{
|
||||||
// console.log(choice)
|
// console.log(choice)
|
||||||
// if (choice == "Да")
|
// if (choice == "Да")
|
||||||
// deferred.resolve(true);
|
// deferred.resolve(true);
|
||||||
// else
|
// else
|
||||||
// deferred.reject(false);
|
// deferred.reject(false);
|
||||||
// })
|
// })
|
||||||
// return deferred.promise;
|
// return deferred.promise;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
function toBytesInt16(num){
|
function toBytesInt16(num){
|
||||||
return [(num & 0xff00) >> 8,(num & 0x00ff)];
|
return [(num & 0xff00) >> 8,(num & 0x00ff)];
|
||||||
}
|
}
|
||||||
// **
|
// **
|
||||||
// Send command to device
|
// Send command to device
|
||||||
// **
|
// **
|
||||||
function send(cmd,addr,msg,result){
|
function send(cmd,addr,msg,result){
|
||||||
var mess = "_"+addr+cmd+ (msg? "|"+msg :"");
|
var mess = "_"+addr+cmd+ (msg? "|"+msg :"");
|
||||||
client.send(mess,0,mess.length,65535,net_addr,result);
|
client.send(mess,0,mess.length,65535,net_addr,result);
|
||||||
}
|
}
|
||||||
// **
|
// **
|
||||||
// process error result
|
// process error result
|
||||||
// **
|
// **
|
||||||
function result(err,bytes) {
|
function result(err,bytes) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
};
|
};
|
||||||
function getFilesInDirectory (path,ext) {
|
function getFilesInDirectory (path,ext) {
|
||||||
let dir = fs.readdirSync( path );
|
let dir = fs.readdirSync( path );
|
||||||
return dir.filter( elm => elm.match(new RegExp(`.*\.(${ext})$`, 'ig')));
|
return dir.filter( elm => elm.match(new RegExp(`.*\.(${ext})$`, 'ig')));
|
||||||
}
|
}
|
||||||
function getFile(path){
|
function getFile(path){
|
||||||
return fs.readFileSync(path);
|
return fs.readFileSync(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("")
|
console.log("")
|
||||||
console.log("Программа обновления прошивки для устройств Tibbo");
|
console.log("Программа обновления прошивки для устройств Tibbo");
|
||||||
console.log("")
|
console.log("")
|
||||||
|
|
||||||
// attach events
|
// attach events
|
||||||
client.on('listening', () =>{ // udp net binding
|
client.on('listening', () =>{ // udp net binding
|
||||||
client.setBroadcast(1);
|
client.setBroadcast(1);
|
||||||
startSearch();
|
startSearch();
|
||||||
});
|
});
|
||||||
var tm;
|
var tm;
|
||||||
client.on('message',(msg,rinfo) => { // udp message recived
|
client.on('message',(msg,rinfo) => { // udp message recived
|
||||||
var m = msg.toString(); // message string from Buffer
|
var m = msg.toString(); // message string from Buffer
|
||||||
var addr = msg.toString().substring(0,25); // device mac address
|
var addr = msg.toString().substring(0,25); // device mac address
|
||||||
switch (mode){
|
switch (mode){
|
||||||
case 1:{ // поиск устройств
|
case 1:{ // поиск устройств
|
||||||
var d = devices.find(obj => { return obj.mac === addr });
|
var d = devices.find(obj => { return obj.mac === addr });
|
||||||
if (!d){
|
if (!d){
|
||||||
devices.push({mac: addr, ip: rinfo.address});
|
devices.push({mac: addr, ip: rinfo.address});
|
||||||
// get device information
|
// get device information
|
||||||
client.send("_"+addr+ "X",65535,net_addr);
|
client.send("_"+addr+ "X",65535,net_addr);
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
if (m.indexOf('/') >0){
|
if (m.indexOf('/') >0){
|
||||||
if (m.indexOf('/')==m.lastIndexOf('/')){
|
if (m.indexOf('/')==m.lastIndexOf('/')){
|
||||||
d.platform = m.substr(26,m.length-27);
|
d.platform = m.substr(26,m.length-27);
|
||||||
d.app_version = ""
|
d.app_version = ""
|
||||||
}else{
|
}else{
|
||||||
d.platform = m.substr(27,m.indexOf('/')-28);
|
d.platform = m.substr(27,m.indexOf('/')-28);
|
||||||
d.app_version = m.substr(m.lastIndexOf('/')+1);
|
d.app_version = m.substr(m.lastIndexOf('/')+1);
|
||||||
}
|
}
|
||||||
}else
|
}else
|
||||||
if ( !d.platform || d.app_version){ // requery if information not full
|
if ( !d.platform || d.app_version){ // requery if information not full
|
||||||
client.send("_"+addr+ "X",65535,net_addr);
|
client.send("_"+addr+ "X",65535,net_addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
countdown.message ("Поиск устройств. Найдено [" + devices.length + "] Осталось "+number+" секунд... ");
|
countdown.message ("Поиск устройств. Найдено [" + devices.length + "] Осталось "+number+" секунд... ");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2:{ // Программирование
|
case 2:{ // Программирование
|
||||||
switch (step){
|
switch (step){
|
||||||
case 1: // switch device to update mode
|
case 1: // switch device to update mode
|
||||||
if (m.indexOf(session)<=0)
|
if (m.indexOf(session)<=0)
|
||||||
return;
|
return;
|
||||||
if (addr == mac){
|
if (addr == mac){
|
||||||
step=2; // send first data blocks
|
step=2; // send first data blocks
|
||||||
var cmdd="Q";
|
var cmdd="Q";
|
||||||
if (firmware==1)
|
if (firmware==1)
|
||||||
cmdd="QF";
|
cmdd="QF";
|
||||||
send(cmdd,mac,session);
|
send(cmdd,mac,session);
|
||||||
tm = setInterval(function(){
|
tm = setInterval(function(){
|
||||||
var cmdd="Q";
|
var cmdd="Q";
|
||||||
if (firmware==1)
|
if (firmware==1)
|
||||||
cmdd="QF";
|
cmdd="QF";
|
||||||
send(cmdd,mac,session);
|
send(cmdd,mac,session);
|
||||||
},500); // resend every 0.5 sec
|
},500); // resend every 0.5 sec
|
||||||
}else{
|
}else{
|
||||||
console.log("ERROR - wrong reply",)
|
console.log("ERROR - wrong reply",)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: // sending first block
|
case 2: // sending first block
|
||||||
if (pageNumber == 0 && addr == mac && m.indexOf(session>0))
|
if (pageNumber == 0 && addr == mac && m.indexOf(session>0))
|
||||||
if (tm){
|
if (tm){
|
||||||
clearInterval(tm);
|
clearInterval(tm);
|
||||||
}
|
}
|
||||||
progressbar = new Progress(20);
|
progressbar = new Progress(20);
|
||||||
process.stdout.write("\u001b[1000D"+progressbar.update(pageNumber,fdata.length/128))
|
process.stdout.write("\u001b[1000D"+progressbar.update(pageNumber,fdata.length/128))
|
||||||
stopTimer = setTimeout(()=>{
|
stopTimer = setTimeout(()=>{
|
||||||
// clearInterval(pr);
|
// clearInterval(pr);
|
||||||
console.log();
|
console.log();
|
||||||
console.log("ОШИБКА: Ответ от устройства не получен!");
|
console.log("ОШИБКА: Ответ от устройства не получен!");
|
||||||
console.log("Возможно включена защита от Spoofing'а");
|
console.log("Возможно включена защита от Spoofing'а");
|
||||||
console.log("Для отключения выполните комманду : ");
|
console.log("Для отключения выполните комманду : ");
|
||||||
console.log("\tsudo sysctl net.ipv4.conf.all.rp_filter=0 && sudo sysctl net.ipv4.conf." +getInterface()+ ".rp_filter=0");
|
console.log("\tsudo sysctl net.ipv4.conf.all.rp_filter=0 && sudo sysctl net.ipv4.conf." +getInterface()+ ".rp_filter=0");
|
||||||
console.log();
|
console.log();
|
||||||
process.exit();
|
process.exit();
|
||||||
},15000)
|
},15000)
|
||||||
sendFilePage();
|
sendFilePage();
|
||||||
break;
|
break;
|
||||||
case 3: // wait confirm block recieved switch to this mode in sendFilePage()
|
case 3: // wait confirm block recieved switch to this mode in sendFilePage()
|
||||||
var b = toBytesInt16(pageNumber);
|
var b = toBytesInt16(pageNumber);
|
||||||
if (pageNumber >= 0 && addr == mac)
|
if (pageNumber >= 0 && addr == mac)
|
||||||
{
|
{
|
||||||
if (stopTimer) { // stop wrong net config check timer
|
if (stopTimer) { // stop wrong net config check timer
|
||||||
clearTimeout(stopTimer);
|
clearTimeout(stopTimer);
|
||||||
stopTimer=null;
|
stopTimer=null;
|
||||||
}
|
}
|
||||||
var b11 = Buffer.from([0x41,b[0],b[1]]) // number of confirmed block
|
var b11 = Buffer.from([0x41,b[0],b[1]]) // number of confirmed block
|
||||||
if (msg.compare(b11,0,3,25)==0){
|
if (msg.compare(b11,0,3,25)==0){
|
||||||
pageNumber++; // change current block number
|
pageNumber++; // change current block number
|
||||||
process.stdout.write("\u001b[1000D"+progressbar.update(pageNumber,fdata.length/128))
|
process.stdout.write("\u001b[1000D"+progressbar.update(pageNumber,fdata.length/128))
|
||||||
|
|
||||||
if (((pageNumber)*128) >= fdata.length-1){ // if last block confirmed
|
if (((pageNumber)*128) >= fdata.length-1){ // if last block confirmed
|
||||||
step = 4; // switch to final step
|
step = 4; // switch to final step
|
||||||
if (firmware==1)
|
if (firmware==1)
|
||||||
send("N",mac,session); // switch device to normal mode
|
send("N",mac,session); // switch device to normal mode
|
||||||
else
|
else
|
||||||
send("T",mac,session); // switch device to normal mode
|
send("T",mac,session); // switch device to normal mode
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
sendFilePage();
|
sendFilePage();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4: // get last success message and switch to search mode
|
case 4: // get last success message and switch to search mode
|
||||||
if (addr == mac && msg[25]==0x41){
|
if (addr == mac && msg[25]==0x41){
|
||||||
clearTimeout(stopTimer);
|
clearTimeout(stopTimer);
|
||||||
send("E",mac,session); // send reboot command to device (if it id not auto reboot)
|
send("E",mac,session); // send reboot command to device (if it id not auto reboot)
|
||||||
console.log("");
|
console.log("");
|
||||||
console.log("Загрузка завершена успешно");
|
console.log("Загрузка завершена успешно");
|
||||||
console.log("");
|
console.log("");
|
||||||
mode = 1;
|
mode = 1;
|
||||||
step = 1;
|
step = 1;
|
||||||
number = longSearch; // long time search for wait to device reboot and network ready
|
number = longSearch; // long time search for wait to device reboot and network ready
|
||||||
fdata = []; // clear file content buffer
|
fdata = []; // clear file content buffer
|
||||||
startSearch();
|
startSearch();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
client.on('close', function() {
|
client.on('close', function() {
|
||||||
console.log('Соединение неожиданно было закрыто. Проверьте сетевое подключение.');
|
console.log('Соединение неожиданно было закрыто. Проверьте сетевое подключение.');
|
||||||
console.log();
|
console.log();
|
||||||
process.exit();
|
process.exit();
|
||||||
});
|
});
|
||||||
|
|
||||||
client.bind(45535); // bind socket
|
client.bind(44515); // bind socket
|
||||||
|
|
||||||
|
|
||||||
//**
|
//**
|
||||||
// Get file names and show in menu
|
// Get file names and show in menu
|
||||||
//**
|
//**
|
||||||
function select_file(ext){
|
function select_file(ext){
|
||||||
console.log("");
|
console.log("");
|
||||||
var filelist = getFilesInDirectory(files_path,ext);
|
var filelist = getFilesInDirectory(files_path,ext);
|
||||||
filelist.push(new inquirer.Separator());
|
filelist.push(new inquirer.Separator());
|
||||||
filelist.push("Отмена");
|
filelist.push("Отмена");
|
||||||
|
|
||||||
showMenu(filelist,'Выберите файл для загрузки в '+mac,item =>{
|
showMenu(filelist,'Выберите файл для загрузки в '+mac,item =>{
|
||||||
if (item.result == "Отмена"){
|
if (item.result == "Отмена"){
|
||||||
process.exit();
|
process.exit();
|
||||||
}
|
}
|
||||||
console.log("OK");
|
console.log("OK");
|
||||||
upload_application(mac,item.result);
|
upload_application(mac,item.result);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function upload_application(mac, filename){
|
function upload_application(mac, filename){
|
||||||
console.log("upload_application("+mac+","+filename+")" );
|
console.log("upload_application("+mac+","+filename+")" );
|
||||||
var d = devices.find(obj => { return obj.mac === mac });
|
var d = devices.find(obj => { return obj.mac === mac });
|
||||||
var platform = d.platform.substring(1,d.platform.lastIndexOf('.'));
|
var platform = d.platform.substring(1,d.platform.lastIndexOf('.'));
|
||||||
console.log("Начинается загрузка");
|
console.log("Начинается загрузка");
|
||||||
fdata = getFile(files_path+filename);
|
fdata = getFile(files_path+filename);
|
||||||
var fst = fdata.indexOf(String.fromCharCode(0)+"<FD>")+5;
|
var fst = fdata.indexOf(String.fromCharCode(0)+"<FD>")+5;
|
||||||
var fen = fdata.indexOf(String.fromCharCode(0)+String.fromCharCode(0)+String.fromCharCode(0),fst);
|
var fen = fdata.indexOf(String.fromCharCode(0)+String.fromCharCode(0)+String.fromCharCode(0),fst);
|
||||||
var line = fdata.toString('ascii',fst+1,fen-1);
|
var line = fdata.toString('ascii',fst+1,fen-1);
|
||||||
var finfo = line.split(String.fromCharCode(0));
|
var finfo = line.split(String.fromCharCode(0));
|
||||||
if (firmware==0 && fdata.indexOf(platform)<0){
|
if (firmware==0 && fdata.indexOf(platform)<0){
|
||||||
console.log("Выбрана неподходящая платформа :");
|
console.log("Выбрана неподходящая платформа :");
|
||||||
console.log("Устройство: "+platform+", файл:" +finfo[2]);
|
console.log("Устройство: "+platform+", файл:" +finfo[2]);
|
||||||
select_file(firmware==0?"tpc":"bin");
|
select_file(firmware==0?"tpc":"bin");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mode = 2; //switch to uploading mode
|
mode = 2; //switch to uploading mode
|
||||||
step=1; // init device step
|
step=1; // init device step
|
||||||
pageNumber = 0;
|
pageNumber = 0;
|
||||||
// init sending
|
// init sending
|
||||||
send("X",mac,session); // switch device to program mode
|
send("X",mac,session); // switch device to program mode
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendFilePage(){
|
function sendFilePage(){
|
||||||
step = 3;
|
step = 3;
|
||||||
clearTimeout(stopTimer); // clear resend timer
|
clearTimeout(stopTimer); // clear resend timer
|
||||||
var bmac = Buffer.from("_"+mac);
|
var bmac = Buffer.from("_"+mac);
|
||||||
var n = toBytesInt16(pageNumber);
|
var n = toBytesInt16(pageNumber);
|
||||||
var cmd = Buffer.from([0x44,n[0],n[1]]);
|
var cmd = Buffer.from([0x44,n[0],n[1]]);
|
||||||
var f = Buffer.from(fdata.slice(128*pageNumber,128*(pageNumber+1)));
|
var f = Buffer.from(fdata.slice(128*pageNumber,128*(pageNumber+1)));
|
||||||
var mess = Buffer.concat([bmac,cmd,f]);
|
var mess = Buffer.concat([bmac,cmd,f]);
|
||||||
client.send(mess,0,mess.length,65535,net_addr,result);
|
client.send(mess,0,mess.length,65535,net_addr,result);
|
||||||
if (fdata.length/128 >pageNumber)
|
if (fdata.length/128 >pageNumber)
|
||||||
stopTimer = setTimeout(sendFilePage,500); // resend every 0.5 sec
|
stopTimer = setTimeout(sendFilePage,500); // resend every 0.5 sec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function startSearch(){
|
function startSearch(){
|
||||||
if (number<=0)
|
if (number<=0)
|
||||||
number = shortSearch;
|
number = shortSearch;
|
||||||
devices = [];
|
devices = [];
|
||||||
session = (Math.random() * 0xFFFFFFFF).toString(16); // change session
|
session = (Math.random() * 0xFFFFFFFF).toString(16); // change session
|
||||||
countdown.start();
|
countdown.start();
|
||||||
// get device list;
|
// get device list;
|
||||||
pr = setInterval(()=>{
|
pr = setInterval(()=>{
|
||||||
send("","?","");
|
send("","?","");
|
||||||
countdown.message( "Поиск устройств. Найдено [" + devices.length + "] Осталось "+number+" секунд... ");
|
countdown.message( "Поиск устройств. Найдено [" + devices.length + "] Осталось "+number+" секунд... ");
|
||||||
if (number == 0){
|
if (number == 0){
|
||||||
clearInterval(pr);
|
clearInterval(pr);
|
||||||
countdown.stop();
|
countdown.stop();
|
||||||
proc();
|
proc();
|
||||||
}
|
}
|
||||||
number--;
|
number--;
|
||||||
},1000);
|
},1000);
|
||||||
send("","?","");
|
send("","?","");
|
||||||
}
|
}
|
||||||
|
|
||||||
function proc(){
|
function proc(){
|
||||||
|
|
||||||
if (devices.length == 0){
|
if (devices.length == 0){
|
||||||
console.log("ОШИБКА: Устройства не найдены!");
|
console.log("ОШИБКА: Устройства не найдены!");
|
||||||
console.log("Возможно включена защита от Spoofing'а");
|
console.log("Возможно включена защита от Spoofing'а");
|
||||||
console.log("Для отключения выполните комманды : ");
|
console.log("Для отключения выполните комманды : ");
|
||||||
console.log("\tsudo sysctl net.ipv4.conf.all.rp_filter=0 && sudo sysctl net.ipv4.conf." +getInterface()+ ".rp_filter=0"); console.log();
|
console.log("\tsudo sysctl net.ipv4.conf.all.rp_filter=0 && sudo sysctl net.ipv4.conf." +getInterface()+ ".rp_filter=0"); console.log();
|
||||||
process.exit();
|
process.exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
var m = [];
|
var m = [];
|
||||||
var mlip = 0;
|
var mlip = 0;
|
||||||
var mlpl = 0;
|
var mlpl = 0;
|
||||||
for (var i = 0; i < devices.length ; i++){
|
for (var i = 0; i < devices.length ; i++){
|
||||||
if (mlip < devices[i].ip.length)
|
if (mlip < devices[i].ip.length)
|
||||||
mlip = devices[i].ip.length;
|
mlip = devices[i].ip.length;
|
||||||
if (mlpl < devices[i].platform.length)
|
if (mlpl < devices[i].platform.length)
|
||||||
mlpl = devices[i].platform.length;
|
mlpl = devices[i].platform.length;
|
||||||
}
|
}
|
||||||
for (var i = 0; i < devices.length ; i++) {
|
for (var i = 0; i < devices.length ; i++) {
|
||||||
m.push({ value: devices[i].mac,
|
m.push({ value: devices[i].mac,
|
||||||
name: devices[i].mac.replace("[",'').replace("]",'') + " | "
|
name: devices[i].mac.replace("[",'').replace("]",'') + " | "
|
||||||
+ devices[i].ip.padStart(mlip," ") + " | "
|
+ devices[i].ip.padStart(mlip," ") + " | "
|
||||||
+ devices[i].platform.padEnd(mlpl," ") + " | "
|
+ devices[i].platform.padEnd(mlpl," ") + " | "
|
||||||
+ devices[i].app_version });
|
+ devices[i].app_version });
|
||||||
}
|
}
|
||||||
m.push(new inquirer.Separator());
|
m.push(new inquirer.Separator());
|
||||||
m.push({ key:'0', value: "Выход" });
|
m.push({ key:'0', value: "Выход" });
|
||||||
|
|
||||||
showMenu(m,"Выберите устройство",function(item) {
|
showMenu(m,"Выберите устройство",function(item) {
|
||||||
if (item){
|
if (item){
|
||||||
if (item.result == "Выход")
|
if (item.result == "Выход")
|
||||||
process.exit();
|
process.exit();
|
||||||
else
|
else
|
||||||
mac = item.result;
|
mac = item.result;
|
||||||
console.log("");
|
console.log("");
|
||||||
showMenu(m2,"Выберите действие",(select)=>{
|
showMenu(m2,"Выберите действие",(select)=>{
|
||||||
//console.log(select);
|
//console.log(select);
|
||||||
if (select.result=="Выход"){
|
if (select.result=="Выход"){
|
||||||
process.exit();
|
process.exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (select.result == 'Загрузка прошивки'){
|
if (select.result == 'Загрузка прошивки'){
|
||||||
//console.log("select file");
|
//console.log("select file");
|
||||||
firmware=0;
|
firmware=0;
|
||||||
select_file("tpc");
|
select_file("tpc");
|
||||||
}
|
}
|
||||||
if (select.result == 'Загрузка firmware'){
|
if (select.result == 'Загрузка firmware'){
|
||||||
firmware=1;
|
firmware=1;
|
||||||
select_file("bin");
|
select_file("bin");
|
||||||
}
|
}
|
||||||
if (select.result == "Перезагрузка"){
|
if (select.result == "Перезагрузка"){
|
||||||
send("E",mac,session);
|
send("E",mac,session);
|
||||||
number = longSearch;
|
number = longSearch;
|
||||||
startSearch();
|
startSearch();
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
console.log("cancel")
|
console.log("cancel")
|
||||||
}
|
}
|
||||||
//process.exit();
|
//process.exit();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
function showMenu(m,title,select){
|
function showMenu(m,title,select){
|
||||||
var q = {
|
var q = {
|
||||||
type: 'list',
|
type: 'list',
|
||||||
name: 'result',
|
name: 'result',
|
||||||
message: title,
|
message: title,
|
||||||
choices: m
|
choices: m
|
||||||
};
|
};
|
||||||
inquirer.prompt(q)
|
inquirer.prompt(q)
|
||||||
.then(select);
|
.then(select);
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue