,同时看到device_id的第4个数就是验证码中的第4个数。四 在windows平台计算验证码如下图,把同样的TOTP算法代码移植到到windows平台,编译后,同一时间计算的验证码跟MCU 端一样。实际项目中,只
2023-02-24 14:45
概述:本篇从本地RTC和RTT日志输出开始,因为验证码的计算严格依赖于时间,而整个项目运行过程和结果都需要RTT日志来显示,为了将运行过程显示的更加精确,包括每一条通信指令的发出和完成时间,所以
2023-02-20 14:49
个小时。当读取或者更新本地RTC时间是用的北京时间,而下一篇计算验证码用的是UTC时间。如下代码,atUdpRecv函数上面已经讲过,把atUdpRecv函数获取字符串格式的时间buff转换成SNTP
2023-02-21 16:47
概述:本篇讲述MCU与NB模组串口通信的交互过程,包括串口通信是否正常,检测模组是否注网成功,基站信号等。首先要确定发送给NB模组的每一个指令和NB模组响应返回的数据格式(包括成功,失败,状态信息,或者其他错误)。一 串口数据收发NB模组波特率默认是9600,实际项目中我发现有少部分模组产品在终端用户用过1年后会串口通信异常,模组厂给我的建议是使用4800,所以我在这里也使用4800波特率。我使用G43X的LPUART ,PA3作为RX,PA4作为TX,相关LPUART配置代码可以直接从例程examples\\LPUART\\Polling中复制过来,这里讲下发送和接收的函数封装。发送函数如下图:指定发送的第一个字节地址和要发送的字节个数另一个发送函数,只需要指定字符串的首地址,就会发送字符串,前提是字符串以0作为结束标记如下图,接收函数recv_data接收到数据就返回true,如果50毫秒都没有接收到,返回超时。clk0 在SysTick_Handler中++clk0,因为在主函数中调用了SysTick_Config(SystemCoreClock/100); 所以10ms会产生一次中断。如下图:对接收函数recv_data的再次封装,参数指定接收的超时时间和已经接收到的字节长度,超时时间到了,函数就返回,同时在函数返回前,如果有接收到数据,输出RTT日志,这样可以看到具体接收到的内容。在初始化完LPUART之后,在main函数调用send_AT_CMD 两次就进行两次串口发送和接收,如下图,是send_AT_CMD函数定义,调用了上面的发送和接收函数。注意函数send_AT_CMD定义在nbiot.c中,与nb模组的交互都是在此文件中。如下图,第一次发送AT\\r\\n,因为NB模组不工作的时候是低功耗休眠,所以第一次返回error,第二次就会返回ok,说明NB模组的串口已经正确通信。注意AT指令数据格式:给NB模组发送的数据都是以\\r\\n结尾,而NB模组返回的数据都是以\\r\\n开头,\\r\\n结尾,所以在在日志中可以看到,AT只有后面只换行一次,而ERROR或者OK的前面换行一次,后面也一次。二接收数据的分析NB模组返回的数据可以分为2类,对于发送到NB模组的指令,一类是NB模组自己处理后即直接返回,不需要借助和基站进行网络通信,这一类返回速度极快,几十到几百毫秒,另一类是NB模组需要借助和基站进行网络通信,把从网络获取的数据返回来,这一类返回速度极慢,需要几秒,有时网络不好,或者第一次与基站连接时,需要几十秒或者更长时间,这里先讲第一类,第二类在下一篇sntp协议解析时讲。下图是第一类返回速度极快的分析,只检测是返回ok,还是error,因为每一个具体at指令返回的数据内容不同,但是返回的数据中都会包含ok或者error,此函数用来判断模组at指令的执行是否完成。以下所讲代码都在nbiot.c中。下图函数中可以执行3条AT指令,红框中的函数用来判断是否注网成功。如果有需要增加其他指令,可以在这里增加。下图封装了执行上面3条指令的函数,如果AT_CGATT查询到注网成功,继续执行后面的流程,如果查询到注网没成功,延时1秒,再次查询,直到180次查询,即3分钟后停止查询,显示注网失败。下图是执行结果,+CGATT:1表示注网成功,+CGATT:0表示注网失败,在第31次查询时注网成功了。
2023-02-20 15:03