首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >电脑客户端遥控鸿蒙开发板执行相应命令

电脑客户端遥控鸿蒙开发板执行相应命令

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

项目需求

我们平时开发物联网相关的项目时,无线控制是我们必须具备的一个功能。我们可以通过编写的电脑客户端,实时控制我们开发板进行相应的操作。比如控制智能家居的灯光、风扇和加湿器等一系列操作。

开发环境

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

使用的技术

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 数据文报发送到远程主机

创建监听举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UdpClient udpserver;
private void udpListen()
{
    udpserver = new UdpClient(8888);//参数为要进行UDP监听的端口
}

接收数据举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void getMsg()//开启一个异步线程去执行该方法
{
    //定义一个IPEndPoint对象用来装载数据来源的IP和端口信息
    IPEndPoint remoteIpAndPort = new IPEndPoint(IPAddress.Any, 0);
    while (true)
    {
        //等待消息,注意,使用该方法在等待消息时会阻塞线程
        byte[] msgBytes = udpserver.Receive(ref remoteIpAndPort)
        string receivedStr = System.Text.Encoding.UTF8.GetString(msgBytes);
    }
}
 

发送数据举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private void buttonSend_Click(object sender, EventArgs e)
        {
            //将要发送的数据转化成byte数组
            byte[] b = System.Text.Encoding.UTF8.GetBytes("Hello");
            //创建目标IP端口信息
            IPEndPoint sendTo = new IPEndPoint(IPAddress.Parse("192.168.1.233"),1234);
            //发送数据
            this.udpserver.Send(b, b.Length, sendTo);
        }

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"

具体设计

功能介绍

当按下电脑端的按钮,通过UDP下发命令,开发板通过WiFi模块连接,之后对电脑端发送的命令进行解析,之后对相应命令执行相应操作。

电脑客户端

页面设计

程序代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        UdpClient ctrludpcRecv = null;  //控制指令
        IPEndPoint ctrllocalIpep = null;
        public Form1()
        {
            InitializeComponent();
            ctrllocalIpep = new IPEndPoint(IPAddress.Any, 50001); // 本机IP和监听端口号
            ctrludpcRecv = new UdpClient(ctrllocalIpep);
            ctrludpcRecv.Client.ReceiveBufferSize = 64 * 4096 * 4096;
            ctrludpcRecv.EnableBroadcast = true;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            IPAddress Adrr;
            if (string.IsNullOrEmpty(textBox1.Text))
            {
                Adrr = IPAddress.Parse("255.255.255.255");
            }
            else
            {
                Adrr = IPAddress.Parse(textBox1.Text);
            }
            IPEndPoint remoteIpep = new IPEndPoint(Adrr, 50001); ;
            JavaScriptSerializer ser = new JavaScriptSerializer();
            CtrlJson rcj = new CtrlJson() { cmd = "RED" };
            string outputJson = ser.Serialize(rcj);
            byte[] sendByte = System.Text.Encoding.Default.GetBytes(outputJson);
            //发送
            ctrludpcRecv.Send(sendByte, sendByte.Length, remoteIpep);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            IPAddress Adrr;
            if (string.IsNullOrEmpty(textBox1.Text))
            {
                Adrr = IPAddress.Parse("255.255.255.255");
            }
            else
            {
                Adrr = IPAddress.Parse(textBox1.Text);
            }
            IPEndPoint remoteIpep = new IPEndPoint(Adrr, 50001); ;
            JavaScriptSerializer ser = new JavaScriptSerializer();
            CtrlJson rcj = new CtrlJson() { cmd = "YELLOW" };
            string outputJson = ser.Serialize(rcj);
            byte[] sendByte = System.Text.Encoding.Default.GetBytes(outputJson);
            //发送
            ctrludpcRecv.Send(sendByte, sendByte.Length, remoteIpep);
        }
        private void button4_Click(object sender, EventArgs e)
        {
            IPAddress Adrr;
            if (string.IsNullOrEmpty(textBox1.Text))
            {
                Adrr = IPAddress.Parse("255.255.255.255");
            }
            else
            {
                Adrr = IPAddress.Parse(textBox1.Text);
            }
            IPEndPoint remoteIpep = new IPEndPoint(Adrr, 50001); ;
            JavaScriptSerializer ser = new JavaScriptSerializer();
            CtrlJson rcj = new CtrlJson() { cmd = "GREEN" };
            string outputJson = ser.Serialize(rcj);
            byte[] sendByte = System.Text.Encoding.Default.GetBytes(outputJson);
            //发送
            ctrludpcRecv.Send(sendByte, sendByte.Length, remoteIpep);
        }
        private void button3_Click(object sender, EventArgs e)
        {
            IPAddress Adrr;
            if (string.IsNullOrEmpty(textBox1.Text))
            {
                Adrr = IPAddress.Parse("255.255.255.255");
            }
            else
            {
                Adrr = IPAddress.Parse(textBox1.Text);
            }
            IPEndPoint remoteIpep = new IPEndPoint(Adrr, 50001); ;
            JavaScriptSerializer ser = new JavaScriptSerializer();
            CtrlJson rcj = new CtrlJson() { cmd = "CLOSE" };
            string outputJson = ser.Serialize(rcj);
            byte[] sendByte = System.Text.Encoding.Default.GetBytes(outputJson);
            //发送
            ctrludpcRecv.Send(sendByte, sendByte.Length, remoteIpep);
        }

    }
}

MCU端

搭建的模块

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

主要代码

代码语言: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-28,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java后端工程师必备书单(含大后端方向相关书籍)
作者黄小斜,斜杠青年,某985硕士,阿里研发工程师,于2018 年秋招拿到 BAT 头条、网易、滴滴等 8 个大厂 offer
程序员黄小斜
2019/03/11
3.3K0
【吐血整理】那些让你起飞的计算机基础知识:学什么,怎么学?
在我们用的程序中,99% 都离不开网络,作为一个程序员,我觉得了解计算机网络是必须的,在大学的课程中,一般也都会开设这一门课。
乔戈里
2019/10/15
8830
程序员必须掌握的算法有哪些?谈谈这这几年学过的算法
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。
乔戈里
2019/10/28
6340
适合普通大学生的 Java 后端开发学习路线
接下来的一段时间,帅地会总结各种技术栈的学习路线,例如 Java 开发,C++ 开发,python 开发,前端开发等等,假如你没有明确的目标,或许可以按照我说的学习路线来学习一波,我写的每一份学习路线,不会很全面,因为我认为,东西列的太多,反而不利于新手的学习,所以我列举的,都是比较必要的知识,当你把这些知识学了的时候,我相信你不需要别人的学习路线,也能知道自己接下来需要学啥了。
帅地
2021/04/14
7050
【吐血整理】那些让你起飞的计算机基础知识:学什么,怎么学?
我公众号里的文章,写的大部分都是与计算机基础知识相关的,这些基础知识,就像我们的内功,如果在未来想要走的更远,这些内功是必须要修炼的。框架千变万化,而这些通用的底层知识,却是几乎不变的,了解了这些知识,可以帮助我们更快着学习一门知识,更加懂得计算机的运行机制。当然,在面试中也经常会被问到,特别是对于应届生,对于春秋招,也可以看看我前阵子写过的文章历经两个月,我的秋招之路结束了!。也有读者经常问的计算机基础知识究竟是指啥?学习顺序?推荐书籍?
kbsc13
2019/10/15
7410
你不可错过的Java学习资源清单(包含社区、大牛、专栏、书籍等)
作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条、网易、滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验、求职心得和成长感悟,以及作为程序员的思考和见解。
程序员黄小斜
2019/03/11
1.4K0
万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线
这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其它人写得不一样, 也定下了一个目标,这篇文章,不能是简单的堆砌学习资源和书单推荐,更要细化如何有效的去执行落地。
灵魂画师牧码
2020/10/26
1.3K0
【原创】为了你,我又又又把Java学习路线和方法更新了一遍
到目前为止,我觉得不管是在公众号后台、知乎还是微信上面我被问的做多的就是:“大佬,有没有 Java 学习路线和方法”(大佬属现代流行的客气称呼,本人非大佬哈)。大概 5 个多月之前,我在公众号发过一篇类似的文章:【原创】Java 学习路线以及方法推荐。今天突然想到能把一些读者问我的一些常见问题汇总起来,于是利用下班后的时间,我先把这篇文章重新完善了一遍。另外,我把 Java 学习的一些常见问题整理在了 JavaGuide 上,并且单独为它开了一个 tab,以后我会整理一些常见的 Java 学习方向的问题放在这里避免重复回答一些常见的问题。
Guide哥
2020/05/08
1.3K0
【原创】为了你,我又又又把Java学习路线和方法更新了一遍
不论你是大众,科班和非科班,我这边整理很久,总结出的学习路线,还不快卷起来
很多人对自我的学习路线没有清楚的定位,鉴于此,我就来写一篇适合普通大众的学习路线,就从大一入学那一刻开始入门说起,虽然不一定适合你,但或许能给没有明确目标的人带来一些学习的方向,那么这篇文章,我就觉得值了。
用户10216580
2022/12/06
4870
呕心沥血一个月,为小白新手准备的C/C++ Linux求职版学习路线
他是非科班转到计算机来的,所以基本功比较差,我专门花了一个多月写了这篇学习路线,全文超过8000字,文章润色了好久,配套的资料全部找齐了。
拓跋阿秀
2021/10/20
1.6K0
写了很久,这是一份最适合/贴切普通大众/科班/非科班的『学习路线』
说实话,对于学习路线这种文章我一般是不写的,大家看我的文章也知道,我是很少写建议别人怎么样怎么样的文章,更多的是,写自己的真实经历,然后供大家去参考,这样子,我内心也比较踏实,也不怕误导他人。
全栈程序员站长
2022/09/13
7221
写了很久,这是一份最适合/贴切普通大众/科班/非科班的『学习路线』
从小白到入门算法,我的经验分享给你~
研究生三年,作为一名非计算机专业的学生,能够从一名纯小白(Python不会,机器学习没听说过)到最后校招拿到几个不错的offer,个人感觉可以给自己打个及格分吧。写本文的目的,一是对自己研究生阶段所学习的知识做一个总结,二是希望对那些刚接触机器学习,准备往这个方向发展的同学们提供一些可借鉴的经验。
石晓文
2019/05/14
8260
从小白到入门算法,我的经验分享给你~
聊聊阿秀过去三年间做的最正确的一件事 | 快来薅羊毛
我买的大部分是技术书,也有一些非技术书,比如《明朝那些事儿》、《平凡的世界》之类的。
拓跋阿秀
2021/04/26
1.4K0
聊聊阿秀过去三年间做的最正确的一件事 | 快来薅羊毛
程序员必须掌握的算法有哪些?谈谈这这几年学过的算法
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。
帅地
2019/10/23
3.6K0
一个C/C++开发工程师的学习路线(已经无路可退,唯有逆风飞翔)
文章首发于本人CSDN账号:https://blog.csdn.net/tefuirnever
我是管小亮
2020/04/20
1.7K0
leetcode 刷500道题,笔试/面试稳吗?谈谈算法的学习
想要学习算法、应付笔试或者应付面试手撕算法题,相信大部分人都会去刷 Leetcode,有读者问?如果我在 leetcode 坚持刷它个 500 道题,以后笔试/面试稳吗?
帅地
2019/10/08
1.1K0
leetcode 刷500道题,笔试/面试稳吗?谈谈算法的学习
Java 后端开发学习路线(修订版)
接下来的一段时间,帅地会总结各种技术栈的学习路线,假如你没有明确的目标,或许可以按照我说的学习路线来学习一波。
帅地
2022/01/13
2.9K0
Java 后端开发学习路线(修订版)
学习Java好书及视频推荐
要想在java领域成为大牛,除了不断进行项目实战以外,还要不断的进行进修和学习,以下将本人学习java多年使用的好书和一些好的视频推荐给大家,这些书和视频都是本人在网络找了很久,后来又经过实践证明的好书和视频。希望对大家学习java有帮助
全栈程序员站长
2022/09/07
7970
Java学习之路 -- Java怎么学?
当时,作为懵懂的小白,大一学习了c和c++,还有数据结构,后来才自学的java。有了c++的基础,其实学java确实感觉挺容易上手。如果没有c或者c++的基础,建议开始需要先把java的基础打好,基础是指什么?基础的语法,能用!至于源码,不建议在刚刚开始学就看源码,绝对劝退!!!
秦怀杂货店
2021/03/29
1.3K0
从Java小白到收获BAT等offer,分享我这两年的经验和感悟
常想,人生最有趣莫过于前路未知。于是我常常羡慕那些个“金梁古温”笔下随遇而安、随性而为、随缘而爱的浪子们。比如陆小凤,比如叶开。
猿天地
2019/05/15
6860
从Java小白到收获BAT等offer,分享我这两年的经验和感悟
推荐阅读
Java后端工程师必备书单(含大后端方向相关书籍)
3.3K0
【吐血整理】那些让你起飞的计算机基础知识:学什么,怎么学?
8830
程序员必须掌握的算法有哪些?谈谈这这几年学过的算法
6340
适合普通大学生的 Java 后端开发学习路线
7050
【吐血整理】那些让你起飞的计算机基础知识:学什么,怎么学?
7410
你不可错过的Java学习资源清单(包含社区、大牛、专栏、书籍等)
1.4K0
万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线
1.3K0
【原创】为了你,我又又又把Java学习路线和方法更新了一遍
1.3K0
不论你是大众,科班和非科班,我这边整理很久,总结出的学习路线,还不快卷起来
4870
呕心沥血一个月,为小白新手准备的C/C++ Linux求职版学习路线
1.6K0
写了很久,这是一份最适合/贴切普通大众/科班/非科班的『学习路线』
7221
从小白到入门算法,我的经验分享给你~
8260
聊聊阿秀过去三年间做的最正确的一件事 | 快来薅羊毛
1.4K0
程序员必须掌握的算法有哪些?谈谈这这几年学过的算法
3.6K0
一个C/C++开发工程师的学习路线(已经无路可退,唯有逆风飞翔)
1.7K0
leetcode 刷500道题,笔试/面试稳吗?谈谈算法的学习
1.1K0
Java 后端开发学习路线(修订版)
2.9K0
学习Java好书及视频推荐
7970
Java学习之路 -- Java怎么学?
1.3K0
从Java小白到收获BAT等offer,分享我这两年的经验和感悟
6860
相关推荐
Java后端工程师必备书单(含大后端方向相关书籍)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档