【时间基准】NTP网络时钟服务器助力智能农业系统
【时间基准】NTP网络时钟服务器助力智能农业系统
京准电子科技官微——ahjzsz
建立一个规范准确即时的种植数据库,提高管理效率、掌握及时准确、全面的种植动态,有效控制种植过程。结合了最先进的物联网及软件技术,为农场等农业企业客户提供全面的信息化解决方案,帮助客户提供管理水平、提高效率、降低成本、增加收入;
通过在生产现场部署传感器、控制器、摄像头等多种物联网设备,借助个人电脑、智能手机,就能实现对农业生产现场气候变化、土壤状况、作物生长、水肥使用、设备运行等实时监测展示,对异常情况的自动报警提醒,生产者可及时采取防控措施,降低生产风险;同时生产者可远程自动控制生产现场的灌溉、通风、降温、增温等设施设备,实现精准作业,减少人工成本的投入。
追溯系统基于多种不同的计算机和网络通信设备工作,这些设备主要依靠自身的时钟振荡器工作,由于温湿度变化、电磁干扰、振荡器老化和生产调试等原因,其时钟的振荡频率和标准频率之间存在一些误差,设备与设备之间存在着一定的时间误差,这些误差乍看似乎微不足道,而在长期积累后会产生相当大的影响。
同时,在追溯系统中还较多的使用了包括掌上电脑在内的嵌入式设备来读取产品的标识(条形码、电子标签等),以及在现场填报过程档案数据。这些嵌入式设备多采用电池供电,其时钟不准确的现象更为突出,经常需要进行时间校准,以保证档案记录中的时间与标准时间一致。在目前的追溯系统中,设备的时间校准往往取决于使用者的习惯,手段常为参照自选的标准手工设定时钟,这种办法效率低下、准确程度较低,无法满足对产品从生产到流通的全过程进行精确溯源、全面追踪的要求。
1、NTP网络时间同步原理
时间同步是指网络各节点设备的时钟时刻和时间间隔与世界标准时间(Universal Time Coordinated, UTC)同步,保证各设备的时间信息基于UTC时间的误差限定在足够小的范围内。
NTP(Network Time Protocol,网络时间协议)由美国德拉瓦大学的David L.Mills 教授于1985 年提出,用于实现互联网上计算机的精确的时间同步。SNTP(SimpleNetwork Time Protocol)的全称是“简单网络时间同步协议”,是一个简化了的NTP服务器和NTP客户端策略,不需要实现NTP协议的所有功能,其功能是使网络内设备的时钟与标准的时钟源保持同步。NTP对性能差异很大的客户端及服务器均能适用,且适用于客户端及服务器所在网络有大范围的网络延迟和抖动的情况。NTP协议同步系统时钟有两种工作模式。一是广播模式Multicast/Broadcast mode):此种工作模式适用于高速的局域网内部,服务器在固定周期向多个客户机主动发出时间信息,客户机根据此时间信息校正系统时钟;二是客户机/服务器模式(Client/Server mode),客户机定时向授时服务器请求时间信息,根据双方交换的时间信息,实现客户机与NTP服务器时钟的同步。


客户机/服务器模式下客户机首先向服务器发送一个NTP包,其中包含了该包离开客户机时的时间戳T1,当
服务器接收到该包时,依次填入数据包到达时的时间戳T2 和包离开时的时间戳T3,然后立即把包返回给客户机,客户机接收到响应包时再填入包回到客户机的时间戳T4,客户机利用这4个时间戳和包交换的往返延迟(TQ和TR)就能够计算出客户机与服务器之间的时钟偏移量ΔT,如图1 所示。
现已知T1、T2、T3、T4 和参数TQ、TR,可以得出时钟偏移量ΔT 的方程式有:
T2=T1+TQ+ΔT (1)
T4=T3+TR-ΔT (2)
假设发送和响应NTP 包在网络上的延迟时间TQ、TR 相等,则根据方程式(1)和方程式(2)可以得出:
由方程式(3)可以看出客户机系统时钟偏差量ΔT与T1、T2 差值和T4、T3 差值相关,而与T2、T3 的差值无关,即时钟偏差量与时钟服务器的响应速度无关。客户机根据时钟偏移量ΔT 来调整本系统时钟,以使其时间与服务器时间一致。
2、系统时间同步的设计和实现
时间同步对于产品质量安全追溯系统有着重要的作用,为了使系统内各设备之间保持时间同步,需要解决四个方面的问题:一是尽量选取非常精确的时间源,各设备与该时间源的误差值应较小;二是自动实现时间同步,排除人工因素;三是降低系统开销,适应现有追溯系统的网络条件,同时具备较好的扩充能力;四是尽量屏蔽异质网络和设备之间的差异。系统时间同步的设计方案将逐一讨论这些问题。
产品质量安全追溯系统一般由多个子系统构成,包括生产子系统、加工子系统、运输子系统、销售子系统,以及对用户权限进行配置管理的子系统等,这些子系统通过网络连结为一个整体进行工作。其中涉及的网络多种多样,包括以太网、无线WLAN网络、GPRS/CDMA无线网络、蓝牙/红外传输网络等。同时子系统运行的计算机软、硬件环境也存在较大的差异。为适应现有的网络条件,使系统差异较大的网络和设备环境能顺利的协同工作,满足不同的设备进行校时的需要,设计了一个统一的与各子系统相对独立的时间同步网络。
————————————————
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时