ME3616 NBIOT模块使用指南
简介
ME3616 是一款支持NB-IoT通信标准的窄带蜂窝物联网通信模组。在NB-IoT制式下,该模块可以提供最大66 Kbps上行速率和34 Kbps下行速率。该模块为极小尺寸LCC紧凑型封装模块,适用于可穿戴设备等对于模块尺寸有严格要求的应用领域。
ME3616专为低速率、低功耗、远距离、海量连接的物联网应用而设计。该模组支持多种网络协议(CoAP、TCP/UDP、MQTT、OMA-LWM2M、oneNET)和多种低功耗模式(PSM、eDRX),并可支持GNSS定位功能和嵌入式eSIM。这些协议和功能可以让它应用在智能表计、智能停车、资产追踪和可穿戴设备等多种物联网及M2M的应用场景中。
前言
本教程旨在面向没有模组使用基础的用户,我尽可能的把繁杂的部分简化,让未接触过此类模组开发学生或者第一次接手该项目的朋友能够快速搭建最小系统用以测试,但是即便是如此,下面的简单设计也依旧是量产过,且经受考验的。
硬件搭建
外围电路
在这里,我提供一个最简化版本的模组外围电路,按此搭建,ME3616模组便可以正常使用且可与外部通信,
[这里使用的是串口开发方案,即通过串口发送AT指令进行通信]
核心
我就没有单独画电源了,因为该模组可以直接3.3V供电,和MCU处在同一电压域,你可以选择任何你需要的电源方案,DCDC或者是像常见的LDO例如ASM1117 3.3即可驱动,非常方便 [注:官方要求的电源能提供的最大电流需达到800ma,因不同制式下可能会出现瞬时大电流,但是平时模组电流并不大,毕竟NB模组就是针对低功耗设计的]。
下图为官方指南:无论哪个版本,都可以在3.3V下正常工作。
电源处尽可能最低满足有一颗最小100uf的低ESR储能电容[一般是用的3216的钽电容]为瞬时增大的电流提供供能,以及三颗图上所示的滤波电容,走线时经过电容尽可能按先大后小的顺序,以增强滤波效果。
这一路串口,是模组调试串口,通常用以给模组下载固件,画板时尽可能保留该接口,或者留下测试点,出现模组版本差异时方便升级模组。
串口电平转换
ME3616模组的串口电平是1.8V,通常我们使用的USB转串口或者MCU都是TTL电平的,为了转换成TTL电平我们采用了这个电路以匹配电平,如果需要转换成其他电平,请自行设计。
[注:三极管的选择需要注意开关频率是否满足波特率,推荐使用MMBT3904这个型号]
天线
天线设计本应该是一个特别考验经验和技能的工作,什么射频阿,阻抗匹配阿,那些让没有经验的小白看着就头大,但是经过我们反复测试,该模组在信号良好时甚至不接天线都能正常通信,所以如果你没有设计过天线也不用担心,一定点的亮,一定能通信,你就放心,至于天线的选择,我推荐的方式是走线由MAIN_ANT引出,留出Π型网络【图示NC的部分,可以根据实际测试时调整数值,或者直接留空,但是画板时依旧建议保留焊盘】,直接连到ipx座子上,使用外部天线,如下图所示。
这种座子即可,立创商城搜天线座子就有。
其他天线
我分别测试过PCB天线,塑料片儿天线,陶瓷天线,均能正常使用,但是外部天线是信号最好的,推荐使用外部天线,下图是我在个人做的一些小玩具上为了省空间使用的陶瓷天线,信号属于【还能用】。
开机复位电路
这个电路依旧很简单,简单的三极管和滤波电容做成的两个按键,其中MCU_RST,MCU_POWER可以连接MCU,通过MCU控制开关和复位。
简述一下开机流程:POWER管脚拉低至少0.2s [对应按键按下0.2s或者MCU IO拉低],模组开始开机,REST引脚拉低一秒,则模组开始复位。
那么基础的硬件部分就介绍完了,如果您还有什么疑问,可以在评论区留言,我会为您解答。
模组AT指令流程
易错提醒
这里我只介绍常用的基础测试指令,复杂功能的实现请阅读相关datasheet。
在指令收发前,我先针对常见错误做出一些整理
1.为什么模组不响应
(1)请确认上位机或者MCU程序设置了正确的波特率,ME3616默认频率为115200,后期可以指令修改。
(2)如果是直接连接的模组,是否已经做了电平转换,模组串口电平是1.8V,你的通信电平是否正确。
2.为什么返回ERROR
(1)请确认指令发送正确或完整,是否有多余的空格,因为模组是通过\r\n作为结束标志的
(2)是否使用了中文符号,特别是双引号【“】,务必使用英文的双引号【”】
/*这里的问号和双引号,在串口助手指令发送时请务必注意区分*/
AT+CPIN? AT+CPIN?
”“ ""
(3)模组是否支持这条指令,发送指令加问号 [指令?] 会回显模组是否支持这个指令,有可能你使用的软件版本不支持该指令,则您需要升级模组固件,如果是硬件版本不支持,则需要更换其他型号的该模组。ATI查看模组软硬件版本。
基础功能测试
/* [响应OK则表示正常运行了]*/
AT
/* 读取SIM卡的ICCID 【如果没插卡是无法读取的,请确认已经插入了物联网卡】*/
AT*MICCID
【下图示为插入SIM卡的响应】
/* EPS网络注册状态,用以查询是否附着上网路,0,1则未注册上网络,附着上网络应该是0,1*/
AT+CEREG?
【下图示为附着上网络】
/* 查询PIN状态,如果PING上网络,会响应READY*/
AT+CPIN?
基础指令就到这里,以上指令都响应正确后,基本就可以开始后面的通信指令。
ME3616 TCP通信
以下是TCP测试的指令合集
创建套接字通道
AT+ESOC=1,1,1
连接TCP服务器
AT+ESOCON=0,8885,"219.144.130.27"
发送数据
AT+ESOSEND=0,8,3131313131313131
关闭套接字
AT+ESOCL=0
先让我们看看通过串口助手收发的完整实际通信流程
//[2020-11-18 21:38:59.692]# SEND ASCII>
AT+ESOC=1,1,1
//[2020-11-18 21:38:59.798]# RECV ASCII>
AT+ESOC=1,1,1
+ESOC=0
OK
//[2020-11-18 21:39:59.699]# SEND ASCII>
AT+ESOCON=0,32868,"122.114.122.174"
//[2020-11-18 21:39:59.799]# RECV ASCII>
AT+ESOCON=0,32868,"122.114.122.174"
//[2020-11-18 21:40:00.207]# RECV ASCII>
OK
//[2020-11-18 21:40:12.451]# SEND ASCII>
AT+ESOSEND=0,8,3131313131313131
//[2020-11-18 21:40:12.590]# RECV ASCII>
AT+ESOSEND=0,8,3131313131313131
OK
//[2020-11-18 21:40:24.044]# RECV ASCII>
+ESONMI=0,5,68656c6c6f
流程详解
首先发送 AT+ESOC指令以创建套接字。
这三个1的意思分别是:【使用ipv4】,【创建的是TCP套接字】,【使用ip】
AT+ESOC=1,1,1
之后模组会返回一个内部分配好的套接字通道句柄,我们后续的指令都是通过该编号操作。
+ESOC=0 的 0 ,就是返回的套接字句柄编号,这个值为0-4,最多开五个通道。
AT+ESOC=1,1,1
+ESOC=0
OK
发送AT+ESOCON连接TCP服务器,这里的【0】是刚才模组分配的套接字句柄编号,这里的【32868】是端口,【“122.114.122.174”】是IP地址,端口不需要双引号包围,而IP地址需要双引号。
AT+ESOCON=0,32868,"122.114.122.174"
之后模组会如下响应,则表示已经连上TCP服务器。
AT+ESOCON=0,32868,"122.114.122.174"
OK
发送AT+ESOSEND指令往服务器发送数据,【0】句柄【8】发送的数据长度,注意是按16进制数据发送的,所以是按16进制数的,不是数ascii数,【3131313131313131】要发送的16进制数据。
AT+ESOSEND=0,8,3131313131313131
之后模组会如下响应,表示发送成功
AT+ESOSEND=0,8,3131313131313131
OK
如果从服务器发送数据,模组收到是什么样子的呢,如下所示,挂载的为【0】收到消息的句柄编号【5】长度【68656c6c6f】16进制数据。
+ESONMI=0,5,68656c6c6f
发送AT+ESOCL指令,关闭套接字,参数【0】为要关闭的套接字通道的句柄编号
AT+ESOCL=0
响应:
AT+ESOCL=0
OK
有时候因为通道开太多了,开满了,则需要关闭点通道,如下所示。
[2020-11-18 22:06:26.639]# SEND ASCII>
AT+ESOC=1,1,1
[2020-11-18 22:06:26.749]# RECV ASCII>
AT+ESOC=1,1,1
too much socket instance
ERROR
[2020-11-18 22:06:41.881]# SEND ASCII>
AT+ESOCL=0
[2020-11-18 22:06:41.984]# RECV ASCII>
AT+ESOCL=0
OK
[2020-11-18 22:06:46.552]# SEND ASCII>
AT+ESOC=1,1,1
[2020-11-18 22:06:46.658]# RECV ASCII>
AT+ESOC=1,1,1
+ESOC=0
OK
掉线的情况,如果收到这种响应,则表明掉线,,可能是服务器关闭,或者被服务器踢掉了,具体情况需要根据返回值确定。
+ESOERR=0,4
那么关于TCP的基础通信就到这里了,如果还有什么疑惑,请在评论区指出。
ME3616 UDP通信
以下是UDP测试的指令合集
创建套接字通道
AT+ESOC=1,2,1
连接TCP服务器
AT+ESOCON=0,7000,"219.144.130.27"
发送数据
AT+ESOSEND=0,8,3131313131313131
关闭套接字
AT+ESOCL=0
//[2020-11-18 21:38:59.692] SEND ASCII>
AT+ESOC=1,2,1
//[2020-11-18 21:38:59.798] RECV ASCII>
AT+ESOC=1,2,1
+ESOC=0
OK
//[2020-11-18 21:39:59.699] SEND ASCII>
AT+ESOCON=0,32868,"122.114.122.174"
//[2020-11-18 21:39:59.799] RECV ASCII>
AT+ESOCON=0,32868,"122.114.122.174"
//[2020-11-18 21:40:00.207]# RECV ASCII>
OK
//[2020-11-18 21:40:12.451] SEND ASCII>
AT+ESOSEND=0,8,3131313131313131
//[2020-11-18 21:40:12.590] RECV ASCII>
AT+ESOSEND=0,8,3131313131313131
OK
//[2020-11-18 21:40:24.044] RECV ASCII>
+ESONMI=0,5,68656c6c6f
和TCP连接几乎一模一样,只是创建套接字通道时候的参数不一样,就不细细讲解了。
ME3616连接MQTT
MQTT是物联网模组最常用的网络协议,这里我不介绍怎么创建MQTT云服务器,因为你们可能有自己搭建的现成的MQTT服务器,也或者是使用ONENET,阿里云提供的MQTT服务器,后续我会单独开个帖子介绍怎么注册ONENET和阿里云创建MQTT服务器,这里只展示怎么怎么指令连接MQTT,而测试例子使用ONENET服务器。
首先MQTT有三元组,这是连接MQTT必备的。
ProductKey: 产品名称
DeviceName: 设备名称
DeviceSecret:设备秘钥,或者鉴权码。
服务器IP地址和端口
以下是MQTT测试的指令合集
通过 TCP 与 MQTT 服务器建立 MQTT 链接,
AT+EMQNEW="219.144.130.26","1883",12000,100
发送链接报文【DeviceName:642441370】【ProductKey:303574】【DeviceSecret:longfushanquan】
AT+EMQCON=0,4,"642441370",120,0,0,"303574","longfushanquan"
发送订阅报文
AT+EMQSUB=0,"mytopic",1
发送发布报文
AT+EMQPUB=0,"mytopic",1,0,0,4,"31323334"
接收发布报文
AT+EMQUNSUB=0,"mytopic"
发送取消订阅报文
AT+EMQDISCON=0
接下来演示下完整流程
[2020-11-18 23:17:10.754] SEND ASCII>
AT+EMQNEW="183.230.40.39","6002",12000,100
[2020-11-18 23:17:10.856] RECV ASCII>
AT+EMQNEW="183.230.40.39","6002",12000,100
[2020-11-18 23:17:11.812] RECV ASCII>
+EMQNEW: 0
OK
[2020-11-18 23:17:13.696] SEND ASCII>
AT+EMQCON=0,4,"642441370",120,0,0,"303574","longfushanquan"
[2020-11-18 23:17:13.810] RECV ASCII>
AT+EMQCON=0,4,"642441370",120,0,0,"303574","longfushanquan"
[2020-11-18 23:17:14.300] RECV ASCII>
OK
[2020-11-18 23:17:17.094] SEND ASCII>
AT+EMQSUB=0,"mytopic",1
[2020-11-18 23:17:17.194] RECV ASCII>
AT+EMQSUB=0,"mytopic",1
[2020-11-18 23:17:17.514] RECV ASCII>
OK
[2020-11-18 23:17:19.759] SEND ASCII>
AT+EMQPUB=0,"mytopic",1,0,0,4,"31323334"
[2020-11-18 23:17:19.867] RECV ASCII>
AT+EMQPUB=0,"mytopic",1,0,0,4,"31323334"
[2020-11-18 23:17:20.663] RECV ASCII>
OK
[2020-11-18 23:17:21.688] RECV ASCII>
+EMQPUB: 0, "mytopic", 1, 0, 0, 4, "31323334"
[2020-11-18 23:17:24.868] SEND ASCII>
AT+EMQDISCON=0
[2020-11-18 23:17:24.966] RECV ASCII>
AT+EMQDISCON=0
[2020-11-18 23:17:25.029] RECV ASCII>
OK
流程详解
发送AT+EMQNEW指令连接ONENET的MQTT服务器,ip地址183.230.40.39,端口6002,如果是ONENET的MQTT,都是这个接口
AT+EMQNEW="183.230.40.39","6002",12000,100
模组响应如下,会返回一个MQTT通道句柄【+EMQNEW: 0】,记住这个值【0】,后续都使用这个句柄
AT+EMQNEW="183.230.40.39","6002",12000,100
+EMQNEW: 0
OK
发送AT+EMQCON指令连接 MQTT,第一位 【0】 是上面返回的MQTT句柄,第二位【4】是指MQTT版本4,ONENET是使用的4,如果你在连接其他MQTT出现死活连接不上,则可以检查下MQTT版本是否一致,【642441370】client_id,如果是ONENET则对应的是设备id/设备名,即DeviceName【120】保活时间,【0】,【0】,【303574】username,对应ONENET的产品ID,【longfushanquan】password,对应ONENET的DeviceSecret/鉴权码。
AT+EMQCON=0,4,"642441370",120,0,0,"303574","longfushanquan"
连接成功会响应如下
AT+EMQCON=0,4,"642441370",120,0,0,"303574","longfushanquan"
OK
发送AT+EMQSUB订阅TOPIC,第一位【0】依旧是MQTT通道ID,写程序的时候要注意处理这个值,【mytopic】是要订阅的topic,【1】是指Qos等级为1,
AT+EMQSUB=0,"mytopic",1
响应为
AT+EMQSUB=0,"mytopic",1
OK
AT+EMQPUB往指定的TOPIC推送报文,【句柄】,【topic】,【1】QoS等级【0】保留标志【0】重复标志【4】长度,这里的长度是指16进制的长度,不是字符串的长度喔,【报文,16进制的字符串】
AT+EMQPUB=0,"mytopic",1,0,0,4,"31323334"
以下是指令响应
AT+EMQPUB=0,"mytopic",1,0,0,4,"31323334"
OK
接下来,还会有一条服务器响应,因为我们刚才订阅了这个topic,所以我们发送的数据,我们也能收到。
+EMQPUB: 0, "mytopic", 1, 0, 0, 4, "31323334"
关闭MQTT通道,注意mqttid
AT+EMQDISCON=0
响应
AT+EMQDISCON=0
OK
以上就是MQTT测试的全部内容了。
ME3616连接LWM2M
待更
ME3616连接阿里云MQTT
待更
MCU通信方案
待更
常见错误处理
待更