这里oneNet平台作为服务器esp8266作为下位机将获得的数据上传至移动oneNet平台。上位机方面做了一个简单的c#winform程序来获取设备状态和下位机上传的数据。
一、整个项目使用的通讯协议。
上位机与服务器使用的是http协议,下位机与服务器使用的mqtt协议。
二、oneNet平台的搭建
首相是注册一个平台账号,然后再登录,之后就是创建设备,在创建设备这里使用的是多协议接入设备(相关注册与数据流之类的详情就不在赘述)。下面是注册好之后的效果图。
这个时候可以用mqtt.fx程序测试以下能否连接上。
连接设置如下
三、库文件准备
#include <PubSubClient.h>主要用到mqtt的库
四、功能代码
4.1 连接
const char *Device_ID = "xxxxxx"; //设备ID
const char *Product_ID = "xxxxxx"; //产品ID
const char *Api_KEY = "xxxxxxx"; //鉴权信息
const char *WiFi_SSID = "xxx"; //WiFi名称
const char *WiFi_Password = "xxxxxxxx"; //WiFi密码
char* pub="$dp"; //发布主题名
4.2上传数据
上传我也是估摸着用,不是很了解,只是知道能够这样上传,而且手册里也没说到这种上传我就只能瞎用了,各位可以自己深入了解再来教教我!!!嘻嘻
//这是我其中一个上传部分的代码
void pubBmp()
{
if (millis() - Last_Updata_Time >= 0)
{
Last_Updata_Time = millis();
memset(Upload_Package, 0, 100);
String Json_Buffer = ",;temp2,"+String(temp2)+",;pressure,"+String(pressure)+",;altitude,"+String(altitude)+";";
//由于不太会jason语句就直接使用网上其他大佬提供的办法,这里格式都是固定的,都是“,;变量名,”+格式类型(变量值)最后以";"结尾就行,一次可以上传多个。
Upload_Package[0] = 5;
Upload_Package[1] = highByte(Json_Buffer.length());
Upload_Package[2] = lowByte(Json_Buffer.length());
for (int i = 0; i < Json_Buffer.length(); i++)
Upload_Package[i + 3] = Json_Buffer.c_str()[i];
client.publish(pub, Upload_Package, Json_Buffer.length() + 3);
}
}
4.3获取数据
这里获取数据用的是http协议在上位机获取。同时还有上位机发送数据。
首先是获取数据。这里用的是c#的代码用到的协议是http,将获取的Jason语句解析后调用。
public void getDevDate()
{
string url = "http://api.heclouds.com/devices/datapoints?devIds=932938880";//请求地址
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
SetHeaderValue(request.Headers, "api-key", "DmeBqDy=wOEj3oreThNecuJKv1g=");//设备API地址和 首部参数
request.Host = "api.heclouds.com";
request.ProtocolVersion = new Version(1, 1);
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
AnalysisT(retString);
//Console.WriteLine(retString);
myStreamReader.Close();
myResponseStream.Close();
}
第二个是通过http协议上传数据。
public void UpGps(string lon,string lat)
{
string url = "http://api.heclouds.com/devices/932938880/datapoints";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
SetHeaderValue(request.Headers, "api-key", "DNDuXRJFXk7FXEytb7=lxKcncZM=");//设备API地址和 首部参数
request.Host = "api.heclouds.com";
request.ProtocolVersion = new Version(1, 1);
string Cod = "{\"datastreams\":[{\"id\":\"location\",\"datapoints\":[{\"value\":{\"lon\":"+lon.ToString()+",\"lat\":"+lat.ToString()+"}}]}]}";
byte[] data = Encoding.UTF8.GetBytes(Cod);
request.ContentLength = data.Length;
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
Stream stream = resp.GetResponseStream();
//获取响应内容
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
//label1.Text = reader.ReadToEnd();
Console.WriteLine(reader.ReadToEnd());
}
}
这就是项目的大概内容,写得比较乱请见谅,有问题欢迎私信或者qq331388572