MCU设备入云方案

基于LTE 4G modem 单片机设备入云

引言

最近项目中有用到LTE 4G模块实现与云端后台连接来管理设备的。模组可根据不同功能需求选择不同的型号。目前国产模组供应商有,广和通、上海合宙、有方科技等。根据结构决定性质和功能,设备若要具有IOT物联功能,那必然是要有模组的。模组内部集成了很多网络协议栈,从OSI七层模型底层到上层,开发者只要根据知道手册进行上层的业务即可。
本项目采用L610CN-32+MCU模组的方式实现设备入云。主要讲讲一个从来没有用过4G模组,没搞过物联网的小白历程。物联网,主要目的是远程云端管理物理世界中的设备,基本方式就是使用网络的方式了。网络又分很多类型、不同的协议、不同的层级。本项目中采用 MQTT的方式。(阿里云物联网平台是一个很好的学习资源,讲解了MQTT、等一系列备设备入云方案)。

那些走过的弯路

因为没搞过物联网,也没搞过模组,刚毕业的小白工程师,更别谈项目经验了/哭。没做过就去找资料,结果找到了阿里云物联方案(从此我就入坑了,进入了迷宫)。首先讲一下为什么阿里云物联网这么坑?,阿里云过于牛逼,就像阿里云是一个航天发动机,而我特么只需要一个自行车就够了。刚开始去看阿里云的C-SDK Link 对接模组的协议,那分层结构、那代码标准、那头文件的安排,无处不体现阿里系的牛逼,Java格式写C语言???好吧,阿里:我就是人性,这才显得我独特/狗头。真的是把我看个半死。
为什么阿里云SDK不适合?
商业垄断,基于自家Ali-IOT开发的SDK,你要使用了就要使用阿里的服务管理平台,这样你就的付钱!!!每层都分得很好,而且可以兼容各种网络协议,各厂家的SDK,对于实际开发不友好。所以说只能做参考学习使用。提供好的想法和方案,可以。而我,刚开始全直接移植它们的SDK了,我觉得自己是个蠢逼。后来的路可想而知,各种问题,心里没底,最后重构自己写。“所有的东西只有自己写的、自己测过之后的,心里才有底气”。

设计方案

首先还是要明白如何去做,无非就是给4G模组发指令,然后模组自己执行相应的功能。指令的格式要根据具体模组的AT指令集手册去封装。方案如下图所示。

4G模组
设计方案如上图所示,简单明了清晰。MCU给通信模组发送AT指令,然后AT模组执行我们想要的功能,并返回数据。通过发送报文指令与IOT平台交互。

问题?

1.MCU如何发?
2.指令什么形式?
3.如何处理数据?
4.软件系统内部如何处理发送数据和接收数据?
5.接收到数据以后做什么?
6.如何实现MQTT协议?

仔细细想,问题如春后的雨笋,遍地都是。 解决的办法就是——一步步来。

实现方案

在这里插入图片描述

模组和MCU通过串口连接,数据的传输也是通过串口收发。串口使用什么方法收发收据,中断接收还是DMA接收。中断接收每次接收到一个字节产生一次中断缓存到buffer里面,DMA方式会快一些,减少了中断接收这一环节。串口+DMA的方式收发数据自行百度,不要去什么CSDN找代码,吐槽一句,不要想着在CSDN找代码。大部分博主贴出代码来,实际是根本就不适合你。还有个现象,我不知道为什么很多技术博主那么喜欢贴代码?漂亮的格式,整整齐齐,显得自己很牛逼的样子。事实是,其实对于存在问题找答案的你来说,没啥用。还是要自己理解,自己去写代码,去调试,去测,慢慢本质你就了解了。别问我为什么这么说,我就是从坑里出来的/哭。所以我的博客,不贴代码,只贴伪代码、图形、逻辑流程。
AT指令是一个指令集,包含了可以操作的所有指令,这样模组可以完成操控了.其他的网络协议都是基于AT指令实现的,MQTT协议指令不超过10条,主要的是如何封装数据,提供主题、负载接口。模组和设备是一个多主通信的场景,只要你给模组发送指令,它就立刻回你什么,这样不好处理。你需要“选择性”的去解析所需的数据,例如:带有服务信息的下行报文、服务指令报文,而那些ACK应答报文就没必要去处理了。

void UARTx_Init(void)
{
	// 1. 串口中断接收方式
	// 2. 串口+DMA 方式
	
}

// 串口行为
void UARTx_Transimit()
{
	// 自行实现自己需要的发送功能
}

void UARTx_Receive()
{
	// 自行实现自己的接收逻辑
	//  大多数做法,一个接收buffer临时缓存数据,一个应用buffer处理数据
}

这里存在几个问题,接收buffer一般只有一个,当服务端连续下发多个报文时,会不会冲包?就是说,还没处理完就下发下一个报文了,有可能。这里需要一个缓存机制——来了就接收,先存起来,后面处理。缓存机制是使用静态内存还是动态内存,对于资源紧张的单片机来说,动态缓存当然好一些,但是为了避免bug和难处理,对大多数人来说使用静态缓存。你玩内存和指针很牛逼的话,当我没说。我是个渣渣/哭,小白工程师。底层的串口数据收发一定要测稳定,要不后面问题一堆。设计从上到下,实现从下到上。系统设计与实现的基本思想就是——分而治之,模块化。都是踩坑之见。
MQTT协议实现就是根据MQTT应用AT指令封装报文就可以了。


```c
// 实现方式参考AT指令手册
void MQTT_UserPack(void)
{
	// 1.自行实现用户连接参数报文
}


void MQTT_ConectPack(void)
{
	// 1.自行实现发起连接报文
}


void MQTT_Subscribe(char *topic_name, int topic_len, int QoS)
{
	// 1.自行实现主题订阅报文
}


void MQTT_PublishQs1(char *topic, int topic_len, char *data, int data_len)
{
	// 1.自行实现发布报文
}

如何处理收到的服务下行报文

答案:解析回调.

总结

先要设计,然后再去做。先要把底层功能,每个函数测稳定了,再去做上层业务逻辑。测试:开发期间要进行白盒测试,把每个模块的函数功能测稳定,模块只提供稳定可靠的接口。函数测试要遍历所有的路径、条件路径、判断路径。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值