smnp-android移植与简洁使用
移植snmp到Android获取CMmac地址
1.linux网络命令dhcp使用
Netcfg:通过串口获取IP地址,android自带的命令,system/core
Udhcpc:动态获取ip,系统内核自带。
Netcfgeth0dhcp:动态分配ip,给eth0传递参数。
2.Snmp源码移植和测试case
1)把Snmp源码编译成动态库
LOCAL_PATH:=$(callmy-dir)
include$(CLEAR_VARS)
LOCAL_C_INCLUDES:=external/net-snmp/inc
LOCAL_SRC_FILES:=src/snmp_client.c\
src/mib.c\
src/parse.c\
src/snmp_api.c\
src/snmp.c\
src/large_fd_set.c\
src/cert_util.c\
src/snmp_auth.c\
src/asn1.c\
src/md5.c\
src/snmp_parse_args.c\
src/system.c\
src/vacm.c\
src/int64.c\
src/read_config.c\
src/pkcs.c\
src/snmp_debug.c\
src/tools.c\
src/snmp_logging.c\
src/text_utils.c\
src/snmpv3.c\
src/lcd_time.c\
src/keytools.c\
src/file_utils.c\
src/dir_utils.c\
src/scapi.c\
src/callback.c\
src/default_store.c\
src/snmp_alarm.c\
src/data_list.c\
src/oid_stash.c\
src/fd_event_manager.c\
src/mt_support.c\
src/snmp_enum.c\
src/snmp-tc.c\
src/snmp_service.c\
src/snprintf.c\
src/snmp_transport.c\
src/transports/snmpUDPBaseDomain.c\
src/transports/snmpUDPIPv4BaseDomain.c\
src/transports/snmpTCPBaseDomain.c\
src/transports/snmpSocketBaseDomain.c\
src/transports/snmpIPv4BaseDomain.c\
src/transports/snmpUDPDomain.c\
src/transports/snmpTCPDomain.c\
src/transports/snmpAliasDomain.c\
src/transports/snmpUnixDomain.c\
src/transports/snmpCallbackDomain.c\
src/snmp_secmod.c\
src/snmpusm.c\
src/snmp_version.c\
src/check_varbind.c\
src/container.c\
src/container_binary_array.c\
src/container_null.c\
src/container_list_ssll.c\
src/container_iterator.c\
src/cmu_compat.c\
src/ucd_compat.c\
src/snmp_openssl.c\
src/openssl/openssl_md5.c\
src/openssl/openssl_sha1.c\
src/openssl/openssl_set_key.c\
src/openssl/openssl_des_enc.c\
src/openssl/openssl_cbc_enc.c\
src/openssl/openssl_aes_cfb.c\
src/openssl/openssl_aes_core.c\
src/openssl/openssl_cfb128.c\
src/strlcpy.c\
src/strlcat.c
LOCAL_SHARED_LIBRARIES:=\
libcutils
LOCAL_MODULE_TAGS:=eng
LOCAL_PRELINK_MODULE:=false
LOCAL_MODULE:=libnetsnmp
include$(BUILD_SHARED_LIBRARY)
生成libnetsnmp.so动态库,然后push到system/lib下面
2)snmp依赖的资源文件夹mibs
把mibscp到系统system/etc下面(路径可以通过改源码配置)
#define NETSNMP_DEFAULT_MIBDIRS "$HOME/ .snmp/mibs:usr/local/net-snmp/share/snmp/mibs;./mibs"
只需在后面添加一个路径即可即添加system/etc/mibs;
3)测试case编译成可执行文件
获取cablemodlemac地址的方法
intget_mac(char*mac)
{
printf("get_macin------------------------------------\n");
charsnmpdata[32];
char*ptmac;
if(0!=snmp_session_init(CM_MAC,ip,community_string,snmpdata))
{
printf("(err)snmp_session_initfailed\n");
return-1;
}
ptmac=strstr(snmpdata,"");
strcpy(mac,ptmac+1);
return0;
}
Main函数
strcpy(ip,"192.168.100.1");
strcpy(cmts_ip,"192.168.10.68");
strcpy(community_string,"public");
strcpy(cmts_community_string,"private");
get_mac(mac);
100.1和10.68两个参数基本是固定的
获取mac详细代码请看:http://blog.csdn.net/new_abc/article/details/8610203
Android.mk文件编译成可执行文件
LOCAL_PATH:=$(callmy-dir)
include$(CLEAR_VARS)
#LOCAL_MODULE_PATH:=$(TARGET_OUT)/bin
LOCAL_MODULE:=cmdiag
LOCAL_SRC_FILES:=cmdiag.c
LOCAL_C_INCLUDES+=\
external/net-snmp_useful_libsnmp/inc\
LOCAL_SHARED_LIBRARIES:=\
libnetsnmp\
LOCAL_PRELINK_MODULE:=false
LOCAL_MODULE_TAGS:=eng
include$(BUILD_EXECUTABLE)
3.开机启动脚本的学习
1)Init.godbox.sh
启动盒子执行脚本,主要功能
1加载hisi驱动到内核中
2后台执行一些可执行文件,启动服务
3执行logcat命令,抓取日志存放到android.log中
2)mk-all.sh
主要是用在在线编译时,制作镜像和制作升级包时执行。
指定用户编译线程数
1生成mkbootimg以及mkyaffs2image.301
2编译kernel。如果.config不存在,则认为是第一次编译
3临时添加的device部分库与bin文件
4编译froyo
5海思的一些文件与一些配置文件
6将rootdir编入kernel
7生成并拷贝目标文件到out目录
8STB镜像文件制作
9编译recovery,生成recovery.img以及升级包
4.显示mac地址的两种方式
1)通过设置系统属性-共享内存的学习
设置属性:property_set("DEVICEINFO_CM_MAC",mac);
获取属性:property_get("DEVICEINFO_CM_MAC",my_mac,"");第三个参数为默认值
重现步骤:1生成可执行文件
2在启动盒子执行的脚本里面init.godbox.sh添加后台执行可执行文件脚本命令
Chmod777system/bin/cmdiag
/system/bin/cmdiag$
3通过串口把snmp用到的资源文件mibscp到相应的路径下面(参考2.2)
4在对应要显示到页面的代码里添加property_get函数,实现CMmac地址的显示。
2)通过集成到jni的实现方式,头文件引用的学习,c字符串分割
不需要通过设置获取属性来读取共享空间的数据,直接在每次调用显示CMmac地址的时候,去调用snmp获取CMmac。
重现步骤:1把测试case获取CMmac集成到jni里面。
2在Android.mk里面添加导入的头文件以及连接的动态库
$(ANDROID_INCLUDE_TOP)external/net-snmp/inc\
LOCAL_SHARED_LIBRARIES:=\
libnetsnmp
3字符串分割,格式化CMmac地址的显示方式(C字符串转变成大写,去掉特殊符号)
#include<stdio.h>
#include<string.h>
char*my_strupr(char*str)
{
char*p=str;
while(*p!='\0')
{
if(*p>='a'&&*p<='z')
*p-=0x20;
p++;
}
returnstr;
}
char*get_mac()
{
charstr[]="0:e:b7:23:1f:75";
charmy_str[32];
chardelims[]=":";
char*result=NULL;
result=strtok(str,delims);
printf("resultzhoulcis\"%s\"\n",result);
memset(my_str,0,sizeof(my_str));
while(result!=NULL){
//printf("resultis\"%s\"\n",result);
if(strlen(result)<=1){
printf("aaaaaaaaa\n");
strcat(my_str,"0");
strcat(my_str,result);
}
else{
strcat(my_str,result);
}
printf("resultzhoulcis\"%s\"\n",result);
result=strtok(NULL,delims);
}
my_strupr(my_str);
printf("my_strzhoulcis\"%s\"\n",my_str);
returnNULL;
}
main()
{
get_mac();
}
字符串改变之前:0:e:b7:23:1f:75
字符串改变之后:000EB7231F75
更多相关文章
- Android(安卓)交叉编译 i2c-tools
- 关于获取手机通讯录联系人Contacts被deprecated的修改
- Ubuntu下Eclipse3.6.1安装ADT插件可能遇到的问题
- Mac OS X下编译Android源码
- android学习日记(一) 获取某一会话的所有短信
- Android(安卓)TV 键值修改流程
- Android小程序-Walker注册页面(六)
- 使用Android(安卓)NDK内置编译器为Android编译Linux应用程序
- 查看Android的源代码