用SSCOM使用HTTP协议向服务器发送数据并在服务器显示
一、使用到的器材
1、硬件部分
SIM868模块一个
USB-TTL模块一个
12V电源适配器一个
SIM卡一张
杜邦线4根
外接天线一个
2、软件部分
SSCOM33串口调试助手
二、线路连接及测试
1、线路连接
下图为SIM868外引脚图
引脚连接方式
SIM868引脚 | USB-TTL引脚 |
---|---|
U_TX | RXD |
U_RX | TXD |
GND | GND |
2、测试模块状态
1) 确认单片机与模块连接正确
发送“AT+回车”,能回复OK即正确。
2) 确认SIM卡是否被识别到
发送“AT+CPIN?+回车”,同样能恢复OK即正确。
3) 确认天线是否安装正确
发送“AT+CSQ+回车”,收到数字,31代表满格,低于12需要检测天线安装是否牢固。
4) 确认模块是否注册到网络
发送“AT+CREG?+回车”;1或5代表注册了。
三、进行数据传输
1.设置GPRS移动台类型
AT+CGCLASS=”B”设置GPRS移动台类型为B,收到回复OK,表示设置成功。
2.定义PDP上下文
AT+CGDCONT=1,”IP”,”CMNET”,定义PDP上下文,设置PDP上下文标志为1,IP协议,接入点为CMNET,收到OK,表示成功。
3.附着GPRS
AT+CGATT=1,附着GPRS,收到OK,表示成功。
4.设置GPRS连接
AT+CIPCSGP=1,”CMNET”,设置GPRS连接,接入点为CMNET,收到OK,表示成功。
5.设置本地TCP端口
AT+CLPORT=”TCP”,”2000”,设置本地TCP端口为2000,收到OK,表示成功。
6.连接到服务器
AT+CIPSTART=”TCP”,”IP地址”,”端口”,启动连接到服务器,IP和端口为服务器地址和端口,等待一会儿,收到CONNECT OK,这时,表明开发板已经通过GPRS与服务器建立连接。
7.发送数据
AT+CIPSEND,这时收到回复 >,这时候就可以发送数据了,发送任意数据后,发送HEX模式的1a,就表示发送完毕,发送成功会收到SEND OK。
本项目的数据接收地址为:www.ycitus.cn:8080/CNCjob/test.jsp
同时我们会收到服务器返回的网页
8.关闭连接
先发送AT+CIPCLOSE=1,再发送AT+CIPSHUT,就可以关闭TCP连接了。
9.数据显示
数据发送成功后我们也可以在服务器上的数据显示页面看到发送的数据。
本项目的结果显示地址为:www.ycitus.cn:8080/CNCjob/result.jsp
SSCOM中输入的指令下载
四、服务器部分
1、服务器环境
1、网站环境。网站的搭建环境使用的是Tomcat9.0。
2、网页编写语言。网页编写使用JavaScript作为编写语言。
3、数据存储方式。对于接收到的POST数据报采用了文件的方式进行存储。
4、编程软件。本项目使用的是Eclipse,当然其他支持java的开发环境也可。
2、代码部分
数据接收和数据显示我编写了两个页面,数据传输使用文件进行传输
1) 用到的额外的库
commons-beanutils.jar
commons-collections-3.0.jar
commons-lang-2.1.jar
commons-logging.jar
ezmorph-1.0.2.jar
json-lib-1.1-jdk13.jar
xom-1.0d10.jar
2) 数据接收
<%@page import="javax.xml.transform.Templates"%>
<%@ page language="java" contentType="text/html; charset=gbk"
import="java.io.*"
import="java.util.*"
import="CNCjob.*"
import="net.sf.json.*"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>自动刷新</title>
</head>
<body>
<center>
<h2>
<% // 设置每隔5秒自动刷新
response.setIntHeader("Refresh", 5);
// 获取当前时间
Calendar calendar = new GregorianCalendar();
String am_pm;
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
month++; //月份计数从0开始,加1获得正确月份
int day = calendar.get(Calendar.DATE);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if(calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = year+"."+month+"."+day+" "+hour+":"+ minute +":"+ second +" "+ am_pm;
out.println("当前时间: " + CT + "\n"); %>
</h2>
<h2>
<% String postData = Common.getPostData(request.getInputStream(), request.getContentLength(), "gbk");
//out.println(postData);
//String post = postData.substring(0, postData.length()-1);
JSONArray json = JSONArray.fromObject(postData);
File file = new File("/home/tomcat/apache-tomcat-9.0.36/webapps/temp.txt");
if(!file.exists()){
file.createNewFile();
}
String s = new String();
try{
if(!json.isEmpty()){ //判断是否接收到数据
for(int i=0; i<json.length(); i++){
JSONObject job = json.getJSONObject(i);
out.println("接收到数据</br>");
out.println("姓名:" + job.get("name")); //获取键值为“name”的数据
out.println(" 学号:" + job.get("studentnumber")); //获取键值为“studentnumber”的数据
s = s + "\n" + CT + " " + "姓名:" + job.get("name") + " 学号:" + job.get("studentnumber");
}
//out.println(json);
/*
将数据存入文件
*/
byte[] b = s.getBytes();
int l = s.length();
OutputStream os = new FileOutputStream(file,true);
os.write(b);
os.close();
}
else
out.println("没有接收到任何POST数据报");
}catch(Exception e){
out.println("没有接收到任何POST数据报");
}
%>
</h2>
</center>
</body>
</html>
3) 数据显示
<%@page import="javax.xml.transform.Templates"%>
<%@ page language="java" contentType="text/html; charset=gbk"
import="java.io.*"
import="java.util.*"
import="net.sf.json.*"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>POST数据报发送结果</title>
</head>
<body>
<%
/*
读取数据并存入strB中
*/
File file = new File("/home/tomcat/apache-tomcat-9.0.36/webapps/temp.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
StringBuffer strB = new StringBuffer();
String str = br.readLine();
while(str != null){
strB.append(str).append("<br>");
str = br.readLine();
}
br.close();
%>
<h2>
<center>
<%=strB %>
</center>
</h2>
</body>
</html>
4) Common.java
package CNCjob;
import java.io.IOException;
import java.io.InputStream;
public class Common {
public static String getPostData(InputStream in, int size, String charset) {
if(in != null && size >0) {
byte[] buf = new byte[size];
try {
in.read(buf);
if(charset == null || charset.length() == 0)
return new String(buf);
else {
return new String(buf,charset);
}
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
return null;
}}
五、遇到的一些问题
1、数据报中的中文解析
遇到的最主要的问题就是发送的数据中,中文不能正确的被接收存储。
经过检查发现,是由于SSCOM发送的数据编码方式与服务器不同导致的。SSCOM发送的数据编码方式为GBK,而服务器默认解析方式为UTF-8。只需要在服务器解析数据时使用GBK编码方式进行解析即可正常解析中文。
String postData = Common.getPostData(request.getInputStream(), request.getContentLength(), "gbk");
2、SSCOM中返回结果显示乱码
这也是由于编码方式导致的问题。
解决办法为将网页的编码方式改为GBK即可正常在SSCOM中显示。
page language="java" contentType="text/html; charset=gbk"