天气预报服务功能

更新时间:2023-02-07 01:56:53下载pdf

本文介绍如何使用涂鸦 MCU SDK 为设备获取天气数据。

打开获取天气数据功能

MCU 发送

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x20
数据长度 2 N((L+K)+(L+K)+…)
数据 Data
  • L:占用 1 byte,表示 K 的长度
  • K:请求参数名称,支持的参数名称见 附录一
支持预报参数示例:
  • L:0x0A K:w.humidity
  • L:0x08 K:w.date.7
不支持预报参数示例: L:0x06 K:w.pm25
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

例:0x55aa 03 20 0010 06 77 2e 68 75 6d 69 64 69 74 79 06 77 2e 70 6d 32 35 08 77 2e 64 61 74 65 2e 37 e9

  • 支持预报的参数,再获取时需要添加上需要预报的数据天数,最多可支持获取 7 天内的数据。

    示例:

    • w.humidity, w.date.1:要当天的空气湿度预报数据
    • w.humidity, w.date.7:要以当天为开始,7 天内的空气湿度预报数据
  • 不支持预报的数据,获取时不可添加上天数内容。

    示例:w.pm2.5

  • 当获取的参数是和时间有关的参数时,需要搭配 t.unix 或者 t.local 使用,需要获取的参数数据是按照格林时间还是本地时间。

    示例:

    • L: 0x0b K: w.sunRise
    • L: 0x0b K: w.date.7
    • L: 0x06 K: t.unix
  • 模组返回的日出时间为格林时间。时间格式:年-月-日 时:分

模组返回

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x20
数据长度 2 0x0002
数据 2
  • 0x00 表示失败
    • 0x01 错误码,数据格式非法
    • 0x02 错误码,异常错误
  • 0x01 表示成功 0x00
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

例:0x55aa 00 20 0002 0100 22

下发天气数据

下发天气数据,在打开天气数据功能后模组,定时下发。

模组发送

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x21
数据长度 2 N
数据 2
  • 0x00 表示失败
    0x01 错误码,表示参数服务没权限,此时请确认您是否购买了该参数服务
  • 0x01 表示成功
    • L:参数名长度
    • K:参数名
    • T:0x00 整形、0x01 字符串
    • L:字段名长度
    • V:字段值
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

例:

  • w.humidity.0:100 w.humidity.1:100 w.humidity.2:100 w.humidity.3:100 w.humidity.4:100 w.humidity.5:100
    w.humidity.6:100
  • w.pm25:14

MCU 模组返回

字段 字节数 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x21
数据长度 2 0x0000
数据 2
校验和 1 从帧头开始,按字节求和,得出的结果对 256 求余

例:0x55aa 00 21 0000 20

对应 MCU SDK 中相关函数

宏定义:

/******************************************************************************
                    是否开启天气功能
如需要请开启该宏,并在 protocol.c 文件内 weather_open_return_handle 与 weather_data_user_handle 两个用户处理函数中实现显示等代码
此两函数内#err 提示,完成函数后请删除该#err
开启天气功能,串口数据缓存区的大小要开大一些
******************************************************************************/
//#define         WEATHER_ENABLE                  //打开天气功能
#ifdef          WEATHER_ENABLE
/*  在 protocol.c 文件中 weather_choose 数组中可调整,然后将打开服务的类型数目写到此宏定义  */
#define         WEATHER_CHOOSE_CNT              4   //选择的需要天气服务类型的数目
/*  在打开天气服务时,可以设置此宏定义选择天气预报的天数,1 表示当天天气(不需要预报可设置为 1),最多为 7 天(不可以设置成 0 或大于 7)  */
#define         WEATHER_FORECAST_DAYS_NUM       1   //设置天气预报的天数
#endif

天气数据参数选择数组,用户可以自定义需要的参数:

#ifdef WEATHER_ENABLE
/**
* @var    weather_choose
* @brief  天气数据参数选择数组
* @note   用户可以自定义需要的参数,注释或者取消注释即可,注意更改。以文档内容为准。
*/
const char *weather_choose[WEATHER_CHOOSE_CNT] = {
    "temp",
    "humidity",
    "pm25",
    /*"pressure",
    "realFeel",
    "uvi",
    "tips",
    "windDir",
    "windLevel",
    "windSpeed",
    "sunrise",
    "sunset",
    "aqi",
    "so2 ",
    "rank",
    "pm10",
    "o3",
    "no2",
    "co",
    "conditionNum",*/
};
#endif

打开天气功能返回用户自处理函数:

/**
* @brief  打开天气功能返回用户自处理函数
* @param[in] {res} 打开天气功能返回结果
* @ref       0:失败
* @ref       1:成功
* @param[in] {err} 错误码
* @return Null
* @note   MCU 需要自行实现该功能
*/
void weather_open_return_handle(unsigned char res, unsigned char err)
{
    #error "请自行完成打开天气功能返回数据处理代码,完成后请删除该行"
    unsigned char err_num = 0;

    if(res == 1) {
        //打开天气返回成功
    }else if(res == 0) {
        //打开天气返回失败
        //获取错误码
        err_num = err;
    }
}

天气数据用户自处理函数:

/**
* @brief  天气数据用户自处理函数
* @param[in] {name} 参数名
* @param[in] {type} 参数类型
* @ref       0:Int 型
* @ref       1:String 型
* @param[in] {data} 参数值的地址
* @param[in] {day} 哪一天的天气  0:表示当天 取值范围:0~6
* @ref       0:今天
* @ref       1:明天
* @return Null
* @note   MCU 需要自行实现该功能
*/
void weather_data_user_handle(char *name, unsigned char type, const unsigned char *data, char day)
{
    #error "这里仅给出示例,请自行完善天气数据处理代码,完成后请删除该行"
    int value_int;
    char value_string[50];//由于有的参数内容较多,这里默认为 50。您可以根据定义的参数,可以适当减少该值

    my_memset(value_string, '\0', 50);

    //首先获取数据类型
    if(type == 0) { //参数是 INT 型
        value_int = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
    }else if(type == 1) {
        my_strcpy(value_string, data);
    }

    //注意要根据所选参数类型来获得参数值!!!
    if(my_strcmp(name, "temp") == 0) {
        printf("day:%d temp value is:%d\r\n", day, value_int);          //int 型
    }else if(my_strcmp(name, "humidity") == 0) {
        printf("day:%d humidity value is:%d\r\n", day, value_int);      //int 型
    }else if(my_strcmp(name, "pm25") == 0) {
        printf("day:%d pm25 value is:%d\r\n", day, value_int);          //int 型
    }else if(my_strcmp(name, "condition.num") == 0) {
        printf("day:%d condition value is:%s\r\n", day, value_string);  //string 型
    }
}

MCU 仿真调试助手模拟

打开天气功能:

  1. all 中列出了所有当前支持的天气信息,根据需要双击选择。

  2. selected 中显示当前已选天气信息,双击可取消选择。

  3. 完成后点击 打开天气功能,天气数据会自动下发,具体在模组首次上电或每隔 30min 下发一次。

    天气预报服务功能

命令解析

接收到的数据 RX:

55 aa 00 21 00 2f 01 06 77 2e 74 65 6d 70 00 04 00 00 00 23 06 77 2e 70 6d 32 35 00 04 00 00 00 11 c7
  • 01 表示获取天气数据成功,

  • 以第二组数据 06 77 2e 70 6d 32 35 00 04 00 00 00 11 为例:

    • 06:参数名 w.pm25 的长度,
    • 77 2e 70 6d 32 35:转换为字符为 w.pm25,
    • 00 04:天气为数值(00),天气长度 04,
    • 00 00 00 11:转换为十进制数据为 17,表示当前 PM2.5 的数据量为 17。

天气预报服务功能示例

以下示例,以中国大陆地区的设备为参考示例。

查询当天实时数据

  • MCU 发送:{"w.temp","w.humidity"}{"w.temp","w.humidity","w.currdate"}

  • 模组返回:

    {
        "w.temp":13,
        "w.humidity":100
    }
    

只查询当天的预报数据

查询返回的数据,为预报型数据,请将当天的预报数据,与实时数据做好区别使用。

  • MCU 发送:{"w.humidity","w.date.1"}

  • 模组返回:

    {
        "w.humidity.0":100
    }
    

查询多天的数据

  • MCU 发送:{"w.humidity","w.date.3"}

  • 模组返回:

    {
        "w.humidity.0":100,
        "w.humidity.1":100,
        "w.humidity.2":100
    }
    

查询多天的数据和当前的实时天气数据

  • MCU 发送:{"w.temp","w.humidity","w.date.3","w.currdate"}

  • 模组返回:

    {
            "w.temp":13,
        "w.humidity":100
        "w.humidity.0":100,
        "w.humidity.1":100,
        "w.humidity.2":100
    }
    

查询日出日落的天气数据

  • 格林时间(以 UTC +8 时区为例)

    • MCU 发送:{ "w.humidity","w.sunrise","w.sunset","t.unix","w.date.3" }

    • 模组返回:

      {
          "w.humidity.0":100,
          "w.sunrise.0":"2019-12-27 00:05",
          "w.sunset.0":"2019-12-27 10:54",
          "w.humidity.1":100,
          "w.sunrise.1":"2019-12-28 00:05",
          "w.sunset.1":"2019-12-28 10:54",
          "w.humidity.2":100,
          "w.sunrise.2":"2019-12-29 00:05",
          "w.sunset.2":"2019-12-29 10:54"
      }
      
  • 本地时间(以 UTC +8 时区为例)

    • MCU 发送:{ "w.humidity","w.sunrise","w.sunset","t.local","w.date.3" }

    • 模组返回:

      {
          "w.humidity.0":100,
          "w.sunrise.0":"2019-12-27 08:05",
          "w.sunset.0":"2019-12-27 18:54",
          "w.humidity.1":100,
          "w.sunrise.1":"2019-12-28 08:05",
          "w.sunset.1":"2019-12-28 18:54",
          "w.humidity.2":100,
          "w.sunrise.2":"2019-12-29 08:05",
          "w.sunset.2":"2019-12-29 18:54"
      }
      

掺杂不支持预报的参数获取示例

  • MCU 发送:{ "w.temp","w.humidity","w.pm10","w.pm25","w.date.3" }

  • 模组返回:

    {
        "w.pm10.0":14,
        "w.pm25.0":7,
        "w.humidity.0":100,
        "w.humidity.1":100,
        "w.humidity.2":100
    }
    

    若 MCU 的入参 w.date.n 中,n >7 或者 n<=0 时,云端按照数据入参异常,此时无返回数据。

附录一:天气数据参数 ASCII 码

天气数据参数 含义
中国大陆 其他国家或地区 是否支持预报 长度 十六进制
w.temp 大气温度,单位:摄氏度 ℃ 支持 支持 支持 7 天内数据,中国大陆地区不支持 6 77 2e 74 65 6d 70
w.humidity 空气湿度 支持 支持 支持 7 天内数据 10 77 2e 68 75 6d 69 64 69 74 79
w.conditionNum 天气概况数字编码 支持 支持 支持 7 天内数据 14 77 2e 63 6f 6e 64 69 74 69 6f 6e 4e 75 6d
w.pressure 大气气压,单位:毫巴 mbar 支持 支持 支持 7 天内数据,中国大陆地区不支持 10 77 2e 70 72 65 73 73 75 72 65
w.realFeel 体感温度 支持 支持 不支持 7 天内数据 10 77 2e 72 65 61 6c 46 65 65 6c
w.uvi 紫外线指数 支持 支持 支持 7 天内数据 5 77 2e 75 76 69
w.sunrise 日出 支持 支持 支持 7 天内数据 9 77 2e 73 75 6e 72 69 73 65
w.sunset 日落 支持 支持 支持 7 天内数据 8 77 2e 73 75 6e 73 65 74
t.unix 格林时间,搭配日出(w.sunrise)和日落(w.sunset)使用 - - - 6 74 2e 75 6e 69 78
t.local 本地时间,搭配日出(w.sunrise)和日落(w.sunset)使用 - - - 7 74 2e 6c 6f 63 61 6c
w.windSpeed 风速,单位:米/秒(m/s) 支持 支持 支持 7 天内数据 11 77 2e 77 69 6e 64 53 70 65 65 64
w.windDir 风向 支持 支持 支持 7 天内数据 9 77 2e 77 69 6e 64 44 69 72
w.windLevel 风级 仅中国大陆地区支持 不支持 支持 7 天内数据 11 77 2e 77 69 6e 64 4c 65 76 65 6c
w.aqi 空气质量指数,采用美国 EPA 标准:0 ~ 500 支持 支持 仅有当天数据 5 77 2e 61 71 69
w.rank/w.quality 详细 AQI 实况及全国排名 仅中国大陆地区支持 不支持 仅有当天数据 6 77 2e 72 61 6e 6b / 77 2e 71 75 61 6c 69 74 79
w.pm10 可吸入颗粒物 PM10,单位:µg/m³ 支持 支持 仅有当天数据 6 77 2e 70 6d 31 30
w.pm25 细颗粒物 PM2.5,单位:µg/m³ 支持 支持 仅有当天数据 6 77 2e 70 6d 32 35
w.o3 臭氧浓度,单位:µg/m³ 支持 支持 仅有当天数据 4 77 2e 6f 33
w.no2 二氧化氮浓度,单位:µg/m³ 支持 支持 仅有当天数据 5 77 2e 6e 6f 32
w.co 一氧化碳浓度,单位:µg/m³ 支持 支持 仅有当天数据 4 77 2e 63 6f
w.so2 二氧化硫浓度 ,单位:µg/m³ 支持 支持 仅有当天数据 5 77 2e 73 6f 32
w.thigh 最高温度,单位:摄氏度 ℃) 支持 支持 仅有预报数据 7 77 2e 74 68 69 67 68
w.tlow 最低温度 ,单位:摄氏度 ℃) 支持 支持 仅有预报数据 6 77 2e 74 6c 6f 77
w.date.n 需要预报的天数,用 n 来表示天数,要求 1<= n <=7 支持 支持 - 8 77 2e 64 61 74 65 2e 6e
w.currdate 实时天气获取 支持 支持 - 10 77 2e 63 75 72 72 64 61 74 65
  • WindDir 为风向字段。为风向简码,详细编码表请参考 附录五

  • w.conditionNum 表示天气情况编码,详细编码表请参考 附录四

  • 大气气压单位说明:

    1 毫巴(mbar)=1 百帕斯卡(hPa),即 1mbar = 100pa = 1hpa。

    例如,中国大陆地区的墨迹天气数据单位是百帕斯卡(hPa)。

  • 是否支持预报:携带 w.date.n 字段时,返回预报数据。

  • 是否支持实时:当携带 w.date.n 字段访问时,若需要实时天气数据,请携带 w.currdate 字段。具体实时数据的访问方式,请参考 天气预报服务功能示例

附录二:城市服务参数 ASCII 码对照

标识 描述 类型 长度 十六进制
c.area 区县或城市名称 字符串 6 63 2e 61 72 65 61
c.city 城市名称 字符串 6 63 2e 63 69 74 79
c.province 字符串 10 63 2e 70 72 6f 76 69 6e 63 65

当天气服务访问时返回的数据仅有城市服务字段,且内容为空时,则说明设备无经纬度信息,无法获取天气数据。可打开手机应用的获取定位功能后,重新进行设备配网。

附录三:天气预报服务数值类型

标识 描述 类型 是否支持实时 是否支持预报
w.temp 温度 整数 仅中国大陆地区不支持
w.humidity 湿度 整数
w.conditionNum 天气概况数字编码 字符串
w.pressure 气压 整数 仅中国大陆地区不支持
w.realFeel 温度实感 整数
w.uvi 紫外线指数 整数
w.windDir 风向 字符串
w.windLevel 风等级 整数 仅中国大陆地区支持
w.windSpeed 风速 字符串,数据格式为 1.0;0.5
w.sunrise 日出时间 字符串,数据格式为 2017-04-24 05:24
w.sunset 日落时间 字符串,数据格式为 2017-04-24 18:32
w.aqi 空气质量指数 整数
w.pm25 PM 2.5 整数
w.so2 二氧化硫浓度 整数
w.rank/w.quality 空气评分 字符串,数据格式为 447/609 仅中国大陆地区支持
w.pm10 PM 10 整数
w.o3 臭氧(O3)浓度 整数
w.no2 二氧化氮(NO2)浓度 整数
w.co 一氧化碳(CO)浓度 整数
w.qualityLevel 空气质量评分等级 整形
w.thigh 最高温度 整形
w.tlow 最低温度 整形
  • 天气参数中,字符串格式类型的数据内容为数字时,数字按照四舍五入的规则只保留一位小数位。示例:1.0;0.9。
  • 是否支持实时:当携带 w.date.n 字段访问时,若需要实时天气数据请携带w.currdate字段。具体实时数据的访问方式,请参考 天气预报服务功能示例
  • 是否支持预报:携带 w.date.n 字段时,返回预报数据。

附录四:中文天气 UTF-8 编码

编码表示(ASCII 码) w.conditionNum 十六进制 天气状况
120 31 32 30
101 31 30 31 大雨
102 31 30 32 雷暴
103 31 30 33 沙尘暴
104 31 30 34 小雪
105 31 30 35
106 31 30 36 冻雾
107 31 30 37 暴雨
108 31 30 38 局部阵雨
109 31 30 39 浮尘
110 31 31 30 雷电
111 31 31 31 小阵雨
112 31 31 32
113 31 31 33 雨夹雪
114 31 31 34 尘卷风
115 31 31 35 冰粒
116 31 31 36 强沙尘暴
117 31 31 37 扬沙
118 31 31 38 小到中雨
119 31 31 39 大部晴朗
121 31 32 31
122 31 32 32 阵雨
123 31 32 33 强阵雨
124 31 32 34 大雪
125 31 32 35 特大暴雨
126 31 32 36 暴雪
127 31 32 37 冰雹
128 31 32 38 小到中雪
129 31 32 39 少云
130 31 33 30 小阵雪
131 31 33 31 中雪
132 31 33 32
133 31 33 33 冰针
134 31 33 34 大暴雨
136 31 33 36 雷阵雨伴有冰雹
137 31 33 37 冻雨
138 31 33 38 阵雪
139 31 33 39 小雨
140 31 34 30
141 31 34 31 中雨
142 31 34 32 多云
143 31 34 33 雷阵雨
144 31 34 34 中到大雨
145 31 34 35 大到暴雨
146 31 34 36 晴朗

附录五:风向简码编码表

风向简码(字符串) 十六进制 描述
N 4e
NNE 4e 4e 45 东北偏北
NE 4e 45 东北
ENE 45 4e 45 东北偏东
E 45
ESE 45 53 45 东南偏东
SE 53 45 东南
SSE 53 53 45 东南偏南
S 53
SSW 53 53 57 西南偏南
SW 53 57 西南
WSW 57 53 57 西南偏西
W 57 西
WNW 57 4e 57 西北偏西
NW 4e 57 西北
NNW 4e 4e 57 西北偏北