HarmonyOS开发板NFC碰一碰完成动态配置

举报
神龙居市 发表于 2021/11/03 19:19:51 2021/11/03
【摘要】 上一篇《华为云IoT API Explorer对接小程序实现系统化应用》介绍了应用侧如何利用应用测的Api做了一个微信小程序业务场景。本篇就介绍南向设备端案例,主要讲解案例基础上集成NFC功能,并和小程序配合成为一个完整的应用场景案例。用来实现NFC动态配置WIFI账号和密码,DeviceId和Secret,可以适合多场景先烧录后配置。硬件准备:1、小熊派开发板 Bearpi_HM nano...

上一篇《华为云IoT API Explorer对接小程序实现系统化应用》介绍了应用侧如何利用应用测的Api做了一个微信小程序业务场景。

本篇就介绍南向设备端案例,主要讲解案例基础上集成NFC功能,并和小程序配合成为一个完整的应用场景案例。

用来实现NFC动态配置WIFI账号和密码,DeviceId和Secret,可以适合多场景先烧录后配置。

硬件准备

1、小熊派开发板 Bearpi_HM nano

2、E53案例的一个扩展版

3、安卓手机一部,带NFC功能

4、Type-C 电源线一根

软件准备

1、HarmonyOS开发环境的Linux系统,帮小熊派宣传一下https://pan.baidu.com/s/1T0Tcl3y48C1p5L6y-6HJNg 提取码:eusr

2、HiBurn烧录工具,方便在Windows上使用

3、微信开发工具

4、VSCode开发工具

目标工作的任务

1、通过小程序能够添加产品和注册设备,注册设备的同时产生的DeviceID和Secret,加上Wifi的账号密码,通过NFC功能,小程序调用手机NFC传递给开发板的NFC里面。

2、开发板启动时,先读取NFC内容,按照预定的格式,如果发现了以上写入信息,就直接使用来连接Wifi和物联网。

看代码

小熊派案例D6_iot_cloud_oc采用Wifi和MQTT连接,包含了智慧农业案例

可以从下面代码中看出,Wifi信息和设备信息都是编译前要写好的。

//Wifi信息联网
uint32_t ret = WifiConnect("Hold", "0987654321");
//设备信息
#define CLIENT_ID "5fc7152fb4ec2202e99df7bf_2020111409_0_0_2020120205"
#define USERNAME "5fc7152fb4ec2202e99df7bf_2020111409"
#define PASSWORD "9b501c0ce96e0d79a071703b870060d939e95715397c6cb5dee90a93a38dd288"

device_info_init(CLIENT_ID, USERNAME, PASSWORD);

Bearpi-HM nano已经支持NFC了,只要引入类库实现读取

NFC代码库包含若干文件

使用起来函数比较简单,先初始化对应的GPIO和SPP

    //GPIO_0复用为I2C1_SDA
    IoTGpioSetFunc(0, IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);

    //GPIO_1复用为I2C1_SCL
    IoTGpioSetFunc(1, IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);

    //baudrate: 400kbps
    IoTI2cInit(WIFI_IOT_I2C_IDX_1, 400000);

接下来就是读取NFC内容了,根据预置格式读取和使用

    extern char product[50], wifissid[50], wifipwd[50], deviceid[50], devicepwd[50];
    /* 从NFC中读取连接平台相关设备信息 */
    ret = nfc_get_devived_data();

    /* 连接WiFi热点 */
    if (ret == 0)
    {
        WifiConnect(wifissid, wifipwd);
    }
    else
    {
        WifiConnect(CONFIG_WIFI_SSID, CONFIG_WIFI_PWD);
    }
   dtls_al_init();
    mqtt_al_init();
    oc_mqtt_init();

    g_app_cb.app_msg = queue_create("queue_rcvmsg", 10, 1);
    if (NULL == g_app_cb.app_msg)
    {
        printf("Create receive msg queue failed");
    }
    oc_mqtt_profile_connect_t connect_para;
    (void)memset(&connect_para, 0, sizeof(connect_para));

    connect_para.boostrap = 0;
    if (ret == 0)
    {
        connect_para.device_id = deviceid;      //平台所需要的deviceid
        connect_para.device_passwd = devicepwd; //平台所需要的devicepwd
    }
    connect_para.server_addr = CONFIG_APP_SERVERIP;
    connect_para.server_port = CONFIG_APP_SERVERPORT;

    connect_para.life_time = CONFIG_APP_LIFETIME;
    connect_para.rcvfunc = msg_rcv_callback;
    connect_para.security.type = EN_DTLS_AL_SECURITY_TYPE_NONE;

    /* 连接到华为云IoT平台 */
    printf("Connecting huawei iot cloud!\r\n");
    ret = oc_mqtt_profile_connect(&connect_para);
    if ((ret == (int)en_oc_mqtt_err_ok))
    {
        g_app_cb.connected = 1;
        printf("oc_mqtt_profile_connect succed!\r\n");
    }

读取NFC主方法

/**************************************************
 * get_devived_data
 * 获取WiFi的ssid和密钥及设备DevicesID和密钥
 * ***********************************************/
uint8_t nfc_get_devived_data(void)
{
    uint8_t memary_buf[16 * 15];
    cJSON *json, *jsonTemp; // *jsonArray,
    uint8_t jsonbuf[512] = {0};
    char jsonbuf_string[512] = {0};
    uint8_t payload_len = 0;
    uint8_t json_len = 0;

    NT3H1101_Read_Userpages(15, memary_buf);

    payload_len = memary_buf[4];
    json_len = payload_len - 3;

    //取出真实的json数据包,往后再偏移3位
    for (uint8_t i = 0; i < json_len; i++)
    {
        jsonbuf[i] = memary_buf[9 + i];
    }
    memset(jsonbuf_string, 0x00, sizeof(jsonbuf_string));
    sprintf(jsonbuf_string, "%s", jsonbuf);
    
    // printf("\r\n nfc json %s\r\n", jsonbuf_string);

    //解析json数据
    json = cJSON_Parse(jsonbuf_string);
    if (!json)
    {
        printf("Error before: [%s]\n", cJSON_GetErrorPtr());
        return -1;
    }
    else
    {
        jsonTemp = cJSON_GetObjectItem(json, "product");
        memset(product, 0, sizeof(product));
        snprintf(product, strlen(jsonTemp->valuestring) + 1, "%s", jsonTemp->valuestring);
        jsonTemp = cJSON_GetObjectItem(json, "device_id");
        memset(deviceid, 0, sizeof(deviceid));
        snprintf(deviceid, strlen(jsonTemp->valuestring) + 1, "%s", jsonTemp->valuestring);
        jsonTemp = cJSON_GetObjectItem(json, "secret");
        memset(devicepwd, 0, sizeof(devicepwd));
        snprintf(devicepwd, strlen(jsonTemp->valuestring) + 1, "%s", jsonTemp->valuestring);
        jsonTemp = cJSON_GetObjectItem(json, "ssid");
        memset(wifissid, 0, sizeof(wifissid));
        snprintf(wifissid, strlen(jsonTemp->valuestring) + 1, "%s", jsonTemp->valuestring);
        jsonTemp = cJSON_GetObjectItem(json, "pwd");
        memset(wifipwd, 0, sizeof(wifipwd));
        snprintf(wifipwd, strlen(jsonTemp->valuestring) + 1, "%s", jsonTemp->valuestring);

        cJSON_Delete(json);
        free(json); // isequal
    }
    return 0;
}

小程序的NFC,需要腾讯提供的NFC组件。其使用过程如下

小程序写入的是json,并在写入时编码,值得一说的是,编码时增加3个ASCII码,NFC的固定规范

var payload = JSON.stringify({
                "product": that.data.selectedProduct,
                "device_id": device.device_id,
                "secret": device.secret,
                "ssid": wifi.ssid,
                "pwd": wifi.pwd
})
 let records = [{
                id: new ArrayBuffer(),
                payload: stringToBuffer(payload, "02,65,6E"),
                type: stringToBuffer('T'),
                tnf: 1
 }]
ndef.writeNdefMessage({
                records: records,               
                success: (res) => {
                  console.log('writeNdefMessage success res:', res)
                  that.setData({
                    setNfcText: '配置成功,请重启开发板',
                    btnNfcText: '确定'
                  })
                },
                complete: (res) => {
                  nfc.stopDiscovery();
       }
})




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。