蓝狮BMG700系列边缘计算网关盒子,支持二次开发,它采用高性能的工业级ARM高端处理器,Linux 操作系统,集成Python开发环境和C语言开发环境,提供标准API接口及开发指导,为用户的应用开发提供稳定快捷的平台。用户可轻松调用系统各种接口及资源,打造差异化核心竞争力。
下文以蓝狮BMG700系列边缘计算网关为例,全面介绍网关是否可以二次开发,二次开发要求,编程语言要求,软件接口说明,如何编程及编译,二次开发示例等。
二次开发要求
此二次开发指导文档只适用于蓝狮BMG700系列边缘计算网关,开始二次开发之前,请务必确认手上的设备是 BMG700系列网关。
操作系统要求
64 位 CPU,2G 内存,10G 硬盘
二次开发只能在 centos,redhat,ubuntu 等 linux 系统,无法在 windows 系统上开发
编程语言要求
二次开发只能使用 C、C++开发;需要开发者熟练掌握 socket,linux 设备文件操作。
设备资源
BMG700 边缘计算网关关键参数:
CPU: ARM 架构,主频 528MHZ, 32K Icache, 32K Dcache
内存: 256MB
Flash: 256MB(1G 可选),其中 128M 用户可用
网口: 4 路,其中 1 路 WAN/LAN 复用
串口: 2路232, 3路485
开关量: 2路DI, 2路继电器
模拟量: 2 路 ADC
软件接口说明
1. 串口对应设备文件
a) RS232_1 对应的设备接口是/dev/ttymxc0,
b) RS232_2 对应的设备接口是/dev/ttymxc1
c) RS485_1 对应的设备接口是/dev/ttymxc4
d) RS485_2 对应的设备接口是/dev/ttymxc6
e) RS485_3 对应的设备接口是/dev/ttymxc3
2. 读取 adc
int read_adc_raw(int adc_num)
参数说明:
adc_num: 取值 1,2,用来指示读取哪一路 adc
返回值:返回一个 0~4096 的原始值
假设返回值是 X,需要使用公式 Y =(X/4096)*6.72 转化成实际电压值
3. 设置 GPIO 输入,输出方向
int gpio_set_dir(unsigned int gpio_num, unsigned int dir)
参数说明:
gpio_num: 取值 GPIO_DI1,GPIO_DI2 或者 GPIO_RELAY1, GPIO_RELAY2,指示要操作哪一 路 gpio
dir: 取值DIR_IN,DIR_OUT,控制要配置成输入,还是输出
返回值: 配置成功返回 1,配置失败返回 0
4. 获取 GPIO 的值
int gpio_get_val(unsigned int gpio_num, unsigned int *val)
gpio_num: 取值 GPIO_DI1,GPIO_DI2 或者 GPIO_RELAY1, GPIO_RELAY2,指示要操作哪一 路 gpio
val: 对应 gpio 的值,有 0,1 两个取值
返回值: 获取成功返回 1,获取失败返回 0
5. 配置 GPIO 的值
int gpio_set_val(unsigned int gpio_num, unsigned int val)
gpio_num: 取值 GPIO_DI1,GPIO_DI2 或者 GPIO_RELAY1, GPIO_RELAY2,指示要操作哪一 路 gpio
val:只能 0 或者 1,其它值无法配置
返回值: 配置成功返回 1,配置失败返回 0
编码编译
准备交叉编译环境
如要您已经拿到我司的交叉编译工具,那么可以先把交叉编译工具拷贝到 linux 系统。 现假设您已经把交叉编译工具拷贝到 linux 系统,比如拷到/opt/,接下来是解压缩交叉编译 工具:
tar xzvf staging_dir.tgz –C /opt/
配置交叉编译环境:
export PATH=$PATH:"/opt/staging_dir/toolchain-arm_cortex-a7+neon_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/bin/" 在命令行输入命令:
arm-openwrt-linux-gcc, 说明编译环境已经正常
一个简单的例子:
下面以一个简单例子来说明如何在蓝狮BMG700系列边缘计算网关的基础上进行二次开发:
比如现在要读取 adc1 的电压值,DI1 的开关量,控制继电器闭合,代码如下:
#include <stdio.h>
#include <string.h>
#include <gpio.h> /* 必须 include , GPIO_DIx, GPIO_RELAYx 定义在这个头文件 */
int main(void)
{
int ret;
int raw_adc;
float voltage;
unsigned int val;
printf("start to test \n");
raw_adc = read_adc_raw(1); /* 读 ADC 通道 1 */
printf("raw adc 1 value is %d\n", raw_adc);
voltage = (float)raw_adc / 4096;
voltage *= 6.72;
printf("adc1 voltage is %.3f\n", voltage);
ret = gpio_set_dir(GPIO_DI1, DIR_IN); /* 配置 DI1 为输入 */
if (ret == 1) {
ret = gpio_get_val(GPIO_DI1, &val);
printf("GPIO_DI1 value is %d\n", val);
} else {
printf("Fails to set di dir %d\n", GPIO_DI1);
}
ret = gpio_set_dir(GPIO_RELAY1, DIR_OUT);/* 配置 RELAY1 为输出 */
if (ret == 1) {
val = 1;
ret = gpio_set_val(GPIO_RELAY1, val);
} else {
printf("Fails to set relay dir %d\n", GPIO_RELAY1);
}
return 0;
}
Makefile 的内容如下:
LIB_DIR=/opt/staging_dir/target-arm_cortex-a7+neon_uClibc-0.9.33.2_eabi/usr/lib/ INCLUDE_DIR=/opt/staging_dir/target-arm_cortex-a7+neon_uClibc-0.9.33.2_eabi/usr/include CC=arm-openwrt-linux-gcc
CFLAGS=-I $(INCLUDE_DIR) LDFLAGS=-L $(LIB_DIR)
all: test
%.o:%.c
$(CC) $(CFLAGS) -c -o $@ $^
test: test.o
$(CC) $(LDFLAGS) -o $@ $^ -lgpio
我司会提供该程序代码;您可以在该示例代码上直接修改。 如果上面的交叉编译环境配置好了,那么直接 make,会生成 test 的可执行程序,如下图:
编译好的可执行文件 test 现在可以 tftp 到设备主板上运行,比如你的电脑 IP 是 192.168.1.10; (注:路由器通过网线与电脑相连,接 LAN 口中的任何一个)
a.那么先在你的电脑上运行 tftpd32 程序,把当前目录改成 test 文件所在的目录
b. telnet 192.168.1.1 到设备,默认用户名跟密码都是 admin
c. 运行命令 tftp –r test –g 192.168.1.10 //下载 test 到设备
d. chmod a+x test //修改程序为可运行
e: ./test //运行程序
如果程序调试 OK,可以把该程序放到/usr/bin/目录下
f. 如果要把该程序配置成开机运行,那么只要在/etc/rc.local 加上该程序,如下图:
后面的&是必须的