课设整个流程:
- 将代码烧写到终端和协调器上,并将协调器和终端上电,等待协调器和终端组好网后。
 - 用串口线将协调器和电脑连接起来,观察终端和协调器是否闪灯,若闪灯则是在发送数据。
 - 打开电脑上的串口工具(自己写的),读出串口数据并且上传到老师服务器的数据库中。
 - 打开安卓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);//取出nameJSONObject 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);//取出nameJSONObject 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 UPDATETIMEnew 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);}
