6

嵌入式设备AP配网实例分享

 1 year ago
source link: https://www.eefocus.com/embedded/527822
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大家好,我是杂烩君。上一篇笔记我们分享了嵌入式Linux单板连接飞燕物联网平台,这篇我们分享一下配网。

在这之前,建议阅读往期相关笔记:

smartconfig一件配网:嵌入式大杂烩周记第 5 期 : SmartLink

嵌入式Linux设备开启无线AP/无线接入点:废旧板子再利用:搭建无线调试环境!

下面我们来简单分享基于阿里生活物联网平台的AP配网实例。

一、安装公版手机APP

我们使用公版的手机APP进行配网,再云平台上简单配置之后,可以扫码安装:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUzicRqWc1MNZG6ciacRhPL8LDYBNrHRzuVnV1DXg3cOxLDbHibGZ0cSEXZZg58vNxde7JaLldibnQ0wT7Q%2F640%3Fwx_fmt%3Dpng&s=01be56

 

二、配置AP模式的环境

无论使用什么云平台,平台给我们提供的设备SDK中,都不会是完整的AP配网功能,比如板子如何进入AP模式,这个SDK是不管的,需要我们去适配。

嵌入式Linux设备,要开启无线接入点需要准备如下四个文件:

hostapd:一个用户态用于AP和认证服务器的守护进程。

hostapd.conf:hostapd配置文件,包含无线AP的名称、密码等信息。

udhcpd:dhcp拨号的服务器端。

udhcpd.conf:udhcpd配置文件,配置网关地址及IP地址的范围。

具体的方法可以查看往期笔记:废旧板子再利用:搭建无线调试环境!

二、适配AP配网接口

配网功能阿里有给我们留出接口,我们需要适配这些配网接口。比如我这里使用设备AP配网,需要适配的接口如:

int HAL_Awss_Open_Ap(const char *ssid, const char *passwd, int beacon_interval, int hide)
{
    const char *ap_ssid = ssid; /*  "linkkit-ap"; */
 char shell_cmd[SHELL_CMD_MAX_LEN] = {0};
    char ip_buf[64] = {0};

    if (1 == g_ap_conf_net_flag)
    {
        g_ap_conf_net_flag = 0;
        printf("HAL_Awss_Open_Ap\n");
        printf("ap_ssid = %s\n", ap_ssid);
        printf("ap_ssid + 4 = %s\n", ap_ssid + 4);
        // 开启热点
        system(SHELL_CMD_KILL_NET_PROCESS);  // 杀掉网卡操作相关的进程
        system(SHELL_CMD_NETCARD_DOWN);      // 禁用网卡
        system(SHELL_CMD_NETCARD_UP);        // 启用网卡
        system(SHELL_CMD_SET_NETCARD_IP);    // 设置网卡IP(作为无线AP的网关IP)
        system(SHELL_CMD_START_UDHCPD);      // 启动UDHCPD服务
        system(SHELL_CMD_RM_HOSTAPD_CONF_FILE);
        system(SHELL_CMD_RESET_HOSTAPD_CONF_FILE);
        snprintf(shell_cmd, sizeof(shell_cmd), SHELL_CMD_MODIFY_AP_SSID, ap_ssid + 4);
        system(shell_cmd);                   // 修改AP名称
        system(SHELL_CMD_START_HOSTAPD);     // 启动HOSTAPD服务

        if (strlen(ap_ssid) < sizeof(g_opened_ap)) {
            memcpy(g_opened_ap, ap_ssid, strlen(ap_ssid));
        }
    }
    else
    {
        printf("HAL_Awss_Open_Ap, g_ap_conf_net_flag = FALSE\n");
    }

    return 0;
}
int HAL_Awss_Close_Ap()
{
    /* use nmcli commands to close the previous open Ap */
    printf("HAL_Awss_Close_Ap\n");
    system(SHELL_CMD_KILL_NET_PROCESS);
 system(SHELL_CMD_WLAN0_DOWN);
    return 0;
}
int HAL_Awss_Connect_Ap(
            _IN_ uint32_t connection_timeout_ms,
            _IN_ char ssid[HAL_MAX_SSID_LEN],
            _IN_ char passwd[HAL_MAX_PASSWD_LEN],
            _IN_OPT_ enum AWSS_AUTH_TYPE auth,
            _IN_OPT_ enum AWSS_ENC_TYPE encry,
            _IN_OPT_ uint8_t bssid[ETH_ALEN],
            _IN_OPT_ uint8_t channel)
{
    char ip_buf[64] = {0};
    char shell_cmd[SHELL_CMD_MAX_LEN] = {0};

    printf("HAL_Awss_Connect_Ap\n");
    printf("ssid = %s, passwd = %s\n", ssid, passwd);
    // 重置WiFi配置文件
    system(SHELL_CMD_RM_WIFI_CONF_FILE);
    system(SHELL_CMD_RESET_WIFI_CONF_FILE);

    // 修改WiFi名称及密码
    sprintf(shell_cmd, SHELL_CMD_MODIFY_WIFI_SSID, ssid);
    printf("set ssid: %s\n", shell_cmd);
    system(shell_cmd);
    memset(shell_cmd, 0, sizeof(shell_cmd));
    sprintf(shell_cmd, SHELL_CMD_MODIFY_WIFI_PSW, passwd);
    printf("set passwd: %s\n", shell_cmd);
    system(shell_cmd);

 system(SHELL_CMD_WLAN0_UP);
 system(SHELL_CMD_RUN_WPA_SUPPLICANT);
 system(SHELL_CMD_RUN_UDHCPC);

    if (get_local_ip(g_ifname, (char*)ip_buf) > 0)
    {
        printf("robot ip = %s\n", ip_buf);
        return 0;
    }

    return -1;
}

进入设备AP配网模式的接口:

//User can call this function to start device AP of AWSS
void living_platform_do_awss_dev_ap(void)
{
    printf("living_platform_do_awss_dev_ap\n");
    void* stop_smartconfig_awss_thread = NULL;
    void* dev_ap_open_thread = NULL;
    hal_os_thread_param_t hal_os_thread_param;

    memset(&hal_os_thread_param, 0, sizeof(hal_os_thread_param_t));
    hal_os_thread_param.stack_size = 4096;
    hal_os_thread_param.name = "smartconfig_awss_stop";
    HAL_ThreadCreate(&stop_smartconfig_awss_thread, stop_smartconfig_awss, NULL, &hal_os_thread_param, NULL);
    memset(&hal_os_thread_param, 0, sizeof(hal_os_thread_param_t));
    hal_os_thread_param.stack_size = 4096;
    hal_os_thread_param.name = "dev_ap_open";
    HAL_ThreadCreate(&dev_ap_open_thread, awss_open_dev_ap, NULL, &hal_os_thread_param, NULL);
}

为了方便测试,使用命令行输入的字符触发配网模式:

void check_input_cmd(void)
{
    if (kbhit()) 
    {
        int ch = 0;
        ch = getchar();
        switch (ch)
        {        
            case '1':
                printf("==========111111 living_platform_do_awss_dev_ap\r\n");
                living_platform_do_awss_dev_ap();
                break;

            default:
                break;
        }
    }
}

篇幅有限,其它代码不再贴出,测试例子完整工程可在文末获取。

下面开始运行测试。

步骤:设备进入配网模式、手机APP给设备配网并绑定设备。

使用公版手机APP扫描配网二维码进行配网:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUzicRqWc1MNZG6ciacRhPL8LDYwqPr7ejEjWadDwo7nUrrllfS4weZpjnHibkGJAXI64DOuaM1TOkFibibQ%2F640%3Fwx_fmt%3Dpng&s=732c60

 

输入设备即将链接的WiFi信息:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUzicRqWc1MNZG6ciacRhPL8LDYWFyqRlytrnQicfvAO0GrfkHON3iamyXibuDXEvNZTyryYkWAethWvBO6g%2F640%3Fwx_fmt%3Dpng&s=3903c4

进入配网模式(我们命令行输入命令模拟硬件进入配网):

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUzicRqWc1MNZG6ciacRhPL8LDYDL2tqA7fsGjq0nVCwBuHCYl6tmYfTRiabAq7poytYy14WpSxhhgNpMw%2F640%3Fwx_fmt%3Dpng&s=542bdc

连接设备热点:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUzicRqWc1MNZG6ciacRhPL8LDYicbke7Wu6K7yMGGdzJL1k2XneD5QbSeicXldspeK0FBbZrej0zgN3nug%2F640%3Fwx_fmt%3Dpng&s=d50fa7
forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUzicRqWc1MNZG6ciacRhPL8LDYyfkoauHkuIXzejt4vEugRsQfxXkF3KzbibftfN88NrH0liajiaicBPymyw%2F640%3Fwx_fmt%3Dpng&s=8d8dc7

设备连接路由器、绑定过程:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUzicRqWc1MNZG6ciacRhPL8LDYFsMG6ouhtOBuGZuePvp914T1QGib1ibklvXicVvR0WeXm169ywZyKPFuA%2F640%3Fwx_fmt%3Dpng&s=f3fd4a
forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUzicRqWc1MNZG6ciacRhPL8LDY1nU7iah344OicE2mUib88Qpq6PQeKZQpxtBrDn1Eeia8OF9J3vVqUHKgdg%2F640%3Fwx_fmt%3Dpng&s=9297e2

设备添加成功:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUzicRqWc1MNZG6ciacRhPL8LDYNW13ogMLJ4Lg1hv0Zic2LPwd2YqHPrOITlQYTdFYJiaxfG4icfEOhAHSQ%2F640%3Fwx_fmt%3Dpng&s=09b535
forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPnO7BjBKUzicRqWc1MNZG6ciacRhPL8LDYPsyvzmtmibnL8Kb4AhInlKorJ8vkXYia5O6R1DUPMQb37ZFYd2Bia0HDw%2F640%3Fwx_fmt%3Dpng&s=cf1cbb

本篇笔记代码获取

本篇笔记的demo可在本公众号【嵌入式大杂烩】后台回复关键词:飞燕平台AP配网 ,即可获取。

以上就是基于飞燕平台的AP配网的例子分享,如果觉得文章有帮助,麻烦帮忙转发,谢谢!


版权声明:与非网经原作者授权转载,版权属于原作者。文章观点仅代表作者本人,不代表与非网立场。文章及其配图仅供工程师学习之用,如有侵权或者其他问题,请联系本站作侵删。 侵权投诉


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK