当前文档版本为 v0.1.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

网关开发说明

1. 开发简介

ChirpLAN系统中的网关是基于NXP imx6ull为主控MCU开发,本文重点描述ChirpLAN网关系统的软件二次开发指南,硬件接口说明,便于客户基于该ChirpLAN网关做系统集成及二次开发。

2. 开发环境

2.1 软件开发环境

  • 开发环境:Ubuntu 20.04

  • 交叉编译器:arm-2009q3

  • 数据库:sqlite3

  • WEB服务器:Boa

  • 依赖库文件:CJSON-1.5.5,openssl-1.0.2,paho.mqtt.c-1.3.8(SDK中external文件夹下已包含)

  • 工具:tftpd,tftp服务器,用于将编译好的应用程序拷贝到网关主控中。putty,串口及telnet客户端,用于调试串口及telnet登录主控的客户端工具。SQLiteStudio,数据库可视化编辑器。

2.2 硬件环境

gateway

网关主板实物图

本文介绍的网关硬件均为上图的网关主板。

注意点:

(1)在网关子卡操作前需要先接上子卡的天线

(2)GPS使用时天线需要放置在室外,否则会影响定位功能

(3)使用4G模块时需接上4G天线

3.调试方法

3.1串口调试终端

调试终端采用串口TTL通信,为了便于接线,在PCB板上使用的是RJ45网口形式。调试串口波特率115200bps。下图为调试串口的原理图以及PCB的引脚位置说明。

debug

调试串口原理图

debug_pcb

调试串口PCB位置

3.2程序下载

条件:网关与电脑处于同一局域网内,电脑端运行tftp服务。

tftp

tftp工具服务

将编译好的应用程序mqtt_client复制到tftpd服务目录下,通过putty工具(串口或telnet方式),进入网关控制终端。

telnetserial

进入终端后,进入到应用目录下,分别将守护程序gw_app_monitor、应用主程序mqtt_client杀掉,然后通过tftp命令将更新的应用程序下载到网关主板上。

telnet1

tftp1

通过网络更新程序

注意点:

(1)通过tftp下载应用程序前,需要先将应用程序关掉,不然会提示mqtt_client文件忙状态,无法下载。

(2)下载成功后,需要运行chmod +x mqtt_client 命令使应用程序有可执行权限,否则应用程序无法运行。

(3)最后运行守护程序,守护程序检测不到应用程序后会后台将mqtt_client主程序运行起来。

3.3系统下载

通过系统烧录USB口接入电脑,电脑使用工具mfgtools_for_6ULL。另外烧录前需要将网关主板上一排拨码开关拨到网关系统烧录状态,具体定义如下:

运行状态/拨码序号

1

2

3

4

5

6

7

8

网关正常运行

1

0

0

0

1

0

0

1

网关系统烧录

0

1

0

0

0

0

0

0

  • 烧录文件目录:mfgtools_for_6ULL2\Profiles\Linux\OS Firmware\files\linux

files

烧录文件
  • 设备树文件:设备树文件与实际硬件相关联,ChirpLAN开源系统中提供的设备树仅适合本网关硬件,若客户的通信接口或控制接口发生改变,需要自行根据硬件原理图重新修改生成设备树文件(本文不作具体描述)

  • 文件系统:用户解压后可以重新修改对应目录的文件(注意需要在linux系统下操作,修改应用程序后需要设置其执行权限),修改好后再重新压缩成该格式的文件,文件名必须设置为rootfs.tar.bz2

  • u-boot.imx:网关uboot文件

  • zImage:网关内核文件

4.接口说明

4.1通信接口

通信设备

通信接口(串口TTL电平)

备注

子卡1

/dev/ttymxc1

波特率115200

子卡2

/dev/ttymxc2

波特率115200

子卡3

/dev/ttymxc3

波特率115200

子卡4

/dev/ttymxc4

波特率115200

子卡5

/dev/ttymxc5

波特率115200

GPS模块

/dev/ttymxc6

波特率9600

4G模块

/dev/ttymxc7

波特率115200

调试串口

/dev/ttymxc0

波特率115200

4.2控制接口

设备控制接口

GPIO接口

备注

GPS模块上电

gpio90

高电平有效

GPS模块wakeup

gpio91

高电平有效

GPS模块reset引脚

gpio89

低电平有效

4G模块上电

gpio87

低电平有效

5.代码结构

5.1目录结构

app_list

SDK分三个主目录,各目录中包含的内容及作用如下所述:

  • gw_app:网关主应用程序,应用程序依赖的第三方插件代码及编译出的依赖库(客户可以直接引用)。

  • gw_monitor:网关守护程序,用于监测主应用程序的运行情况,后续可以在该应用中增加看门狗喂狗功能,防止守护程序异常退出的情况。

  • gw_web:网关内置WEB服务的cgi源码,html,数据库文件。

5.2代码编译

以gw_app编译为例,首先进入到主程序目录gw_app/app/mqtt_client,修改Makefile文件的环境变量,然后即可通过make命令编译工程。

app_makefile

Makefile修改示意图

5.3网关主程序说明

workflow

网关主程序流程图

以上为网关主程序工作流程图,网关共5个子卡,其中四个子卡线程用于接收和处理接收数据,一个子卡专门用于发送,使用消息队列存放发送数据,先入列的先发送。以下对各线程作简要说明:

  • 入网线程:判断入网请求,若入网请求合法则分配后续数据通信的参数给终端节点,若入网请求不合法则舍弃该请求。

  • 数据通道接收线程:接收各终端上行的数据,判断数据的合法性,根据其帧格式要求是否需要回复ACK,将数据打包发送至网络端。

  • RF发送线程:通过消息队列接收需要发送的数据内容,操作子卡将数据通过ChirpIOT发送出去。

5.4 4G模块的使用

网关内置4G模块及4G拨号程序,用户在使用前先需确认4G卡使用的是移动还是电信卡,其次该4G卡需要开通上网功能,且确保流量充足(数据量由节点数量及通信频次决定)本脚本默认支持移动数据卡。

APN修改,修改脚本/etc/ppp/peers/quectel-chat-connect倒数第三行:

# /etc/ppp/peers/quectel-chat-connect
ABORT "BUSY"
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
TIMEOUT 30
"" AT
OK ATE0
OK ATI;+CSUB;+CSQ;+CPIN?;+COPS?;+CGREG?;&D2
# Insert the APN provided by your network operator, default apn is 3gnet
OK AT+CGDCONT=1,"IP","cmnet",,0,0
OK ATD*99#
CONNECT

移动APN:cmnet 电信APN:ctnet

启动4G拨号流程

(1)确认好APN设置正确

(2)确认4G卡不欠费且能正常上网,并已插入SIM卡槽

(3)最后确认好4G天线已接好。

(4)启动脚本

cd /etc/ppp/peers
pppd call quectel-ppp &

详细启动过程日志如下:

[root@Panchip]# pppd call quectel-ppp &
[root@Panchip]# pppd options in effect:
debug           # (from /etc/ppp/peers/quectel-ppp)
nodetach                # (from /etc/ppp/peers/quectel-ppp)
dump            # (from /etc/ppp/peers/quectel-ppp)
noauth          # (from /etc/ppp/peers/quectel-ppp)
user test               # (from /etc/ppp/peers/quectel-ppp)
password ??????         # (from /etc/ppp/peers/quectel-ppp)
remotename 3gppp                # (from /etc/ppp/peers/quectel-ppp)
/dev/ttymxc7            # (from /etc/ppp/peers/quectel-ppp)
115200          # (from /etc/ppp/peers/quectel-ppp)
lock            # (from /etc/ppp/peers/quectel-ppp)
connect /etc/ppp/chat -s -v -f /etc/ppp/peers/quectel-chat-connect                                                                                                      # (from /etc/ppp/peers/quectel-ppp)
disconnect /etc/ppp/chat -s -v -f /etc/ppp/peers/quectel-chat-disconnect                                                                                                        # (from /etc/ppp/peers/quectel-ppp)
nocrtscts               # (from /etc/ppp/peers/quectel-ppp)
modem           # (from /etc/ppp/peers/quectel-ppp)
hide-password           # (from /etc/ppp/peers/quectel-ppp)
novj            # (from /etc/ppp/peers/quectel-ppp)
novjccomp               # (from /etc/ppp/peers/quectel-ppp)
ipcp-accept-local               # (from /etc/ppp/peers/quectel-ppp)
ipcp-accept-remote              # (from /etc/ppp/peers/quectel-ppp)
ipparam 3gppp           # (from /etc/ppp/peers/quectel-ppp)
noipdefault             # (from /etc/ppp/peers/quectel-ppp)
ipcp-max-failure 30             # (from /etc/ppp/peers/quectel-ppp)
defaultroute            # (from /etc/ppp/peers/quectel-ppp)
usepeerdns              # (from /etc/ppp/peers/quectel-ppp)
noccp           # (from /etc/ppp/peers/quectel-ppp)
abort on (BUSY)
abort on (NO CARRIER)
abort on (NO DIALTONE)
abort on (ERROR)
abort on (NO ANSWER)
timeout set to 30 seconds
send (AT^M)
expect (OK)
AT^M^M
OK
 -- got it

send (ATE0^M)
expect (OK)
^M
ATE0^M^M
OK
 -- got it

send (ATI;+CSUB;+CSQ;+CPIN?;+COPS?;+CGREG?;&D2^M)
expect (OK)
^M
^M
Quectel^M
EC600U^M
Revision: EC600UCNLBR02A08M08^M
^M
SubEdition: V08^M
^M
+CSQ: 21,99^M
^M
+CPIN: READY^M
^M
+COPS: 0,0,"CHINA MOBILE",7^M
^M
+CGREG: 0,1^M
^M
OK
 -- got it

send (AT+CGDCONT=1,"IP","cmnet",,0,0^M)
expect (OK)
^M
^M
OK
 -- got it

send (ATD*99#^M)
expect (CONNECT)
^M
^M
CONNECT
 -- got it

Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttymxc7
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x6e7ce57c> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MD5> <magic 0x9b42f1b1> <pcom                                                                                        p> <accomp>]
sent [LCP ConfAck id=0x1 <asyncmap 0x0> <auth chap MD5> <magic 0x9b42f1b1> <pcom                                                                                        p> <accomp>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x6e7ce57c> <pcomp> <accomp>]
rcvd [CHAP Challenge id=0x1 <71d614cead1620e97137c09da0abc0b1>, name = "lwIP"]
sent [CHAP Response id=0x1 <bc55763e0c5bf280ccad24599afd65d4>, name = "test"]
rcvd [CHAP Success id=0x1 "\260t\316\200"]
CHAP authentication succeeded: M-0tM-NM-^@
CHAP authentication succeeded
sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns3 0.0.0.0>]
rcvd [IPCP ConfReq id=0x1 <addr 192.168.0.1>]
sent [IPCP ConfAck id=0x1 <addr 192.168.0.1>]
rcvd [IPCP ConfNak id=0x1 <addr 10.104.111.87> <ms-dns1 211.136.17.107> <ms-dns3                                                                                         211.136.20.203>]
sent [IPCP ConfReq id=0x2 <addr 10.104.111.87> <ms-dns1 211.136.17.107> <ms-dns3                                                                                         211.136.20.203>]
rcvd [IPCP ConfAck id=0x2 <addr 10.104.111.87> <ms-dns1 211.136.17.107> <ms-dns3                                                                                         211.136.20.203>]
not replacing existing default route via 10.181.255.254
local  IP address 10.104.111.87
remote IP address 192.168.0.1
primary   DNS address 211.136.17.107
secondary DNS address 211.136.20.203

6.数据库设计说明

数据库文件名conf.db,数据库采用sqlite3,用户可以使用SQLiteStudio工具进行查看和编辑。

序号

表名

说明

1

Login

存放网关WEB登录用户名和密码

2

Net_Config

DHCP和静态IP设置及网络选择

3

Node_List

入网节点管理表(包含节点的工作模式,通信参数,入网时间,最近收发时间,服务器下发的数据,是否被列入黑名单)TBD

4

Rx_Radio_Config

网关接收子卡参数配置表

5

Server_Config

存放云端的配置参数(TCP/MQTT选择,服务器IP、端口号,mqtt用户名和密码)

6

Sys_Config

网关系统配置表(网关ID,应用ID,AES密钥)

7

Tx_Radio_Config

网关发射子卡参数配置表