NB-IOT个人学习记录(二)

这篇文章主要内容是分析 度云公司 提供的两个库:M5310A.cAT_Command_Parser.c
前见 《NB-IOT个人学习记录(一)》

文件结构初览

这两个文件函数较多,Keil看代码太吃力,这里使用Source Insight,将整个工程文件夹导入。
两个文件的结构如下:


NB-IOT个人学习记录(二)_第1张图片
文件结构

相应的头文件M5310.hAT_Command_Parser.h中定义了大量需要用到的结构体,这里就不贴出来了。

M5310.c

M5310A_Recv_Enable_Clear()
/*使能串口中断,并清空5310结构体中的串口接收部分*/

Send_At_Command()
/*将AT指令通过指定通道发送出去,并设置5310结构体中的ID、命令类型。返回bool值(成功1,失败0)*/

M5310A_RxCallBack()
/*在上篇文章中提到过,若串口接收的数据来自LPUART1(AT指令发送端口),则调用此函数,对AT指令
的回应消息进行解析。*/

Brd_M5310A_AT_MIPLCONF()
/*生成注册码,在模组中创建与Onenet平台的通信实例。返回bool值(命令的发送结果)*/

Wait_Rec_AT()
/*得到AT指令的执行结果。返回bool值(收到OK为1,收到ERROR/超时为0)
注意!这个函数里没有对串口接收到的数据的具体操作,
而是空循环直到超时或M5310A.ATInfo.ATState发生改变,
而M5310A.ATInfo.ATState是在串口接收中断中,对接收值解析时发生改变的。*/

Brd_M5310A_Snd_AT()
/*发送AT,判断与M5310模块之间的串口连接是否正常,返回bool值(AT指令执行结果)*/
MESetAtState()                //设置AT指令执行后的状态。
Brd_M5310A_AT_CSQ()           //查询信号强度。
Brd_M5310A_AT_CEREG()         //查询网络附着状态。
Brd_M5310A_AT_CGSN()          //查询IMEI号。
Brd_M5310A_AT_CIMI()          //查询IMSI号。
Brd_M5310A_AT_MIPLADDOBJ()    //模组创建一个Object
Brd_M5310A_AT_MIPLNOTIFY()    //模组向Onenet平台请求同步数据
/*需要填写具体Object id,Instance id,Resource id(符合LwM2M协议中的要求)*/

Brd_M5310A_AT_MIPLOPEN()   设备注册到Onenet平台。
/*注意!模组成功接收到此命令后会返回“OK”。
模组成功注册到平台后,平台会发出“+MILPOPEN”和“+MIPLOBSERVE”,
除这两条外,如果在平台中打开了选项“自动发现资源”,平台还会发送“+MIPLDISCOVER”。
所以说,一次成功的Onenet平台注册连接行为会收到3或4条回应:
OK
+MIPLOPEN
+MIPLOBSERVE
+MIPLDISCOVER
或(没打开自动发现资源时)
OK
+MIPLOPEN
+MIPLOBSERVE
串口接收中断会根据返回的消息判断这条命令是否成功注册连接到Onenet平台。*/

Brd_M5310A_AT_MIPLREAD()
/*这里应该是:Brd_M5310A_AT_MIPLREADRSP()才对。
MIPLREAD()是Onenet平台向模组发出读请求,由平台发出。
MIPLREADRSP()是模组响应平台的读请求,才是应该由模组发出的。
这里应该是由于M5310固件版本已经升级,相应的库函数却没有及时跟进。
注:平台READ的数据貌似不会保存在资源列表的属性列表中,
但是在日志查询中可以查询到这条READ,包括成功与否和路径: /Obj ID/ Instance ID/ Resource ID*/

Brd_M5310A_AT_MIPLCLOSE()    //注销与Onenet平台的连接。
Brd_M5310A_AT_MMIPLDELOBJ()  //删除模组中的Object。
Brd_M5310A_AT_MMIPLDEL()    //删除模组中的通信实例。
M5310A_Api_Init()           //M5310模组连接到Onenet平台的全过程如下:
**********************M5310A_Api_Init()  START****************************
AT                      //测试与M5310的串口连接是否正常
AT+CSQ                  //检测信号强度,>0时才进行后续操作
AT+CEREG?               //获取网络附着状态,返回1或5时才进行后续操作
AT+CGSN=1               //查询IMEI
AT+CIMI                 //查询IMSI
AT+MIPLCONF=......      //在模组中创建通信实例
AT+MIPLADDOBJ=......    //在平台实例中创建对象
AT+MIPLNOTIFY=......    //模组向平台请求同步数据
AT+MIPLOPEN=......      //模组向平台发起注册连接
AT+MIPLNOTIFY=......    //模组向平台请求同步数据
                        //(在注册连接成功后再次同步数据,数据才会上传到平台上)
********************M5310A_Api_Init() END***********************************
M5310A_exit()            //断开与平台的注册连接,删除模组中的对象,删除通信实例。

小结:
M5310.c中大多数函数所做的工作只是通过串口发送AT指令,然后监听M5310对指令的回应。

接收流程

  1. 串口接收到数据,进入中断
  2. 由于使用的是HAL库,用户自行编写的中断处理函数写在 中断回调函数 中。
  3. 判断产生中断的串口端口,若为M5310连接端,进行接收处理。
  4. 根据AT指令的返回格式进行接收(即XXXX
  5. 接收完成,判断返回内容
  6. 根据发送和接收过程中暂存下来的状态,跳转到相应Command_Handler()处
  7. 判断接收内容是否与预期相符,返回。
//接收中断
void AES_RNG_LPUART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&hlpuart1);
}

/********************************
中间跳转步骤如下:
1. HAL_UART_IRQHandler()
2. UART_Receive_IT()
3. HAL_UART_RxCpltCallback()
*********************************/

//自行重定义的回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance==LPUART1)
    {
        M5310A_RxCallBack();
    }
}

void M5310A_RxCallBack(void)
{
/*
这个处理函数较长,所做的内容是:
1. 判断头部
2. 接收数据段内容
3. 判断尾部,跳转处理
*/
}

void ATHandle(uint8_t *p_ATBuff,uint16_t len)
{
    ATAnswerCheck(M5310A.ATInfo.ATCommand,M5310A.ATInfo.ATType,(char *)p_ATBuff);
    //处理主动上报数据
    Active_report((char *)p_ATBuff);
}

bool ATAnswerCheck(AT_Command_t cmd,AT_Type_t at_type,char * pch)
{
  if (ATWaitEventHandler[cmd] == NULL)
    return false;
    //当模块返回回显现时立即返回
  if (!strncmp(pch, "AT", 3))
     return true;
   ATWaitEventHandler[cmd](pch,at_type);
   return true;
}

//相应的Handler
const WaitEventHandler ATWaitEventHandler[] =
{
    NULL, 
    WatiATHandler,
    WaitCSQHandler,
    WaitCeregHandler,
    WaitCgsnHandler,
    WaitCimiHandler,
    WaitMiplconfHandler,
    WaitMipladdobjHandler,
    WaitMiplnotifyHandler,
    WaitMiplopenHandler,
    WaitMiplreadHandler,
    WaitMiplcloseHandler,
    WaitMipldelobjHandler,
    WaitMipldelHandler,
};

你可能感兴趣的:(NB-IOT个人学习记录(二))