HAL_Project/Project -APP-V1.0/Hardware/LORA/lora.c.orig

555 lines
25 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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++;
}