int main(void) { uint16_t temp, humi; //温湿度 char HTTP_Buf[400]; //HTTP报文缓存区 char tempStr[5]; //字符串格式温度 char humiStr[5]; //字符串格式湿度 int len; USART1_Config(); //USART1作为调试串口 USART2_Config(); //USART2用于连接ESP8266模块 Hal_I2C_Init(); //I2C初始化,用于连接温湿度传感器 ESP8266_Init(); //ESP8266初始化 printf("ESP8266 init over\r\n"); //SHT20_loop(); // while(1) { /* 获取温湿度 */ SHT2x_MeasureHM(SHT20_Measurement_T_HM, &temp); mDelay(500); SHT2x_MeasureHM(SHT20_Measurement_RH_HM, &humi); /* 转化为字符串形式 */ sprintf(tempStr, "%d", temp); sprintf(humiStr, "%d", humi); //printf("%s %s\r\n", tempStr, humiStr); USART2_Clear(); len = HTTP_PostPkt(HTTP_Buf, API_KEY, DEV_ID, "temp", tempStr); //HTTP组包 USART2_Write(USART2, (unsigned char *)(HTTP_Buf), len); //报文发送 printf("send HTTP msg:\r\n%s\r\n", HTTP_Buf); mDelay(1000); printf("rcv response:\r\n%s\r\n", usart2_rcv_buf); USART2_Clear(); len = HTTP_PostPkt(HTTP_Buf, API_KEY, DEV_ID, "humi", humiStr); //HTTP组包 USART2_Write(USART2, (unsigned char *)(HTTP_Buf), len); //报文发送 printf("send HTTP msg:\r\n%s\r\n", HTTP_Buf); mDelay(1000); printf("rcv response:\r\n%s\r\n", usart2_rcv_buf); mDelay(5000); } }
/* * @brief EDP协议向Onenet上传温湿度信息,使用简单字符串格式,数据点格式TYPE=5,FEILD type 2. */ void Save_TempHumToOneNet(void) { EdpPacket* send_pkg; uint16_t hum[1], temperature[1]; int8_t data_string[64] = ",;temperature,%d;hum,%d", data_string_dst[64]; SHT20_read_user_reg(); mDelay(200);//延迟,设备没有那么快的响应时间,否则总线处理忙等待 SHT2x_MeasureHM(SHT20_Measurement_RH_NHM, hum); mDelay(200); SHT2x_MeasureHM(SHT20_Measurement_T_HM, temperature); printf("%s %d hum:%d\n", __func__, __LINE__, (uint32_t)hum[0]); printf("%s %d t:%d\n", __func__, __LINE__, (uint32_t)temperature[0]); snprintf(data_string_dst, sizeof(data_string), data_string, (uint32_t)temperature[0], (uint32_t)hum[0]); printf("%s %d t:%s\n", __func__, __LINE__, data_string_dst); send_pkg = PacketSavedataSimpleString(NULL, data_string_dst); DoSend(0, (const uint8_t *)send_pkg->_data, send_pkg->_write_pos); DeleteBuffer(&send_pkg); mDelay(1000); }
void Save_AllSensorsToOneNet(void) { EdpPacket* send_pkg; uint16_t f; uint16_t hum[1], temperature[1]; int16_t adxl[3], hmc5883l[3]; /*读取温湿度*/ memset(data_string_dst, 0, sizeof(data_string_dst)); SHT20_read_user_reg(); mDelay(200);//延迟,设备没有那么快的响应时间,否则总线处理忙等 SHT2x_MeasureHM(SHT20_Measurement_T_HM, temperature); mDelay(1000); SHT2x_MeasureHM(SHT20_Measurement_RH_HM, hum); mDelay(400); f = (uint16_t)Read_BH1750(); snprintf(data_string_t, sizeof(data_string_t), ",;BH1750FVI,%d;SHT20_temperature,%d;SHT20_hum,%d;", (uint16_t)f, (uint16_t)temperature[0], (uint16_t)hum[0]); /*读取BH1750FVI*/ printf("%s\n", data_string_t); mDelay(400); /*读取ADXL345*/ ADXL345_GETXYZ(adxl); snprintf(data_string_adxl, sizeof(data_string_adxl), "ADXL345_x,0x%x;ADXL345_y,0x%0x;ADXL345_z,0x%x;", (uint16_t)adxl[0], (uint16_t)adxl[1], (uint16_t)adxl[2]); printf("%s\n", data_string_adxl); mDelay(400); /*读取HMC588CL*/ HMC5883L_GetXYZ(hmc5883l); snprintf(data_string_hmc5883l, sizeof(data_string_hmc5883l), "HMC5883L_x,0x%x;HMC5883L_y,0x%x;HMC5883L_z,0x%x", (uint16_t)hmc5883l[0], (uint16_t)hmc5883l[2], (uint16_t)hmc5883l[1]); printf("%s\n", data_string_hmc5883l); strcat(data_string_dst, data_string_t); strcat(data_string_dst, data_string_adxl); strcat(data_string_dst, data_string_hmc5883l); printf("%s\n", data_string_dst); send_pkg = PacketSavedataSimpleString(NULL, data_string_dst); DoSend(0, (const uint8_t *)send_pkg->_data, send_pkg->_write_pos); DeleteBuffer(&send_pkg); mDelay(1000); }
/* * @brief EDP协议向Onenet上传湿度信息,数据点格式TYPE=3 */ void Save_HumToOneNet(void) { EdpPacket* send_pkg; uint16_t hum[1]; SHT20_read_user_reg(); mDelay(200);//延迟,设备没有那么快的响应时间,否则总线处理忙等待 SHT2x_MeasureHM(SHT20_Measurement_RH_NHM, hum); printf("%s %d hum:%d\n", __func__, __LINE__, (uint32_t)hum[0]); send_pkg = PacketSavedataInt(kTypeSimpleJsonWithoutTime, NULL, "hum", (uint32_t)hum[0], 0, NULL); DoSend(0, (const uint8_t *)send_pkg->_data, send_pkg->_write_pos); DeleteBuffer(&send_pkg); mDelay(1000); }
/** * @brief 周期性发布数据,这里是测试代码,发布温湿度和一个状态信息,三个数据流轮流发布 * @param ctx:上下文变量 * @param cause:发布原因,TIMEOUT,定时发送,EVENT则是由设备事件触发 * @retval ret:0,成功,<0 失败 **/ static int MqttSample_CmdPublishNormal(struct MqttSampleContext *ctx, uint8_t cause) { int err = 0, ir_index = 0; int bytes = 0; struct MqttExtent *ext; unsigned char dis[3][64] = {"未知初始状态", "设备在位", "设备离位"}; static unsigned char count = 0; int64_t ts = 0; //no time uint16_t temprature[1], rh[1]; if(ctx->publish_state != 0) { printf("publsh busy\n"); return -1; } ctx->publish_state = 1; printf("%s %d,count=%d,cause=%d\n", __func__, __LINE__, count, cause); // ts = (int64_t)time(NULL) * 1000; SHT2x_MeasureHM(SHT20_Measurement_RH_HM, temprature); mDelay(1500); SHT2x_MeasureHM(SHT20_Measurement_T_HM, rh); if((count == 0) || (cause == EVENT)) { //no time if(cause == TIME_OUT) { ir_state = !ir_state; } if(ir_state == 0xff) { ir_index = 0; } if(ir_state == 0x1) { ir_index = 1; } if(ir_state == 0) { ir_index = 2; } if(count != 2) { count++; } //append data; String printf("pub state\n"); err |= Mqtt_PackDataPointStartNormal(ctx->mqttbuf, (char *)(DS_TO_PUBLISH), 1, MQTT_QOS_LEVEL2, 0, 1); ext = MqttBuffer_AllocExtent(ctx->mqttbuf, 1 + strlen(dis[ir_index])); if(!ext) { return MQTTERR_OUTOFMEMORY; } ext->payload[0] = 0x84;; memcpy(&ext->payload[1], dis[ir_index], strlen(dis[ir_index])); MqttBuffer_AppendExtent(ctx->mqttbuf, ext); } else if(count == 1) { printf("pub temprature\n"); err |= Mqtt_PackDataPointStartNormal(ctx->mqttbuf, (char *)(DS_TO_PUBLISH_T), 1, MQTT_QOS_LEVEL2, 0, 1); //append data; int32 ext = MqttBuffer_AllocExtent(ctx->mqttbuf, 1 + sizeof(int)); if(!ext) { return MQTTERR_OUTOFMEMORY; } ext->payload[0] = 0x81; ext->payload[1] = 0; ext->payload[2] = 0; ext->payload[3] = 0; ext->payload[4] = temprature[0]; MqttBuffer_AppendExtent(ctx->mqttbuf, ext); count++; } else if(count == 2) { printf("rh\n"); err |= Mqtt_PackDataPointStartNormal(ctx->mqttbuf, (char *)(DS_TO_PUBLISH_RH), 1, MQTT_QOS_LEVEL2, 0, 1); //append data; int32 ext = MqttBuffer_AllocExtent(ctx->mqttbuf, 1 + sizeof(int)); if(!ext) { return MQTTERR_OUTOFMEMORY; } ext->payload[0] = 0x81;; ext->payload[1] = 0; ext->payload[2] = 0; ext->payload[3] = 0; ext->payload[4] = rh[0]; MqttBuffer_AppendExtent(ctx->mqttbuf, ext); count = 0; } if(err) { printf("Failed to pack data point package.err=%d\n", err); return -1; } err = Mqtt_AppendLength(ctx->mqttbuf, ext->len); if(MQTTERR_NOERROR != err) { return err; } bytes = Mqtt_SendPkt(ctx->mqttctx, ctx->mqttbuf, 0); MqttBuffer_Reset(ctx->mqttbuf); return 0; }
/** * @brief 周期性发布数据,暂时没有使用,因为采用JSON发布,前端暂时不支持Json显示,但可以正常发布 * @param ctx:上下文变量 * @retval ret:0,成功,<0 失败 **/ static int MqttSample_CmdPublish(struct MqttSampleContext *ctx) { uint8_t cause = 0; //only for test int err = 0; int bytes = 0; static unsigned char count = 0; int64_t ts = 0; //no time uint16_t temprature[1], rh[1]; printf("%s %d,count=%d,cause=%d\n", __func__, __LINE__, count, cause); // ts = (int64_t)time(NULL) * 1000; SHT2x_MeasureHM(SHT20_Measurement_RH_HM, temprature); mDelay(1500); SHT2x_MeasureHM(SHT20_Measurement_T_HM, rh); err |= Mqtt_PackDataPointStart(ctx->mqttbuf, 1, MQTT_QOS_LEVEL2, 0, 1); if((count == 0) || (cause == EVENT)) { err |= Mqtt_AppendDPStartObject(ctx->mqttbuf, DS_TO_PUBLISH, ts); if(cause == TIME_OUT) { ir_state = !ir_state; } if(ir_state == 0x1) { err |= Mqtt_AppendDPSubvalueString(ctx->mqttbuf, DS_TO_PUBLISH, "设备在位"); } else if(ir_state == 0) { err |= Mqtt_AppendDPSubvalueString(ctx->mqttbuf, DS_TO_PUBLISH, "设备离位"); } else { err |= Mqtt_AppendDPSubvalueString(ctx->mqttbuf, DS_TO_PUBLISH, "未知初始状态"); } if(count != 2) { count++; } } else if(count == 1) { err |= Mqtt_AppendDPStartObject(ctx->mqttbuf, DS_TO_PUBLISH_T, ts); err |= Mqtt_AppendDPSubvalueInt(ctx->mqttbuf, DS_TO_PUBLISH_T, temprature[0]); count++; } else if(count == 2) { err |= Mqtt_AppendDPStartObject(ctx->mqttbuf, DS_TO_PUBLISH_RH, ts); err |= Mqtt_AppendDPSubvalueInt(ctx->mqttbuf, DS_TO_PUBLISH_RH, rh[0]); count = 0; } err |= Mqtt_AppendDPFinishObject(ctx->mqttbuf); err |= Mqtt_PackDataPointFinish(ctx->mqttbuf); if(err) { printf("Failed to pack data point package.err=%d\n", err); return -1; } bytes = Mqtt_SendPkt(ctx->mqttctx, ctx->mqttbuf, 0); MqttBuffer_Reset(ctx->mqttbuf); return 0; }