瑞芯微RK3128-微信Airkiss2.0配网功能调试及实现
越来越多的智能硬件设备实现了简易的配网功能,微信硬件平台推出了Airkiss技术,详细的关于Airkiss的介绍可以参考微信硬件平台开发者心:微信硬件平台Airkiss
关于AirKiss的实现,基于的WiFi芯片是BroadCom AP6212,基于的CPU还是瑞芯微RK3128,Android系统。
其实很多WiFI厂商都和微信有了合作,实现了其Airkiss、AirSync等功能。比如我拿到的是正基科技(AMPAK)AP6212的
EasySetupTarget.zip,其实现了微信的Airkiss功能,同时也支持几个其它厂商的智能配网功能,具体如下:
Usage: (type setup -h)
# setup -h
-h: show help message
-d: show debug message
-k <v>: set 16-char key for all protocols
-p <v>: bitmask of protocols to enable
0x0001 - bcast
0x0002 - neeze
0x0004 - akiss
0x0010 - changhong
0x0020 - changhong
0x0040 - jd JoyLink
本文中我们只介绍Airkiss的测试过程,Airkiss的实现需要一下几个模块支持:wifi固件、服务端(EasySetupTarget)、
客户端(APP or微信公众号发送ssid和password)。
wifi固件
Airkiss服务实现模块
可以编译为可执行文件或so库,源码在jni文件夹中,可以通过Androi JNI调用。详细的说明在readme文档。
这里主要记录一下我遇到的问题,编译jni目录为可执行文件,push到开发板运行正常,可以获取到ssid和password。
但是为了更加方便操作,我是通过上层APP的JNI调用easysetup接口,开启airkiss,然后走到easy_setup_start()接口,
看日志已经进入该函数,但是在ioctrl操作时失败了,具体日志如下:
[ 01-01 12:45:27.541 7172: 7275 I/ ]Lucien: Easy setup target library v3.7.0
[ 01-01 12:45:27.541 7172: 7275 I/ ]easy setup iovar !
[ 01-01 12:45:27.541 7172: 7275 I/ ] easy setup ioctl(cmd=263) failed: 1(Operation not permitted)
[ 01-01 12:45:27.541 7172: 7275 I/ ]easy setup iovar:easy_setup_ioctl return:-1
[ 01-01 12:45:27.541 7172: 7275 I/ ] easy setup start failed: 1(Operation not permitted)
。。。。。。
/* log if not WLC_SCAN_RESULTS(51) */
if (cmd != 51) {
LOGD("easy setup ioctl(cmd=%d) failed: %d(%s)\n",
cmd, errno, strerror(errno));
}
return -1;
}
}
刚开始百思不得其解,为什么会权限失败,apk是放在/system/app中、设置platform签名凭证、以及设置shareUid,
相应的so权限及用户组也没什么问题,纠结了半天,还是怪自己对Android权限管理了解到不够清楚,刚开始怀疑是selinux权限没加,
但是又没有相应的avc日志。还尝试app中调用可执行文件,也是失败的。看了这位同仁的博客才明白(参考博客),
其实是apk的操作权限没有加够。
原来在函数dev_ioctl中,会检查CAP_NET_ADMIN权限,进入这个函数,发现检查的是进程是否在group AID_NET_ADMIN中:
com.mydale.iot: type=1400 audit(0.0:4): avc: denied { net_admin } for capability=12 scontext=u:r:platform_app:s0 tcontext=u:r:
platform_app:s0tclass=capability permissive=1
添加权限:
allow platform_app self:capability { net_admin };
但是编译会报错,原来在app.te中声明了net_admin在app domain是不被允许的。
neverallow { appdomain -bluetooth } self:capability *;
这里需要修改下,其它就OK了。以上只是自己理解,可能有不准确的地方,谅解。
补充;
设备获取到wifi ssid和password后,也会同时获取一个随机数,在设备联网后,要发送不少于20次udp广播到端口10000,告诉微信公众号或app端,信息全部被正确接收了。
Java端的udp广播发送代码参考如下:
相关文章
- 实战:第六章:H5微信与支付宝调试错误,请回到请求来源地,重新发起请求。 错误代码 insufficient-isv-permissions
- 实战:第六章:H5微信与支付宝调试错误,请回到请求来源地,重新发起请求。 错误代码 insufficient-isv-permissions
- 编译ffplay并导入IDE断点调试
- Linux环境下段错误的产生原因及调试方法小结详解程序员
- Eclipse调试时出现source not found的问题详解数据库
- html5 微信真机调试方法vConsole详解编程语言
- 掌握Linux下线程的调试技术(查看linux线程)
- 解析Linux函数调用栈的调试方法(linux函数调用栈)
- 一个可以更好地调试的 Perl 模块
- 使用微软的 ProcDump 调试 Linux
- 对textarea框的代码调试,而且功能上使用非常方便,酷
- 分享一则javascript调试技巧