iwinfo编译

尝试在openwrt上,自己编译iwinfo,并引用iwinfo的库编译自己的软件

获取源码

git://git.openwrt.org/project/iwinfo.git

切换到2020-06-03的版本

git checkout 2faa20e5e9d107b97e393a4eb458370e80b4d720

如果这里不切换版本,那么后面编译出来的.so文件可能会报错

iwinfo_backend: symbol not found

添加依赖库

include

没添加include的相关头文件,会报错fatal error: xxx.h: No such file or directory

该include一般在xxx/staging_dir/target-aarch64_cortex-a53_musl/usr/include

xxx就是你拉的openwrt源码所在的位置

target-aarch64_cortex-a53_musl对应于你所编译选择的架构

需要添加的文件:

  • libnl-tiny
  • libubox
  • uci.h
  • uci_config.h
  • libubus.h
  • ubus_common.h
  • ubusmsg.h
  • lua.h
  • luaconf.h
  • lnum_config.h
  • lualib.h
  • lauxlib.h

可以将以上文件添加到openwrt的某个目录下,比如我这里添加到的是/root/wrt/include

lib

没添加相关动态库,会报错cannot find -lxxx

该lib库一般在xxx/staging_dir/target-aarch64_cortex-a53_musl/usr/lib

与include类似

需要添加的文件:

  • liblua.so.5.1.5
    • 该lua添加后,还需要在添加的目录下做个软连接 ln -s liblua.so.5.1.5 liblua.so
  • libuci.so
  • libubox.so
  • libubus.so

编译iwinfo

添加好以上依赖,将iwinfo源码scp到openwrt上,就可以开始编译了

编译命令

make CFLAGS="-Iinclude -I/root/wrt/include -I/root/wrt/include/libnl-tiny -fpic -D_GNU_SOURCE -std=gnu99 -fstrict-aliasing" LDFLAGS="-L/root/wrt/lib -lnl-tiny" BACKENDS=nl80211
  • -I/root/wrt/include:指向你添加的include的目录
  • -L/root/wrt/lib:指向你添加的lib的目录
root@OpenWrt:~/wrt/iwinfo# make CFLAGS="-Iinclude -I/root/wrt/include -I/root/wrt/include/libnl-tiny -fpic -D_GNU_SOURCE -std=gnu99 -fs
trict-aliasing" LDFLAGS="-L/root/wrt/lib -lnl-tiny" BACKENDS=nl80211
rm -f *.o libiwinfo.so iwinfo.so iwinfo
cc -Iinclude -I/root/wrt/include -I/root/wrt/include/libnl-tiny -fpic -D_GNU_SOURCE -std=gnu99 -fstrict-aliasing -std=gnu99 -fstrict-aliasing -Iinclude -DUSE_NL80211  -c -o iwinfo_utils.o iwinfo_utils.c
cc -Iinclude -I/root/wrt/include -I/root/wrt/include/libnl-tiny -fpic -D_GNU_SOURCE -std=gnu99 -fstrict-aliasing -std=gnu99 -fstrict-aliasing -Iinclude -DUSE_NL80211  -c -o iwinfo_wext.o iwinfo_wext.c
cc -Iinclude -I/root/wrt/include -I/root/wrt/include/libnl-tiny -fpic -D_GNU_SOURCE -std=gnu99 -fstrict-aliasing -std=gnu99 -fstrict-aliasing -Iinclude -DUSE_NL80211  -c -o iwinfo_wext_scan.o iwinfo_wext_scan.c
cc -Iinclude -I/root/wrt/include -I/root/wrt/include/libnl-tiny -fpic -D_GNU_SOURCE -std=gnu99 -fstrict-aliasing -std=gnu99 -fstrict-aliasing -Iinclude -DUSE_NL80211  -c -o iwinfo_lib.o iwinfo_lib.c
cc -Iinclude -I/root/wrt/include -I/root/wrt/include/libnl-tiny -fpic -D_GNU_SOURCE -std=gnu99 -fstrict-aliasing -std=gnu99 -fstrict-aliasing -Iinclude -DUSE_NL80211  -c -o iwinfo_nl80211.o iwinfo_nl80211.c
cc -Iinclude -I/root/wrt/include -I/root/wrt/include/libnl-tiny -fpic -D_GNU_SOURCE -std=gnu99 -fstrict-aliasing -std=gnu99 -fstrict-aliasing -Iinclude -DUSE_NL80211  -c -o iwinfo_lua.o iwinfo_lua.c
cc -Iinclude -I/root/wrt/include -I/root/wrt/include/libnl-tiny -fpic -D_GNU_SOURCE -std=gnu99 -fstrict-aliasing -std=gnu99 -fstrict-aliasing -Iinclude -DUSE_NL80211  -c -o iwinfo_cli.o iwinfo_cli.c
cc -luci -lubox -lubus -L/root/wrt/lib -lnl-tiny -shared -lnl-tiny -o libiwinfo.so iwinfo_utils.o iwinfo_wext.o iwinfo_wext_scan.o iwinfo_lib.o iwinfo_nl80211.o
cc -luci -lubox -lubus -L/root/wrt/lib -lnl-tiny -shared -L. -liwinfo -llua -o iwinfo.so iwinfo_lua.o
cc -luci -lubox -lubus -L/root/wrt/lib -lnl-tiny -L. -liwinfo -lnl-tiny -o iwinfo iwinfo_cli.o

编译完成。测试iwinfo是否正常使用

root@OpenWrt:~/wrt/iwinfo# ./iwinfo
wlan0     ESSID: "OpenWrt"
          Access Point: E8:4E:06:7C:4E:0C
          Mode: Master  Channel: 11 (2.462 GHz)
          Tx-Power: 20 dBm  Link Quality: 39/70
          Signal: -71 dBm  Noise: unknown
          Bit Rate: 72.2 MBit/s
          Encryption: none
          Type: nl80211  HW Mode(s): 802.11bgn
          Hardware: unknown [Generic MAC80211]
          TX power offset: unknown
          Frequency offset: unknown
          Supports VAPs: no  PHY name: phy0

编译自定义软件

需要编译的源码

#include <stdio.h>
#include "iwinfo.h"

static char * print_bssid(const struct iwinfo_ops *iw, const char *ifname)
{
	static char buf[18] = { 0 };

	if (iw->bssid(ifname, buf))
		snprintf(buf, sizeof(buf), "00:00:00:00:00:00");

	return buf;
}

int main(int argc, char **argv)
{
  char* ifname = argv[1];
  struct iwinfo_ops* iw;
  iw = iwinfo_backend(argv[1]);
  if (!iw)
  {
    fprintf(stderr, "No such wireless device: %s\n", argv[1]);
  }
  printf("%s\n",iw->name);
  // iw->ssid(ifname, buf);
  printf("%s\n", print_bssid(iw,argv[1]));
  return 0;
}

编译命令:

gcc -I/root/wrt/include/libnl-tiny -I/root/wrt/include -D_GNU_SOURCE -std=gnu99 -fstrict-aliasing -Iinclude -DUSE_NL80211 -fpic -c -o a.o a.c
gcc -luci -lubox -lubus -L/root/wrt/lib -L. -liwinfo -lnl-tiny -o a a.o

编译完成。测试能否正常使用

root@OpenWrt:~/wrt/iwinfo# ./a wlan0
nl80211
E8:4E:06:7C:4E:0C