作者:小成Charles
商业工作,学习交流请添加Vx:Lcc-Triumph
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/113502220

一、前言

因为看了B站上稚晖君的嵌入式开发视频,搞得我这个软件开发的也想弄一弄嵌入式,然后就设计了一下,做了我这个第一个物联网项目,我称之为LoveTV,这个是做了送给女朋友的,为了方便控制它以及传输数据,这里想到就直接用网页传输数据,这样很方便!服务器是要搭建在我的腾讯云服务器,也就是理论上来说,可以在任何地方实现数据传输。话不多说,上项目图!

二、设计思路

上面只是雏形,后期会添加和美化更多功能!这里我实现网页控制换页的方法是网页通过点击按钮会执行相应的PHP文件,php后端会创建一个udp协议,然后将数据发送给用C++创建的Udp服务端,服务端收到消息后会把消息再转发给单片机创建的Udp客户端,单片机客户端收到数据后会做相应的处理。这就是大致的思路,为了方便理解,我大致的流程画个图。

三、核心代码(非完整代码)

(1)php后端
这里就是创建socket,指定为udpsocket,然后直接将数据传输给指定的服务器IP端口,注意php使用socket要到php.ini文件里面把extension=sockets前面的分号去掉,这样才能使用socket。

<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$msg = '1';
$len = strlen($msg);
socket_sendto($sock, $msg, $len, 0, serverIp,serverPort);
header("Location: http://lovetv/index.html");
socket_close($sock);
?>

(2)c++后端
这里主要就是实现数据的转发,基于C++的框架Qt写得
tvServer.h

#ifndef TVSERVER_H
#define TVSERVER_H#include <QUdpSocket>
#include <QObject>
#include <QList>class tvServer : public QObject
{Q_OBJECT
public:explicit tvServer(QObject *parent = nullptr);QUdpSocket *udpServer;void bindServer(quint16 port);quint16 port;QHostAddress tvAddr;quint16 tvPort;QHostAddress webAddr;quint16 webPort;bool enter;signals:public slots:void onReadyRead();
};#endif // TVSERVER_H

tvServer.cpp

#include "tvserver.h"tvServer::tvServer(QObject *parent) : QObject(parent)
{udpServer=new QUdpSocket ();//test iptvAddr.setAddress("192.168.1.91");tvPort=1520;enter=false;bindServer(1520);connect(udpServer,&QUdpSocket::readyRead,this,&tvServer::onReadyRead);
}
void tvServer::bindServer(quint16 port)
{//bind value
//    QHostAddress addr;
//    addr.setAddress("192.168.1.110");if(udpServer->bind(port)){qDebug()<<"successful bind!";}else {qDebug()<<"falied to bind!";}}
void tvServer::onReadyRead()
{//server to reveciveQByteArray   datagram;datagram.resize(udpServer->pendingDatagramSize());QHostAddress    peerAddr;quint16 peerPort;udpServer->readDatagram(datagram.data(),datagram.size(),&peerAddr,&peerPort);if(QString(datagram.data()) =="tv"&&enter==false){qDebug()<<datagram.data()<<peerAddr<<peerPort;tvAddr=peerAddr;tvPort=peerPort;udpServer->writeDatagram("replay tv",peerAddr,peerPort);enter=true;}if(QString(datagram.data()) =="web"){webAddr=peerAddr;webPort=peerPort;qDebug()<<datagram.data()<<peerAddr<<peerPort;
}
//send msg to tv;qDebug()<<datagram.data()<<peerAddr<<peerPort;udpServer->writeDatagram(datagram.data(),tvAddr,tvPort);}

(3)嵌入式c后端
编程IDE用的是Arduino,然后主板用的是ESp32,屏幕就是透明的OLED屏幕,前端不多说了,主要是利用u8g2这个图形框架写得,后端先连接wifi,然后利用WiFiUDP这个库创建客户端,一直循环去监听消息,收到消息后做出相应的判断;

这里是开启udp

  //开启udp工具if(udp.begin(WiFi.localIP(),udpLocalPort)){Serial.printf("现在收听IP:%s, UDP端口:%d\n", WiFi.localIP().toString().c_str(), udpLocalPort);//将wifi信息传输给服务器udp.beginPacket(udpServerAddr, udpServerPort);//配置远端ip地址和端口udp.print("tv");//把数据写入发送缓冲区udp.endPacket();//发送数据}else{Serial.println("监听失败");}

getUdpMsg()这里就是一直获得解析包,可以在loop里面去一直调用这个函数获得返回数据。

String Network::getUdpMsg()
{//    udp.beginPacket(udpServerAddr, udpServerPort);//配置远端ip地址和端口
//    udp.print("mesg!");//把数据写入发送缓冲区
//    udp.endPacket();//发送数据int packetSize = udp.parsePacket();//获得解析包if (packetSize)//解析包不为空{//收到Udp数据包//Udp.remoteIP().toString().c_str()用于将获取的远端IP地址转化为字符串Serial.printf("收到来自远程IP:%s(远程端口:%d)的数据包字节数:%d\n", udp.remoteIP().toString().c_str(), udp.remotePort(), packetSize);// 解析UDP数据包中的所以数据,以字符串格式返回String udpStringVal = udp.readString(); // 然后向串口打印返回的字符串Serial.print("开发板接收到UDP数据中的字符串 "); Serial.println(udpStringVal);return udpStringVal;}}

这里用了一个Chrono线程库,让这个函数一直处于一个单独的线程运行
hasPassed()里面给的参数越小,延迟就越小,单位为毫秒

  if (timeChrono.hasPassed(10) ) { // elapsed(1000) returns 1 if 1000ms have passed.timeChrono.restart();  // restart the Chrono String msgVal= wifi.getUdpMsg();if(msgVal.toInt()!=0){ nowPage=msgVal.toInt();Serial.println(nowPage);
}

四、总结和扩展

目前还处于雏形阶段,就是理论已经成型了,接下来就是完善和优化了,需要改进的就是Udp协议虽然面型无连接但是由于单片机的性能太低,网络信号差,特别容易丢包,导致数据接收不到,那么改进就是换成TCP协议或者对UDP协议做一个类似于TCp三次握手的数据是否接受的检测来保证数据传输到了。

作者:小成Charles
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/113502220

商业工作,学习交流请添加Vx:Lcc-Triumph

小成开发日记----物联网项目LoveTv实现web网页传输数据到单片机-表白女朋友(技术栈涉及web前端,php后端,c/c++ socket,嵌入式前后端)相关推荐

  1. 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)

    作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...

  2. 小成开发日记-----利用Python在互动吧网站自动抢票实战分析

    作者:小成Charles 商业工作,学习交流请添加Vx:Lcc-Triumph 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/artic ...

  3. 微信小程序开发-微信支付功能【WxMaService 获取openid,WxPayService建微信订单,接收微信支付异步通知回调方法,附有完整前后端代码】

    前提:对小程序开发有一定的基础:小程序已发布使用,已开通微信支付,关联商户号. 微信小程序平台:小程序平台 微信开发者文档:开发者文档 微信小程序支付API 地址:微信支付文档地址 微信支付平台:微信 ...

  4. 视频教程-用Java从零开始开发一个物联网项目-物联网技术

    用Java从零开始开发一个物联网项目 多年的产品设计和开发经验,带领团队完成多个知名产品.历任多家大型公司的Java架构师,对知名框架的源码均有深入研究.拥有IT一线开发.教学10多年的实战经验,能充 ...

  5. Linux 小程序开发日记(终章)(pyqt+yolov5)

    Linux 小程序开发日记(终章) 哈喽大家好,我是爱喝欢乐水的柳橙汁,这一篇,是最后一篇啦.我会将所有个过程都梳理一遍. 关于代码的详细注释,大家就参考一下之前的笔记吧.这一篇博客我就放上我精简的代 ...

  6. linux桌面小程序开发日记3(pyqt5+yolov5)

    linux桌面小程序开发日记3 vm虚拟机配置yolov5环境(Ubuntu 18.04) 最后一篇博客地址:https://blog.csdn.net/Liuchengzhizhi/article/ ...

  7. 微信小游戏开发教程-新建项目

    微信小游戏开发教程-新建项目 1. 新建小游戏项目 我们这回使用空项目,不要勾选使用模板创建. 2. 添加小游戏必要文件 项目创建好以后我们发现缺少一些必要的文件,我们手动添加即可: game.jso ...

  8. 小程序分享到朋友圈功能_小程序开发日记 分享到朋友圈

    贵州 水司楼 图片来自 视频截图 最近微信小程序开始公测小程序分享到朋友圈的功能了.记得前两天刚开始内测时,小程序社区里就不断有人发帖问关于分享到朋友圈的各种问题.很显然大家对这个新特性都特别关心.那 ...

  9. 基于STM32小熊派开发智慧路灯项目实践

    目录 一.引言 二.智慧路灯物联网架构介绍 1.感知层: 2.网络层: 3.平台层 4.应用层 三.开发环境 四.开发注意事项 五.学习网站(实践指南) 1.华为云实战训练营教学视频 2.智慧路灯项目 ...

  10. 一、零基础入门微信小程序开发之创建项目工程同时完成引导页开发

    前言 创建这个系列博客的原因是因为最近在加深微信小程序的学习,按照我之前的学习习惯是不喜欢记录的,加上自己有拖延症就更不太愿意做这件事情了,同时我要给学生上课,但总是缺少教材所以就开了这个系列的博客, ...

最新文章

  1. 《数学之美》第20章 不要把鸡蛋都放到一个篮子里--谈谈最大熵模型
  2. GLUT及其函数的用法整理
  3. Excel VBA开发中数字签名的管理
  4. tensorflow tf.placeholder()(相当于创建变量分配内存空间,但不赋值)
  5. 【通信原理】【实验】实验二:数字基带传输实验(GZHU)
  6. shutil.rmtree()
  7. uip UDPclient模式通信移植,当地port随机
  8. 解决: 'Cannot call `.is_valid()` as no `data=` keyword argument was ' AssertionError: Cannot call `
  9. 如何模块化设计B端系统?
  10. Qt文档阅读笔记-QNetworkAccessManager官方解析与实例
  11. 实战 | F1060路由模式典型组网配置案例(静态路由)
  12. serialize和unserialize函数
  13. SAP 是不是很烂的一个ERP软件
  14. 1037: 求一元二次方程的根(带虚根)
  15. 古诗文登录验证码识别及登录
  16. Cisco Aironet WLAN系列AP的瘦胖模式转换
  17. 【ArcGIS微课1000例】0026:ArcGIS10如何自定义工具条?
  18. 我如何把薪水从 50人民币/天 提升到 100美元/小时的 (3)
  19. CDH安装Tez 0.8.5
  20. web前端开发免费教程

热门文章

  1. 互联网金融常见的一些业务
  2. 2020大疆数字IC校招笔试题(3)——CMOS 反相器【CMOS逻辑】【MOS管】【PMOS】【NMOS】
  3. 5G通信光模块是什么?5G通信光模块的发展方向如何?
  4. 什么是企业邮箱?企业邮箱有什么用途?
  5. Java自学教程百度云盘,疯狂加持!腾讯大佬的
  6. Linux sleep exit abort函数
  7. hiber泛型 spring
  8. Java中求珠穆朗玛峰问题
  9. fastai v1环境搭建:Win10 MX250 CUDA10.1 cuDNN Pytorch1.0.0 Fastai v1安(bi)装(keng)指南
  10. 怎么画出好的架构图,架构师必备!