Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >鸿蒙之接收UDP消息

鸿蒙之接收UDP消息

作者头像
跋扈洋
发布于 2022-03-29 00:45:06
发布于 2022-03-29 00:45:06
1.5K00
代码可运行
举报
文章被收录于专栏:物联网知识物联网知识
运行总次数:0
代码可运行

开发环境

  1. VS Code
  2. HUAWEI DevEco Device Tool(HarmonyOS面向智能设备开发者提供的一站式集成开发环境)
  3. HiBurn(用于烧录)
  4. VMware
  5. UbuntuLinux系统)

使用的技术

UDP

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。 Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。 UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但即使在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。 方法 说明 Close 关闭 UDP 连接 Connect 建立与远程主机的连接 DropMulticastGroup 退出多路广播组 JoinMulticastGroup 将 UdpClient 添加到多路广播组 Receive 返回已由远程主机发送的 UDP 数据文报 Send 将 UDP 数据文报发送到远程主机

方法

说明

Close

关闭 UDP 连接

Connect

建立与远程主机的连接

DropMulticastGroup

退出多路广播组

JoinMulticastGroup

将 UdpClient 添加到多路广播组

Receive

返回已由远程主机发送的 UDP 数据文报

Send

将 UDP 数据文报发送到远程主机

JSON

JSON介绍

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON 语法规则

JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。 JSON是一个序列化的对象或数组。

  1. 六个构造字符: begin-array = ws %x5B ws ; [ 左方括号 begin-object = ws %x7B ws ; { 左大括号 end-array = ws %x5D ws ; ] 右方括号 end-object = ws %x7D ws ; } 右大括号 name-separator = ws %x3A ws ; : 冒号 value-separator = ws %x2C ws ; , 逗号
  2. 在这六个构造字符的前或后允许存在无意义的空白符(ws): ws = *(%x20 /; 空间 %x09 /; 水平标签 %x0A /; 换行或换行 %x0D); 回程
  3. JSON的值 JSON的构成: ws 值 ws [1] 值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。 对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成,如: 1

{“name”: “John Doe”, “age”: 18, “address”: {“country” : “china”, “zip-code”: “10000”}}

数组是由方括号括起来的一组值构成,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[3, 1, 4, 1, 5, 9, 2, 6]

字符串与C或者Java的字符串非常相似。字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 数字也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。 一些合法的JSON的实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"a": 1, "b": [1, 2, 3]}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1, 2, "3", {"a": 4}]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3.14
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"wulianwangzhishi"

具体设计

文件结构

先在./applications/sample/wifi-iot/app路径下新建一个目录(或一套目录结构),用于存放业务源码文件。 本例程:在app下新增业务led,其中hello_world.c为业务代码,BUILD.gn为编译脚本,具体规划目录结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
└── applications
    └── sample
        └── wifi-iot
            └── app
                │── led
                │  │── led.c
                │  └── BUILD.gn
                └── BUILD.gn

功能实现

新建./applications/sample/wifi-iot/app/led下的led.c文件,在led.c中新建业务入口函数led,并实现业务逻辑。并在代码最下方,使用HarmonyOS启动恢复模块接口SYS_RUN()启动业务。(SYS_RUN定义在ohos_init.h文件中)

BUILD.gn为编译脚本 led.c为业务逻辑代码所在文件

BUILD.gn(app/led/BUILD.gn)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static_library("bahuyang") {
    sources = [
        "led.c"
    ]

    include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//base/iot_hardware/interfaces/kits/wifiiot_lite",
    ]
}
  1. “bahuyang”:是生成静态库名称,可随意更改
  2. “led.c”:代码文件

BUILD.gn(app\BUILD.gn)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import("//build/lite/config/component/lite_component.gni")

lite_component("app") {
    features = [
        #"startup",
        "led:bahuyang"
    ]
}
  1. 将"startup"注释,运行我们自己的文件
  2. “led”:工程目录
  3. bahuyang:静态库文件

搭建的模块

  1. WiFi模块
  2. OLED显示屏
  3. 红绿黄三色交通灯

主要代码

sta联网

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define APP_INIT_VAP_NUM    2
#define APP_INIT_USR_NUM    2
volatile char start_wifi_connected_flg = 0;
static struct netif *g_lwip_netif = NULL;
void hi_sta_reset_addr(struct netif *pst_lwip_netif)
{
    ip4_addr_t st_gw;
    ip4_addr_t st_ipaddr;
    ip4_addr_t st_netmask;
    printf("%s %d \r\n", __FILE__, __LINE__);
    if (pst_lwip_netif == NULL) {
        printf("hisi_reset_addr::Null param of netdev\r\n");
        return;
    }
    IP4_ADDR(&st_gw, 0, 0, 0, 0);
    IP4_ADDR(&st_ipaddr, 0, 0, 0, 0);
    IP4_ADDR(&st_netmask, 0, 0, 0, 0);

    netifapi_netif_set_addr(pst_lwip_netif, &st_ipaddr, &st_netmask, &st_gw);
}

void wifi_wpa_event_cb(const hi_wifi_event *hisi_event)
{
    if (hisi_event == NULL)
        return;

    switch (hisi_event->event) {
        case HI_WIFI_EVT_SCAN_DONE:
            printf("WiFi: Scan results available\n");
            break;
        case HI_WIFI_EVT_CONNECTED:
            printf("WiFi: Connected\n");
            netifapi_dhcp_start(g_lwip_netif);

            start_wifi_connected_flg = 1;

            break;
        case HI_WIFI_EVT_DISCONNECTED:
            printf("WiFi: Disconnected\n");
            netifapi_dhcp_stop(g_lwip_netif);
            hi_sta_reset_addr(g_lwip_netif);
            break;
        case HI_WIFI_EVT_WPS_TIMEOUT:
            printf("WiFi: wps is timeout\n");
            break;
        default:
            break;
    }
}

int hi_wifi_start_connect(void)
{
    int ret;
    errno_t rc;
    hi_wifi_assoc_request assoc_req = {0};

    /* copy SSID to assoc_req */
    //热点名称
    rc = memcpy_s(assoc_req.ssid, HI_WIFI_MAX_SSID_LEN + 1, "BAHUYANG", 8); /* 9:ssid length */
    if (rc != EOK) {
        printf("%s %d \r\n", __FILE__, __LINE__);
        return -1;
    }

    /*
     * OPEN mode
     * for WPA2-PSK mode:
     * set assoc_req.auth as HI_WIFI_SECURITY_WPA2PSK,
     * then memcpy(assoc_req.key, "12345678", 8).
     */
    //热点加密方式
    assoc_req.auth = HI_WIFI_SECURITY_WPA2PSK;

    /* 热点密码 */
    memcpy(assoc_req.key, "123456789", 9);


    ret = hi_wifi_sta_connect(&assoc_req);
    if (ret != HISI_OK) {
        printf("%s %d \r\n", __FILE__, __LINE__);
        return -1;
    }
    printf("%s %d \r\n", __FILE__, __LINE__);
    return 0;
}

int hi_wifi_start_sta(void)
{
    int ret;
    char ifname[WIFI_IFNAME_MAX_SIZE + 1] = {0};
    int len = sizeof(ifname);
    const unsigned char wifi_vap_res_num = APP_INIT_VAP_NUM;
    const unsigned char wifi_user_res_num = APP_INIT_USR_NUM;

    printf("%s %d \r\n", __FILE__, __LINE__);

    ret = hi_wifi_init(wifi_vap_res_num, wifi_user_res_num);
    if (ret != HISI_OK) {
        printf("%s %d \r\n", __FILE__, __LINE__);
        //return -1;
    }

    printf("%s %d \r\n", __FILE__, __LINE__);
    ret = hi_wifi_sta_start(ifname, &len);
    if (ret != HISI_OK) {
        printf("%s %d \r\n", __FILE__, __LINE__);
        return -1;
    }

    /* register call back function to receive wifi event, etc scan results event,
     * connected event, disconnected event.
     */
    ret = hi_wifi_register_event_callback(wifi_wpa_event_cb);
    if (ret != HISI_OK) {
        printf("register wifi event callback failed\n");
    }

    /* acquire netif for IP operation */
    g_lwip_netif = netifapi_netif_find(ifname);
    if (g_lwip_netif == NULL) {
        printf("%s: get netif failed\n", __FUNCTION__);
        return -1;
    }

    /* if received scan results, select one SSID to connect */
    ret = hi_wifi_start_connect();
    if (ret != 0) {
        printf("%s %d \r\n", __FILE__, __LINE__);
        return -1;
    }


    return 0;
}

void hi_wifi_stop_sta(void)
{
    int ret;

    ret = hi_wifi_sta_stop();
    if (ret != HISI_OK) {
        printf("failed to stop sta\n");
    }

    ret = hi_wifi_deinit();
    if (ret != HISI_OK) {
        printf("failed to deinit wifi\n");
    }

    g_lwip_netif = NULL;

    
}



void mqtt_test_thread(void * argv)
{

    argv = argv;

    hi_wifi_start_sta();

    while(start_wifi_connected_flg == 0)
    {
        usleep(300000);
    }

    sleep(3);
    LED_test();

}


void led_off(void)
{
    GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
}

void led_on(void)
{
    GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
}


void StaExampleEntry(void)
{
    osThreadAttr_t attr;

    attr.name = "wifi_config_thread";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 4096;
    attr.priority = 36;

    if (osThreadNew((osThreadFunc_t)mqtt_test_thread, NULL, &attr) == NULL) {
        printf("[LedExample] Falied to create LedTask!\n");
    }
}

SYS_RUN(StaExampleEntry);

接收UDP数据

程序流程如下:

  1. 创建一个UDP socket句柄,以及一个变量toAd的人,并设置服务器的IP地址和端口号
  2. 使用sendto()函数向服务器发送数据
  3. 使用recvfrom()函数从服务器接受消息
  4. 使用close()函数关闭此socket
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char recvline[1024];
void udp_thread(void *pdata)
{
    int ret;
    struct sockaddr_in servaddr;
    cJSON *recvjson;
    pdata = pdata;
    int sockfd = socket(PF_INET, SOCK_DGRAM, 0);
    //服务器 ip port
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(50001);
    printf("udp_thread \r\n");
    bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    while(1)
    {
        struct sockaddr_in addrClient;
        int sizeClientAddr = sizeof(struct sockaddr_in);
        memset(recvline, sizeof(recvline), 0);
        ret = recvfrom(sockfd, recvline, 1024, 0, (struct sockaddr*)&addrClient,(socklen_t*)&sizeClientAddr);
        if(ret>0)
        {
            char *pClientIP =inet_ntoa(addrClient.sin_addr);
            printf("%s-%d(%d) says:%s\n",pClientIP,ntohs(addrClient.sin_port),addrClient.sin_port, recvline);
            //进行json解析
            recvjson = cJSON_Parse(recvline);
            if(recvjson != NULL)
            {
                if(cJSON_GetObjectItem(recvjson, "cmd")->valuestring != NULL)
                {
                    printf("cmd : %s\r\n", cJSON_GetObjectItem(recvjson, "cmd")->valuestring);
                    if(strcmp("RED", cJSON_GetObjectItem(recvjson, "cmd")->valuestring) == 0)
                    {
                        set_LED_status(LED_STATUS_RED);
                        printf("RED\r\n");
                    }
                    if(strcmp("YELLOW", cJSON_GetObjectItem(recvjson, "cmd")->valuestring) == 0)
                    {
                        set_LED_status(LED_STATUS_YELLOW);
                        printf("YELLOW\r\n");
                    }
                    if(strcmp("GREEN", cJSON_GetObjectItem(recvjson, "cmd")->valuestring) == 0)
                    {
                        set_LED_status(LED_STATUS_GREEN);
                        printf("GREEN\r\n");
                    }
                    if(strcmp("CLOSE", cJSON_GetObjectItem(recvjson, "cmd")->valuestring) == 0)
                    {
                        set_LED_status(LED_STATUS_CLOSE);
                        printf("CLOSE\r\n");
                    }
                }             
                cJSON_Delete(recvjson);
            }
    }
    }
}
void start_udp_thread(void)
{
    osThreadAttr_t attr;
    attr.name = "wifi_config_thread";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 2048;
    attr.priority = 36;
    if (osThreadNew((osThreadFunc_t)udp_thread, NULL, &attr) == NULL) {
        printf("[LedExample] Falied to create LedTask!\n");
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
电脑客户端遥控鸿蒙开发板执行相应命令
我们平时开发物联网相关的项目时,无线控制是我们必须具备的一个功能。我们可以通过编写的电脑客户端,实时控制我们开发板进行相应的操作。比如控制智能家居的灯光、风扇和加湿器等一系列操作。
跋扈洋
2022/03/29
7080
电脑客户端遥控鸿蒙开发板执行相应命令
OpenHarmony轻量系统开发【9】WiFi之STA模式连接热点
Hi3861 为我们提供了WiFi操作的相关API,方便我们编写代码,实现热点连接。
小帅聊鸿蒙
2024/09/06
2400
OpenHarmony轻量系统开发【9】WiFi之STA模式连接热点
鸿蒙之连接MQTT
鸿蒙系统中通过移植第3方软件包 paho mqtt去实现MQTT协议功能 首先下载MQTT移植文件
跋扈洋
2022/03/29
1.4K0
鸿蒙之连接MQTT
RT-Thread实战笔记|语音控制获取心知天气信息
上篇文章介绍了LD3320的用法,小飞哥“灵光一现”,何不做一个语音控制获取天气信息的东东,既然想了,那就干它,来,淦~小飞哥前面说过rt-thread好用,那今天一起来看看到底有多好用...
用户8913398
2021/09/10
1K0
OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植案例(一)
本文章基于恒玄科技BES2600W芯片的欧智通 Multi-modal V200Z-R开发板 ,进行轻量带屏开发板的标准移植,开发了智能开关面板样例,同时实现了ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF等部件基于OpenHarmony LiteOS-M内核的适配。移植架构上采用Board与SoC分离的方案,工具链Newlib C库与Musl C库可选,LiteOS-M内核编译采用gn结合Kconfig图形化配置等需求。
小帅聊鸿蒙
2025/06/26
1300
OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植案例(一)
为全志D1开发板移植LVGL日历控件和显示天气
Linux还真是逐步熟悉中,现在才了解到Linux即没有原生的GUI,也没有应用层协议栈,所以要实现HTTP应用,必须利用TCP然后自己封装HTTP数据包。本篇即记录封装HTTP数据包,到心知天气请求天气信息的案例实现过程。
阿志小管家
2024/02/22
4230
为全志D1开发板移植LVGL日历控件和显示天气
OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植案例(二)
本方案基于OpenHarmony LiteOS-M内核,使用ASR582X芯片的 DEV.WIFI.A开发板 进行开发移植。作为典型的IOT Combo(Wi-Fi+BLE)解决方案,本文章介绍ASR582X的适配过程。
小帅聊鸿蒙
2025/06/26
840
基于STM32的智能天气预报系统
这是本人的毕业设计,一个智能的天气预报系统。显示屏上显示各种天气指标及实时显示时间日期等。可以使用触摸屏输入城市名称搜索天气,也可以使用语音搜索天气。
正念君
2019/07/01
4.7K1
基于STM32的智能天气预报系统
智能家居之旅(14):IoT Blufi配网工具新功能介绍
今天给大家介绍一下小程序配网工具-安信可 IOT,近期刚发布了新的版本,新增了服务器地址配置的功能。 可以说这个新功能,给我们带来了不少便利,特别是 HomeAssistant 固件使用这一块。 2024 年 7 月 17 号之前,安信可 IOT 小程序只能给大家提供配网程序,大家能够利用蓝牙功能给 WiFi 模块进行无线网络配置,但是随着 DIY 作品不断地更新,发现要给大家更加方便地使用固件地话,涉及 TCP 服务器和 MQTT 服务器地址配置只能通过 AT 指令来实现,在某些应用场合根本无法实现。
安信可科技
2024/09/05
1550
OpenHarmony轻量系统开发【4】编写第一个程序、启动流程分析
开发者编写业务时,务必先在./applications/sample/wifi-iot/app路径下新建一个目录(或一套目录结构),用于存放业务源码文件。
小帅聊鸿蒙
2024/09/03
3470
OpenHarmony轻量系统开发【4】编写第一个程序、启动流程分析
我用STM32MP1做了个疫情监控平台3—疫情监控平台实现
既然Qt是跨平台的,那么能不能在嵌入式平台实现一下呢?最近刚好看到,ST官方在开展创客大赛活动,就买了米尔科技的YA157C开发板移植一下。
单片机点灯小能手
2020/07/16
1.3K0
基于全志D1-H哪吒让LVGL8带的Music-Demo音乐响起来
下边简单说一下过程 a.首先要获取播放列表 播放列表里的字体是浪漫雅圆,使用freetype渲染的 。获取列表有2种方法
阿志小管家
2024/02/02
2730
基于全志D1-H哪吒让LVGL8带的Music-Demo音乐响起来
【IoT应用创新大赛】基于TencentOS tiny的 智能 家居总控系统
​首先,我要先讲一下概念,在传统的生活方式中呢,我们都是手动打开电器,亲自去检查门有没有关好,亲手去拉窗帘。 而到了现在,我们有了各种各样的智能电器,例如智能电视,智能门锁这些。    而现实中这些设备往往对普通人来说是可望不可即的存在,因为它们造价比较昂贵,比较少的人消费的起。      而有没有一种居中的方法让他们之间调和呢,于是我就设计出了这个智能管家设备,也就是 智能   家居总控系统。它的主要特点是可以智能的控制家里的各种设备,例如电视啊,窗帘这些,还可以实时的监控家里的物理状态,让我们在外面可以简单的了解到家里的情况,就例如门到底锁好没有,空调有没有关。 而这个 智能 家居总控系统 相比于智能家电最大的不同在于它只有一个mcu, 一个mcu控制整个家庭的设备,而不必给每个设备都装上mcu和联网模块。 所以,这个智能 家居总控系统 相当于起到了一个管家的角色
黑白方圆丶
2020/04/20
1.2K0
OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植案例(三)
本文介绍基于芯海cst85芯片的cst85_wblink开发板移植OpenHarmony LiteOS-M轻量系统的移植案例。开发了Wi-Fi连接样例和XTS测试样例,同时实现了wifi_lite, lwip, startup, utils, xts, hdf等部件基于OpenHarmony LiteOS-M内核的适配。移植架构上采用Board和Soc分离的方案,工具链采用NewLib C库,LiteOS-M内核编译采用gn结合Kconfig图形化配置的方式。
小帅聊鸿蒙
2025/06/26
1080
OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植案例(三)
鸿蒙之WiFi联网
从理论上来说,任何一个WiFi设备都可以称位STA。STA是支持IEEE802.11协议的设备。 在大多数情况下,当大家说到STA模式时,一般是指具有WiFi client行为的设备,可以连接到接入点。 STA会扫描可连接的接入点,选择一个想要连接的接入点,经过认证、关联等步骤后,将与接入点进行连接。
跋扈洋
2022/03/29
6820
OpenHarmony轻量系统开发【11】移植MQTT
MQTT 是当前最主流的物联网通信协议,需要物联网云平台,例如华为云、阿里云、移动OneNET都支持mqtt。而Hi3861则是一款专为IoT应用场景打造的芯片。本节主要讲如何在鸿蒙系统中通过移植第3方软件包 paho mqtt去实现MQTT协议功能,最后会给出测试验证。为后续的物联网项目打好基础。
小帅聊鸿蒙
2024/09/07
2210
OpenHarmony轻量系统开发【11】移植MQTT
26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网
按下固件按钮(GPIO0)大约3S, 让GPIO2那个灯快闪,进入配网模式,然后60S超时检测.还有就是不让WIFI打印官方内部写的东西(打印的东西太多了...)
杨奉武
2019/08/30
2K1
26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网
【DIY】用安信可WiFi+蓝牙模组Ai-WB2-32S-Kit实现安防检测
笔者这次决定使用AI-WB2-32s-Kit+雷达模块制+蓝牙信标作安防检测,灵感来源是想着马上毕业要外出租房,担心陌生人进入房间。
安信可科技
2025/06/18
1170
基于STM32+RT-Thread的新冠肺炎疫情监控平台
上周末加班,这周末休息,有时间整理一篇之前做的基于RT-Thread的疫情监控平台。上一篇文章我们使用STM32F103 MCU裸机开发的方式实现了疫情监控平台。这次我们玩点高端的,使用RT-Thread Studio来实现同样的功能,一起来看看吧!
单片机点灯小能手
2020/08/18
1.6K0
基于STM32+RT-Thread的新冠肺炎疫情监控平台
UDP套接口编程
常用的UDP实现的程序:DNS域名系统,NFS网络文件系统,SNMP简单网络管理协议 ssize_t recvfrom(int sockfd,void *buff,size_t nbytes,int flags,struct sockaddr * from,socklen_t *addrlen); ssize_t sendto(int sockfd,void *buff,size_t nbytes,int flags,struct sockaddr * to,socklen_t addrlen); sock
用户1154259
2018/01/17
1K0
推荐阅读
相关推荐
电脑客户端遥控鸿蒙开发板执行相应命令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验