#include "lora.h" LoRaParameter LoRaSetData = { //模块工作参数 0x00, //模块地址高字节 0x00, //模块地址低字节 0x01, //模块网络地址 LoRa_9600, //模块串口 波特率 9600 LoRa_8N1, //串口工作模式 8数据位 无校验 1停止位 LoRa_38_4, //模块空中速率 38.4K LoRa_Data240, //数据分包大小 240字节 LoRa_RssiDIS, //关闭RSSI功能 LoRa_FEC_22DBM, //发射功率22dbm LoRa_CH23, //模块信道 LoRa_RssiByteDIS, //禁用RSSI字节功能 LoRa_ModePOINT, //定点模式 LoRa_RelayDIS, //禁用中继模式 LoRa_LBTEN, //使能LBT LoRa_WorTX, //Wor模式发送 只在模式1才有效 LoRa_Wor2000ms, //Wor周期2000毫秒 只在模式1才有效 0x22, //模块加密秘钥高字节 0x33, //模块加密秘钥低字节 }; //LoRA模块引脚初始化 void loraGpioInit(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = LORA_AUX_Pin; //忙检测引脚 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(LORA_AUX_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = LORA_POW_Pin ; //电源控制引脚 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LORA_POW_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = LORA_M0_Pin ; //M0引脚 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LORA_M0_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = LORA_M1_Pin ; //M1引脚 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LORA_M1_Port, &GPIO_InitStruct); LoRa_MODE2; //模块模式2 HAL_Delay(200); //适当延时 } /*-------------------------------------------------*/ /*函数名:LoRa上电复位 */ /*参 数:timeout:超时时间 */ /*返回值:0:正确 其他:错误 */ /*-------------------------------------------------*/ uint8_t loraReset(int16_t timeout) { LoRa_PowerOFF; //先关闭电源 HAL_Delay(200); //延时 LoRa_PowerON; //再打开电源 while(timeout--) { //等待复位成功 HAL_Delay(100); //延时100ms if(LoRa_AUX==1) //需要等到高电平1,才能跳出while,表示复位完毕 break; //主动跳出while循环 u1_printf("%d ",timeout); //串口输出现在的超时时间 } u1_printf("\r\n"); //串口输出信息 if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到了,也没能等到LoRa_AUX高电平,返回1 return 0; //正确,返回0 } /*-------------------------------------------------*/ /*函数名:初始化模块 */ /*参 数:无 */ /*返回值:无 */ /*-------------------------------------------------*/ void loraInit(void) { loraGpioInit(); //Lora模块引脚初始化 u1_printf("准备复位Lora模块\r\n"); //串口输出信息 if(loraReset(100)) { //复位Lora模块,返回值如果非零,表示错误 u1_printf("复位Lora模块失败,重启\r\n"); //串口输出信息 NVIC_SystemReset(); //重启 } else u1_printf("Lora模块复位成功\r\n"); //串口输出信息 u1_printf("准备设置Lora模块\r\n"); //串口输出信息 loraSet(); //设置Lora模块 HAL_Delay(200); //延时 } /*-------------------------------------------------*/ /*函数名:LoRa设置工作参数 */ /*参 数:无 */ /*返回值:无 */ /*-------------------------------------------------*/ void loraSet(void) { uint8_t cmd[12]; //保存设置参数的数组缓冲区,命令共计12字节 cmd[0] = 0xC0; //设置参数指令的起始字节,固定值0xC0 cmd[1] = 0x00; //设置参数的起始寄存器地址,从寄存器0开始设置,一共9个 cmd[2] = 0x09; //一共设置9个寄存器 cmd[3] = LoRaSetData.LoRa_AddrH; //设置模块地址高字节 cmd[4] = LoRaSetData.LoRa_AddrL; //设置模块地址低字节 cmd[5] = LoRaSetData.LoRa_NetID; //设置模块网络地址 cmd[6] = LoRaSetData.LoRa_Baudrate | LoRaSetData.LoRa_UartMode | LoRaSetData.LoRa_airvelocity; //设置模块 波特率 串口模式 空中速率 cmd[7] = LoRaSetData.LoRa_DataLen | LoRaSetData.LoRa_Rssi | LoRaSetData.LoRa_TxPower; //设置模块 数据分包长度 RSSI噪声是否使能 发射功率 cmd[8] = LoRaSetData.LoRa_CH; //设置模块信道 cmd[9] = LoRaSetData.LoRa_RssiByte | LoRaSetData.LoRa_DateMode | LoRaSetData.LoRa_Relay | LoRaSetData.LoRa_LBT | LoRaSetData.LoRa_WORmode | LoRaSetData.LoRa_WORcycle; //设置模块 是否使用RSSI字节功能 传输方式 是否中继 是否使用LBT WOR模式收发控制 WOR周期 cmd[10] = LoRaSetData.LoRa_KeyH; //设置模块加密秘钥高字节 cmd[11] = LoRaSetData.LoRa_KeyL; //设置模块加密秘钥低字节 u3_TxDataBuf(cmd,12); //发送缓冲区加入数据 } /*-------------------------------------------------*/ /*函数名:LoRa查询工作参数 */ /*参 数:data:工作参数数据 */ /*返回值:无 */ /*-------------------------------------------------*/ void loraGet(uint8_t *data) { uint8_t ch; //保存信道的变量 u1_printf("模块地址:0x%02X%02X\r\n",data[3],data[4]); //串口输出信息 u1_printf("模块网络ID:0x%02X\r\n",data[5]); //串口输出信息 switch(data[6]&0xE0) { //判断串口波特率 case LoRa_1200 : u1_printf("波特率 1200\r\n"); //串口输出信息 break; //跳出 case LoRa_2400 : u1_printf("波特率 2400\r\n"); //串口输出信息 break; //跳出 case LoRa_4800 : u1_printf("波特率 4800\r\n"); //串口输出信息 break; //跳出 case LoRa_9600 : u1_printf("波特率 9600\r\n"); //串口输出信息 break; //跳出 case LoRa_19200 : u1_printf("波特率 19200\r\n"); //串口输出信息 break; //跳出 case LoRa_38400 : u1_printf("波特率 38400\r\n"); //串口输出信息 break; //跳出 case LoRa_57600 : u1_printf("波特率 57600\r\n"); //串口输出信息 break; //跳出 case LoRa_115200: u1_printf("波特率 115200\r\n"); //串口输出信息 break; //跳出 } switch(data[6]&0x18) { //判断串口参数 case LoRa_8N1 : u1_printf("8数据位 无校验 1停止位\r\n"); //串口输出信息 break; //跳出 case LoRa_8O1 : u1_printf("8数据位 奇校验 1停止位\r\n"); //串口输出信息 break; //跳出 case LoRa_8E1 : u1_printf("8数据位 偶校验 1停止位\r\n"); //串口输出信息 break; //跳出 } switch(data[6]&0x07) { //判断空中速率 case LoRa_0_3 : u1_printf("空中速率 0.3K\r\n"); //串口输出信息 break; //跳出 case LoRa_1_2 : u1_printf("空中速率 1.2K\r\n"); //串口输出信息 break; //跳出 case LoRa_2_4 : u1_printf("空中速率 2.4K\r\n"); //串口输出信息 break; //跳出 case LoRa_4_8 : u1_printf("空中速率 4.8K\r\n"); //串口输出信息 break; //跳出 case LoRa_9_6 : u1_printf("空中速率 9.6K\r\n"); //串口输出信息 break; //跳出 case LoRa_19_2 : u1_printf("空中速率 19.2K\r\n"); //串口输出信息 break; //跳出 case LoRa_38_4 : u1_printf("空中速率 38.4K\r\n"); //串口输出信息 break; //跳出 case LoRa_62_5 : u1_printf("空中速率 62.5K\r\n"); //串口输出信息 break; //跳出 } switch(data[7]&0xC0) { //判断数据分包大小 case LoRa_Data240 : u1_printf("数据分包大小:240字节\r\n"); //串口输出信息 break; //跳出 case LoRa_Data128 : u1_printf("数据分包大小:128字节\r\n"); //串口输出信息 break; //跳出 case LoRa_Data64 : u1_printf("数据分包大小:64字节\r\n"); //串口输出信息 break; //跳出 case LoRa_Data32 : u1_printf("数据分包大小:32字节\r\n"); //串口输出信息 break; //跳出 } switch(data[7]&0x20) { //判断是否启用RSSI功能 case LoRa_RssiEN : u1_printf("启用RSSI功能\r\n"); //串口输出信息 break; //跳出 case LoRa_RssiDIS : u1_printf("禁用RSSI功能\r\n"); //串口输出信息 break; //跳出 } switch(data[7]&0x03) { //判断发射功率 case LoRa_FEC_22DBM : u1_printf("发射功率 22dbm\r\n"); //串口输出信息 break; //跳出 case LoRa_FEC_17DBM : u1_printf("发射功率 17dbm\r\n"); //串口输出信息 break; //跳出 case LoRa_FEC_13DBM : u1_printf("发射功率 13dbm\r\n"); //串口输出信息 break; //跳出 case LoRa_FEC_10DBM : u1_printf("发射功率 10dbm\r\n"); //串口输出信息 break; //跳出 } ch = data[8] & 0x7F; //保存信道 u1_printf("信道:0x%02X 对应频率%dMHz\r\n",ch,410+ch); //串口输出信息 switch(data[9]&0x80) { //判断RSSI字节功能 case LoRa_RssiByteEN : u1_printf("启用RSSI字节功能\r\n"); //串口输出信息 break; //跳出 case LoRa_RssiByteDIS : u1_printf("禁用RSSI字节功能\r\n"); //串口输出信息 break; //跳出 } switch(data[9]&0x40) { //判断传输模式 case LoRa_ModeTRANS : u1_printf("透明传输\r\n"); //串口输出信息 break; //跳出 case LoRa_ModePOINT : u1_printf("定点传输\r\n"); //串口输出信息 break; //跳出 } switch(data[9]&0x20) { //判断中继功能 case LoRa_RelayEN : u1_printf("启用中继\r\n"); //串口输出信息 break; //跳出 case LoRa_RelayDIS : u1_printf("禁用中继\r\n"); //串口输出信息 break; //跳出 } switch(data[9]&0x10) { //判断LBT功能 case LoRa_LBTEN : u1_printf("启用LBT\r\n"); //串口输出信息 break; //跳出 case LoRa_LBTDIS : u1_printf("禁用LBT\r\n"); //串口输出信息 break; //跳出 } // switch(data[9]&0x08){ //判断WOR模式 // case LoRa_WorTX : u1_printf("Wor模式发送\r\n"); //串口输出信息 // break; //跳出 // case LoRa_WorRX : u1_printf("Wor模式接收\r\n"); //串口输出信息 // break; //跳出 // } // switch(data[9]&0x07){ //判断WOR周期 // case LoRa_Wor500ms : u1_printf("WOR周期时间 500毫秒\r\n"); //串口输出信息 // break; //跳出 // case LoRa_Wor1000ms : u1_printf("WOR周期时间 1000毫秒\r\n"); //串口输出信息 // break; //跳出 // case LoRa_Wor1500ms : u1_printf("WOR周期时间 1500毫秒\r\n"); //串口输出信息 // break; //跳出 // case LoRa_Wor2000ms : u1_printf("WOR周期时间 2000毫秒\r\n"); //串口输出信息 // break; //跳出 // case LoRa_Wor2500ms : u1_printf("WOR周期时间 2500毫秒\r\n"); //串口输出信息 // break; //跳出 // case LoRa_Wor3000ms : u1_printf("WOR周期时间 3000毫秒\r\n"); //串口输出信息 // break; //跳出 // case LoRa_Wor3500ms : u1_printf("WOR周期时间 3500毫秒\r\n"); //串口输出信息 // break; //跳出 // case LoRa_Wor4000ms : u1_printf("WOR周期时间 4000毫秒\r\n"); //串口输出信息 // break; //跳出 // } } /*-------------------------------------------------*/ /*函数名:串口3被动事件 */ /*参 数:data :数据 */ /*参 数:datalen :数据长度 */ /*返回值:无 */ /*-------------------------------------------------*/ uint8_t tempdata[512]; void u3PassiveEvent(uint8_t *data, uint16_t datalen) { /*----------------------------------------------*/ /* 接收设置LoRa模块返回数据 */ /*----------------------------------------------*/ if((data[0]==0xC1)&&(datalen==12)) { u1_printf("接收设置LoRa模块返回数据\r\n"); //串口输出信息 loraGet(data); //分析设置的参数 LoRa_MODE0; //切换到模式0 HAL_Delay(200); //延时 catReset(); //4G模块重启 } /*----------------------------------------------*/ /* 接收到子设备x上发的证书信息 */ /*----------------------------------------------*/ if(datalen==(SUBMQTTINFO_STRUCT_LEN+1)) { //收到符合长度的数据 switch (data[0]) { case CERT1_DATA: subDeviceReportingCertificate(0,data); break; case CERT2_DATA: subDeviceReportingCertificate(1,data); break; case CERT3_DATA: subDeviceReportingCertificate(2,data); break; case CERT4_DATA: subDeviceReportingCertificate(3,data); break; case CERT5_DATA: subDeviceReportingCertificate(4,data); break; case CERT6_DATA: subDeviceReportingCertificate(5,data); break; case CERT7_DATA: subDeviceReportingCertificate(6,data); break; case CERT8_DATA: subDeviceReportingCertificate(7,data); break; case CERT9_DATA: subDeviceReportingCertificate(8,data); break; case CERT10_DATA: subDeviceReportingCertificate(9,data); break; default : break; } u1_printf("***收到子设备数据,线程结束...\r\n"); taskRunning = 0; //则退出 } /*----------------------------------------------*/ /* 接收到子设备x上发的开关状态数据 */ /*----------------------------------------------*/ if(datalen==(ATTRIBUTE_STRUCT_LEN+1)) { //收到符合长度的数据 switch (data[0]) { case SUB1_DATA: subDeviceReportingSwitchStatus(0,data); break; case SUB2_DATA: subDeviceReportingSwitchStatus(1,data); break; case SUB3_DATA: subDeviceReportingSwitchStatus(2,data); break; case SUB4_DATA: subDeviceReportingSwitchStatus(3,data); break; case SUB5_DATA: subDeviceReportingSwitchStatus(4,data); break; case SUB6_DATA: subDeviceReportingSwitchStatus(5,data); break; case SUB7_DATA: subDeviceReportingSwitchStatus(6,data); break; case SUB8_DATA: subDeviceReportingSwitchStatus(7,data); break; case SUB9_DATA: subDeviceReportingSwitchStatus(8,data); break; case SUB10_DATA: subDeviceReportingSwitchStatus(9,data); break; default : break; } u1_printf("***收到子设备数据,线程结束...\r\n"); taskRunning = 0; //则退出 } } //子设备上报证书信息至云平台 推送 参数说明: sub_num 子设备序号 0表示设备1... void subDeviceReportingCertificate(uint8_t sub_num,uint8_t *data) { u1_printf("接收到子设备%d证书信息。\r\n",sub_num + 1); memcpy(&SubMqttInfo_Struct[sub_num],&data[1],SUBMQTTINFO_STRUCT_LEN); //临时缓冲区全部清零 CAT1_printf("AT+MPUB=\"/iot/sub/live/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.live.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22online\\22:[{\\22uid\\22:\\22%s\\22,\\22secret\\22:\\22%s\\22}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubMqttInfo_Struct[sub_num].Passward); u1_printf("子设备%d的uid:%s,secret:%s\r\n", sub_num + 1, SubMqttInfo_Struct[sub_num].ClientID, SubMqttInfo_Struct[sub_num].Passward); SUB_DEVICE_ON[sub_num] = 1;//子设备上线标志位置一 } uint8_t massage_index = 0; //子设备上报开关状态至云平台 推送 参数说明: sub_num 子设备序号 0表示设备1... void subDeviceReportingSwitchStatus(uint8_t sub_num,uint8_t *data) { uint8_t sub_sensor_online_count = 0; if(massage_index > 9) massage_index = 1; sub_sensor_online_count = SubAttribute_Struct[sub_num].Water_PH_OnLine + SubAttribute_Struct[sub_num].Envir_Press_OnLine + SubAttribute_Struct[sub_num].Water_DissOxy_OnLine + SubAttribute_Struct[sub_num].Envir_Byx_OnLine + SubAttribute_Struct[sub_num].Leaf_TH_OnLine + SubAttribute_Struct[sub_num].Soil_TH_OnLine + SubAttribute_Struct[sub_num].Soil_NPK_OnLine + SubAttribute_Struct[sub_num].Soil_PH_OnLine + SubAttribute_Struct[sub_num].Soil_EC_OnLine; u1_printf("接收到子设备%d的数据。\r\n",sub_num + 1); memcpy(&SubAttribute_Struct[sub_num],&data[1],ATTRIBUTE_STRUCT_LEN); //拷贝数据 u1_printf("开关1:%d\r\n",SubAttribute_Struct[sub_num].Switch1Sta); //串口输出数据 u1_printf("开关2:%d\r\n",SubAttribute_Struct[sub_num].Switch2Sta); //串口输出数据 u1_printf("开关3:%d\r\n",SubAttribute_Struct[sub_num].Switch3Sta); //串口输出数据 u1_printf("开关4:%d\r\n",SubAttribute_Struct[sub_num].Switch4Sta); //串口输出数据 u1_printf("子设备%d的传感器在线数量:%d\r\n",sub_num + 1,sub_sensor_online_count); CAT1_printf("AT+MPUB=\"/iot/sub/prop/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.prop.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22subs\\22:[{\\22uid\\22:\\22%s\\22,\\22props\\22:{\\22BAT_VAL\\22:%d,\\22sw1\\22:%d,\\22sw2\\22:%d,\\22sw3\\22:%d,\\22sw4\\22:%d}}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubAttribute_Struct[sub_num].Sub_BAT, SubAttribute_Struct[sub_num].Switch1Sta, SubAttribute_Struct[sub_num].Switch2Sta, SubAttribute_Struct[sub_num].Switch3Sta, SubAttribute_Struct[sub_num].Switch4Sta);//回复数据 HAL_Delay(1000); /*****************************************************************************/ /* 开始推送在线的传感器数据至云平台 */ /*****************************************************************************/ switch (massage_index){ case 1: if(SubAttribute_Struct[sub_num].Water_PH_OnLine) { //如果在线则推送消息至云平台 CAT1_printf("AT+MPUB=\"/iot/sub/prop/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.prop.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22subs\\22:[{\\22uid\\22:\\22%s\\22,\\22props\\22:{\\22PH\\22:%.2f,\\22DS_T\\22:%.2f}}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubAttribute_Struct[sub_num].Water_PH, SubAttribute_Struct[sub_num].Water_Temp);//回复数据 } break; case 2: if(SubAttribute_Struct[sub_num].Envir_Press_OnLine){ CAT1_printf("AT+MPUB=\"/iot/sub/prop/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.prop.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22subs\\22:[{\\22uid\\22:\\22%s\\22,\\22props\\22:{\\22BS_RH\\22:%.2f,\\22BS_T\\22:%.2f,\\22BS_DO\\22:%.2f}}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubAttribute_Struct[sub_num].Envir_PressHumi, SubAttribute_Struct[sub_num].Envir_PressTemp, SubAttribute_Struct[sub_num].Envir_Press);//回复数据 } break; case 3: if(SubAttribute_Struct[sub_num].Water_DissOxy_OnLine){ CAT1_printf("AT+MPUB=\"/iot/sub/prop/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.prop.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22subs\\22:[{\\22uid\\22:\\22%s\\22,\\22props\\22:{\\22DO\\22:%.2f}}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubAttribute_Struct[sub_num].Water_DissOxy);//回复数据 } break; case 4: if(SubAttribute_Struct[sub_num].Envir_Byx_OnLine){ CAT1_printf("AT+MPUB=\"/iot/sub/prop/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.prop.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22subs\\22:[{\\22uid\\22:\\22%s\\22,\\22props\\22:{\\22BY_CO2\\22:%.2f,\\22BY_HV\\22:%d,\\22BY_RH\\22:%.2f,\\22BY_TP\\22:%.2f,}}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubAttribute_Struct[sub_num].Envir_Co2, SubAttribute_Struct[sub_num].Envir_Light, SubAttribute_Struct[sub_num].Envir_Humi, SubAttribute_Struct[sub_num].Envir_Temp);//回复数据 } break; case 5: if(SubAttribute_Struct[sub_num].Leaf_TH_OnLine){ CAT1_printf("AT+MPUB=\"/iot/sub/prop/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.prop.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22subs\\22:[{\\22uid\\22:\\22%s\\22,\\22props\\22:{\\22YSMD_RH\\22:%.2f,\\22YSMD_TP\\22:%.2f}}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubAttribute_Struct[sub_num].Leaf_Humi, SubAttribute_Struct[sub_num].Leaf_Temp);//回复数据 } break; case 6: if(SubAttribute_Struct[sub_num].Soil_TH_OnLine){ CAT1_printf("AT+MPUB=\"/iot/sub/prop/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.prop.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22subs\\22:[{\\22uid\\22:\\22%s\\22,\\22props\\22:{\\22SOIL_RH\\22:%.2f,\\22SOIL_TP\\22:%.2f}}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubAttribute_Struct[sub_num].Soil_Humi, SubAttribute_Struct[sub_num].Soil_Temp);//回复数据 } break; case 7: if(SubAttribute_Struct[sub_num].Soil_NPK_OnLine){ CAT1_printf("AT+MPUB=\"/iot/sub/prop/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.prop.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22subs\\22:[{\\22uid\\22:\\22%s\\22,\\22props\\22:{\\22SOIL_NV\\22:%.2f,\\22SOIL_PV\\22:%.2f,\\22SOIL_KV\\22:%.2f}}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubAttribute_Struct[sub_num].Soil_NV, SubAttribute_Struct[sub_num].Soil_PV, SubAttribute_Struct[sub_num].Soil_KV);//回复数据 } break; case 8: if(SubAttribute_Struct[sub_num].Soil_PH_OnLine){ CAT1_printf("AT+MPUB=\"/iot/sub/prop/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.prop.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22subs\\22:[{\\22uid\\22:\\22%s\\22,\\22props\\22:{\\22SOIL_PH\\22:%.2f}}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubAttribute_Struct[sub_num].Soil_PH);//回复数据 } break; case 9: if(SubAttribute_Struct[sub_num].Soil_EC_OnLine){ CAT1_printf("AT+MPUB=\"/iot/sub/prop/post/%s\",0,0,\"{\\22header\\22:\\22iot.sub.prop.post\\22,\\22version\\22:\\221.0\\22,\\22body\\22:{\\22subs\\22:[{\\22uid\\22:\\22%s\\22,\\22props\\22:{\\22SOIL_RV\\22:%.2f}}]}}\"\r\n", GwMqttInfo_Struct.ClientID, SubMqttInfo_Struct[sub_num].ClientID, SubAttribute_Struct[sub_num].Soil_EC);//回复数据 } break; default: break; } massage_index++; }