一. 接口说明
最近一直在学习物联网云平台的开发, 一知半解, 一头雾水. 现在理解一下大概如下: 不同的协议需要搭建不同类型的服务器, 比如MQTT服务器, 那么服务器就是一个代理, 转发消息. 我们的HTTP服务器则是实现GET和POST两个基本的操作. GET数据库的消息. 而GET的数据形式需要自己去编写. POST就是客户端目标向服务器发送数据, 服务器接收并存在数据库中. (PS: 这里未考虑加密验证).
之前学习的误区在于不知道怎么搭建物联网云平台, 怎么搭?(基础薄弱! ). 现在明白其中最重要的是接口的开发. 即API.写出了接口给客户端调用以实现数据的读写, 后续要做的就是数据处理并好看的展示在前端页面上.
二. 程序框图
三. 导入包说明
开发需要导入图片中的这些包, JSon包的话Myeclipse中有可以直接导入, servlet包我也没有找到, 可以从Tomcat服务器的lib文件夹下面找赋值过来. 实在没有可以留言发邮箱. PS: 百度是万能的?
四. 开发步骤
Servlet3.0: 新建Dynamic web project时把 Target runtime选为javaEE 6.0 , 这样我们的servlet版本也就变成了3.0. 之所以这样, 是因为后面再写JSON基类的时候要用到servlet2.4版本以上的新特性.
(1) JSON基类
这个类用于控制数据返回的格式, 样例如下:
(具体调用则实在servlet中)
{
"code": "ok",
"msg": "访问成功",
"time": 1527237083877,
"items": [
{
"id": 1,
"name": "Temp",
"value": 12
},
{
"id": 2,
"name": "location",
"value": 12
},
{
"id": 3,
"name": "usage",
"value": 99
}
]
}
com.niu.json.core
AbstractJsonObject.java : JSON数据的基类
ListObject.java : JSON数组类
SignalObject.java : Json对象类
com.niu.json.core
ResponseUtils.java : 将消息写入response
com.niu.json.core
StatusCode,java : 状态返回码 e.g. 200OK
StatusHouse.java :
StatusObject.java : 状态对象, 封装了msg和code(具体请百度json格式)
com.niu.json.core
JackJsonUtils.java : 生成json数据和解析json数据
上面的只是控制他返回的格式, 基本上是固定的.
(2) 模型层开发
什么是模型层开发? 看了下面的程序大概就会明白了. 就是定义变量并给出get和set方法. 那get和set的是啥呢? 这就是关键了, 程序中定义的变量就是数据库中我们定义的字段, 那就是对数据库的读写 ! (数据库请看最后补充部分)
com.niu.model
package com.niu.model;
public class Datastreams {
private int id;
private String name;
private int value;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
(3) 业务层开发
业务层开发主要是:
1. 控制数据库开关的DBHelper类
2. 调用model层get, set方法操作数据库的方法
com.niu.business
DBHelper类, 用来操作数据库的打开和关闭, 程序中需要说明几点: url为数据库路径(restful_api为数据库服务器名), user为数据库账号, password为数据库密码
DBHelper.java:
public class DBHelper {
public static final String url = "jdbc:mysql://localhost:3306/restful_api";
public static final String name = "com.mysql.jdbc.Driver";
public static final String user = "root";
public static final String password = "root";
public Connection conn = null;
public PreparedStatement pst = null;
public DBHelper(String sql) {
try {
Class.forName(name);//
conn = DriverManager.getConnection(url, user, password);//
pst = conn.prepareStatement(sql);//
} catch (Exception e) {
e.printStackTrace();
}
}
public void close() {
try {
this.conn.close();
this.pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
DatastreamsBusiness.java: 特别关键的一个类
这里的方法是: sql = "select *from datastreams"; 获取datastreams表中的所有数据.
其它的对数据库操作就用别的sql语句, 文末会给出一些常用的语句提供借鉴, 建议菜鸟教程看一遍差不多就可以用得起来
本质上不同的方法也就是对应着不同的sql语句 ! !
public class DatastreamsBusiness {
public static List<Datastreams> getAllDatastreams() { //select *from datastreams
List<Datastreams> list = new ArrayList<Datastreams>();
String sql = null;
DBHelper db1 = null;
sql = "select *from datastreams";// SQL
db1 = new DBHelper(sql);//
ResultSet ret = null;
try {
ret = db1.pst.executeQuery();
while (ret.next()) {
int id = ret.getInt(1);
String name = ret.getString(2);
int value = ret.getInt(3);
Datastreams datastreams = new Datastreams();
datastreams.setId(id);
datastreams.setName(name);
datastreams.setValue(value);
list.add(datastreams);
} //
ret.close();
db1.close();//
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //
return list;
}
/**
* @param _id
* @return
*/
public static Datastreams getDatastreamInfoById(String _id) {//select * from student where id =" + _id
String sql = null;
DBHelper db1 = null;
sql = "select * from student where id =" + _id;//
db1 = new DBHelper(sql);//
ResultSet ret = null;
Datastreams datastreams = new Datastreams();
try {
ret = db1.pst.executeQuery();
while (ret.next()) {
int id = ret.getInt(1);
String name = ret.getString(2);
int value = ret.getInt(3);
datastreams.setId(id);
datastreams.setName(name);
datastreams.setValue(value);
} //
ret.close();
db1.close();//
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //
return datastreams;
}
}
(4) Servlet开发
重点来了啊~~~~~~~~~~~~~~~~~
了解servlet :
servlet: (Server Applet),小服务程序或服务连接器
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
这里我们只写了两个方法doGet和doPost.
doGet用于从数据库获取数据, 用于计算处理展示等
doPost用于接收客户端发过来的消息, 并存储值数据库中
doGet方法很简单就不多说,
doPost方法: (简单粗暴多多指教), 这里未设置返回值.
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//Step one
System.out.println(new Date()+"\n");
InputStream sin = new BufferedInputStream(request.getInputStream());
ByteArrayOutputStream sout = new ByteArrayOutputStream();
int b=0;
while((b=sin.read())!=-1)
{
sout.write(b);
}
byte[] temp = sout.toByteArray();
String s_ok = new String(temp,"UTF-8");
String regex="[0123456789.]+"; //正则表达式分离s_ok
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(s_ok);
int i=0;
while(m.find())
{
String item=m.group();
System.out.println(item);
i++;
if(i==2)
{
id=Integer.parseInt(item);
System.out.println("这是第"+i+"个数字:"+item);
}
if(i==4)
{
time=item;
System.out.println("这是第"+i+"个数字:"+item);
}
if(i==6)
{
value=Integer.parseInt(item);
System.out.println("这是第"+i+"个数字:"+item);
}
}
System.out.println(s_ok);
String sql = null;
//System.out.print("this is request: "+request+"this is response: "+response);
System.out.println("id:"+id+",time: "+time+" ,value: "+value);
sql = "insert into location" //sql语句
+"(id,time,value)"
+"values( "+" ' "+id+" ' "+", "+" ' "+time+" ' "+", "+" ' "+value+" ' "+")";
DBHelper mysql = new DBHelper(sql);
try {
mysql.insertMess(request, id, time, value);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("未成功插入数据!_API");
}
return;
//doGet(request, response);
}
(5) Service层开发
这一层的开发就是接口及接口的实现, 在我的这个web开发中service层只是简单的return, 具体方法放在了业务层, 那么为什么要这个呢? 是因为开发起来层次更加清楚, 方便以后的增删改.