🎲
🦄

jXLRYiCFNYcnh">

  1. 👺

      🛂
      🧞👹
      🚂
    • 🚷🕢
      🏣
      🏀
      🔪
      🐹😋
    • 🙌

      智能家居之旅(14):安信可IoT Blufi配网工具新功能介绍

      发布时间:2024-08-30 14:22  浏览量:15

      智能家居之旅(1):了解HomeAssistant

      智能家居之旅(2):设备接入HomeAssistant的方法

      智能家居之旅(3):Ai-M61/M62 接入HomeAssistant 实现点灯

      智能家居之旅(4):神器在手,摸鱼我有!用Rd-01做个老板监视器

      智能家居之旅(5):Ai-WB2 使用HomeAssistant-C库接入HomeAssistant

      智能家居之旅(6):HomeAssistant-C传感器实体使用方法

      智能家居之旅(7):HomeAssistant开发板的RGB颜色

      智能家居之旅(8):Text(文本)实体使用方法

      智能家居之旅(9):HomeAssistant 的开关实体具象化

      智能家居之旅(10):用一块免费的PCB板完成USB小夜灯控制器

      智能家居之旅(11):如何使用HA交流通断器来控制家里的电器?

      智能家居之旅(12):整一个几乎能控制家里所有电器供电的通断器?

      智能家居之旅(13):基于 Ai-WB2 模组实现的 HomeAssistant 传感器采集器?

      今天给大家介绍一下小程序配网工具-安信可 IoT,近期刚发布了新的版本,新增了服务器地址配置的功能。这个新功能,给我们带来了不少便利,特别是 HomeAssistant 固件使用这一块。

      在2024 年 7 月 17 号之前,安信可 IoT 小程序只能提供配网程序,用户能够利用蓝牙功能给 Wi-Fi 模块进行无线网络配置,但是随着 DIY 作品不断地更新,为了更加方便地使用固件,涉及 TCP 服务器和 MQTT 服务器地址配置只能通过 AT 指令来实现,在某些应用场合根本无法实现。

      所以,这次让前端工程师加了这个功能,在配网的时候,可以选择配置服务器地址。

      01新功能使用说明

      小程序下发的服务器配置数据是以 json 格式下发:

      {

      "server_type":

      {

      "addr":"0.0.0.0",

      "port":"xxxxx"

      }

      }

      字段名说明示例server_type服务器类型"tcp"addr服务器地址,支持 IPV4 地址和域名"192.168.1.1"port服务器端口号1883

      例如:下发一个 TCP 服务器,地址为:192.168.3.1,端口号为:8888,则数据为:

      {

      "tcp":

      {

      "addr":"192.168.3.1",

      "port":"8888"

      }

      }

      03数据接收

      数据接收就是设备端的了,但是前提是要使用 Blufi 配网功能,在 Ai-WB2 的 SDK(Ai-Thinker-WB2)当中,有 Blufi 的 demo。

      因为小程序下发的数据是通过 Blufi 的 custom data(自定义数据)接口下发,在 blufo demo 当中

      AXK_BLUFI_EVENT_RECV_CUSTOM_DATA 事件,可以看到下发的服务器地址数据:

      04数据解析

      既然是 json 数据,那只要引用 cJSON.h 头文件,就能实现对服务器地址和端口号的解析,下面写了函数,大家做个参考

      解析服务器地址

      static char data_buff[128] = { 0 };

      char* get_ip_addr_from_custom_data(const char* server_type, const char* custom_data)

      {

      if (custom_data==NULL) {

      blog_error("custom_data is NULL");

      return NULL;

      }

      char* cjson_root = custom_data;

      cJSON* root = cJSON_Parse(cjson_root);

      if (root==NULL)

      {

      blog_error("%s is't json data", cjson_root);

      cJSON_Delete(root);

      return NULL;

      }

      cJSON* add_type = cJSON_GetObjectItem(root, server_type);

      if (add_type==NULL)

      {

      blog_error("%s not \"%s\" project ", cjson_root,server_type);

      cJSON_Delete(root);

      return NULL;

      }

      cJSON* addr = cJSON_GetObjectItem(add_type, "addr");

      if (addr==NULL)

      {

      blog_error("%s not \"addr\" project ", cjson_root);

      cJSON_Delete(root);

      return NULL;

      }

      memset(data_buff, 0, 128);

      strcpy(data_buff, addr->valuestring);

      cJSON_Delete(root);

      return data_buff;

      }

      函数说明说明示例server_type服务器类型,支持以下类型:tcp、udp 和 mqtt"tcp"custom_datablufi 接收自定义数据/返回值:char*返回服务器地址的指针/

      调用示例:

      char* addr=get_ip_addr_from_custom_data("tcp",custom_data);

      printf("addr=%s\r\n",addr);


      uint16_t get_port_from_custom_data(const char* server_type, const char* custom_data)

      {

      if (custom_data==NULL) {

      blog_error("custom_data is NULL");

      return NULL;

      }

      char* cjson_root = custom_data;

      cJSON* root = cJSON_Parse(cjson_root);

      if (root==NULL)

      {

      blog_error("%s is't json data", cjson_root);

      cJSON_Delete(root);

      return NULL;

      }

      cJSON* add_type = cJSON_GetObjectItem(root, server_type);

      if (add_type==NULL)

      {

      blog_error("%s not \"%s\" project ", cjson_root,server_type);

      cJSON_Delete(root);

      return NULL;

      }

      cJSON* port_p = cJSON_GetObjectItem(add_type, "port");

      if (port_p==NULL)

      {

      blog_error("%s not \"port\" project ", cjson_root);

      cJSON_Delete(root);

      return NULL;

      }

      uint16_t port = atoi(port_p->valuestring);

      cJSON_Delete(root);

      return port;

      }

      函数说明说明示例server_type服务器类型,支持以下类型:tcp、udp 和 mqtt"tcp"custom_datablufi 接收自定义数据/返回值:uint16_t返回端口号,范围:0-655351883

      调用示例:

      uint16_t port=get_port_from_custom_data("tcp",custom_data);

      printf("port=%d\r\n",port);

      这些程序流程我就不解释,太简单了,不懂的话,自己去学一下 cjson 的数据解析。

      外部推荐

      🔧🌺

      ♍🥘

      🔼🈸

      1WwGRWE">

      🍋🍢
      🧙
        💆🐨
        1. 🔌🤢
        • 🍧
          💊
        • 🔔🎲
          📋
        • 🍦
          🙏
        • 🚨