ONE NET MQTT+HTTP多端控制

ops/2025/2/6 12:18:22/

使用移动的ONENET实现数据上传与远程控制,数据上传使用MQTT协议(ESP8266),而数据查看和远程控制使用的HTTP(安卓端/QT),效果:

ONENET简单MQTT和HTTP使用

ESP8266通过MQTT上传和订阅数据我就不多赘述了,教程很多,我直接刷的MQTT固件,然后通过AT指令进行MQTT操作的

void esp_init(){SendCmd(ATE0,"OK",10);	//关闭回显HAL_Delay(50);SendCmd(AT,"OK",10);//发送AT指令HAL_Delay(50);SendCmd(CWJAP1,"IP",40);//连接WIFI,CWJAP1为连接的WiFi信息HAL_Delay(50);SendCmd(MQTTUSERCFG,"OK",10);//设置MQTT信息HAL_Delay(100);SendCmd(MQTTCONN,"OK",40);//连接MQTTHAL_Delay(100);SendCmd(MQTTSUB,"OK",40);//订阅MQTTHAL_Delay(100);
}
#define   AT          "AT\r\n"	
#define   ATE0        "ATE0\r\n"	
#define   CWMODE      "AT+CWMODE=1\r\n"
#define   RST         "AT+RST\r\n"
#define   CIFSR       "AT+CIFSR\r\n"#define   CWJAP       "AT+CWJAP=\"Caneve16spro\",\"123456789\"\r\n"//网络连接信息
#define   CWJAP1       "AT+CWJAP=\"CanEve17Pro\",\"12345678\"\r\n"#define		MQTTUSERCFG "AT+MQTTUSERCFG=0,1,\"FARM\",\"xxxxx\",\"version=2018-10-31&res=xxxxx\",0,0,\"\"\r\n" //这个就是MQTT的配置信息,根据自己的填
#define   MQTTCONN    "AT+MQTTCONN=0,\"mqtts.heclouds.com\",1883,0\r\n"//MQTT服务器
#define   MQTTSUB			"AT+MQTTSUB=0,\"$sys/xxxxx/FARM/thing/property/set\",1\r\n"//MQTT订阅#define   CIPSTART    "AT+CIPSTART=\"TCP\",\"192.168.31.112\",20233\r\n"
#define   CIPMODE     "AT+CIPMODE=1\r\n"
#define   CIPSEND     "AT+CIPSEND\r\n"
#define   CIPSTATUS   "AT+CIPSTATUS\r\n"
#define   CIPMODEOFF  "AT+CIPMODE=0\r\n"
#define   CIPCLOSE    "AT+CIPCLOSE\r\n"

设备接入的具体配置详见官网:OneNET - 中国移动物联网开放平台

https://i-blog.csdnimg.cn/direct/ab79305f05fa43f89fcf5e8b762df5c4.png" width="1611" />

上传数据

void pub_dat(){//MQTT发布更新数据memset(pub_dat_buf,0,sizeof pub_dat_buf);//清空发送数组memset(topic,0,sizeof topic);sprintf(pub_dat_buf,"{\"id\": \"123\",\"params\": {\"FAN\": {\"value\": %d},\"TEMP\": { \"value\": %.1f},\"LIGHT\": {\"value\": %d},\"LED\": {\"value\": %d},\"HUM\": {\"value\": %.0f},\"SOIL\": {\"value\": %.0f},\"PRE\": {\"value\": %.0f},\"PUMP\": {\"value\": %d}}}",mq_fan,mq_temp,mq_light,mq_led,humidity,soil_h,pressure,mq_pump);sprintf(topic,"AT+MQTTPUBRAW=0,\"$sys/xxxxx/FARM/thing/property/post\",%d,0,0\r\n",strlen(pub_dat_buf));SendCmd(topic,">",50);//发送需要发布的topic以及数据长度HAL_Delay(50);esp_send(pub_dat_buf);
}

Android端使用GET获取数据

public void Get() {new Thread(() -> {//接受温度OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("https://iot-api.heclouds.com/thingmodel/query-device-property?product_id=xxxxx&device_name=FARM").addHeader("Authorization", "version=2018-10-31&res=products%2Fxxxxx%2Fdevices%2FFARM&et=1736269477&method=md5&sign=fVpjPaZLpv1%2Btl5zcIcC9A%3D%3D").addHeader("Accept",Accept).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {if(!response.isSuccessful()) {throw new IOException("Unexpected code" +response);}else {String responseBody = response.body().string();Log.e("farm",responseBody);//输出响应内容try {JSONArray jsonArray = new JSONArray(responseBody.substring(responseBody.indexOf("["),responseBody.lastIndexOf("]")+1));StringBuilder str= new StringBuilder("httpclient:\n");for (int i=0;i<jsonArray.length();i++){JSONObject jsonObject2 = (JSONObject)jsonArray.opt(i);String temp_id=jsonObject2.has("identifier")?jsonObject2.getString("identifier"):null;String temp_val=jsonObject2.has("value")? jsonObject2.getString("value"):null;str.append("第").append(i).append("个:").append(temp_id).append(": ").append(temp_val).append("\n");check(temp_id,temp_val);}Log.e("zms", str.toString());Calendar calendar = Calendar.getInstance();str= new StringBuilder(calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + str);check(String.valueOf(str));} catch (JSONException e) {
// TODO Auto-generated catch blockLog.e("zms", "err");e.printStackTrace();}}}@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Log.e("farm","get fail");e.printStackTrace();}});}).start();}

Android端发送控制指令使用的POST

    //异步post请求public void Post() {RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), "{" +"    \"product_id\": \"xxxxx\"," +"    \"device_name\": \"FARM\"," +"    \"params\": {" +"      \"LED\": 0" +"    }" +"  }");Request request = new Request.Builder().url("https://iot-api.heclouds.com/thingmodel/set-device-property").post(requestBody).header("Authorization", "version=2018-10-31&res=products%2Fxxxxx%2Fdevices%2FFARM&et=1772735919&method=md5&sign=QwtaZir04FXz1BeO%2B9FPpQ%3D%3D").build();OkHttpClient okHttpClient=new OkHttpClient();Call call=okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.e("farm","post fail");//输出响应内容}@Overridepublic void onResponse(Call call, Response response) throws IOException {String str=response.body().string();//.........Log.e("farmPOST",str);//输出响应内容if(str.contains("success")){check("set ok");}}});}

https://i-blog.csdnimg.cn/direct/e13c8cfafabc4c2792beee986194b8ab.png" width="967" />

https://i-blog.csdnimg.cn/direct/4afd63bd6fb6487da60d962d3c42d3ea.png" width="539" />

QT端和Android操作差不多,也是通过get和post

void MainWindow::SendGetRequst()
{mNetworkManager = new QNetworkAccessManager(this);QNetworkRequest _quest;QString url = "https://iot-api.heclouds.com/thingmodel/query-device-property?product_id=xxxxx&device_name=FARM";_quest.setUrl((QUrl(url)));_quest.setRawHeader("Authorization","version=2018-10-31&res=products%2Fxxxxx%2Fdevices%2FFARM&et=1736269477&method=md5&sign=fVpjPaZLpv1%2Btl5zcIcC9A%3D%3D");_quest.setRawHeader("Accept","application/json, text/plain, */*");//自定义mReply = mNetworkManager->get(_quest);QByteArray _data = mReply->readAll();//读出数据//QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData();qInfo()<<"1_data ==> "<<_data;//connect(mReply,&QNetworkReply::finished,this,&HttpOperate::ReplyFinshed);//方式一// auto lambdaFun = [=]{ReplyFinshed();};//lambda函数// connect(mReply,&QNetworkReply::finished,lambdaFun);//这里的信号的接受者可以省略不写connect(mReply,&QNetworkReply::finished,[=]{//这里的信号的接受者可以省略不写ReplyFinshed();});qInfo()<<"2_data ==> " << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData();}void MainWindow::SendPostRequst(uint8_t flag)//将控制命令发出去 0 led 1 pump 2 fan
{mNetworkManager = new QNetworkAccessManager(this);QNetworkRequest _quest;_quest.setUrl((QUrl("https://iot-api.heclouds.com/thingmodel/set-device-property")));_quest.setRawHeader("Authorization", "version=2018-10-31&res=products%2Fxxxxx%2Fdevices%2FFARM&et=1772735919&method=md5&sign=QwtaZir04FXz1BeO%2B9FPpQ%3D%3D");_quest.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));QJsonDocument document;QJsonObject obj,obj1;obj.insert("product_id", "xxxxx");obj.insert("device_name", "FARM");switch (flag) {case 0:obj1.insert("LED",ui->comboBox->currentIndex());break;case 1:obj1.insert("PUMP",ui->checkBox_4->isChecked() ? 1:0);break;case 2:obj1.insert("FAN",ui->checkBox_2->isChecked() ? 1:0);break;default:return;break;}obj.insert("params", obj1);document.setObject(obj);QByteArray _postData = document.toJson(QJsonDocument::Compact);//以Json字符串的方式传参qDebug()<<_postData;_quest.setAttribute(QNetworkRequest::Http2AllowedAttribute, false);mReply = mNetworkManager->post(_quest,_postData);QByteArray _data = mReply->readAll();//读出数据qDebug()<<"1_data ==> "<<_data;//此s时数据为空connect(mReply,&QNetworkReply::finished,this,[=]{ReplyFinshed();});//方式三qDebug()<<"2_data ==> ";}


http://www.ppmy.cn/ops/156151.html

相关文章

DeepSeek-R1:开源机器人智能控制系统的革命性突破

目录 引言 一、DeepSeek-R1 的概述 1.1 什么是 DeepSeek-R1&#xff1f; 1.2 DeepSeek-R1 的定位 二、DeepSeek-R1 的核心特性 2.1 实时控制能力 2.2 多传感器融合 2.3 路径规划与导航 2.4 人工智能集成 2.5 开源与模块化设计 2.6 跨平台支持 三、DeepSeek-R1 的技术…

PPT演示设置:插入音频同步切换播放时长计算

PPT中插入音频&同步切换&放时长计算 一、 插入音频及音频设置二、设置页面切换和音频同步三、播放时长计算四、使用宏设置设置页面切换和音频同步 一、 插入音频及音频设置 1.插入音频&#xff1a;点击菜单栏插入-音频-选择PC上的音频&#xff08;已存在的音频&#x…

用Deepseek做EXCLE文件对比

背景是我想对比两个PO系统里的一个消息映射&#xff0c;EDI接口的mapping有多复杂懂的都懂&#xff0c;它还不支持跨系统版本对比&#xff0c;所以我费半天劲装NWDS&#xff0c;导出MM到excle&#xff0c;然后问题来了&#xff0c;我需要对比两个excel文件里的内容&#xff0c;…

【AIGC月报】AIGC大模型启元:2025.02(DeepSeek)

【AIGC月报】AIGC大模型启元&#xff1a;2025.02 &#xff08;1&#xff09;o3-mini系列&#xff08;OpenAI推理大模型&#xff09;&#xff08;2&#xff09;Falcon 3系列&#xff08;阿联酋大语言模型&#xff09;&#xff08;3&#xff09;Deep Research&#xff08;OpenAI推…

R语言应用KNN、朴素贝叶斯、SVM实现手写数字识别

R语言应用KNN、朴素贝叶斯、SVM实现手写数字识别 使用Rstudio完成,下载本文绑定资源即可开始实验 一、The MNIST Dataset 在本研究中,我们将研究机器学习中最著名的数据集之一——MNIST(改进型国家标准与技术研究院)数据库。完整数据集包含70,000张0到9的手写数字训练图像…

国产化创新 守护开放边界网络安全

当今数字化浪潮的席卷下&#xff0c;企业、医院、政府部门等各类机构的信息化建设正以前所未有的速度推进。 在这个数字化转型的关键时期&#xff0c;尤其是在涉及国家核心利益和敏感数据的领域&#xff0c;我们不仅要追求技术的先进性&#xff0c;更要确保安全性和自主可控性…

java后端开发面试常问

面试常问问题 1 spring相关 &#xff08;1&#xff09;Transactional失效的场景 <1> Transactional注解默认只会回滚运行时异常&#xff08;RuntimeException&#xff09;&#xff0c;如果方法中抛出了其他异常&#xff0c;则事务不会回滚&#xff08;数据库数据仍然插…

漏洞管理:筑牢网络安全防线的关键环节

在当今数字化时代&#xff0c;网络漏洞如同隐藏在系统深处的“地雷”&#xff0c;一旦被触发&#xff0c;可能引发数据泄露、系统瘫痪等一系列严重后果。因此&#xff0c;漏洞管理成为保障网络安全的重中之重。九河云来和大家聊一聊漏洞管理的相关知识把。 漏洞管理是一个系统…