要求:1、时钟分布在世界各地并连接服务器,从服务器获得UTC时间,服务器按照时钟的IP地址自动转换为当地的时区时间。

3 服务器要能通过NTP协议获取标准时间,但是NTP应该是一个列表,不因某个NTP服务器不能访问而导致失败。当然,NTP时间修正可以一天一次。"/>

永利yl23411|官方网站|欢迎您

永利yl23411|官方网站
专注电子产品研发外包服务 基于客户要求的个性化设计
021-51360000

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

浏览数:521 






1、 课题内容和要求

内容:设计和编写一个智能物联网时钟的服务器

要求:1、时钟分布在世界各地并连接服务器,从服务器获得UTC时间,服务器按照时钟的IP地址自动转换为当地的时区时间。

2 时钟可能存在盗版,服务器可以按照数据库ID判断,假如ID不在数据库,判断为复制品,下发指令,通知时钟自动销毁程序。

3 服务器要能通过NTP协议获取标准时间,但是NTP应该是一个列表,不因某个NTP服务器不能访问而导致失败。当然,NTP时间修正可以一天一次。

4 服务器接口可以采用TCP socket, HTTP或者json接口。但需要考虑负载问题,考虑到服务器有较多连接,应自动断开已经成功下发数据的连接,确保不会导致并发资源过载。

5 服务器应考虑黑客攻击,如果黑客用程序自动发起大量请求,应该判断这种情况,并且过滤对应的IP地址。当然,对于分布式攻击,需要判断出厂产品数据库,如果ID号码不在这里面的,一律过滤IP地址。

主要设计想法:


1、转换时间:可以导入IP数据库和从网络获取当前IP对应的地理位置信息。

我的做法是从具有查询ip地址经纬度的网站API连接网站获取当前IP地址的经纬度,然后通过代码计算出时区,在根据当前时区换算出当地时间。


2、检测盗版:我的做法是从API获取地理位置信息前,先比对当前ID是否在数据库中,如果在数据库中,连接API并根据当地IP返回时间,并跟新IP和时区记录进数据库,如果当前ID不在数据库中动下发指令 19id+5A ,下位机收到以后,自动删除程序。


3、socket tcp连接:我的做法是建立一个socket tcpserver,监听端口号:9999;一旦监听到客户发送的数据包,自动对比数据库中的ID号如果当前ID存在,根据读到的数据包中取出的IP地址,自动换为当地时间。然后下发。 下发完毕服务器主动关闭链接。

如果不存在,则不下发时间,并关闭链接。


4、判断是否为恶意连接:我的做法是连接数据库进行ID比对,如果ID不存在,记录IP请求次数,如果超出10次,过滤该IP地址,如果ID存在,如果超出10次,暂时过滤IP地址,

设计过程


一、检验盗版和获取时区部分:


1、时钟可以从各地获取当地时间,可以设置一个定时器,定时自动一天一次获取对应IP的当时时间


2、检测盗版,如果确定为盗版,下发指令给下位机销毁程序。




Huoqushiqu类方法
功能

Main()
执行主函数功能,对比数据库和通过经度获得的时区。

getAddresses()
从外接的API获取地理位置信息

getResult()
连接API,设置连接API参数。

shujuku()

建立于数据库,连接对比ID如果ID 存在返回当地时间,如果不存在,下发下发指令 19id+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;

}

二、预防服务器过载部分

4、 服务器接口可以采用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()));







Baidu
sogou