Kylin V3.2开发板+OneNET MQ消息队列+Java+Mysql
(用以记录写代码时的思路以免遗忘
文章目录
一、Kylin V3.2开发板上传数据之OneNET在之前的博客已经提及:
二、Java接收、处理数据并存入数据库
-步骤:
- 将接收到的数据转为json对象,方便处理
- 使用alibaba.druid和Spring Template存入数据库
-依赖:
- spring-jdbc-5.0.0.RELEASE.jar
- druid-1.0.9.jar
1、Java接收、处理数据:
每收到一次数据控制台打印如下信息:
打印信息的代码From:\src\main\java\com\onenet\mq\PushCallback.java:
public void messageArrived(String topic, MqttMessage message) throws InvalidProtocolBufferException {
byte[] payload = message.getPayload();
OnenetMq.Msg obj = OnenetMq.Msg.parseFrom(payload);
long at = obj.getTimestamp();
long msgid = obj.getMsgid();
String body = new String(obj.getData().toByteArray());
JsonDemo jsonDemo = new JsonDemo();
//从收到的String body里提取出原始传感器数据
double orihumidity = jsonDemo.getOriHumidity(body);
double oritemperature = jsonDemo.getOriTemperature(body);
//分别存入数据库
if (orihumidity!=0){
Humidity humidity = new Humidity();
humidity.setValue(orihumidity);
HumidityDao humidityDao = new HumidityDao();
humidityDao.UpdateHumidity(humidity);
}
if (oritemperature!=0) {
Temperature temperature = new Temperature();
temperature.setValue(oritemperature);
TemperatureDao temperatureDao = new TemperatureDao();
temperatureDao.UpdateTemperature(temperature);
}
SimpleDateFormat slf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss:S”);
String time = slf.format(at);
logger.info( "time = " + time +
",msg id: " + msgid +
", body: " + body);
}
可见,所有数据都存在String body中,而且是json格式,body中的数据如下所示:
{"sysProperty":
{"messageType":"deviceDatapoint","productId":"312118"},
"appProperty":
{"deviceId":"581205941","dataTimestamp":1578884925484,"datastream":"Tempreture"},
"body":"27.775230"
}
{
"sysProperty":
{"messageType":"deviceDatapoint","productId":"274535"},
"appProperty":
{"deviceId":"543970284","dataTimestamp":1578038610715,"datastream":"Humidity"},
"body":"34.603668"
}
需要做两件事:
- (1) 将上面json中key=“body”的键值对的值取出来
- (2)识别key=“datastream”的值是"Humidity"(湿度)还是“Tempreture”(温度,这里是OneNET的工程师英语垃圾拼错了单词,不是我拼错了,参考:牛津词典)
(1)、编写JsonDemo类,用来操作json字符串**
参考博客json操作类
(2)、取出需要的数据(温度、湿度)
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JsonDemo {
//获取湿度
public double getOriHumidity(String body){
JSONObject jsonObject = JSONObject.fromObject(body);
String data = jsonObject.getString("appProperty");
JSONObject jsonObject1 = JSONObject.fromObject(data);
Date date = new Date(jsonObject1.getInt("dataTimestamp"));
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss SSS a");
long onenet = jsonObject1.getLong("dataTimestamp");
long current = System.currentTimeMillis();
System.out.println("onenet" + onenet + " current" + current);
System.out.println("当前延时" + (current - onenet));
double value=0;
if (jsonObject1.getString("datastream").equals("Humidity")){
value = jsonObject.getDouble("body");
}
return value;
}
//获取温度
public double getOriTemperature(String body){
JSONObject jsonObject = JSONObject.fromObject(body);
String data = jsonObject.getString("appProperty");
JSONObject jsonObject1 = JSONObject.fromObject(data);
double value=0;
if (jsonObject1.getString("datastream").equals("Tempreture")){
value = jsonObject.getDouble("body");
}
return value;
}
}
2、实时存入数据库:
代码From:\src\main\java\com\onenet\mq\PushCallback.java:
......
JsonDemo jsonDemo = new JsonDemo();
JsonDemo jsonDemo1 = new JsonDemo();
//从收到的String body里提取出原始传感器数据
double orihumidity = jsonDemo.getOriHumidity(body);
double oritemperature = jsonDemo1.getOriTemperature(body);
//System.out.printf("vvvvvvvvvvvvvalue: "+value);
//分别存入数据库
if (orihumidity!=0){
Humidity humidity = new Humidity();
humidity.setValue(orihumidity);
HumidityDao humidityDao = new HumidityDao();
humidityDao.UpdateHumidity(humidity);
}
if (oritemperature!=0) {
Temperature temperature = new Temperature();
temperature.setValue(oritemperature);
TemperatureDao temperatureDao = new TemperatureDao();
temperatureDao.UpdateTemperature(temperature);
}
......
分为2个步骤:
- 获取原始数据之后存入Humidity humidity实体中
- 调用HumidityDao humidityDao中的UpdateHumidity(humidity)方法更新数据库
(1)、HumidityDao:
import JDBCUtils.JDBCUtils;
import domain.Humidity;
import org.springframework.jdbc.core.JdbcTemplate;
public class HumidityDao {
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
public void addHumidity(Humidity humidity){
String sql= "insert into humidity values(null,?,?)";
template.update(sql,humidity.getLoca(),humidity.getValue());
}
public void UpdateHumidity(Humidity humidity){
String sql = "update humidity set value =? where id =1";
template.update(sql,humidity.getValue());
}
}
**import了:
1)、JDBCUtils:
import alibaba.druid
内容:
- 定义成员变量DataSource
- 加载配置文件:(1)、加载配置文件(2)、获取DataSource
- 定义三种方法:获取链接、释放资源、获取连接池的方法
2)、springframework JdbcTemplate**
内容:
- 调用JDBCUtils获取数据库的链接:
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
- 导入sql语句完成增删改查:
public void addHumidity(Humidity humidity){
String sql= "insert into humidity values(null,?,?)";
template.update(sql,humidity.getLoca(),humidity.getValue());
}
public void UpdateHumidity(Humidity humidity){
String sql = "update humidity set value =? where id =1";
template.update(sql,humidity.getValue());
}