前言
从CAT0开始推广开始,就知道NB-IoT的大名,但是直到上周才开始实际测试。技术上,以我以往的2G/3G MODEM积累的代码,没有特别的技术难度。
NB-IoT的真正问题在于其封闭性和行政管理要求。华为最为标准和规范的制定者,从一开始就是以封闭系统的方式进行推广的。尝试垄断所有的一切资源:芯片、模组、终端、IoT平台甚至系统集成。同时透过工信部阳谋铲除LoRaWAN/Sigfox等竞争标准。
所以,我从最开始的热切盼望,转而旁观、继而反感。
然而,在商言商,应该抛弃成见。基于移动蜂窝基站的公众物联网有着天生的优势:
- 网络覆盖率;
- 成熟的基础建设...
只要资费合理,其实未尝不可作为业务基础。所以昨天抽空我测试了一把最成熟的BC95-B8电信版模组。
万能的X宝
X宝上卖家不仅提供了BC95模组核心板,还有中国电信NB SIM卡。而且还帮助我配置了UDP端口转发。这样我就可以进行开发工作了。
设备方案组成
第一个产品是针对慢速资产定位,如宠物、儿童、老人、自行车和电动车等。所以板子上有BC95 + LR70R + MCU + FeRAM + PWR + LiPo。我知道新一代芯片已经内置了定位芯片,但是差别不大。最关键的依然是MCU固件中关于AT指令集的处理。
AT以及NMEA指令集的处理说穿了就是串口字符串的收发和格式化处理。
根据我以往的工程经验,不同编程语言的字符串处理难度是不同的:
Embedded C/C++ > Standard C/C++ > Java > Lua > JavaScript > Python
嵌入式C/C++如Keil/IAR之所以比标准C/C++要更难处理字符串,差异点在于嵌入式的libc库资源受限。一旦libc链接进来,ROM/RAM要多占用不少。
C++/Java中的String类库要比标准libc中的函数要更加方便,当然本质上是一回事情。但是C++要多占用Heap和其他资源。而Java需要额外的runtime。
在VHLL中,Lua/JavaScript/Python我觉得是类似,用于处理字符串实在太简单了,拿起来就可以用,连工程都不需要建立。相比之下,我选用了Python。
基于以上理由,我选用了STM32F4和L0作为主控。原型采用F4,支持MicroPython,而L0作为后续cost-down版本,使用GCC-ARM。
测试
先写了一个UART/USB_VCP的桥接脚本,用于测试了BC95的指令和L70R的NMEA指令。以下是测试结果:
ATI
Quectel
BC95-B5
Revision:BC95B5HBR01A03W16
OK
AT+CFUN?
+CFUN:1
OK
AT+CIMI
460111175097877
OK
AT+CSQ
+CSQ:19,99
OK
AT+CEREG?
+CEREG:0,1
OK
AT+CGPADDR
+CGPADDR:0,10.161.109.154
OK
AT+NPING=123.57.211.188
OK
+NPING:123.57.211.188,116,4817
AT+NSOCR=DGRAM,17,8888,1
0
OK
AT+NSOST=0,123.57.211.188,59980,2,3031
0,2
OK
+NSONMI:0,2
AT+NSORF=0,2
0,123.57.211.188,59980,2,3031,0
OK
注意
为了保护业务端口,以上日志中,IP地址已经被修改过。读者就别费心测试了。以上日志简单测试了NB Modem的收发流程。
原型脚本
用MicroPython开发原型脚本也非常简单。而且使用UART.readline()可以一次性把一行字符串读取进来,然后通过binascii直接转换,然后多重赋值。一次性获取经纬度、高度、时间、方位角、速度等等。
固件功能加持
基于基础代码,还需要添加以下功能:
- 基于UDP的设备认证,包括ID/Key换取Token
- 基于UDP的设备认证获取的Token,加上时间戳和Nonce随机数,计算签名散列值,然后上传GPS数据,或任意数据。
- 下发指令处理等。
- 升级到CoAP/DTLS。
BC95的CoAP几乎是被阉割的版本,还要通过华为或者中国电信平台转发。好在UDP就是一个很好地通路,所以我打算通过UDP端口实现一个CoAP Client/Server。
不太确定的是此类设备的外形。车用?腕带类?日用品类?胸牌类?
服务器和移动APP
由于我有自己研发的EPIC IoTHub/EPIC AppBuilder,而UDP服务器基于Twisted/Netty增设一个Connector端口也非常简单,如此,原来的EPIC云端就可以对接上了。
而EPIC AppBuilder的ATS就是针对资产定位的,采用了Baidu地图,不过最近在调研Baidu的鹰眼服务和服务器之间整合。不过就最简单的实时定位和历史数据查阅和可视化。都已经实现。并支持微信社交账户登陆和分享。