我正在为我的大学建立一个出勤申请,我希望通过网络标记学生的出勤率。每个教室都有单独的路由器,我想基本检查学生是否坐在路由器的范围内,并相应地标记他们的出勤率。 如何检查是否有路由器位于路由器范围内,是否可以通过Web套接字进行检查? 要么 我如何通过网络套接字ping或做某事来检查特定的IP是否存活?
我正在使用kotlin来开发我的应用程序。请帮忙。
答案 0 :(得分:0)
您可以ping IP。但是,似乎每个学生都应该获得每个班级的永久本地知识产权。这是如何ping到IP的示例:
fun ping(ip: String): String {
var str = ""
try {
val process = Runtime.getRuntime().exec(
"/system/bin/ping -c 8 " + ip)
val reader = BufferedReader(InputStreamReader(
process.inputStream))
var i: Int
val buffer = CharArray(4096)
val output = StringBuffer()
i = reader.read(buffer)
while (i > 0) {
output.append(buffer, 0, i)
i = reader.read(buffer)
}
reader.close()
str = output.toString()
} catch (e: IOException) {
e.printStackTrace()
}
return str
}
答案 1 :(得分:0)
除了通过IP地址进行检查之外,为什么不能让用户登录应用程序,只有当他/她处于特定的坐标或GPS位置时。这样,即使您的IP地址将来发生变化,也无需更新应用程序。
在您的服务器中,保留每个班级的位置列表。只有当学生在该位置范围内时,才应允许他/她登录该应用程序。
有关详细信息,请参阅Check if a latitude and longitude is within a circle。
答案 2 :(得分:0)
您可以找到的唯一位置是路由器的ARP表。终点并不能保证返回它没有要求的任何内容,而路由器需要这些信息才能正确地将流量回流到终点。
答案 3 :(得分:0)
如何通过网络套接字ping或做某事来检查特定IP是否存活?
您无法强制客户端允许您仅使用其IP地址ping它们。最好的方法是将用户连接到中央服务器(通过示例中的websocket)并检查websocket上的心跳。
对于此,当然您必须首先授权您的学生,并确保每个人都在他们的websocket上有一个令牌,以便您可以跟踪他们在您的系统中的存在。那你需要某种心跳系统。我见过的大多数websocket实现已经实现了ping
和pong
。它可以双向工作:
有一点,检查其他点是否已连接应发送ping
个请求,另一个点会自动发回pong
消息如果已连接。
在我们编写的应用程序中,我们有间隔向客户发送ping,我们坚持他们的pong时间戳。如果上一个乒乓时间戳太旧,那么我们就知道连接失败或客户端在网络上不可用。
但是,如果websocket关闭或面临错误,则会调用方法(如onError()
和onClose()
)并通知您。但实施心跳服务可以帮助您确保您的连接确实存在并且在基于websocket的系统中是必须。
如何检查是否有路由器位于路由器的范围内,这是否可以通过网络插座进行?
如果我没错,你负责设计应用程序的两面(客户端和服务器)。因此,您可以让用户一次又一次地尝试连接到 LOCAL IP地址,直到连接成功为止。您只需要确保通过其他路由器可以访问您的服务器IP地址。
注意:在本地网络上,如果学生不能使用其他教室路由器连接,那么您可以检查他们的websocket IP地址。在此之前,应该有一个表将每个用户映射到他们可以从中发送消息的IP地址。
实现此目的的另一种方法如果您的服务器不在本地网络是为这些路由提供相同的公共IP地址(或静态IP地址),并将您的流量通过互联网路由到您的服务器公共IP地址。然后,为了确保用户只能从这些路由器(在这些路由器的范围内)进行连接,您必须在服务器防火墙中允许这些路由器的IP地址(或者您可以在服务器应用程序端执行此操作)并阻止您的任何其他连接。 websocket port。
注2 再次,如果您的服务器不在您的本地网络中,但您仍想确保每个用户都在其有效的教室中,则需要一个代理服务器。是这样的:
客户端连接到其教室路由器>路由器连接到本地代理服务器>代理服务器将路由器IP地址添加到websocket消息并将其发送到公共服务器>公共服务器可以处理消息并具有用户本地IP地址