网关开发说明¶
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 硬件环境¶
本文介绍的网关硬件均为上图的网关主板。
注意点:
(1)在网关子卡操作前需要先接上子卡的天线
(2)GPS使用时天线需要放置在室外,否则会影响定位功能
(3)使用4G模块时需接上4G天线
3.调试方法¶
3.1串口调试终端¶
调试终端采用串口TTL通信,为了便于接线,在PCB板上使用的是RJ45网口形式。调试串口波特率115200bps。下图为调试串口的原理图以及PCB的引脚位置说明。
3.2程序下载¶
条件:网关与电脑处于同一局域网内,电脑端运行tftp服务。
将编译好的应用程序mqtt_client复制到tftpd服务目录下,通过putty工具(串口或telnet方式),进入网关控制终端。
进入终端后,进入到应用目录下,分别将守护程序gw_app_monitor、应用主程序mqtt_client杀掉,然后通过tftp命令将更新的应用程序下载到网关主板上。
注意点:
(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
设备树文件:设备树文件与实际硬件相关联,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目录结构¶
SDK分三个主目录,各目录中包含的内容及作用如下所述:
gw_app:网关主应用程序,应用程序依赖的第三方插件代码及编译出的依赖库(客户可以直接引用)。
gw_monitor:网关守护程序,用于监测主应用程序的运行情况,后续可以在该应用中增加看门狗喂狗功能,防止守护程序异常退出的情况。
gw_web:网关内置WEB服务的cgi源码,html,数据库文件。
5.2代码编译¶
以gw_app编译为例,首先进入到主程序目录gw_app/app/mqtt_client,修改Makefile文件的环境变量,然后即可通过make命令编译工程。
5.3网关主程序说明¶
以上为网关主程序工作流程图,网关共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 |
网关发射子卡参数配置表 |