最近有一个项目想在工地里监控一个物品的异常情况,这种东西用3.7V电池要能够待机20~30天,平常情况下几乎是静止状态,受旁边干扰会有少许震动,当有较大的移动时,要能够发出报警,还能发出位置信息,让管理人员快速掌握最新情况。
最初想用2G短信的办法解决,但几大运营商都在关停2G网络,这种技术可能不太可靠。
想用日常用的3G/4G技术,但这种连接方式功耗太大,待机能有几天就不错。最后想到了NB-IoT,窄带物联网,技术挺新,功耗低,通讯频率和速度较低,能够满足物联网里一些传感器定时传送少量重要参数的需求。
我最近研究树莓派Pico,就找与Pico相关的板子,最后发现了微雪的SIM7020C模块。
官方给出的概述:
本产品是一款具有 NB-IoT (窄带物联网) 功能的树莓派 Pico 扩展板,国内 NB-IoT 全网通,串口 AT 指令控制,支持 HTTP/MQTT/LWM2M/COAP 等协议通信。具有低延迟、低功耗、广覆盖和低成本等优点,非常适用于如智能仪表、资产跟踪和远程监控等物联网应用。
几个特性:
- 板载 Raspberry Pi Pico 接口,适用于 Raspberry Pi Pico 系列主板
- UART 接口通信,串口 AT 指令控制,支持多种通信协议和多个云平台
- 板载 3.7V 锂电池接口及充电电路,可外接可充电锂电池实现外部供电,支持边充边放
- 板载 2 个 LED 指示灯,方便查看模块运行状态
- 板载 nano SIM 卡槽,国内支持电信/联通/移动的 NB-IoT 专用卡
- 提供完善的配套资料手册 (MicroPython 示例程序和使用手册等)
某东平台上141元买入(不含Pico),实物拍照。
我买的时候注明了底座焊接,这样可以插入Pico,再插到面板包上,将来还要接入陀螺仪等其它元器件,下面这张图忘了连接天线。
随着设备带着一张电信的NB-IoT卡(Nano小卡),好像只能用于物联网,不能用于手机的上网流量。
主要的参考资料来源于这个网站:
https://www.waveshare.net/wiki/Pico-SIM7020C-NB-IoT,然后就开始了我的折腾之旅。
连接很简单,因为它的40针与Pico可以直接一一对应,只要按照USB口的标记接好即可,这个模块主要用到4根针(不算电源和接地)。
GP0/GP1用于串口的RXD/TXD。
GP14是整个模块的开关。
GP17是DTR,用于唤醒模块。
这个模块可以用Pico的VBUS供电,我在电脑上调试的时候,就用它了。电脑 USB 5V -> Pico VBUS -> SIM7020C VBUS。
将来拿到工地上可以用锂电池供电,把板上VSYS附近的一个开关拨到ON位置即可,锂电3.7V -> SIM7020C VSYS -> Pico VSYS。
官网提供的MicroPython代码有180行,一点不照顾新人的感受,让我慢慢抽丝拨茧熟悉它。
我先测试AT指令:
import machine
import utime
import binascii
uart = machine.UART(0, 115200, tx=machine.Pin(0), rx=machine.Pin(1))
print(uart)
# pico的GP14控制SIM7020C的启停
PWR_ENABLE_PIN = 14
pwr_enable = machine.Pin(PWR_ENABLE_PIN, machine.Pin.OUT)
pwr_enable.on()
def wait_response(timeout = 2000):
prvMills = utime.ticks_ms()
resp = b''
while (utime.ticks_ms() - prvMills) < timeout:
if uart.any():
resp = b''.join([resp, uart.read(1)])
if resp != b'':
print(resp.decode())
def send_cmd_and_wait(cmd, timeout=2000):
print("【命令】:" + cmd)
uart.write((cmd + '\r\n').encode())
wait_response(timeout)
def at_command_test():
send_cmd_and_wait("AT")
send_cmd_and_wait("ATE1")
send_cmd_and_wait("AT+CGMM")
send_cmd_and_wait("AT+CPIN?") #whether some password is required or not
send_cmd_and_wait("AT+CSQ") #received signal strength
send_cmd_and_wait("AT+CGREG?") #the registration of the ME.
send_cmd_and_wait("AT+CGATT?") #GPRS Service’s status
send_cmd_and_wait("AT+CGACT?") #PDN active status
send_cmd_and_wait("AT+COPS?") #Query Network information
send_cmd_and_wait("AT+CGCONTRDP") #Attached PS domain and got IP address automatically
# 清空串口的缓冲区
wait_response()
at_command_test()
pwr_enable.off()
运行程序后,得到如下的输出:
UART(0, baudrate=115200, bits=8, parity=None, stop=1, tx=0, rx=1, txbuf=256, rxbuf=256, timeout=0, timeout_char=1, invert=None)
【命令】:AT
AT
OK
【命令】:ATE1
ATE1
OK
【命令】:AT+CGMM
AT+CGMM
SIM7020C
OK
【命令】:AT+CPIN?
AT+CPIN?
+CPIN: READY
OK
【命令】:AT+CSQ
AT+CSQ
+CSQ: 11,0
OK
【命令】:AT+CGREG?
AT+CGREG?
+CGREG: 0,1
OK
【命令】:AT+CGATT?
AT+CGATT?
+CGATT: 1
OK
【命令】:AT+CGACT?
AT+CGACT?
+CGACT: 1,1
OK
【命令】:AT+COPS?
AT+COPS?
+COPS: 0,2,"46000",9
OK
【命令】:AT+CGCONTRDP
AT+CGCONTRDP
+CGCONTRDP: 1,5,"cmnbiot","100.1.2.3.255.255.255.0"
OK
从网上找到SIM7020的AT指令手册,有200多页,读不过来,先学习最基本的。
ATE是指设置Echo模式,1表示输入的命令再原封不动输出出来,可用于调试错误,输出太啰嗦,还是用ATE0把它关了。
AT+CGMM 可以获取模块的型号,这里是SIM7020C。
AT+CPIN? 用于询问是否有PIN密码保护,返回READY表示直接可用。
AT+CSQ 查询信号强度。返回2个整数,第一个整数位于0到31之间,代表信号强度,第二整数表示channel bit error rate。99表示unkown。我一开始没有接天线,信号强度为0,接上天线后稳定在11或12。
AT+CGREG?用于查询网络的注册状态。
0,0 – not registered, MT is not currently searching a new operator to register to
0,1 – Registered, home network
0,2 – Searching
0,3 – Registration denied
0,5 – Registered, non-home network
AT+CGATT?获取GPRS/Packet Domain的连接状态,返回0表示未连接,1已连接。
AT+CGACT?用于激活 PDP context,PDP指Packet Data Protocol,我还不知道它的具体内容。CGACT返回2个整数,第一个是<cid>(好像是PDP里的一个序号),第二个是<state>,1表示激活了。
AT+COPS? 获取移动网络的状态。
返回的数据格式:
+COPS: <mode>[,<format>,<oper>,[AcT>]]
我的数据是:+COPS: 0,2,“46000”,9
<mode>
0 – Automatic network selection
1 – Manual network selection
2 – Deregistered. Only for the read command.
<format>
0 – Long alphanumeric <oper> format
1 – Short alphanumeric <oper> format
2 – Numeric <oper> format
<oper> 运营商的代码
Mobile Country Code (MCC):每个国家的移动网络都有一个3位数的编码,我国为460。
Mobile Network Code (MNC) :不同的网络运营商还有2~3位的编码,我国的情况:
我的设备显示46000,就是中国移动的卡。
"46000"之后的9,表示NB-IoT网络。
AT+CGCONTRDP 返回 PDP上下文动态参数,我的设备返回的数据是:
+CGCONTRDP: 1,5,“cmnbiot”,“100.1.2.3.255.255.255.0”
第一个数据表示<cid>,primary PDP context definition
第二个数据5表示<bearer_id>,还不明白其含义。
第三个数据是APN,cmnbiot,就是中国移动的NB-IoT
第四个数据是IP地址和子网掩码。