一、功能简述
- 此节点通过与SIMATIC IOT2040工业物联网智能网关中服务器的数据交互,完成对工业物联网智能网关(以下均简称为盒子)无线模块网络信息的读取与修改;
- 用户可在界面中(通过与之前网络参数节点的结合)可选择不同网卡以修改或读取相应的网络参数;
- 用户可在无线连接界面中输入wifi名称及密码进行连接,连接成功后可选择使用默认ip或自定义ip;
- 若出现无线网卡连接异常或连接wifi时出现输入名称或密码错误时进行提示。
二、功能实现
1.UML图
2.实现方式
- 非无线模块中修改网络参数部分均在上一篇文章中说明,在这里大同小异,不再赘述;
- 无线模块中判断无线网卡连接状况功能通过执行系统命令
ifconfig
判断其中是否存在wlan0字符串实现; - 无线模块中wifi连接功能通过执行盒子中事先编辑好的脚本,修改系统中的
wpa_supplicant.conf
配置文件后重启网卡实现; - 无线模块中修改网络参数功能通过修改系统中的
interfaces
配置文件后重启网卡实现。
三、服务端
服务端通过利用子进程来调用系统命令或者脚本文件,结合脚本文件中的内容达到相应的功能。相应基础知识内容在上一篇有所详细说明,此处不再赘述。
1.功能设计
服务端通过与客户端的数据交互,除了有之前读取网卡信息和修改interfaces
文件的功能,对于无线网卡模块新增了许多功能。
- 判断无线网卡模块安装状态功能:通过脚本判断
ifconfig
中是否存在wlan0部分的信息,若不存在则说明无线网卡安装异常; - 连接wifi功能:通过脚本修改配置文件
wpa_supplicant.conf
中的wifi信息部分,重启网卡后即可连接wifi; - 判断wifi连接状态功能:通过脚本判断
ifconfig
中wlan0部分是否有ip,若没有分配ip则说明无线网卡连接wifi异常; - 读取无线网卡ip信息功能:通过正则提取出
ifconfig
和route
中的无线网卡ip和Mac信息; - 修改无线网卡ip信息功能:通过脚本修改
interfaces
文件中的相关信息达到修改无线网卡ip信息的目的,还可以通过判断客户端传来的请求,将无线网卡获取ip的方式修改为默认或自定义。
2.程序设计
let http = require("http");
var exec = require('child_process');
const urlLib = require('url');
let server = http.createServer();
server.on('request', function (req, res) {
if (req.method === 'GET') {
var urlObj = urlLib.parse(req.url, true);
if (urlObj.pathname == "/getIpMsg") {
//当请求为‘GET’‘getIpMsg’时执行脚本提取网卡1网卡2的网络数据。
exec('/shell02/ip.sh', (err, stdout, stderr) => {
if (err) {
console.log(err);
return;
}
res.setHeader('Access-Control-Allow-Origin', "*");
res.end(stdout);
})
} else if (urlObj.pathname == "/getWlanMsg") {
//当请求为‘GET’‘getWlanMsg’时执行脚本提取无线网卡的网络数据。
exec('/shell02/wlan0.sh', (err, stdout, stderr) => {
if (err) {
console.log(err);
return;
}
res.setHeader('Access-Control-Allow-Origin', "*");
res.end(stdout);
})
}
} else if (req.method === 'POST') {
var urlObj = urlLib.parse(req.url, true);
res.setHeader('Access-Control-Allow-Origin', "*");
if (urlObj.pathname == "/setIpMsg") {
//如果请求为‘POST’‘setIPMsg’时首先获取客户端传来的将要修改的ip等数据
let data = ''
req.on('data', function (chunk) {
data += chunk;
});
//获取数据后执行修改网卡ip的脚本
req.on('end', function () {
console.log(data);
data = JSON.parse(data);
var callfile = require('child_process');
if (data.eth === 'eth0') {
callfile.execFile('/shell01/ip1_shell.sh', [data.ip0, data.nm0, data.gw0], null, function (err, stdout, stderr) {
});
} else if (data.eth === 'eth1') {
callfile.execFile('/shell01/ip2_shell.sh', [data.ip1, data.nm1, data.gw1], null, function (err, stdout, stderr) {
});
}
res.end("successful");
})
} else if (urlObj.pathname == "/setWifiMsg") {
//如果请求为‘POST’‘setWifMsg’时首先获取客户端传来的wifi名称和密码。
let data = ''
req.on('data', function (chunk) {
data += chunk;
});
//获取数据后执行连接wifi的脚本
req.on('end', function () {
data = JSON.parse(data);
var child_process = require('child_process');
var wifi = child_process.execFile('/shell02/wifi.sh', [data.ssid, data.key], null, function (err, stdout, stderr) {
console.log(stdout);
});
wifi.stdout.on('data', function (data) {
console.log(data.toString());
});
//执行连接wifi的脚本后重启网卡
wifi.on('close', function () {
console.log('Wifi file is configured');
var ifup = child_process.spawn('ifup', ['wlan0']);
ifup.stdout.on('data', function (data) {
console.log(data.toString());
});
//重启网卡后判断网卡是否正常连接
ifup.on('close', function () {
console.log('The network card has been opened');
child_process.execFile('/shell02/judge.sh', [], null, function (err, stdout, stderr) {
//若连接正常,向客户端返回无线网卡信息
if (Boolean(stdout.replace(/[\r\n]/g, ""))) {
var stringResult = stdout.split(',');
let wlanMsg = {
ip: stringResult[0],
nm: stringResult[1],
gw: stringResult[2],
mac: stringResult[3]
}
console.log(JSON.stringify(wlanMsg));
res.setHeader('Access-Control-Allow-Origin', "*");
res.end(JSON.stringify(wlanMsg));
}
//若连接异常,向客户端返回连接失败信息
else {
res.end('')
}
})
})
})
})
} else if (urlObj.pathname == "/setWlanIpMsg") {
//如果请求为‘POST’‘setWlanIpMsg’时首先获取客户端传来的修改无线网卡ip的数据
res.setHeader('Access-Control-Allow-Origin', "*");
let data = ''
req.on('data', function (chunk) {
data += chunk;
});
//获取数据后执行修改无线网卡ip数据的脚本
req.on('end', function () {
var callfile = require('child_process');
data = JSON.parse(data);
var ipdhcp = callfile.execFile('/shell02/ipdhcp.sh', [data.ip, data.netmask, data.gateway], null, function (err, stdout, stderr) {
});
ipdhcp.on("exit", function () {
//修改ip后判断修改是否可以正常连接
callfile.execFile('/shell02/judge.sh', [], null, function (err, stdout, stderr) {
var stringResult = stdout.split(',');
console.log('array:', stringResult)
let wlanMsg = {
ip: stringResult[0],
nm: stringResult[1],
gw: stringResult[2],
mac: stringResult[3]
}
res.end(JSON.stringify(wlanMsg))
})
})
})
}
} else {
res.end('Please re-select the request method')
}
});
server.listen(3000, function () {
console.log("Server started successfully")
});
四、客户端
1.功能设计
在之前parameters节点的功能基础上,在切换网卡菜单栏中添加wlan0条目。
- 点击“获取服务端数据”按钮之后,获得服务端传来的数据,包括eth0、eth1、wlan0的相关数据。
- 当切换至wlan0条目时,出现无线网卡连接状态提示,若网卡正常,则显示“网卡正常”的提示并缓慢消失,同时出现wifi连接界面;若异常,则显示“网卡异常”的提示。
- “连接wifi”界面包括wifi名字输入项、wifi密码输入项及连接wifi按钮。输入相应内容之后,点击“连接wifi”按钮,显示“连接中…”等待连接。若成功连上wifi则显示“连接成功”的提示并缓慢消失,同时出现修改ip界面;若异常则显示“连接异常”的提示。
- 修改ip界面包括“自动获取ip地址”和“使用以下ip地址”的单选框、显示无线模块网络信息诸如ip、netmask、gateway等各个条目。连接wifi成功后界面上显示现在无线网卡的各网络参数信息。若选择“自动获取ip地址”单选框,则ip地址自动变为“dhcp”且各网络信息无法修改;若选择“使用以下ip地址”单选框,则可自行修改各网络参数。点击“修改无线网卡ip”后系统进行修改工作,并显示“正在修改无线网卡ip…”提示,修改完成后提示“无线网卡ip已修改”。
2.界面设计
-
输入服务端ip,点击“获取服务端数据”按钮,切换至wlan0条目,网卡安装正常时会提示正常并出现连接wifi界面;
若网卡安装异常会出现异常提示,则需要检查无线网卡模块安装情况,确认安装完成且出现安装正常提示后即可连接wifi。
-
输入wifi名称和密码,点击连接wifi按钮,出现连接中提示。
若正常连接会显现正常提示后缓慢消退,且出现修改和显示ip信息界面。此时ip信息界面就是此时无线网卡部分的ip信息。
若输入wifi名称或密码错误,则出现wifi连接异常的提示。
3. 连接wifi正常后可选择“自动获得ip地址”或“使用以下ip地址”,出现修改中的提示。若选择自动获得选项则默认ip为dhcp,即由系统自动分配ip,此时界面的输入框均处于锁定状态不可修改;
若选择自定义ip选项,则可使用用户配置的相关网卡信息。点击“修改无线网卡ip”按钮后会出现连接中提示,修改结束后会出现结果提示。