最近有一个项目想在工地里监控一个物品的异常情况,这种东西用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),实物拍照。

仰邦科技 java 开发 仰邦科技怎么样_nb-iot


我买的时候注明了底座焊接,这样可以插入Pico,再插到面板包上,将来还要接入陀螺仪等其它元器件,下面这张图忘了连接天线。

仰邦科技 java 开发 仰邦科技怎么样_仰邦科技 java 开发_02


随着设备带着一张电信的NB-IoT卡(Nano小卡),好像只能用于物联网,不能用于手机的上网流量。

主要的参考资料来源于这个网站:
https://www.waveshare.net/wiki/Pico-SIM7020C-NB-IoT,然后就开始了我的折腾之旅。

连接很简单,因为它的40针与Pico可以直接一一对应,只要按照USB口的标记接好即可,这个模块主要用到4根针(不算电源和接地)。

GP0/GP1用于串口的RXD/TXD。

GP14是整个模块的开关。

GP17是DTR,用于唤醒模块。

仰邦科技 java 开发 仰邦科技怎么样_仰邦科技 java 开发_03


这个模块可以用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位的编码,我国的情况:

仰邦科技 java 开发 仰邦科技怎么样_iot_04


我的设备显示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地址和子网掩码。