数据库
- id:varchar(20)nodemcu设备编号
- ip:varchar(20)nodemcu的ip地址
- temp:float(5.2)温度
- humi:float(5.2)湿度
Java Web开发
将对如下的代码文件进行讲解
SensorData
对应上面数据库的内容
OperateSql
进行数据库操作
AppRequestData_servlet
app向服务器请求数据时访问的servlet
String id = request.getParameter("id").toString();
SensorData data = OperateSql.queryData(id);
Gson gson = new Gson();
String st = gson.toJson(data);
//System.out.println(st);
try(PrintWriter out = new PrintWriter(response.getWriter())){
out.println(st);
out.flush();
}
app发送id号给这个servlet,servlet根据唯一的id号查询数据,然后返回给app。
SensorData_servlet
NodeMcu发送数据给这个servlet,同时在这个servlet中更新数据库。
AppControl_servlet
app发送信息给这个servlet来控制NodeMcu
String id = request.getParameter("id").toString();
String flag = request.getParameter("flag").toString();
SensorData data = OperateSql.queryData(id);
String ip = data.getIp();
boolean tick = false;
try {
Socket client = new Socket(ip, 80);
client.setSoTimeout(10000);
//获取Socket的输出流,用来发送数据到服务端
try(PrintStream out = new PrintStream(client.getOutputStream());) {
out.println(flag);
System.out.println("与设备:"+id+"通信成功");
tick = true;
}
client.close();
}catch(IOException e) {
System.out.println("与设备:"+id+"通信失败");
}finally {
try {
try(PrintWriter out = new PrintWriter(response.getWriter())){
if(tick)
out.println("success");
else
out.println("fail");
out.flush();
}
}catch(IOException e) {
}
}
}
app发送了id号和一个flag标志给这个servlet,但是我这里只是做了一个简单的控制,所以flag可有可无,只要能触发这个servlet就可以了。
servlet根据接收到的id查询数据库,得到对应设备的ip地址。
然后和NodeMcu间建立一个socket链接,发送flag过去,同样能触发NodeMcu的端口监听就行。