要求:1、时钟分布在世界各地并连接服务器,从服务器获得UTC时间,服务器按照时钟的IP地址自动转换为当地的时区时间。
3 服务器要能通过NTP协议获取标准时间,但是NTP应该是一个列表,不因某个NTP服务器不能访问而导致失败。当然,NTP时间修正可以一天一次。"/>
工作时间 周一至周六 :8:30-17:00 联系方式 电话:021-51360000 地址:浦东新区金吉路778号1幢703 email:embedchina@163.com 客服热线:18717992104 技术咨询:17811901598 |
嵌入式物联网智能钟--后台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不在数据库中动下发指令 19位id号+5A ,下位机收到以后,自动删除程序。 3、socket tcp连接:我的做法是建立一个socket tcpserver,监听端口号:9999;一旦监听到客户发送的数据包,自动对比数据库中的ID号如果当前ID存在,根据读到的数据包中取出的IP地址,自动换为当地时间。然后下发。 下发完毕服务器主动关闭链接。 如果不存在,则不下发时间,并关闭链接。 4、判断是否为恶意连接:我的做法是连接数据库进行ID比对,如果ID不存在,记录IP请求次数,如果超出10次,过滤该IP地址,如果ID存在,如果超出10次,暂时过滤IP地址, 设计过程:一、检验盗版和获取时区部分:1、时钟可以从各地获取当地时间,可以设置一个定时器,定时自动一天一次获取对应IP的当时时间 2、检测盗版,如果确定为盗版,下发指令给下位机销毁程序。
数据流程图:
从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())); |