先说结论,免得你看完骂我
我不推荐 NB-IoT。至少不推荐给 50 平米以下的冷库、药店阴凉柜、小作坊这种东西。原因后面讲,先讲讲我是怎么蹚进这条沟里的。
去年冬天,我表哥在城郊弄了个 60 吨的保鲜库,存中药材。门一开,那股当归混着土腥味的凉气直往鼻子里钻,冻得人眼眶发酸。他之前用的是 300 多块的成品温湿度记录仪,插 SD 卡的那种,一周导一次数据,Excel 画个折线图,挺像那么回事。
问题出在正月。有天晚上压缩机接触器烧了,库温从 2℃ 一路爬到 11℃,第二天早上开门才发现,一垛黄芪发了霉,赔了小两万。他给我打电话的时候语气特别平静,越平静我越难受。
于是我说,我给你搞个能手机看温度的。
这句话后来让我在零下 18 度的库房里蹲了三个周末。
第一个坑:信号根本进不去
冷库标准墙是彩钢板加 100mm 聚氨酯发泡。我拿手机在门里门外测过,900MHz 和 1800MHz 的衰减大概 25 到 35dB。什么概念?库门外手机 4G 满格,门一关,掉到一格,往里走两步,无服务。
所以任何把物联网卡和天线塞在库体内部的方案,都是耍流氓。包括某宝上那些标着「冷库专用」、卖 168 块的成品探头,你仔细看详情页,它也是主机放库外,只把探头线穿进去。
进去实测记得戴手套。我在里面待了 40 分钟,出来手指是僵的,弯不了,用热水冲的时候像被针扎。这算什么现象我不确定,反正很难受。手机上显示的温度是 -18℃,屏幕触控已经开始飘了,点了三下才点中。
正确做法是这么几步:
- 从压缩机管孔旁边那个发泡剂封的洞走一根 4 芯屏蔽线进去
- 主机放库外走廊,天线朝窗户
- 探头用 DS18B20 不锈钢封装,三线制,DATA 和 VCC 之间加一个 4.7kΩ 上拉电阻
- 想测多点,一根 1-Wire 总线上挂 3 到 5 个没问题,但线长超过 10 米就得考虑降速或者改 485 加 PT100 变送器
信号到底怎么测?我后来才知道有正经办法。安卓装个 Cellular-Z,看 LTE 的 RSRP:
- -85dBm 以内,很棒,板载天线就够
- -95dBm 左右,能用,但雨天可能抖
- -105dBm 以下,别折腾了,换位置或者上外置吸盘天线
- -115dBm,理论上还能连,实际会疯狂重连,一天耗掉 20MB 流量还发不出数据
我最后花 20 块钱买了根 3 米馈线的 4G 吸盘天线,贴在走廊窗户玻璃上,RSRP 从 -108 变成 -89。就这么简单一件事,我浪费了两个周末。
第二坑:物联网卡,我烧了三张
这个必须骂。
第一张在某平台买的「年包 12G」,29 块钱。用到第 11 天,卡停了。问客服,说检测到异常使用。什么叫异常?不说。
后来我才慢慢搞明白几个词,写出来给后来人省点时间:
定向卡和非定向卡。 定向卡只能访问指定 IP,便宜,但你连不了自己的 MQTT broker,除非走他们的透传云。非定向卡贵一点,能连公网。
静默期。 连续 30 天或 90 天没有流量,卡会被回收。你写个只上报、几乎不上行的程序,一天几十字节心跳,很可能被判静默。我现在的做法是每天让设备发一条 200 字节左右的心跳。
虚标。 标 12G 实际给 3G 的太多了。怎么验证?设备端自己统计 TCP 上下行字节数。我用的是合宙 Air724UG 模组,AT 指令 AT+QGDCNT? 能查累计流量,跟平台后台对一下,差多少一目了然。
11 位和 13 位。 11 位(长得像手机号)一般是运营商正规卡,13 位大多是转售的。13 位很多不支持短信,也不给公网 IP。
最后我用的是电信 4G Cat.1 非定向卡,一年 60G,120 块。别问我哪家,免得说我打广告,你自己搜「Cat.1 物联网卡 非定向」,下单前务必问清楚静默期和是否支持公网。
为什么不选 NB-IoT 和 LoRa
(偏见预警,不同意可以跳过)
NB-IoT 在纸面上完美:功耗低、穿透强、运营商覆盖。实际呢?我买过一块 BC26 模组,第一次入网花了 47 秒,第二次 12 秒,还行。然后有一天它不连了,一直停在附着状态。我查了大半天,本地 NB 基站被调整了,跟我没关系。
NB-IoT 还有个让我很烦的点:你很难自己判断信号好不好。AT+CESQ 能查,但那个数值和 LTE 的 RSRP 不是一个量纲,参考价值有限。你只能反复试,试一次等一分钟。
LoRa 呢?听着很爽,433MHz,穿墙一流,不交流量费。但网关是你自己搭的,网关一挂,全网设备集体失联,没有人给你打电话。而且国内 470MHz 频段的占空比限制,具体百分比我记不清了,反正你不能频繁上报。
Cat.1 慢、费电,但它是蜂窝网。掉线了你至少知道是基站的问题,不是你的问题。这一点对一个人干活的项目来说,太重要了。
| 维度 | NB-IoT | Cat.1 | LoRa |
|---|---|---|---|
| 模组价格 | 30-60 元 | 25-40 元 | 15-30 元 |
| 待机电流 | 3-5μA | 1-2mA | 1-2μA |
| 流量费 | 需要 | 需要 | 不需要 |
| 自建网关 | 否 | 否 | 是 |
| 适合场景 | 水表电表抄表 | 中频上报 | 园区自组网 |
软件这边,说点具体的
MQTT 别用公共 broker。我在 test.mosquitto.org 上跑过两天,天天一堆奇怪的订阅请求,明显有人在扫端口。后来自己买了台 2 核 2G 的云服务器,99 一年,装 mosquitto,改三件事:
- 开
listener 8883配 TLS,别用 1883 裸奔 allow_anonymous false,建用户名密码- broker 端 keepalive 设 60,设备端
MQTT_KEEPALIVE设 30,让客户端主动心跳
上报策略我是这么定的:
- 温度变化 ≥0.5℃ 立刻上报
- 否则每 5 分钟一次
- 断网时本地存环形缓冲,我用 SPIFFS,存 512 条,恢复后按时间戳补传
- 报警阈值 -12℃
- 除霜期间屏蔽 40 分钟
最后这条是血的教训。冷库大概每 6 小时除霜一次,蒸发器加热的时候,风口附近的探头会瞬间冲到 5℃ 以上。第一个月我被半夜报警吵醒了 11 次。11 次。
我老婆说你到底在给谁干活。
现在它跑了九个月
上周表哥发了张截图,四条线,基本是平的。他说现在睡觉踏实了。
我自己把报警推送关得只剩「设备离线超过 2 小时」这一条。说句真心话,2℃ 到 3℃ 的波动,没人在意,包括他自己。报警太密,人就会开始无视,这可能是所有物联网项目最终的样子。
对了,那台成品记录仪其实没坏,还在柜子里躺着,我留着做对照。上周对了一下,跟我的 DS18B20 差 0.6℃。谁对谁错也说不清,我倾向于信那个贵的。
差不多就这些。你要真想干,先别急着下单模组,拿个手机去你仓库里把信号测一遍。这一步过了再谈后面。