佰馬BMG8200網關,是佰馬科技專為智慧路燈桿、智能燈桿、5G路燈桿、多功能桿等場景應用而研發的智能網關,配置7路LAN口、1路WAN口、4路POE供電、2路千兆光口等,具有強大的交流與直接電源供給能力、設備接入能力、通信協議轉換、運算處理能力、聯動控制能力。智慧燈桿上眾多設備包括:智能照明、視頻監控、環保監測、氣象監測、LED 顯示屏、無線 WIFI 覆蓋、 公共廣播、一鍵報警,充電樁,微基站等,可以通過BMG8200 網關一站式接入。
智慧燈桿網關融入智能網關、邊緣計算等功能模塊,高性能的工業級ARM高端處理器,Linux 操作系統,集成Python開發環境和C語言開發環境,提供標準API接口及開發指導,為用戶的二次應用開發提供穩定快捷的平臺。
二次開發要求 此文檔只適用于佰馬科技智慧桿網關BMG8200,開始二次開發之前,請務必確認手上的設備是BMG8200系統智能網關。
操作系統要求: 64位CPU,2G內存,10G硬盤 二次開發只能在centos,redhat,ubuntu等linux系統,無法在windows系統上開發。
編程語言要求: 二次開發只能使用C、C++開發;需要開發者熟練掌握socket,linux設備文件操作。
軟件接口說明 1.串口對應設備文件 a) RS485對應的設備接口是/dev/ttyS1
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 BMG8200_toolchain.tgz –C /opt/
配置交叉編譯環境: export PATH=$PATH:"/opt/staging_dir/toolchain-mipsel_24kc_gcc-7.3.0_musl/bin/" 在命令行輸入命令: mipsel-openwrt-linux-gcc,如果命令可以運行, 說明編譯環境已經正常
一個簡單的例子: 下面以一個簡單例子來說明如果進行網關二次開發: 比如現在要讀取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-mipsel_24kc_musl /usr/lib/ INCLUDE_DIR=/opt/staging_dir/target-mipsel_24kc_musl/usr/include CC= mipsel-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加上該程序,如下圖:
后面的&是必須的
|