## 一、操作系统简介
DHG系列物联网关运行基于Linux深度定制的嵌入式操作系统,具有灵活的扩展性,并提供完整的SDK开发包和交叉编译工具链,用户可以方便地进行二次开发。
### 1.1 访问网关操作系统
#### WEB方式
若通过WiFi或LAN口连接网关,用浏览器访问`http://192.168.1.1`即可登录WEB管理界面,默认用户密码:`admin`;若通过WAN口连接,需要访问`http://wan.ip:8080`,WAN口IP默认为动态获取,因此最好先用WiFi登录后改为静态再用WAN口连接。
#### 命令行方式
通过WiFi或LAN口连接,`ssh admin@192.168.1.1`;
若通过WAN口,则需要访问10022端口:`ssh -p10022 admin@x.x.x.x` 。
### 1.2 网关上的文件系统
为了保证系统稳定可靠,网关上采用的是**只读**文件系统,系统启动时会把固件加载到内存运行,并初始化一些RAMDISK用于存放运行时产生的临时文件等。因此,对于二次开发的应用程序无法直接保存在网关上,我们提供两种选择:
1. 应用开发调试完成后,由我们来集成到固件中,此法适用于用户应用比较纯粹,依赖外部库不多的情形。
2. 增加外部存储(TF卡),在外部存储上运行一个完整的应用环境(标准C库和其它第三方软件库等),然后把用户应用完全部署在外部存储上。这样的好处是用户环境与系统固件完全分开,容易集成第三方软件包,用户程序可以单独升级。如果用户的应用较为复杂,依赖第三方软件包,或者需要本地存储支持的情况。
### 1.3 网关固件自带的软件资源
* uClibc标准C库
* 常用Linux命令
* libpthread, libiconv, openssl-devel
* libcurl, libghttp(可选)
### 1.4 网关硬件资源
#### 串口
* RS232-1,设备名:/dev/ttyS1
* RS232-2,设备名:/dev/ttyS2
* RS485-1,设备名:/dev/ttySC0
* RS485-2,设备名:/dev/ttySC1
#### DIO
可通过命令控制开关量输入输出,命令行如下:
```
Usage: mtk_gpio -d <pin> <in/out> - gpio pin set direction (in=0, out=1)
mtk_gpio -r <pin> - gpio pin read value
mtk_gpio -w <pin> <value> - gpio pin write value (0/1)
mtk_gpio -m <bit> - gpio mode get bit
mtk_gpio -s <bit> <value> - gpio mode set bit (0/1)
```
也可以通过C程序实现,我们可提供接口函数和调用示例。
开关量接口与GPIO引脚对应关系如下表:
| FUNC | GPIO |
| ------- | ---- |
| IN1 | 29 |
| IN2 | 26 |
| IN3 | 28 |
| OUT1 | 25 |
| SYS LED | 31 |
## 二、交叉编译用户应用
由于网关采用了MIPS架构的CPU,不同于PC的X86架构,因此需要把用户程序在开发机上交叉编译为MIPS架构的可执行程序才能在网关上运行。
### MIPS交叉编译工具链使用说明
以下步骤需要在Linux开发机上执行。
1. 下载toolchain-3.4.x.tgz
链接:http://pan.baidu.com/s/1eSIR6mQ
密码:l4x1
2. 解压安装
`tar xzf toolchain-3.4.x.tgz -C /opt`
3. 交叉编译
`/opt/toolchain-3.4.x/bin/mipsel-linux-uclibc-gcc -o hello hello.c`
4. 在网关上运行程序
```bash
# scp user@192.168.1.8:hello /tmp
# /tmp/hello
```
## 三、在外部存储部署用户应用
前面提到,若用户应用相对复杂、体积较大,不太适合集成到固件中时,可以采用在外部存储部署一个独立的运行环境,具体做法如下:
### 3.1 安装并启用外部存储
网关支持TF卡扩展,插入TF卡后,还需要配置一下Entware才能在TF卡上部署运行环境,可通过WEB界面实现:
![entware](https://box.kancloud.cn/c773fa2830e1c11f1ba7fd25136b9a50_937x558.png)
### 3.2 初始化Entware运行环境
以下代码中,以#号开头的表示在Linux命令行输入的命令,其它为命令的输出。
1. 通过SSH登录到网关
2. 格式化TF卡为ext4格式:
```bash
# umount /dev/mmcblk0p1 -- 卸载TF卡,如未安装请忽略
# mkfs.ext4 -L SD /dev/mmcblk0p1 -- 格式化
mke2fs 1.42.8 (20-Jun-2013)
Filesystem label=SD
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
972944 inodes, 3889280 blocks
194464 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=3984588800
119 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
#
```
3. 初始化Entware(此步需要连接外网)
```bash
# mdev_mmc mmcblk0p1 add -- 自动mount TF卡
EXT4-fs (mmcblk0p1): mounted filesystem with ordered data mode. Opts: (null)
event signal: User defined signal 1
rc notification: on_hotplug_mass_storage
# mount -- 确认SD卡已mount
...
/dev/mmcblk0p1 on /media/SD type ext4 (rw,noatime,data=ordered)
# cd /media/SD -- 进SD
# mkdir opt -- 建opt目录
# opt-mount.sh /dev/mmcblk0p1 /media/SD -- mount opt文件系统
# mount -- 确认/opt已mount
...
/dev/mmcblk0p1 on /media/SD type ext4 (rw,noatime,data=ordered)
/dev/mmcblk0p1 on /opt type ext4 (rw,noatime,data=ordered)
# opt-opkg-upd.sh -- 初始化基本Entware运行环境
Downloading http://pkg.entware.net/binaries/mipsel/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/entware-ng
Installing ldconfig (1.0.17-1) to root...
Downloading http://pkg.entware.net/binaries/mipsel/ldconfig_1.0.17-1_mipselsf.ipk
Installing findutils (4.6.0-1) to root...
Downloading http://pkg.entware.net/binaries/mipsel/findutils_4.6.0-1_mipselsf.ipk
Installing libc (1.0.17-1) to root...
Downloading http://pkg.entware.net/binaries/mipsel/libc_1.0.17-1_mipselsf.ipk
Installing libgcc (5.4.0-1) to root...
Downloading http://pkg.entware.net/binaries/mipsel/libgcc_5.4.0-1_mipselsf.ipk
Installing libssp (5.4.0-1) to root...
Downloading http://pkg.entware.net/binaries/mipsel/libssp_5.4.0-1_mipselsf.ipk
Configuring ldconfig.
Configuring libgcc.
Configuring libc.
Configuring libssp.
Configuring findutils.
# reboot -- 完成,重启后确认是否能自动mount opt文件系统。
```
### 3.3 Entware软件包管理
Entware可以认为是安装于/opt下,独立于网关固件的一套运行环境,包括了基本的libc库、busybox命令集以及简单的软件包管理功能。通过软件包管理工具,用户可以方便地在线安装(已经移植并且交叉编译好的二进制)软件包,常用的开源软件包基本都有,详细列表参见:http://pkg.entware.net/binaries/mipsel/Packages.html.
另外,Entware还有一个完善的buildroot交叉编译环境,在这个buildroot下,不论是移植开源软件包或是交叉编译用户自己的应用,都是非常方便的(我们有单独的buildroot使用说明)。
下面是常用的软件包管理命令:
#### 1. 更新软件包列表
```bash
# /opt/bin/opkg update
Downloading http://pkg.entware.net/binaries/mipsel/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/entware-ng
#
```
#### 2. 查找/安装软件包
```bash
# /opt/bin/opkg find "curl*"
curl - 7.57.0-1 - A client-side URL transfer utility
curlftpfs - 0.9.2-3 - CurlFtpFS is a filesystem for accessing FTP hosts
based on FUSE and libcurl.
# /opt/bin/opkg install curl
Installing curl (7.57.0-1) to root...
Downloading http://pkg.entware.net/binaries/mipsel/curl_7.57.0-1_mipselsf.ipk
Installing libcurl (7.57.0-1) to root...
Downloading http://pkg.entware.net/binaries/mipsel/libcurl_7.57.0-1_mipselsf.ipk
Installing libopenssl (1.0.2n-1) to root...
Downloading http://pkg.entware.net/binaries/mipsel/libopenssl_1.0.2n-1_mipselsf.ipk
Installing zlib (1.2.11-1) to root...
Downloading http://pkg.entware.net/binaries/mipsel/zlib_1.2.11-1_mipselsf.ipk
Configuring zlib.
Configuring libopenssl.
Configuring libcurl.
Configuring curl.
#
```