BMG700系列边缘计算网关二次开发说明

  • 时间 :2021-02-24
  • 作者 :
  • 浏览数 :2541

佰马BMG700系列边缘计算网关盒子,支持二次开发,它采用高性能的工业级ARM高端处理器,Linux 操作系统,集成Python开发环境和C语言开发环境,提供标准API接口及开发指导,为用户的应用开发提供稳定快捷的平台。用户可轻松调用系统各种接口及资源,打造差异化核心竞争力。


下文以佰马BMG700系列边缘计算网关为例,全面介绍网关是否可以二次开发,二次开发要求,编程语言要求,软件接口说明,如何编程及编译,二次开发示例等。


BMG700边缘计算网关.jpg


二次开发要求

此二次开发指导文档只适用于佰马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

#include

#include /* 必须 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 的可执行程序,如下图:


代码示例1.jpg


编译好的可执行文件 test 现在可以 tftp 到设备主板上运行,比如你的电脑 IP 是 192.168.1.10; (注:路由器通过网线与电脑相连,接 LAN 口中的任何一个)


a.那么先在你的电脑上运行 tftpd32 程序,把当前目录改成 test 文件所在的目录


IP设置.jpg


b. telnet 192.168.1.1 到设备,默认用户名跟密码都是 admin



c. 运行命令 tftp –r test –g 192.168.1.10 //下载 test 到设备


运行示例1.jpg


d. chmod a+x test //修改程序为可运行


运行示例2.jpg


e: ./test //运行程序


运行示例3.jpg


如果程序调试 OK,可以把该程序放到/usr/bin/目录下

f. 如果要把该程序配置成开机运行,那么只要在/etc/rc.local 加上该程序,如下图:


运行示例4.jpg


后面的&是必须的


联系我们
联系我们

佰马Baimatech,集M2M产品研发、IoT平台服务、国际化运营于一体,让我们联接,共创未来

Baidu
map