小成开发日记----物联网项目LoveTv实现web网页传输数据到单片机-表白女朋友(技术栈涉及web前端,php后端,c/c++ socket,嵌入式前后端)
作者:小成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,嵌入式前后端)相关推荐
- 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)
作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...
- 小成开发日记-----利用Python在互动吧网站自动抢票实战分析
作者:小成Charles 商业工作,学习交流请添加Vx:Lcc-Triumph 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/artic ...
- 微信小程序开发-微信支付功能【WxMaService 获取openid,WxPayService建微信订单,接收微信支付异步通知回调方法,附有完整前后端代码】
前提:对小程序开发有一定的基础:小程序已发布使用,已开通微信支付,关联商户号. 微信小程序平台:小程序平台 微信开发者文档:开发者文档 微信小程序支付API 地址:微信支付文档地址 微信支付平台:微信 ...
- 视频教程-用Java从零开始开发一个物联网项目-物联网技术
用Java从零开始开发一个物联网项目 多年的产品设计和开发经验,带领团队完成多个知名产品.历任多家大型公司的Java架构师,对知名框架的源码均有深入研究.拥有IT一线开发.教学10多年的实战经验,能充 ...
- Linux 小程序开发日记(终章)(pyqt+yolov5)
Linux 小程序开发日记(终章) 哈喽大家好,我是爱喝欢乐水的柳橙汁,这一篇,是最后一篇啦.我会将所有个过程都梳理一遍. 关于代码的详细注释,大家就参考一下之前的笔记吧.这一篇博客我就放上我精简的代 ...
- linux桌面小程序开发日记3(pyqt5+yolov5)
linux桌面小程序开发日记3 vm虚拟机配置yolov5环境(Ubuntu 18.04) 最后一篇博客地址:https://blog.csdn.net/Liuchengzhizhi/article/ ...
- 微信小游戏开发教程-新建项目
微信小游戏开发教程-新建项目 1. 新建小游戏项目 我们这回使用空项目,不要勾选使用模板创建. 2. 添加小游戏必要文件 项目创建好以后我们发现缺少一些必要的文件,我们手动添加即可: game.jso ...
- 小程序分享到朋友圈功能_小程序开发日记 分享到朋友圈
贵州 水司楼 图片来自 视频截图 最近微信小程序开始公测小程序分享到朋友圈的功能了.记得前两天刚开始内测时,小程序社区里就不断有人发帖问关于分享到朋友圈的各种问题.很显然大家对这个新特性都特别关心.那 ...
- 基于STM32小熊派开发智慧路灯项目实践
目录 一.引言 二.智慧路灯物联网架构介绍 1.感知层: 2.网络层: 3.平台层 4.应用层 三.开发环境 四.开发注意事项 五.学习网站(实践指南) 1.华为云实战训练营教学视频 2.智慧路灯项目 ...
- 一、零基础入门微信小程序开发之创建项目工程同时完成引导页开发
前言 创建这个系列博客的原因是因为最近在加深微信小程序的学习,按照我之前的学习习惯是不喜欢记录的,加上自己有拖延症就更不太愿意做这件事情了,同时我要给学生上课,但总是缺少教材所以就开了这个系列的博客, ...
最新文章
- 《数学之美》第20章 不要把鸡蛋都放到一个篮子里--谈谈最大熵模型
- GLUT及其函数的用法整理
- Excel VBA开发中数字签名的管理
- tensorflow tf.placeholder()(相当于创建变量分配内存空间,但不赋值)
- 【通信原理】【实验】实验二:数字基带传输实验(GZHU)
- shutil.rmtree()
- uip UDPclient模式通信移植,当地port随机
- 解决: 'Cannot call `.is_valid()` as no `data=` keyword argument was ' AssertionError: Cannot call `
- 如何模块化设计B端系统?
- Qt文档阅读笔记-QNetworkAccessManager官方解析与实例
- 实战 | F1060路由模式典型组网配置案例(静态路由)
- serialize和unserialize函数
- SAP 是不是很烂的一个ERP软件
- 1037: 求一元二次方程的根(带虚根)
- 古诗文登录验证码识别及登录
- Cisco Aironet WLAN系列AP的瘦胖模式转换
- 【ArcGIS微课1000例】0026:ArcGIS10如何自定义工具条?
- 我如何把薪水从 50人民币/天 提升到 100美元/小时的 (3)
- CDH安装Tez 0.8.5
- web前端开发免费教程
热门文章
- 互联网金融常见的一些业务
- 2020大疆数字IC校招笔试题(3)——CMOS 反相器【CMOS逻辑】【MOS管】【PMOS】【NMOS】
- 5G通信光模块是什么?5G通信光模块的发展方向如何?
- 什么是企业邮箱?企业邮箱有什么用途?
- Java自学教程百度云盘,疯狂加持!腾讯大佬的
- Linux sleep exit abort函数
- hiber泛型 spring
- Java中求珠穆朗玛峰问题
- fastai v1环境搭建:Win10 MX250 CUDA10.1 cuDNN Pytorch1.0.0 Fastai v1安(bi)装(keng)指南
- 怎么画出好的架构图,架构师必备!