课设整个流程:

  1. 将代码烧写到终端和协调器上,并将协调器和终端上电,等待协调器和终端组好网后。
  2. 用串口线将协调器和电脑连接起来,观察终端和协调器是否闪灯,若闪灯则是在发送数据。
  3. 打开电脑上的串口工具(自己写的),读出串口数据并且上传到老师服务器的数据库中。
  4. 打开安卓APP,在输入框中输入学号,点击确定,查看上传的数据。

终端向协调器发送数据(多少个数据,什么数据,怎么发送,怎么处理数据)

温湿度:

总共发了6个字节,温度占两个字节,在第二(高位)和第三个字节,湿度占两个字节,在第四(高位)和第五个字节,第一个是0xff是接收数据时用来判断是否接收的,第六个字节是传设备的ID。

光照:

总共发了3个字节,第一个字节是0xff是接收数据时用来判断是否接收的,光照占两个字节,在第二(高位)和第三个字节。

怎么发送:

终端通过无线传感器网络传给协调器,协调器通过串口传给电脑,电脑上写的串口工具可以读取串口上的数据,然后将数据处理后发给老师的服务器(服务器上有SQL server数据库),最后安卓通过调用老师服务器的接口(http://106.52.230.85/wsntest/WebServicedDemo.asmx/getdateXHjson?XH=)传入XH(学号)后返回 json 串,在安卓端处理后展示。

怎么处理数据:

硬件端

光照:

终端发送:
image.png

  1. static void myReportData(void)
  2. {
  3. byte dat[6];
  4. //获取本节点的网络短地址
  5. uint16 sAddr = NLME_GetShortAddr();
  6. //获取协调器的网络短地址
  7. uint16 pAddr = NLME_GetCoordShortAddr();
  8. // DHT22_Read();
  9. //LED灯闪烁1次
  10. //GetAM231Data();
  11. HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );
  12. HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
  13. //将节点信息进行封装
  14. dat[0] = 0xff;
  15. //dat[1] =gHumiture[0]; //(Rxbuf>>8) & 0xff;
  16. //dat[2] = gHumiture[1];
  17. //dat[3] =gHumiture[2];
  18. //dat[4] = gHumiture[3];
  19. //uint32 vol = getVol();
  20. //dat[1] = (vol>>24)& 0xff; //(Rxbuf>>8) & 0xff;
  21. //dat[2] = (vol>>16)& 0xff;
  22. //dat[3] = (vol>>8)& 0xff;
  23. //dat[4] = (vol>>0)& 0xff;
  24. CBTDevice_LIGHT_Processing();
  25. dat[2]=gLight & 0xff; //低位
  26. dat[1]=(gLight>>8) & 0xFF;//高位
  27. //dat[3] = 0xff;
  28. //dat[4] = 0xff;
  29. //dat[1] = 0x00;
  30. //lendata = 4;
  31. //SampleApp_SendPeriodicMessage(SENSOR_LIGHT, SENSOR_INDEX, POSITION, sdata, 4);
  32. //dat[5] = MYDEVID;
  33. //将数据包发送给协调器
  34. zb_SendDataRequest(0, ID_CMD_REPORT, 3, dat, 0, AF_ACK_REQUEST, 0 );
  35. }

协调器接收
image.png

  1. #include <stdio.h>
  2. void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData )
  3. {
  4. char buf[32];
  5. char buf1[2];
  6. //接收到数据之后LED灯闪烁
  7. HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );
  8. HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
  9. if (len==3 && pData[0]==0xff) {
  10. float temp_f, humi_f;
  11. buf1[0]=pData[1];
  12. buf1[1]=pData[2];
  13. humi_f = ((float)(( pData[1]<<8)+ pData[2])/10);
  14. //temp_f = ((float)(( pData[3]<<8)+ pData[4])/10);
  15. //sprintf(buf, "%02X H:%-6.2f%% T:%-6.2f℃", pData[5],humi_f, temp_f);
  16. sprintf(buf, "%.0f",humi_f);
  17. debug_str(buf1);//将数据通过串口传递给上位机
  18. }
  19. }

温湿度:

终端发送:
image.png

  1. static void myReportData(void)
  2. {
  3. byte dat[6];
  4. //获取本节点的网络短地址
  5. uint16 sAddr = NLME_GetShortAddr();
  6. //获取协调器的网络短地址
  7. uint16 pAddr = NLME_GetCoordShortAddr();
  8. // DHT22_Read();
  9. //LED灯闪烁1次
  10. GetAM231Data();
  11. HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );
  12. HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
  13. //将节点信息进行封装
  14. dat[0] = 0xff;
  15. dat[1] =gHumiture[0]; //(Rxbuf>>8) & 0xff;
  16. dat[2] = gHumiture[1];
  17. dat[3] =gHumiture[2];
  18. dat[4] = gHumiture[3];
  19. dat[5] = MYDEVID;
  20. //将数据包发送给协调器
  21. zb_SendDataRequest(0, ID_CMD_REPORT, 6, dat, 0, AF_ACK_REQUEST, 0 );
  22. }

协调器接收
image.png

  1. void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData )
  2. {
  3. char buf[32];
  4. //接收到数据之后LED灯闪烁
  5. HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );
  6. HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
  7. if (len==6 && pData[0]==0xff) {
  8. float temp_f, humi_f;
  9. humi_f = ((float)(( pData[1]<<8)+ pData[2])/10);
  10. temp_f = ((float)(( pData[3]<<8)+ pData[4])/10);
  11. sprintf(buf, "%-6.2f %-6.2f",humi_f, temp_f);
  12. debug_str(buf);//将数据通过串口传递给上位机
  13. }
  14. }

串口工具端

image.png

主要修改函数的地方(看两个等号分割中间的地方)
image.png

  1. public void onActionOpenBtn(ActionEvent actionEvent) {
  2. isOpen = !isOpen;
  3. if (isOpen) {
  4. if (!serialController.open(comboBox.getValue(), BaudRateBox.getValue())) {
  5. return;
  6. }
  7. serialController.setListenerToSerialPort(ev -> {
  8. if (ev.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
  9. String str = null;
  10. System.out.println("====================================================================================");
  11. try {
  12. str = serialController.readData();
  13. String regEX="[^0-9]";
  14. Pattern compile = Pattern.compile(regEX);
  15. Matcher matcher = compile.matcher(str);
  16. String guangzhao = matcher.replaceAll("").trim();
  17. System.out.println("guangzhao:"+guangzhao);
  18. Connection connection = SqlUtils.getConnection();
  19. Statement statement = connection.createStatement();
  20. /**
  21. * ID GROUPID XH VALUE UPDATETIME
  22. */
  23. //String sql = "SELECT * FROM WSNTEST";
  24. // String sql1 = "INSERT INTO WSNTEST(GROUPID,XH,VALUE) VALUES ('202004071-202003978-202003983','wenglushi','"+"温度:"+wd+"湿度:"+sd+"')";
  25. // String sql2 = "INSERT INTO WSNTEST(GROUPID,XH,VALUE) VALUES ('202004071-202003978-202003983','wenglushi','"+"光照:"+guangzhao+"')";
  26. // if (wd < 30 && wd>10){
  27. // statement.executeUpdate(sql1);
  28. // }
  29. // if(Integer.parseInt(guangzhao) > 100){
  30. // statement.executeUpdate(sql2);
  31. // }
  32. if (guangzhao.length()==8){//温湿度
  33. char c0 = guangzhao.charAt(0);
  34. char c1 = guangzhao.charAt(1);
  35. char c2 = guangzhao.charAt(2);
  36. char c3 = guangzhao.charAt(3);
  37. char c4 = guangzhao.charAt(4);
  38. char c5 = guangzhao.charAt(5);
  39. char c6 = guangzhao.charAt(6);
  40. char c7 = guangzhao.charAt(7);
  41. String wsd="湿度:"+c0+c1+"."+c2+c3+" 温度:"+c4+c5+"."+c6+c7;
  42. String sql1 = "INSERT INTO WSNTEST(GROUPID,XH,VALUE) VALUES ('20200471-202003978-202003983','wenglushi','"+wsd+"')";
  43. statement.executeUpdate(sql1);
  44. }else if(guangzhao.length()==3){
  45. String gzhao = "光照:"+guangzhao;
  46. String sql2 = "INSERT INTO WSNTEST(GROUPID,XH,VALUE) VALUES ('20200471-202003978-202003983','wenglushi','"+gzhao+"')";
  47. statement.executeUpdate(sql2);
  48. }
  49. //=======================================================================================================================================
  50. System.out.println("str:"+str);
  51. // byte[] bytes = Hex.decodeHex(str);
  52. // System.out.println(bytes);
  53. char[] chars = str.toCharArray();
  54. ArrayList<String> strings = new ArrayList<>();
  55. System.out.println("strings:"+strings);
  56. for (int i= 0;i<chars.length;i++){
  57. String s = Integer.toHexString(chars[i]);
  58. strings.add(s);
  59. System.out.println("000000000:"+s);
  60. }
  61. System.out.println("1111111:"+strings);
  62. Integer wd = Integer.parseInt(strings.get(1),16);
  63. // Integer gz = Integer.parseInt(((Integer.parseInt(strings.get(1),16)*256)+Integer.parseInt(strings.get(2),16))/10+"");
  64. // Integer gz = Integer.parseInt(((Integer.parseInt(strings.get(1)+strings.get(2),16)))+"");
  65. System.out.println("gz:"+guangzhao);
  66. Integer sd = Integer.parseInt(strings.get(2),16);
  67. System.out.println("2222222:"+"wd:"+wd+"sd:"+sd);
  68. // ResultSet resultSet = statement.executeQuery(sql);
  69. /*
  70. while (resultSet.next()) {
  71. String ID = resultSet.getString("ID");
  72. String GROUPID = resultSet.getString("GROUPID");
  73. String XH = resultSet.getString("XH");
  74. String VALUE = resultSet.getString("VALUE");
  75. String UPDATETIME = resultSet.getString("UPDATETIME");
  76. System.out.println(ID+GROUPID+XH+VALUE+UPDATETIME);
  77. }*/
  78. } catch (UnsupportedEncodingException | SQLException e) {
  79. e.printStackTrace();
  80. }
  81. String finalStr = str;
  82. Platform.runLater(() -> {
  83. if (receiveText.getLength() < 4000) {
  84. receiveText.appendText(finalStr);
  85. } else {
  86. receiveText.deleteText(0, finalStr.length());
  87. receiveText.appendText(finalStr);
  88. }
  89. });
  90. }
  91. });
  92. openBnt.setText("关闭串口");
  93. } else {
  94. serialController.close();
  95. openBnt.setText("打开串口");
  96. }
  97. }

安卓怎么读数据

注意文件位置
image.png
image.png
image.png
image.png

  1. /**
  2. * json转List<HashMap<String, String>>
  3. * @param data
  4. * @return
  5. */
  6. public List<HashMap<String, String>> jsonToList(String data){
  7. List<HashMap<String, String>> list = null;
  8. try {
  9. // JSONObject jsonObject1 = new JSONObject(data);
  10. // JSONArray jsonArray = jsonObject1.getJSONArray("");
  11. list = new ArrayList<>();
  12. JSONArray jsonArray = new JSONArray(data);
  13. // int i = jsonArray.length() - 1;
  14. // JSONObject jsonObject = (JSONObject) jsonArray.get(i);
  15. //取出name
  16. JSONObject jsonObject1;
  17. HashMap<String, String> hashMap;
  18. for (int i = 0;i < jsonArray.length();i++){
  19. String json = (String) jsonArray.getString(i);
  20. jsonObject1 = new JSONObject(json);
  21. String ID = jsonObject1.getString("ID");
  22. String GROUPID = jsonObject1.getString("GROUPID");
  23. String XH = jsonObject1.getString("XH");
  24. String VALUE = jsonObject1.getString("VALUE");
  25. String UPDATETIME = jsonObject1.getString("UPDATETIME");
  26. hashMap = new HashMap<>();
  27. hashMap.put("ID",ID);
  28. hashMap.put("GROUPID",GROUPID);
  29. hashMap.put("XH",XH);
  30. hashMap.put("VALUE",VALUE);
  31. hashMap.put("UPDATETIME",UPDATETIME);
  32. list.add(hashMap);
  33. }
  34. // String groupid = jsonArray.getString(1);
  35. // String xh = jsonArray.getString(2);
  36. // String value = jsonArray.getString(3);
  37. // String update = jsonArray.getString(4);
  38. // data = "组号:"+groupid + "\n" + "学号:"+xh + "\n" +"传值:"+ value + "\n"+"最后更新时间:"+ update;
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. /*List<HashMap<String, String>> list = new ArrayList<>();
  43. try {
  44. // JSONObject jsonObject1 = new JSONObject(data);
  45. // JSONArray jsonArray = jsonObject1.getJSONArray("WSNTEST");
  46. JSONArray jsonArray = new JSONArray(data);
  47. // int i = jsonArray.length() - 1;
  48. // JSONObject jsonObject = (JSONObject) jsonArray.get(i);
  49. //取出name
  50. //
  51. for (int i = 0;i < jsonArray.length();i++){
  52. String ID = (String) jsonArray.get(0);
  53. }
  54. // String ID = jsonObject1.getString("ID");
  55. // String GROUPID = jsonObject1.getString("GROUPID");
  56. // String XH = jsonObject1.getString("XH");
  57. // String VALUE = jsonObject1.getString("VALUE");
  58. // String UPDATETIME = jsonObject1.getString("UPDATETIME");
  59. HashMap<String, String> hashMap = new HashMap<>();
  60. // hashMap.put("ID",ID);
  61. // hashMap.put("GROUPID",GROUPID);
  62. // hashMap.put("XH",XH);
  63. // hashMap.put("VALUE",VALUE);
  64. // hashMap.put("UPDATETIME",UPDATETIME);
  65. //
  66. // list.add(hashMap);
  67. } catch (JSONException e) {
  68. e.printStackTrace();
  69. }*/
  70. return list;
  71. }
  72. /**
  73. * json处理
  74. * @param data
  75. * @return
  76. */
  77. public String Stringjson(String data) {
  78. List<HashMap<String, String>> list;
  79. try {
  80. // JSONObject jsonObject1 = new JSONObject(data);
  81. // JSONArray jsonArray = jsonObject1.getJSONArray("");
  82. list = new ArrayList<>();
  83. JSONArray jsonArray = new JSONArray(data);
  84. // int i = jsonArray.length() - 1;
  85. // JSONObject jsonObject = (JSONObject) jsonArray.get(i);
  86. //取出name
  87. JSONObject jsonObject1;
  88. HashMap<String, String> hashMap;
  89. for (int i = 0;i < jsonArray.length();i++){
  90. String json = (String) jsonArray.getString(i);
  91. jsonObject1 = new JSONObject(json);
  92. String ID = jsonObject1.getString("ID");
  93. String GROUPID = jsonObject1.getString("GROUPID");
  94. String XH = jsonObject1.getString("XH");
  95. String VALUE = jsonObject1.getString("VALUE");
  96. String UPDATETIME = jsonObject1.getString("UPDATETIME");
  97. hashMap = new HashMap<>();
  98. hashMap.put("ID",ID);
  99. hashMap.put("GROUPID",GROUPID);
  100. hashMap.put("XH",XH);
  101. hashMap.put("VALUE",VALUE);
  102. hashMap.put("UPDATETIME",UPDATETIME);
  103. list.add(hashMap);
  104. }
  105. // String groupid = jsonArray.getString(1);
  106. // String xh = jsonArray.getString(2);
  107. // String value = jsonArray.getString(3);
  108. // String update = jsonArray.getString(4);
  109. // data = "组号:"+groupid + "\n" + "学号:"+xh + "\n" +"传值:"+ value + "\n"+"最后更新时间:"+ update;
  110. } catch (Exception e) {
  111. e.printStackTrace();
  112. }
  113. return data;
  114. }

image.png

  1. /**
  2. * 将数据展示到ListView
  3. * @param list
  4. * @param lv_shop_data
  5. * @throws SQLException
  6. */
  7. private void setListView(List<HashMap<String, String>> list,ListView lv_shop_data) throws SQLException {
  8. // lv_shop_data.setVisibility(View.VISIBLE);
  9. adapter = new SimpleAdapter(
  10. MainActivity.this,
  11. list,
  12. R.layout.adapter_item,
  13. //ID GROUPID XH VALUE UPDATETIME
  14. new String[] { "ID", "GROUPID", "XH" ,"VALUE","UPDATETIME"},
  15. new int[] { R.id.txt_ID, R.id.txt_GROUPID, R.id.txt_XH, R.id.txt_VALUE, R.id.txt_UPDATETIME });
  16. lv_shop_data.setAdapter(adapter);
  17. }