美文网首页NB-IoT LPWAN 设计
NB-IoT新手上路与快速原型构建

NB-IoT新手上路与快速原型构建

作者: 小鱼儿他老汉 | 来源:发表于2018-03-14 10:36 被阅读298次

    前言

    从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的鹰眼服务和服务器之间整合。不过就最简单的实时定位和历史数据查阅和可视化。都已经实现。并支持微信社交账户登陆和分享。

    相关文章

      网友评论

        本文标题:NB-IoT新手上路与快速原型构建

        本文链接:https://www.haomeiwen.com/subject/tvvxqftx.html