我正在使用SIM800E。我想知道应该将哪些AT命令发送到调制解调器以获取时间?该调制解调器具有RTC。但是我需要通过手机信号塔自动设置它。使用AT命令请求时,塔可以将时间发送到调制解调器。我已经在许多电话中看到,交接期间时间会更新。
本手册没有此信息。
我正在使用SIM800E。我想知道应该将哪些AT命令发送到调制解调器以获取时间?该调制解调器具有RTC。但是我需要通过手机信号塔自动设置它。使用AT命令请求时,塔可以将时间发送到调制解调器。我已经在许多电话中看到,交接期间时间会更新。
本手册没有此信息。
Answers:
我使用了以下命令:
AT+CCLK?
返回日期和时间,例如:
+CCLK: "00/01/12,05:44:53+00"
使用三种不同的电池模块成功地应用于产品:Enfora,Telit和Sierra。它在AT后面使用+字符的事实意味着它是一个常见的命令(相对于专有命令),并且在大多数(如果不是全部)电池模块上应该可用。(专有命令在AT后面使用供应商特定的字符,例如AT $,AT%,AT!等。)
正如我在评论中提到的那样,如果您无法使用该命令获取时间(例如,它返回全0),那么另一种方法是连接到网络并使用HTTP命令获取服务器的时间。
For example, the following HTTP request:
HEAD /index.html HTTP/1.1\r\n
Host: www.somehost.com\r\n;
\r\n
其中somehost是您自己的服务器或Google.com等。这还假定index.html是网站的主页(对于Google而言并非如此)。
它将返回一个标题,如:
HTTP/1.x 200 OK
Transfer-Encoding: (something)
Date: Fri, 13 Nov 2013 04:36:25 GMT
(lots more stuff)
据我所知,所有服务器都必须在其标头中返回GMT时间。
首先,许多网络对NITZ的支持都很差(可以说COST-CUTTING)。我根本不会依赖它,因为十分之十的网络都在使用它,尤其是在遥远的地方。
其次,+ CCLK命令用于调制解调器的内部RTC。某些调制解调器具有从网络更新此时钟的功能。依靠它是有风险的。
上面的HTTP请求不完整,即不起作用。我曾经知道如何执行此操作,因此它将在工作时还原。
它在AT后面使用+字符的事实意味着它是一个常见的命令(相对于专有命令),并且在大多数(如果不是全部)电池模块上应该可用。(专有命令在AT后面使用供应商特定的字符,例如AT $,AT%,AT!等。)
这并非完全正确。有遵循AT +约定的专有调制解调器命令。例如,AT + WOPEN是专有的Sierra命令。
无论调制解调器如何,都有一组相同的命令。这些在3GPP文档中定义。专有命令通常在供应商的用户手册中定义,并明确标记为专有。
油灰:
AT+COPS=2
OK
AT+CTZU=1
OK
AT+COPS=0
OK
+CTZU: "15/05/06,17:25:42",-12,0
完美的作品,以后你要解析的结果,发生在CLK,因为这并不会自动发生。(至少在我的Cinterion中)
使用AT + CIPGSMLOC命令。它在SIMCOM模块中运行良好。
使用此命令之前,需要附加GPRS服务。因此,首先使用适当的命令序列连接GPRS服务,然后使用此命令从GSM网络获取日期和时间。
附加GPRS服务:
CMD:AT+CGATT=1
CMD:AT+SAPBR=3,1,"Contype","GPRS"
CMD:AT+SAPBR=3,1,"APN",""
CMD:AT+SAPBR=3,1,"USER",""
CMD:AT+SAPBR=3,1,"PWD",""
CMD:AT+SAPBR=1,1
CMD:AT+SAPBR=2,1 /* to confirm that GPRS is attached. will show IP if attached */
然后使用GSM Location命令:
AT+CIPGSMLOC=1,1
该命令需要相当长的时间(几秒钟)才能从网络获取信息,因此请给命令执行功能适当的超时。
此命令还返回模块连接到的BTS位置。因此,您也可以大致了解GSM模块的位置。
有关更多信息,请参阅本手册:(与SIM800的工作方式相同)
SIM900_GSM Location AT Command Manual_V1.00
另请注意,AT + CLBS命令与此命令不同。在某些地区可能无法使用。(我无法使用它!)。但是AT + CIPGSMLOC始终可以工作。
+CIPGSMLOC: 302<\r><\n>
回应
这是获取蜂窝网络时间的AT命令序列,它在我的UBLOX LEON G-200 GSM模块中有效。
GSM_Send_Modem_Command("AT+COPS=2\r\n");//de register
GSM_Send_Modem_Command("AT+CTZU=1\r\n");//automatic time zone update is enabled
GSM_Send_Modem_Command("AT+COPS=0\r\n");// register to network
GSM_Send_Modem_Command("AT+CCLK?\r\n");// gets the clock of the MT
我为U-Blox LTE开发了固件。在那里我用过AT + CCLK?从调制解调器获取当前本地时间。
它以以下格式给出时间。并不是说这是一个同步命令。
+CCLK: "00/01/01,05:44:53+00" (might get unsynchronized time if the modem time is not sync with the system time)
因此,在注册之前发送了以下AT命令,以将时间与网络同步
AT+CTZU=1\r\n
所以我的命令顺序是:
AT+CTZU=1\r\n
AT+CREG=1\r\n (to subscribe for the network registration updates)
AT+CCLK?\r\n (The Time Zone information is provided after the network registration, if the network supports the time
zone information)
确保其具有正确时间的其他逻辑:
它根据70/01/01或00/01/01来检查日期(在我们的情况下,这是调制解调器具有无效时间时获得的时间)。如果无效,它将每隔1分钟定期尝试一次,直到获得正确的时间为止。重试几次后停止发送CCLK吗?并依靠其他时间来源。
注意:少数国家/地区支持NITZ(https://en.wikipedia.org/wiki/NITZ)
因此,如果该国家/地区不支持使用时间更新,则最好使用备用方法。
就我而言,我们具有GPS模块,因此我可以通过GNSS数据获取时间更新。
此外,这与此处无关,但对时间同步很有用。
我们运行chrony deamon来更新系统时间(启用手动命令)。因此,将同时获取两个时间更新,并且chrony会确定正确的时间并更新系统时间。