RAK IoT 模块配置工具移植说明 深圳市瑞科慧联科技有限公司 www.rakwireless.com info@rakwireless.com 2015 瑞科慧联对于此文件保留所有权利 本文所提及的实际公司和产品名称, 均为其各自所有者商标 本文档的任何部分不得转载, 不得存储在任何检索系统, 或以任何未经过瑞科慧联书面同意的形式传送 本文件在更新新版本后, 恕不另行通知 1
1. 概述 该配置工具主要依赖于库 iot.sdk.aar, 方便用户快速上手使用 RAK 公司的 IoT WiFi 模块, 包括 : RAK413/RAK415/RAK423/RAK425/RAK473/RAK475/RAK476/RAK477, 主要功能包括一键配置 AP 配置 参数配置 OTA 升级 透传通信等功能 注意, 该 SDK 支持 8 种模块类型, 下文中所有需要填入的模块类型均为字符串类型, 即 : RAK413 RAK415 RAK423 RAK425 RAK473 RAK475 RAK476 RAK477 2
2. 本地发现移植说明 2.1 概述 这一部分主要实现当手机与模块处于同一网络时, 手机可以获取到该模块的相关信息 2.2 移植步骤 1. 添加 iot.sdk.aar 2. 初始化本地发现接口 : Scanner _scanner=new Scanner(getApplicationContext()); 3. 监听扫描结果并获取相关信息 : _scanner.setonscanoverlistener(new Scanner.OnScanOverListener() { public void onresult(map<inetaddress, ScanInfo> data,inetaddress gatewayaddress) { if (data!= null) { for (Map.Entry<InetAddress, ScanInfo> entry : data.entryset()) { String ip = entry.getkey().gethostaddress(); _scaninfo.ip = ip;// 获取模块的 ip 地址 ScanInfo _scaninfo = entry.getvalue();// 获取模块的其他信息 /* 模块信息包括 : _scaninfo.groupname // 模块的组名称 _scaninfo.nickname // 模块名称 _scaninfo.mac // 模块的 MAC 地址 _scaninfo.rssi // 模块的信号值 _scaninfo.productid // 模块所属产品 ID _scaninfo.clientid // 模块的 ID */ ); 4. 扫描设备, 有以下三种方式 : _scanner.scanall(); // 扫描同一局域网下全部设备 _scanner.scan(); // 扫描同一局域网下单个设备 ( 第一个回应手机的设备 ) _scanner.scan(_ip); // 指定 ip 地址扫描,_ip: 模块的 ip 地址 3
3. AP 配置移植说明 3.1 概述这一部分主要实现使用 AP 配置的方式把模块配置到指定的路由器, 这种配置方式非常稳定可靠 3.2 移植步骤移植步骤 : 初始化 >>> 获取网络列表, 选择其中一个网络 >>> 配置模块 >>> 复位模块 1. 添加 iot.sdk.aar 2. 初始化 AP 配置接口 : ApConfig _apsdkapi=new ApConfig(_deviceIp,_devicePassword,_moduleType); //_deviceip: 模块 ip _devicepassword: 模块密码 _moduletype: 模块类型 3. 设置 AP 配置监听 : _apsdkapi.setonresultlistener(new ApConfig.OnResultListener() { public void onresult(apconfig.response result) { if (result.type== ApConfig.GET_SSID_FROM_DEVICE){ // 获取网络列表返回的内容 if (result.statuscode==200){ ssidlist=_apsdkapi.decodessidfromdevice(result.body);// 解析网络列表 if (ssidlist.size()>0){ rssilist=_apsdkapi.getrssilist();// 获取网络列表的信号值 // 显示获取到的网络列表 else if (result.type== ApConfig.CONFIGURE_DEVICE_TO_NETWORK){ // 配置模块联网返回的内容 if (result.statuscode==200){ // 配置完成 else if (result.type== ApConfig.RESET_DEVICE){// 配置模块联网返回的内容 if (result.statuscode==200){// 复位成功 ); 4. 获取模块扫描到的网络列表 _apsdkapi.getssidfromdevice(); 5. 配置模块联网 _apsdkapi.configuredevicetonetwork(ssid, Psk); //Ssid: 无线网络名称 Psk: 无线网络密码 6. 复位模块 _apsdkapi.resetdevice(); 4
4. 一键配置移植说明 4.1 概述 这一部分主要实现如何利用手机 APP, 使用一键配置功能快速把模块配置到指定的路由器 4.2 移植步骤 1. 添加库 iot.sdk.aar 2. 初始化一键配置接口 : EasyConfig _easyconfig = new EasyConfig(_ctx, _moduletype); //_ctx: 上下文 Context _moduletype: 模块类型 3. 设置相关监听 // 监听停止配置事件 _easyconfig.setonstoplistener(new EasyConfig.OnStopListener() { public void onstop() {... ); // 监听配置进度 _easyconfig.setonprogresslistener(new EasyConfig.OnProgressListener() { public void ondata(final int progress, final String ip, final String mac) {... //progress: 配置进度 ip: 模块 ip mac: 模块 mac ( 当 ip 和 mac 不为 null 时即配置成功 ) ); 4. 开始配置 _easyconfig.start(ssid, Psk); //Ssid: 无线网络名称 Psk: 无线网络密码 5. 停止配置 _easyconfig.stop(); 5
5. 参数配置移植说明 5.1 概述这一部分实现配置模块的所有参数 5.2 移植步骤 1. 添加库 iot.sdk.aar 2. 初始化参数配置接口 ParametersSettings _parameterssettings=new ParametersSettings(_deviceIp,_moduleType); //_deviceip: 模块 ip _moduletype: 模块类型 3. 设置相关监听 _parameterssettings.setonrecvdatalistener(new ParametersSettings.OnRecvDataListener() { public void onrecvdata(final int statuscode, final String resultdata, final int cmdtype) { runonuithread(new Runnable() { public void run() { if (statuscode==200){ if (cmdtype==parameterssettings.certificate_cmd){ // 模块认证返回的信息 else if(cmdtype==parameterssettings.get_version_cmd){ // 获取模块的固件版本 else if(cmdtype==parameterssettings.get_parameters_cmd){ // 获取模块的配置参数 else if(cmdtype==parameterssettings.set_parameters_cmd){ // 设置模块的配置参数 else if(cmdtype==parameterssettings.reset_cmd){ // 复位模块返回的信息 else if(cmdtype==parameterssettings.fac_reset_cmd){ // 模块恢复出厂返回的信息 else if(cmdtype==parameterssettings.get_ssid_from_device){ // 解析网络列表 ssidlist=_parameterssettings.decodessidfromdevice(resultdata); if (ssidlist.size()>0){ // 获取网络列表的信号值 rssilist=_parameterssettings.getrssifromdevice(); // 显示获取到的网络列表 6
); ); 4. 模块认证 _parameterssettings.certificate(username, Password); //Username: 模块用户名 Password: 模块密码 5. 获取模块版本号 _parameterssettings.getversion(); 6. 获取模块配置参数 _parameterssettings.getparameters(); 7. 解析模块配置参数 ModuleParameters.DecodeModuleParameters(parameters); 解析完的模块参数保存到 ModuleParameters 类里, 所有参数如表 5-1 所示 : 表 5-1 模块参数值说明 参数类型 参数名称 参数说明 参数值 备注 power_mode_value 功耗模式 full: 全功耗 save: 节省功耗 模式设置 wlan_mode_value 网络模式 STA:STA 模式 仅 RAK47X AP:AP 模式 支持共存模式 AP+STA: 共存 AP 参数设置 ap_ssid_value AP 热点名称 ap_bdcast_value AP 热点广播 0: 关闭 1: 开启 ap_max_clts_value 允许最大连接 取值 :0~4 0 表示无限制 ap_channel_value AP 信道 取值 :1~13 ap_sec_mode_value AP 加密模式 0: 不加密 1: 加密 ap_psk_value AP 密码 ap_ip_value AP 的 IP 地址 仅 RAK47X 支持多个连接 STA 参数设置 sta_ssid_value STA 网络名称 sta_sec_mode_value STA 加密模式 0: 不加密 1: 加密 sta_psk_value STA 网络密码 sta_dhcp_value DHCP 设置 0: 不使能 1: 使能 7
sta_ip_value sta_netmask_value sta_gateway_value sta_dns1_value sta_dns2_value STA 时模块 IP STA 时模块掩码 STA 时模块网关 STA 时模块 dns1 STA 时模块 dns2 UART 参数设置 uart_baudrate_value UART 波特率 9600~921600 uart_datalen_value UART 数据位 5~8 RAK47X 只支持 7 和 8 uart_parity_en_value UART 校验位 0: 无校验 1: 奇校验 2: 偶校验 uart_stoplen_value UART 停止位 0:1 位停止位 1:2 位停止位 uart_rtscts_en_value UART 流控 0: 不使能 1: 使能 RAK47X 不支持 485 流控 2: 使能 485 流控 uart_timeout_value UART 字节超时 uart_recvlenout_value UART 字节间隔 SOCKET 参数设置 socket_multi_en_value 双 socket 设置 0: 不使能 1: 使能 socketa_type_value socketa 类型 tcp:tcp 客户端 ltcp:tcp 服务器 udp : UDP 客户端 ludp:udp 服务器 socketa_max_clts_value socketa 最大连接 取值 :0~4 仅 RAK47X 数 支持 socketa_destip_value socketa 目标 ip socketa_destport_value socketa 目标端口 socketa_localport_value socketa 本地端口 socketa_tcp_timeout_va lue socketa TCP 超时时间 socketa_tcp_reconval_v socketa TCP 重连 仅 RAK47X alue 时间间隔 支持 socketb_type_value socketb 类型 tcp:tcp 客户端 ltcp:tcp 服务器 udp : UDP 客户端 ludp:udp 服务器 socketb_max_clts_value socketb 最大连接 取值 :0~4 仅 RAK47X 数 支持 socketb_destip_value socketb 目标 ip socketb_destport_value socketb 目标端口 8
socketb_localport_value socketb 本地端口 socketb_tcp_timeout_va socketb TCP 超时 lue 时间 socketb_tcp_reconval_v sockeb TCP 重连 仅 RAK47X alue 时间间隔 支持 用户参数设置 user_name_value user_password_value module_name_value module_group_value 模块用户名模块用户密码模块名称模块组名称 8. 设置模块配置参数 (1) _parameterssettings.setparameters();// 设置模块所有参数 (2) _parameterssettings.setparameters(_type);// 设置模块指定类型的参数 类型包括 : ParametersSettings.SET_PARAMETERS_MODE ParametersSettings.SET_PARAMETERS_AP ParametersSettings.SET_PARAMETERS_STA ParametersSettings.SET_PARAMETERS_UART ParametersSettings.SET_PARAMETERS_SOCKET ParametersSettings.SET_PARAMETERS_USER // 设置模式相关参数 // 设置 AP 相关参数 // 设置 STA 相关参数 // 设置 UART 相关参数 // 设置 SOCKET 相关参数 // 设置用户相关参数 注意 : 以上两种参数设置方式配置前需要先获取模块的配置参数, 然后对表 5-1 中需要修改的参数进 行修改, 然后选择调用上面两个接口, 即可完成配置 (3) _parameterssettings.setparameters(_config);// 设置模块任意参数 _config: 配置信息这个接口需要用户自己拼接配置参数, 拼接格式如下 : 关键字 = 值 & 关键字 = 值 & 关键字 = 值 & 关键字 = 值 & 关键字 = 值... wlan_mode=0&power_mode=0&ap_ssid=rak477_ap&ap_psk=&ap_bdcast=1&ap_sec_mode=0&ap _max_clts=3&ap_channel=6&... RAK IoT 模块的关键字信息在 ModuleParameters 类里已有定义, 可以直接引用, 如表 5-2: 表 5-2 模块关键字说明 关键字类型 关键字名称 关键字说明 关键字的值 备注 power_mode 功耗模式 RAK47X: 0: 全功耗 1: 节省功耗 RAK41X 42X: full: 全功耗 save: 节省功耗 模式设置 wlan_mode RAK47X 网络模式 0:STA 模式 1:AP 模式 9
wifi_mode RAK41X 42X 网络 模式 2:AP+STA 共存 STA:STA 模式 AP:AP 模式 AP 参数设置 ap_ssid AP 热点名称 ap_bdcast RAK47X: AP 热点广播 0: 关闭 1: 开启 ap_bdcast_en RAK41X 42X:AP 热点广播 0: 关闭 1: 开启 ap_max_clts 允许最大连接 取值 :0~4 0 表示无限制 ap_channel AP 信道 取值 :1~13 ap_sec_mode RAK47X: AP 加密 0: 不加密 模式 1: 加密 ap_secu_en RAK41X 42X: AP 0: 不加密 加密模式 1: 加密 ap_psk AP 密码 ap_ip RAK47X: AP 的 IP 地址 ap_ipaddr RAK41X 42X: AP 的 IP 地址 仅 RAK47X 支持多个连接 STA 参数设置 sta_ssid STA 网络名称 sta_sec_mode RAK47X:STA 加密模式 sta_secu_en RAK41X 42X:STA 加密模式 sta_psk STA 网络密码 sta_dhcp RAK47X:DHCP 设置 sta_dhcp_en RAK41X 42X : DHCP 设置 sta_ip RAK47X:STA 时模块 IP sta_ipaddr RAK41X 42X:STA 时模块 IP sta_netmask STA 时模块掩码 sta_gateway STA 时模块网关 sta_dns1 RAK47X:STA 时模块 dns1 sta_dnssever1 RAK41X 42X:STA 时模块 dns1 0: 不加密 1: 加密 0: 不加密 1: 加密 0: 不使能 1: 使能 0: 不使能 1: 使能 10
sta_dns2 sta_dnssever2 RAK47X:STA 时模块 dns2 RAK41X 42X:STA 时模块 dns2 UART 参数设置 uart_baudrate UART 波特率 9600~921600 uart_datalen UART 数据位 5~8 RAK47X 只支持 7 和 8 uart_parity_en UART 校验位 0: 无校验 1: 奇校验 2: 偶校验 uart_stoplen UART 停止位 0:1 位停止位 1:2 位停止位 uart_rtscts_en UART 流控 0: 不使能 1: 使能 RAK47X 不支持 485 流控 2: 使能 485 流控 uart_timeout UART 字节超时 uart_recvlenout UART 字节间隔 socket_multi_en 双 socket 设置 0: 不使能 1: 使能 socketa_type socketa 类型 RAK47X: 0:TCP 客户端 1:TCP 服务器 2:UDP 客户端 3:UDP 服务器 RAK41X 42X: tcp:tcp 客户端 ltcp:tcp 服务器 udp : UDP 客户端 SOCKET 参数设置 ludp:udp 服务器 socketa_max_clts socketa 最大连接 取值 :0~4 仅 RAK47X 数 支持 socketa_destip socketa 目标 ip socketa_destport socketa 目标端口 socketa_localport socketa 本地端口 socketa_tcp_timeout socketa TCP 超时 时间 socketa_tcp_reconval socketa TCP 重连 仅 RAK47X 时间间隔 支持 socketb_type socketb 类型 RAK47X: 0:TCP 客户端 11
1:TCP 服务器 2:UDP 客户端 3:UDP 服务器 socketb_max_clts socketb_destip socketb_destport socketb_localport socketb_tcp_timeout socketb_tcp_reconval socketb 最大连接数 socketb 目标 ip socketb 目标端口 socketb 本地端口 socketb TCP 超时时间 sockeb TCP 重连时间间隔 RAK41X 42X: tcp:tcp 客户端 ltcp:tcp 服务器 udp : UDP 客户端 ludp:udp 服务器 取值 :0~4 仅 RAK47X 支持 仅 RAK47X 支持 用户参数设置 user_name user_password module_name module_group 模块用户名模块用户密码模块名称模块组名称 注意 : 参数配置完成后不会立即生效, 需要复位模块才生效 调用复位接口或者硬件复位均可 9. 复位模块 _parameterssettings.reset(); 10. 模块恢复出厂设置 _parameterssettings.facreset(); 11. 获取模块扫描到的网络列表 _parameterssettings.getssidfromdevice(); 12. 解析模块扫描到的网络列表 ArrayList<String> ssidlist=_parameterssettings.decodessidfromdevice(resultdata); //resultdata: 获取到的网络信息 ssidlist: 解析后的网络列表 13. 关闭配置, 释放配置接口 _parameterssettings.close(); 12
6. 透传移植说明 6.1 概述 这一部分主要实现模块通过 Socket 透传收发数据的功能 6.2 移植步骤 1. 添加库 iot.sdk.aar 2. 初始化 Socket 通信接口 (1) SocketControl _socketcontrol=new SocketControl(_destIp,_destPort,_localPort, _type); (2) SocketControl _socketcontrol=new SocketControl(_destIp,_destPort, _type); (3) SocketControl _socketcontrol=new SocketControl(_localPort, _type); //_destip: 目标 ip _destport: 目标端口 _localport: 本地端口 _type:socket 类型 Socket 类型 : SocketControl.TCP //TCP 客户端 SocketControl.LTCP //TCP 服务器 SocketControl.UDP //UDP 客户端 SocketControl.LUDP //UDP 服务器 3.Socket 连接 // 设置 Socket 连接监听 _socketcontrol.setonconnectstatelistener(new SocketControl.OnConnectStateListener() { public void OnConnectState(final boolean connect) { //connect:true 表示 Socket 连接成功 false 表示 Socket 连接失败 ); _socketcontrol.socketconnect();//socket 连接 4.Socket 发送数据 // 设置 Socket 发送监听 _socketcontrol.setonsenddatastatelistener(new SocketControl.OnSendDataStateListener() { public void OnSendDataState(final boolean send) { //send:true 表示发送成功 false 表示 Socket 发送失败 ); _socketcontrol.socketsend(data, offset, length);//socket 发送字节数组 _socketcontrol.socketsend(str);//socket 发送字符串数据 13
5.Socket 接收数据 // 设置 Socket 接收 TCP 数据监听 _socketcontrol.setonrecvtcpdatalistener(new SocketControl.OnRecvTCPDataListener() { public void onrecvtcpdata(final byte[] data, final int size) { //TCP 数据 ); // 设置 Socket 接收 UDP 数据监听 _socketcontrol.setonrecvudpdatalistener(new SocketControl.OnRecvUDPDataListener() { public void onrecvudpdata(final byte[] data, final int size) { //UDP 数据 ); 6. 关闭 Socket _socketcontrol.socketclose(); 14
7. OTA 移植说明 7.1 概述这一部分主要实现无线升级固件的功能 7.2 移植步骤整个升级过程如下 : 创建文件夹存放要升级的固件 >> 手机扫描设备, 选择一个设备升级 >> 获取模块和手机中存放固件的版本号 >> 建立连接并开始升级 >> 显示升级结果 1. 添加库 iot.sdk.aar 2. 初始化升级接口 OTAInterface _otainterface=new OTAInterface(_deviceIp,_username,_password,_moduleType); //_deviceip: 模块 ip _username: 模块用户名 _password: 模块密码 _moduletype: 模块类型 3. 设置相关监听 _otainterface.setonresultalistener(new OTAInterface.OnResultListener() { public void onresult(final int percent, final int resultdata) { //percent: 升级进度 runonuithread(new Runnable() { public void run() { if (resultdata==otainterface.ota_connect_failed){ // 连接失败 else if (resultdata==otainterface.ota_response_failed){ // 升级失败 else if (resultdata==otainterface.ota_upgrade_success){ // 升级成功注意 : RAK413/RAK415/RAK423/RAK425 升级成功后模块加载成功需要 60s RAK473/RAK475/RAK476/RAK477 升级成功后模块加载成功需要 10s ); ); 4. 开始升级 _otainterface.upgradefirmwaretodevice(_firmwarepath);//firmwarepath: 升级固件的路径 5. 停止升级 _otainterface.stopupgradefirmware(); 15
8. 相关权限 8.1 相关权限 <!-- wifi usage --> <uses-permission android:name="android.permission.change_wifi_multicast_state"/> <uses-permission android:name="android.permission.change_network_state"></uses-permission> <uses-permission android:name="android.permission.change_wifi_state"></uses-permission> <uses-permission android:name="android.permission.access_network_state"></uses-permission> <uses-permission android:name="android.permission.access_wifi_state"></uses-permission> <uses-permission android:name="android.permission.internet" ></uses-permission> <uses-permission android:name="android.permission.read_sms"></uses-permission> <!-- Camera usage --> <uses-permission android:name="android.permission.vibrate" /> <uses-permission android:name="android.permission.camera" /> <uses-permission android:name="android.permission.flashlight" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <!-- file and SD Card usage --> <uses-permission android:name="android.permission.read_external_storage"/> <uses-permission android:name="android.permission.write_external_storage"/> <uses-permission android:name="android.permission.mount_unmount_filesystems"/> 16
9. 修改记录 版本作者时间修改内容 V1.0 瞿瑾 2017/02/14 创建文档 瞿瑾 2017/02/20 添加获取扫描网络列表的信号值 17