今天给大家介绍一下小程序配网工具-安信可 IoT,近期刚发布了新的版本,新增了服务器地址配置的功能。这个新功能,给我们带来了不少便利,特别是 HomeAssistant 固件使用这一块。
在2024 年 7 月 17 号之前,安信可 IoT 小程序只能提供配网程序,用户能够利用蓝牙功能给 Wi-Fi 模块进行无线网络配置,但是随着 DIY 作品不断地更新,为了更加方便地使用固件,涉及 TCP 服务器和 MQTT 服务器地址配置只能通过 AT 指令来实现,在某些应用场合根本无法实现。
所以,这次让前端工程师加了这个功能,在配网的时候,可以选择配置服务器地址。
01新功能使用说明
02数据格式
小程序下发的服务器配置数据是以 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; }
调用示例:
char* addr=get_ip_addr_from_custom_data("tcp",custom_data); printf("addr=%srn",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; }
调用示例:
uint16_t port=get_port_from_custom_data("tcp",custom_data); printf("port=%drn",port);
这些程序流程我就不解释,太简单了,不懂的话,自己去学一下 cjson 的数据解析。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !