嵌入式物联网智能钟--后台jiava程序设计

技术设计 · 2019/08/30
← 返回技术文章

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()));