1、 课题内容和要求:内容:设计和编写一个智能物联网时钟的服务器要求:1、时钟分布在世界各地并连接服务器,从服务器...
[[heading]]
[[/heading]]
- 课题内容和要求:
内容:设计和编写一个智能物联网时钟的服务器
要求:1、时钟分布在世界各地并连接服务器,从服务器获得UTC时间,服务器按照时钟的IP地址自动转换为当地的时区时间。
2 时钟可能存在盗版,服务器可以按照数据库ID判断,假如ID不在数据库,判断为复制品,下发指令,通知时钟自动销毁程序。
3 服务器要能通过NTP协议获取标准时间,但是NTP应该是一个列表,不因某个NTP服务器不能访问而导致失败。当然,NTP时间修正可以一天一次。
4 服务器接口可以采用TCP socket, HTTP或者json接口。但需要考虑负载问题,考虑到服务器有较多连接,应自动断开已经成功下发数据的连接,确保不会导致并发资源过载。
5 服务器应考虑黑客攻击,如果黑客用程序自动发起大量请求,应该判断这种情况,并且过滤对应的IP地址。当然,对于分布式攻击,需要判断出厂产品数据库,如果ID号码不在这里面的,一律过滤IP地址。
主要设计想法:
- 转换时间:可以导入IP数据库和从网络获取当前IP对应的地理位置信息。
我的做法是从具有查询ip地址经纬度的网站API连接网站获取当前IP地址的经纬度,然后通过代码计算出时区,在根据当前时区换算出当地时间。
- 检测盗版:我的做法是从API获取地理位置信息前,先比对当前ID是否在数据库中,如果在数据库中,连接API并根据当地IP返回时间,并跟新IP和时区记录进数据库,如果当前ID不在数据库中动下发指令 19位id号+5A ,下位机收到以后,自动删除程序。
- socket tcp连接:我的做法是建立一个socket tcpserver,监听端口号:9999;一旦监听到客户发送的数据包,自动对比数据库中的ID号如果当前ID存在,根据读到的数据包中取出的IP地址,自动换为当地时间。然后下发。 下发完毕服务器主动关闭链接。
如果不存在,则不下发时间,并关闭链接。
- 判断是否为恶意连接:我的做法是连接数据库进行ID比对,如果ID不存在,记录IP请求次数,如果超出10次,过滤该IP地址,如果ID存在,如果超出10次,暂时过滤IP地址,
设计过程:
一、检验盗版和获取时区部分:
- 时钟可以从各地获取当地时间,可以设置一个定时器,定时自动一天一次获取对应IP的当时时间
- 检测盗版,如果确定为盗版,下发指令给下位机销毁程序。
Huoqushiqu类方法
功能
Main()
执行主函数功能,对比数据库和通过经度获得的时区。
getAddresses()
从外接的API获取地理位置信息
getResult()
连接API,设置连接API参数。
shujuku()
建立于数据库,连接对比ID如果ID 存在返回当地时间,如果不存在,下发下发指令 19位id号+5A
数据流程图:
从API获取地理位置信息代码如下:
public String getAddresses(String content, String encodingString)
throws UnsupportedEncodingException {
String urlStr = String .format("https://ip.seeip.org/geoip/%s",content);
// 取得IP所在的城市信息
String returnStr = this.getResult(urlStr, content, encodingString);
if (returnStr != null) {
// 处理返回的城市信息
return returnStr;
连接API部分代码如下:
private String getResult(String urlStr, String content, String encoding) {
URL url = null;
HttpURLConnection connection = null;
try {
url = new URL(urlStr);
connection = (HttpURLConnection) url.openConnection();// 新建连接实例
connection.setConnectTimeout(5000);// 设置连接超时时间,单位毫秒
connection.setReadTimeout(5000);// 设置读取数据超时时间,单位毫秒
connection.setDoOutput(true);// 是否打开输出流 true|false
connection.setDoInput(true);// 是否打开输入流true|false
connection.setRequestMethod("POST");// 提交方法POST|GET
connection.setUseCaches(false);// 是否缓存true|false
connection.connect();// 打开连接端口
DataOutputStream out = new DataOutputStream(connection
.getOutputStream());// 打开输出流往对端服务器写数据
out.writeBytes(content);// 写数据
out.flush();// 刷新
out.close();// 关闭输出流
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据
// ,以BufferedReader流来读取
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
reader.close();
return buffer.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();// 关闭连接
}
}
return null;
}
二、预防服务器过载部分:
- 服务器接口可以采用TCP socket接口进行连接,如果访问量过多,可以自动断开已经成功下发数据的连接,确保不会过载。
数据流程图:
三、预防黑客攻击部分:
5 、服务器可以预防黑客攻击,如果当前IP多次访问服务器,判断当前IP是否在数据库中,如果在数据库中,暂时屏蔽当前IP,如果当前IP不在数据库中,服务器过滤当前IP不进行理会。
数据流程图:
代码测试及结果:
一、根据IP获取时间部分代码代码:
huoqushiqu huoqu = new huoqushiqu();
String ip = "169.235.24.133";
String address = "";
String ID ;
ID="0123456789abcdf0102";//15个字符序列号,2个字符请求码,2个字符工作模式
SQL sjk =new SQL();
String a="";
int f = sjk.shujuku(ID,ip,a);
if(f==1) {
address = huoqu.getAddresses(ip, "utf-8");
String jingdu=StringUtils.substringBetween(address, "longitude\":" , ",");//获取当前IP经度
System.out.println(jingdu);
int c;
c=Double.valueOf(jingdu).intValue();//通过经度换算出时区
int d;
d=c%15;
c=c/15;
if(d>=7.5)
{c++;
}
if(c>0) {
a="GMT+"+c;
}
else
{
a="GMT"+c;
}
sjk.shujuku(ID,ip,a);
TimeZone tz=TimeZone.getTimeZone(a);
DateFormat df=DateFormat.getDateTimeInstance();
df.setTimeZone(tz);
System.out.println("当前IP所在地时间:"+df.format(new Date()));
