onenet上报gps数据

发布时间 2023-04-04 00:05:46作者: MKT-porter

 

 

 

 

 

  在地图中选择对应设备中名为“location”的数据流即可。

 

 

 

 

{"location":{"lat":34.0215704,"lon":108.4555422},"速度":28,"紫外线":28,"温度":28}
{"location":{"lat":34.0215704,"lon":108.4555422},"速度":29,"紫外线":29,"温度":29}
{"location":{"lat":34.0215704,"lon":108.4555422},"速度":30,"紫外线":30,"温度":30}
{"location":{"lat":34.0215704,"lon":108.4555422},"速度":31,"紫外线":31,"温度":31}

  

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <Ticker.h>
    
#include <SoftwareSerial.h>
//实例化软串口
SoftwareSerial mySerial(D1, D2); // RX, TX
//分割结果
#define sleng 10 //数组大小
String split_result[sleng];//手动动态调整数组大小,保证数组可以满足容量
    
    
    
#define WIFI_DEBUG 0 //1:使用一键配网,其它值则使用默认无线账号密码
#define ONENET_DISCONNECTED 1 //已经断开
#define ONENET_CONNECTED 2 //已经连接上
#define ONENET_RECONNECT 3 //重连成功
#define VER  "ESP8266_MQTT_V1.0"  //版本号
    
const char* ssid = "yaoyao";//wifi账号
const char* password = "love123456";//wifi密码
    
/*OneNet*/
PubSubClient mqttClient;
const char* mqttServer = "183.230.40.39";//mqtt服务器
const uint16_t mqttPort = 6002; //端口号
#define onenet_productId   "207282" //产品ID
#define onenet_deviceId "515439794" //设备ID
#define onenet_apiKey "ZcxLlq=Pd4t6CgaFKcB=zQXzDt8=" //产品API_KEY
    
 
int state;
Ticker delayTimer;
WiFiClient espClient;
    
/*字符串分割
输入参数
String zifuchuan,  输入字符串
String fengefu,    分隔符号-可以是多个
String result[]    输出结果
     
*/
void Split(String zifuchuan,String fengefu,String result[])
 {
  int weizhi; //找查的位置
  String temps;//临时字符串
  int i=0;
  do
  {
      weizhi = zifuchuan.indexOf(fengefu);//找到位置
      if(weizhi != -1)//如果位置不为空
      {
          temps=zifuchuan.substring(0,weizhi);//打印取第一个字符
          zifuchuan = zifuchuan.substring(weizhi+fengefu.length(), zifuchuan.length());
          //分隔后只取后面一段内容 以方便后面找查
      }
      else
      {  //上面实在找不到了就把最后的 一个分割值赋值出来以免遗漏
         if(zifuchuan.length() > 0)
          temps=zifuchuan;
      }
     
      result[i++]=temps;
      //Serial.println(result[i-1]);//在这里执行分割出来的字符下面不然又清空了
      temps="";
   }
   while(weizhi >=0);
  }
    
    
/* 延时N秒 */
void delayNs(uint8_t m){
  for(uint8_t index = 0;index<m;index ++){ delay(1000); ESP.wdtFeed();
  }
}
/* 延时重启 */
void delayRestart(float t) {
  Serial.print("Restart after ");
  Serial.print(t);
  Serial.println("s");
  delayTimer.attach(t, []() {
    Serial.println("\r\nRestart now!");
    ESP.restart();
  });
}
    
/* 自动连接 */
bool autoConfig()
{
  WiFi.begin();
  for (int i = 0; i < 20; i++)
  { if (WiFi.status() == WL_CONNECTED) {
    Serial.println("AutoConfig Success");
    Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
    Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
    WiFi.printDiag(Serial); return true; }
    else {
      Serial.print("AutoConfig Waiting......");
      Serial.println(WiFi.status());
      delay(1000);
      }
  }
  Serial.println("AutoConfig Faild!" );
  return false;
}
    
/* 一键配网 */
void smartConfig()
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig");
  WiFi.beginSmartConfig();
  while (1)
  { Serial.print(".");
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  if (WiFi.smartConfigDone()) { Serial.println("SmartConfig Success");
  Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
  Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
  WiFi.setAutoConnect(true);  // 设置自动连接
  break; }
  delay(1000); // 这个地方一定要加延时,否则极易崩溃重启
  }
}
    
/* 连接OneNet */
int connectToOneNetMqtt(){
  int cnt = 0;
  while(!mqttClient.connected()){
    ESP.wdtFeed();
    cnt++;
    Serial.println("Connect to OneNet MQTT...");
    if (mqttClient.connect(onenet_deviceId,onenet_productId,onenet_apiKey)) {
        Serial.println("connect success!");
        return ONENET_RECONNECT;
        }
    else {
      Serial.print("connect fail!");
      Serial.println(" try again in 5 seconds");
    
      delay(5000);
      }
    if(cnt >=10){
      //只做10次连接到OneNet,连接不上重启8266
      cnt = 0;
      delayRestart(1);
      } }
      return ONENET_CONNECTED;
}
    
/* 云端下发 */
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  if ((char)payload[0] == '1') {
    digitalWrite(LED_BUILTIN, LOW);
  }
  else {
    digitalWrite(LED_BUILTIN, HIGH);
  }
}
    
    
/* 发布一个传感器信息
String sensorname  传感器名字
String data        数据
int sendlen=200;   数据大小
*/
    
void pubMQTTmsg_one_name_value(String sensorname,String data){
  long lastMsg = 0;
  int sendlen=200;//28 //数组大小
  char msg[sendlen+22]; //数组大小
  char tmp[sendlen];
  char d[3];
  //snprintf(tmp,sizeof(tmp),String("")+"{\""+sensorname+"\":%d}",data);
  String sendmsg=String("")+"{\""+sensorname+"\":"+data+"}";
  //String sendmsg="{\"mq2\":1234,\"mq3\":345}";
  sendmsg.toCharArray(tmp, sendlen);
  Serial.println(tmp);
    
  uint16_t streamLen= strlen(tmp);
  d[0]='\x03';
  d[1] = (streamLen >> 8);
  d[2] = (streamLen & 0xFF);
  snprintf(msg,sizeof(msg),"%c%c%c%s",d[0],d[1],d[2],tmp);
  mqttClient.publish("$dp", (uint8_t*)msg,streamLen+3,false);
}
    
/* 发布多个传感器信息
String sendmsg  打包数据
    
{"senseor1":1213,"senseor2":313.3,"senseor3":543.09,"senseor4":645.0}
注意  ” 转义字符串 \“
    
*/
void pubMQTTmsg_more_name_value(String sendmsg_in){
  long lastMsg = 0;
  int sendlen=800;//28 //数组大小
  char msg[sendlen+22]; //数组大小
  char tmp[sendlen];
  char d[3];
  //snprintf(tmp,sizeof(tmp),String("")+"{\""+sensorname+"\":%d}",data);
  //String sendmsg=String("")+"{\""+sensorname+"\":"+data+"}";
  String sendmsg=sendmsg_in;
  sendmsg.toCharArray(tmp, sendlen);
  Serial.println(tmp);
    
  uint16_t streamLen= strlen(tmp);
  d[0]='\x03';
  d[1] = (streamLen >> 8);
  d[2] = (streamLen & 0xFF);
  snprintf(msg,sizeof(msg),"%c%c%c%s",d[0],d[1],d[2],tmp);
  mqttClient.publish("$dp", (uint8_t*)msg,streamLen+3,false);
}
    
    
    
/* 初始化系统 */
void initSystem(){
  int cnt = 0;
  Serial.begin (9600);
  Serial.println("\r\n\r\nStart ESP8266 MQTT");
  Serial.print("Firmware Version:");
  Serial.println(VER); Serial.print("SDK Version:");
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println(ESP.getSdkVersion());
  ESP.wdtEnable(5000);
  if(WIFI_DEBUG==1)//开启一键配网模式
  {
    if (!autoConfig()) {
    Serial.println("Start smartConfig");
    smartConfig();
    }
  }
  else {
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED)
         {
            delay(500); cnt++; Serial.print(".");
            if(cnt>=40){
              cnt = 0; //重启系统
              delayRestart(1);
            }
          }
        }
  Serial.print("WIFI Connect \r\n");
    }
    
    
/* 初始化ONENET通信 */
void initOneNetMqtt(){
  mqttClient.setServer(mqttServer,mqttPort);
  mqttClient.setClient(espClient);
  mqttClient.setCallback(callback);
}
    
/* 初始化 */
void setup() {
  initSystem();
  initOneNetMqtt();
    
  Serial.begin(9600);
  while (!Serial) {
  }
     
  Serial.println("Goodnight moon!");
     
  mySerial.begin(9600);
      
}
   
   
int i =0;
             
    
/* 主函数 */
void loop() {
      ESP.wdtFeed();
      state = connectToOneNetMqtt();
      //Serial.println(WiFi.status());
            
    //接收串口消息
//  if (mySerial.available()){
//      String split_input =mySerial.readStringUntil(';');
//      //Serial.println(split_input);
//    
//      //分割解析
//      Split(split_input,"-",split_result);//分割调用
//          
//      Serial.println("----------------");
//      //打印消息 检查是否为空
//       for(int i=0;i<sleng;i++)
//          {
//            if(split_result[i]!="")
//            {
//             Serial.println(String(i)+"-"+split_result[i]);
//            }
//            else
//            {
//              split_result[i]="0";
//             }
//          }
//    
//    
//        //发送onenet
//        ESP.wdtFeed();
        state = connectToOneNetMqtt();
        //Serial.println(WiFi.status());
        if(state == ONENET_RECONNECT){
          mqttClient.loop();
        }
        else if(state == ONENET_CONNECTED)
        {
 
         

           i++;
           String msg=String("")+"{"
                     +"\"location\":"+"{\"lat\":34.0215704,\"lon\":108.4555422}"+","
                    
                     +"\"速度\":"+String(i)+","
                     +"\"紫外线\":"+String(i)+","
                     +"\"温度\":"+String(i)
                    
                     +"}";

   
//          String msg=String("")+"{"
//                     +"\"经度\":"+String(split_result[0])+","
//                     +"\"纬度\":"+String(split_result[1])+","
//                     +"\"速度\":"+String(split_result[2])+","
//                     +"\"紫外线\":"+String(split_result[3])+","
//                     +"\"温度\":"+String(split_result[4])
//                    
//                     +"}";
          pubMQTTmsg_more_name_value(msg);
          mqttClient.loop();
        }
           
        delay(2000);
          
  //}
    
    
      
    
    
    
      
}