课设整个流程:
- 将代码烧写到终端和协调器上,并将协调器和终端上电,等待协调器和终端组好网后。
- 用串口线将协调器和电脑连接起来,观察终端和协调器是否闪灯,若闪灯则是在发送数据。
- 打开电脑上的串口工具(自己写的),读出串口数据并且上传到老师服务器的数据库中。
- 打开安卓APP,在输入框中输入学号,点击确定,查看上传的数据。
终端向协调器发送数据(多少个数据,什么数据,怎么发送,怎么处理数据)
温湿度:
总共发了6个字节,温度占两个字节,在第二(高位)和第三个字节,湿度占两个字节,在第四(高位)和第五个字节,第一个是0xff是接收数据时用来判断是否接收的,第六个字节是传设备的ID。
光照:
总共发了3个字节,第一个字节是0xff是接收数据时用来判断是否接收的,光照占两个字节,在第二(高位)和第三个字节。
怎么发送:
终端通过无线传感器网络传给协调器,协调器通过串口传给电脑,电脑上写的串口工具可以读取串口上的数据,然后将数据处理后发给老师的服务器(服务器上有SQL server数据库),最后安卓通过调用老师服务器的接口(http://106.52.230.85/wsntest/WebServicedDemo.asmx/getdateXHjson?XH=)传入XH(学号)后返回 json 串,在安卓端处理后展示。
怎么处理数据:
硬件端
光照:
终端发送:
static void myReportData(void)
{
byte dat[6];
//获取本节点的网络短地址
uint16 sAddr = NLME_GetShortAddr();
//获取协调器的网络短地址
uint16 pAddr = NLME_GetCoordShortAddr();
// DHT22_Read();
//LED灯闪烁1次
//GetAM231Data();
HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );
HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
//将节点信息进行封装
dat[0] = 0xff;
//dat[1] =gHumiture[0]; //(Rxbuf>>8) & 0xff;
//dat[2] = gHumiture[1];
//dat[3] =gHumiture[2];
//dat[4] = gHumiture[3];
//uint32 vol = getVol();
//dat[1] = (vol>>24)& 0xff; //(Rxbuf>>8) & 0xff;
//dat[2] = (vol>>16)& 0xff;
//dat[3] = (vol>>8)& 0xff;
//dat[4] = (vol>>0)& 0xff;
CBTDevice_LIGHT_Processing();
dat[2]=gLight & 0xff; //低位
dat[1]=(gLight>>8) & 0xFF;//高位
//dat[3] = 0xff;
//dat[4] = 0xff;
//dat[1] = 0x00;
//lendata = 4;
//SampleApp_SendPeriodicMessage(SENSOR_LIGHT, SENSOR_INDEX, POSITION, sdata, 4);
//dat[5] = MYDEVID;
//将数据包发送给协调器
zb_SendDataRequest(0, ID_CMD_REPORT, 3, dat, 0, AF_ACK_REQUEST, 0 );
}
协调器接收
#include <stdio.h>
void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData )
{
char buf[32];
char buf1[2];
//接收到数据之后LED灯闪烁
HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );
HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
if (len==3 && pData[0]==0xff) {
float temp_f, humi_f;
buf1[0]=pData[1];
buf1[1]=pData[2];
humi_f = ((float)(( pData[1]<<8)+ pData[2])/10);
//temp_f = ((float)(( pData[3]<<8)+ pData[4])/10);
//sprintf(buf, "%02X H:%-6.2f%% T:%-6.2f℃", pData[5],humi_f, temp_f);
sprintf(buf, "%.0f",humi_f);
debug_str(buf1);//将数据通过串口传递给上位机
}
}
温湿度:
终端发送:
static void myReportData(void)
{
byte dat[6];
//获取本节点的网络短地址
uint16 sAddr = NLME_GetShortAddr();
//获取协调器的网络短地址
uint16 pAddr = NLME_GetCoordShortAddr();
// DHT22_Read();
//LED灯闪烁1次
GetAM231Data();
HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );
HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
//将节点信息进行封装
dat[0] = 0xff;
dat[1] =gHumiture[0]; //(Rxbuf>>8) & 0xff;
dat[2] = gHumiture[1];
dat[3] =gHumiture[2];
dat[4] = gHumiture[3];
dat[5] = MYDEVID;
//将数据包发送给协调器
zb_SendDataRequest(0, ID_CMD_REPORT, 6, dat, 0, AF_ACK_REQUEST, 0 );
}
协调器接收
void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData )
{
char buf[32];
//接收到数据之后LED灯闪烁
HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );
HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
if (len==6 && pData[0]==0xff) {
float temp_f, humi_f;
humi_f = ((float)(( pData[1]<<8)+ pData[2])/10);
temp_f = ((float)(( pData[3]<<8)+ pData[4])/10);
sprintf(buf, "%-6.2f %-6.2f",humi_f, temp_f);
debug_str(buf);//将数据通过串口传递给上位机
}
}
串口工具端
主要修改函数的地方(看两个等号分割中间的地方)
public void onActionOpenBtn(ActionEvent actionEvent) {
isOpen = !isOpen;
if (isOpen) {
if (!serialController.open(comboBox.getValue(), BaudRateBox.getValue())) {
return;
}
serialController.setListenerToSerialPort(ev -> {
if (ev.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
String str = null;
System.out.println("====================================================================================");
try {
str = serialController.readData();
String regEX="[^0-9]";
Pattern compile = Pattern.compile(regEX);
Matcher matcher = compile.matcher(str);
String guangzhao = matcher.replaceAll("").trim();
System.out.println("guangzhao:"+guangzhao);
Connection connection = SqlUtils.getConnection();
Statement statement = connection.createStatement();
/**
* ID GROUPID XH VALUE UPDATETIME
*/
//String sql = "SELECT * FROM WSNTEST";
// String sql1 = "INSERT INTO WSNTEST(GROUPID,XH,VALUE) VALUES ('202004071-202003978-202003983','wenglushi','"+"温度:"+wd+"湿度:"+sd+"')";
// String sql2 = "INSERT INTO WSNTEST(GROUPID,XH,VALUE) VALUES ('202004071-202003978-202003983','wenglushi','"+"光照:"+guangzhao+"')";
// if (wd < 30 && wd>10){
// statement.executeUpdate(sql1);
// }
// if(Integer.parseInt(guangzhao) > 100){
// statement.executeUpdate(sql2);
// }
if (guangzhao.length()==8){//温湿度
char c0 = guangzhao.charAt(0);
char c1 = guangzhao.charAt(1);
char c2 = guangzhao.charAt(2);
char c3 = guangzhao.charAt(3);
char c4 = guangzhao.charAt(4);
char c5 = guangzhao.charAt(5);
char c6 = guangzhao.charAt(6);
char c7 = guangzhao.charAt(7);
String wsd="湿度:"+c0+c1+"."+c2+c3+" 温度:"+c4+c5+"."+c6+c7;
String sql1 = "INSERT INTO WSNTEST(GROUPID,XH,VALUE) VALUES ('20200471-202003978-202003983','wenglushi','"+wsd+"')";
statement.executeUpdate(sql1);
}else if(guangzhao.length()==3){
String gzhao = "光照:"+guangzhao;
String sql2 = "INSERT INTO WSNTEST(GROUPID,XH,VALUE) VALUES ('20200471-202003978-202003983','wenglushi','"+gzhao+"')";
statement.executeUpdate(sql2);
}
//=======================================================================================================================================
System.out.println("str:"+str);
// byte[] bytes = Hex.decodeHex(str);
// System.out.println(bytes);
char[] chars = str.toCharArray();
ArrayList<String> strings = new ArrayList<>();
System.out.println("strings:"+strings);
for (int i= 0;i<chars.length;i++){
String s = Integer.toHexString(chars[i]);
strings.add(s);
System.out.println("000000000:"+s);
}
System.out.println("1111111:"+strings);
Integer wd = Integer.parseInt(strings.get(1),16);
// Integer gz = Integer.parseInt(((Integer.parseInt(strings.get(1),16)*256)+Integer.parseInt(strings.get(2),16))/10+"");
// Integer gz = Integer.parseInt(((Integer.parseInt(strings.get(1)+strings.get(2),16)))+"");
System.out.println("gz:"+guangzhao);
Integer sd = Integer.parseInt(strings.get(2),16);
System.out.println("2222222:"+"wd:"+wd+"sd:"+sd);
// ResultSet resultSet = statement.executeQuery(sql);
/*
while (resultSet.next()) {
String ID = resultSet.getString("ID");
String GROUPID = resultSet.getString("GROUPID");
String XH = resultSet.getString("XH");
String VALUE = resultSet.getString("VALUE");
String UPDATETIME = resultSet.getString("UPDATETIME");
System.out.println(ID+GROUPID+XH+VALUE+UPDATETIME);
}*/
} catch (UnsupportedEncodingException | SQLException e) {
e.printStackTrace();
}
String finalStr = str;
Platform.runLater(() -> {
if (receiveText.getLength() < 4000) {
receiveText.appendText(finalStr);
} else {
receiveText.deleteText(0, finalStr.length());
receiveText.appendText(finalStr);
}
});
}
});
openBnt.setText("关闭串口");
} else {
serialController.close();
openBnt.setText("打开串口");
}
}
安卓怎么读数据
注意文件位置
/**
* json转List<HashMap<String, String>>
* @param data
* @return
*/
public List<HashMap<String, String>> jsonToList(String data){
List<HashMap<String, String>> list = null;
try {
// JSONObject jsonObject1 = new JSONObject(data);
// JSONArray jsonArray = jsonObject1.getJSONArray("");
list = new ArrayList<>();
JSONArray jsonArray = new JSONArray(data);
// int i = jsonArray.length() - 1;
// JSONObject jsonObject = (JSONObject) jsonArray.get(i);
//取出name
JSONObject jsonObject1;
HashMap<String, String> hashMap;
for (int i = 0;i < jsonArray.length();i++){
String json = (String) jsonArray.getString(i);
jsonObject1 = new JSONObject(json);
String ID = jsonObject1.getString("ID");
String GROUPID = jsonObject1.getString("GROUPID");
String XH = jsonObject1.getString("XH");
String VALUE = jsonObject1.getString("VALUE");
String UPDATETIME = jsonObject1.getString("UPDATETIME");
hashMap = new HashMap<>();
hashMap.put("ID",ID);
hashMap.put("GROUPID",GROUPID);
hashMap.put("XH",XH);
hashMap.put("VALUE",VALUE);
hashMap.put("UPDATETIME",UPDATETIME);
list.add(hashMap);
}
// String groupid = jsonArray.getString(1);
// String xh = jsonArray.getString(2);
// String value = jsonArray.getString(3);
// String update = jsonArray.getString(4);
// data = "组号:"+groupid + "\n" + "学号:"+xh + "\n" +"传值:"+ value + "\n"+"最后更新时间:"+ update;
} catch (Exception e) {
e.printStackTrace();
}
/*List<HashMap<String, String>> list = new ArrayList<>();
try {
// JSONObject jsonObject1 = new JSONObject(data);
// JSONArray jsonArray = jsonObject1.getJSONArray("WSNTEST");
JSONArray jsonArray = new JSONArray(data);
// int i = jsonArray.length() - 1;
// JSONObject jsonObject = (JSONObject) jsonArray.get(i);
//取出name
//
for (int i = 0;i < jsonArray.length();i++){
String ID = (String) jsonArray.get(0);
}
// String ID = jsonObject1.getString("ID");
// String GROUPID = jsonObject1.getString("GROUPID");
// String XH = jsonObject1.getString("XH");
// String VALUE = jsonObject1.getString("VALUE");
// String UPDATETIME = jsonObject1.getString("UPDATETIME");
HashMap<String, String> hashMap = new HashMap<>();
// hashMap.put("ID",ID);
// hashMap.put("GROUPID",GROUPID);
// hashMap.put("XH",XH);
// hashMap.put("VALUE",VALUE);
// hashMap.put("UPDATETIME",UPDATETIME);
//
// list.add(hashMap);
} catch (JSONException e) {
e.printStackTrace();
}*/
return list;
}
/**
* json处理
* @param data
* @return
*/
public String Stringjson(String data) {
List<HashMap<String, String>> list;
try {
// JSONObject jsonObject1 = new JSONObject(data);
// JSONArray jsonArray = jsonObject1.getJSONArray("");
list = new ArrayList<>();
JSONArray jsonArray = new JSONArray(data);
// int i = jsonArray.length() - 1;
// JSONObject jsonObject = (JSONObject) jsonArray.get(i);
//取出name
JSONObject jsonObject1;
HashMap<String, String> hashMap;
for (int i = 0;i < jsonArray.length();i++){
String json = (String) jsonArray.getString(i);
jsonObject1 = new JSONObject(json);
String ID = jsonObject1.getString("ID");
String GROUPID = jsonObject1.getString("GROUPID");
String XH = jsonObject1.getString("XH");
String VALUE = jsonObject1.getString("VALUE");
String UPDATETIME = jsonObject1.getString("UPDATETIME");
hashMap = new HashMap<>();
hashMap.put("ID",ID);
hashMap.put("GROUPID",GROUPID);
hashMap.put("XH",XH);
hashMap.put("VALUE",VALUE);
hashMap.put("UPDATETIME",UPDATETIME);
list.add(hashMap);
}
// String groupid = jsonArray.getString(1);
// String xh = jsonArray.getString(2);
// String value = jsonArray.getString(3);
// String update = jsonArray.getString(4);
// data = "组号:"+groupid + "\n" + "学号:"+xh + "\n" +"传值:"+ value + "\n"+"最后更新时间:"+ update;
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
/**
* 将数据展示到ListView
* @param list
* @param lv_shop_data
* @throws SQLException
*/
private void setListView(List<HashMap<String, String>> list,ListView lv_shop_data) throws SQLException {
// lv_shop_data.setVisibility(View.VISIBLE);
adapter = new SimpleAdapter(
MainActivity.this,
list,
R.layout.adapter_item,
//ID GROUPID XH VALUE UPDATETIME
new String[] { "ID", "GROUPID", "XH" ,"VALUE","UPDATETIME"},
new int[] { R.id.txt_ID, R.id.txt_GROUPID, R.id.txt_XH, R.id.txt_VALUE, R.id.txt_UPDATETIME });
lv_shop_data.setAdapter(adapter);
}