这是我本科毕设搞得一个小任务,现在稍微整理了其中一点内容,下面有相应的程序代码。
程序参考:
采用STM32作为主控,通过串口与ME3616通信,控制ME3616对接OneNET,将采集到的温度数据上报OneNET。
代码在GitHub:
https://github.com/sanjaywu/OneNET_ME3616_DEMO

系统总体设计

基于 STM32 和 NB-IoT 的可穿戴式老人防摔监测系统主要通过软件和硬件的相互配合
来完成相应的功能,各个功能模块通过主控 STM32F103 提供的定时器和中断以及串口等
功能相互配合使系统能够快速有效地完成工作。最终可将采集心率、老人姿态、 GPS 位置、 人体温度等传感器的数据通过 NB-IoT 模组发送给 OneNET 物联网开发平台。

主要功能:

  • ME3616模组数据传输;
  • 温湿度数据的获取;
  • MPU6050陀螺仪数据的获取;
  • mlx90614体温传感器数据的获取;
  • MAX30102心率传感器数据的获取;
  • oled显示;
  • sim900a短信功能;
  • GPS数据获取及处理;

系统程序包含的内容

主程序:

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "usart2.h"
#include "usart3.h"
#include "time3.h"
#include "time2.h"
#include "led.h"
#include "me3616.h"
#include "FreeRTOS.h"
#include "task.h"
#include "malloc.h"#include "sht20_i2c.h"
#include "sht20.h"
#include "mpu6050.h"
#include "mlx90614.h"
#include "GPS.h"
#include "sim900a.h"
#include "i2c_max30102.h"
#include "MAX30102.h"
#include "algorithm.h"
#include "oled.h"
#include "i2c_oled.h"/********************************************///extern float Pitch,Roll,Yaw;
extern unsigned char Men_heartRate[];
extern unsigned char Men_Temp[];
extern char g_sensor_value_HeartRate[5];
extern char g_sensor_value_temp[8];
extern u8 n_heart_rate_flag;
extern int32_t n_heart_rate; //心率
extern float  temp;/*******************************************/extern u8 n_heart_rate_flag;
uint8_t uch_dummy;
int key;
int Warn_flag=0;
int GPS_i = 0;
void hardware_init(void);
unsigned char i_OLED;//汉字在codetab.h中的索引
int main(void)
{   extern unsigned char Init_ing_Show[];extern unsigned char Init_fini_Show[];extern unsigned char nbiot_internet[];   hardware_init();printf("me3616 nbiot...\r\n");OLED_CLS();//清屏OLED_Fill(0x00);//全屏灭    for(i_OLED=0;i_OLED<4;i_OLED++){OLED_ShowCN(20+i_OLED*16,3,Init_ing_Show,i_OLED);//初始化中}delay_ms(500);
#if 1me3616_power_on();delay_ms(1000);#ifdef ME3616_OPEN_SLEEP_MODEme3616_sleep_config(1);      /* 打开模组休眠模式 */#elseme3616_sleep_config(0);      /* 关闭模组休眠模式 */#endifdelay_ms(100);me3616_hardware_reset();//*******************GPS*****************************/#ifdef ME3616_OPEN_GPS   //打开GPSdelay_ms(100);me3616_onenet_GPS_init();for(GPS_i=0;GPS_i<10;GPS_i++){if(strstr((const char*)USART3_RX_BUF, "+ZGPS"))   /*查到 SUCCESS,说明模组GPS下载或查询 AGNSS 数据*/{me3616_at_response(1);delay_ms(200);me3616_onenet_GPS_AskDATA();if(strstr((const char*)USART3_RX_BUF, "READY")){printf("me3616 GPS init ok ...\r\n");delay_ms(200);me3616_onenet_GPS_Run(1);break;}else printf("me3616 GPS init error XXX  \r\n");}else me3616_onenet_GPS_DowmDATA();}#endif//****************************************************/OLED_CLS();//清屏    for(i_OLED=0;i_OLED<5;i_OLED++){OLED_ShowCN(20+i_OLED*16,3,Init_fini_Show,i_OLED);//测试显示中文}delay_ms(1000);for(i_OLED=0;i_OLED<5;i_OLED++){OLED_ShowCN(20+i_OLED*16,3,nbiot_internet,i_OLED);//测试显示中文} me3616_connect_onenet_app();vTaskStartScheduler();#else//   extern const unsigned char BMP1[];
//  extern unsigned char Init_ing_Show[];
//  extern unsigned char Init_fini_Show[];
//  extern unsigned char Wait_heartRate_Test[];
//  extern unsigned char heartRate_Show[];
//  extern unsigned char System_Reset[];
//  extern unsigned char nbiot_internet[];
//  extern unsigned char nbiot_internet_ok[];extern unsigned char Men_heartRate[];extern unsigned char Men_Temp[];//    unsigned char m[]= "98";
//
//  OLED_CLS();//清屏
//  for(i_OLED=0;i_OLED<5;i_OLED++)
//  {//      OLED_ShowCN(20+i_OLED*16,3,Init_fini_Show,i_OLED);//测试显示中文
//  }
//  delay_ms(1000);
//
//  OLED_CLS();//清屏
//  for(i_OLED=0;i_OLED<5;i_OLED++)
//  {//      OLED_ShowCN(20+i_OLED*16,3,nbiot_internet,i_OLED);//测试显示中文
//  }
//  delay_ms(1000);
//  OLED_CLS();//清屏
//  OLED_ShowStr(10,3,"NB-IOT IN NET",2);
//  delay_ms(3000);
//  OLED_CLS();//清屏
//  for(i_OLED=0;i_OLED<6;i_OLED++)
//  {//      OLED_ShowCN(20+i_OLED*16,3,nbiot_internet_ok,i_OLED);//测试显示中文
//  }
//  delay_ms(1000);
//  OLED_CLS();//清屏
//  for(i_OLED=0;i_OLED<4;i_OLED++)
//  {//      OLED_ShowCN(3+i_OLED*16,1,Men_heartRate,i_OLED);//测试显示中文
//      OLED_ShowCN(3+i_OLED*16,4,Men_Temp,i_OLED);//测试显示中文
//  }
//  OLED_ShowStr(3+4*16,1,"980",2);
//  OLED_ShowStr(3+4*16,4,"36.2",2); TIM_Cmd(TIM4, ENABLE);  //使能TIMx外设while(1){memset(g_sensor_value_HeartRate, 0, sizeof(g_sensor_value_HeartRate));//心率sprintf(g_sensor_value_HeartRate, "%d", n_heart_rate);g_sensor_value_HeartRate[4] = '\0';memset(g_sensor_value_temp, 0, sizeof(g_sensor_value_temp));//心率sprintf(g_sensor_value_temp, "%0.1f", temp);g_sensor_value_temp[4] = '\0';OLED_CLS();//清屏   for(i_OLED=0;i_OLED<4;i_OLED++){OLED_ShowCN(3+i_OLED*16,1,Men_heartRate,i_OLED);//测试显示中文OLED_ShowCN(3+i_OLED*16,4,Men_Temp,i_OLED);//测试显示中文}OLED_ShowStr(3+4*16,1,(unsigned char *)g_sensor_value_HeartRate,2);OLED_ShowStr(3+4*16,4,(unsigned char *)g_sensor_value_temp,2);}            for(i_OLED=0;i_OLED<4;i_OLED++){OLED_ShowCN(3+i_OLED*16,1,Men_heartRate,i_OLED);//测试显示中文
//          OLED_ShowCN(3+i_OLED*16,4,Men_Temp,i_OLED);//测试显示中文}
//      OLED_ShowStr(3+4*16,1,Men_Temp,2);OLED_ShowStr(3+4*16,4,Men_heartRate,2);delay_ms(3000);  }
#endif}
/**************************************************************
函数名称 : hardware_init
函数功能 : 硬件初始化
输入参数 : 无
返回值      : 无
备注       : 无
**************************************************************/
void hardware_init(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级delay_init();usart1_init(115200);usart3_init(115200);USART2_init(115200);TIM3_Int_Init(8999, 7199);me3616_power_init();led_init();  Beep_init();IIC_Init();MPU6050_initialize();     //=====MPU6050初始化 DMP_Init();IIC_MAX30_Init();maxim_max30102_reset();//复位 MAX30102maxim_max30102_read_reg(REG_INTR_STATUS_1,&uch_dummy);//read and clear status registermaxim_max30102_init();//初始化MAX30102mlx90614_init();sht20_i2c_init();IIC_OLED_Init();OLED_Init();TIM4_Int_Init(9999,7199);TIM2_Int_Init(5999,719);while(!simCard_test())delay_ms(150);}

me3616.c的程序:

#define ME3616_WAKE_UP_HIGH  GPIO_SetBits(GPIOC, GPIO_Pin_7)
#define ME3616_WAKE_UP_LOW  GPIO_ResetBits(GPIOC, GPIO_Pin_7)#define ME3616_MIPLNOTIFY_TIME 25int g_opend_lifetime = 3600;
int g_addobj_objectid_3300 = 3300;
int g_addobj_objectid_3303 = 3303;
int g_addobj_objectid_3304 = 3304;
int g_addobj_objectid_3336 = 3336;
int g_observe_msgid;
int g_observe_flag;
int g_observe_objectid;
int g_observe_instanceid;
int g_observe_resourceid;
int g_discover_msgid;
int g_discover_objectid;char *g_discover_valuestring_5700 = "\"5700\"";
char *g_discover_valuestring_1314 = "\"5513;5514\"";int g_notify_resourceid_5700_sensor_value = 5700;
int g_notify_resourceid_5513_sensor_value = 5513;
int g_notify_resourceid_5514_sensor_value = 5514;//**********************************************
int a = 0;
int b = 0;
int g_observe_msgid_T[10];
//int g_observe_objectid_T[5];//char g_sensor_value_Pitch[5];
//char g_sensor_value_Roll[5];
//char g_sensor_value_Yaw[5];
char g_sensor_value_FS[5];
char g_sensor_value_Tem[5];
char g_sensor_value_Hul[5];
char g_sensor_value_Lat[15];
char g_sensor_value_Lon[15];extern char g_sensor_value_temp[8];
extern char g_sensor_value_HeartRate[5];
//extern float Pitch,Roll,Yaw;
extern float  temp;double GPS_Lat;
double GPS_Lon;
double Baidu_Lat = 36.067118;
double Baidu_Lon = 114.343343;
//114.361774,36.076296
//114.355126,36.073007
//系楼:36.067118  114.343343
u8 mpu_flag = 0;
extern int key;
extern int Warn_flag;
extern u8 n_heart_rate_flag;
extern int32_t n_heart_rate;//单次获取
//extern int32_t V_heart_rate;//均值extern unsigned char i_OLED;//汉字在codetab.h中的索引extern unsigned char Init_ing_Show[];
extern unsigned char Init_fini_Show[];
extern unsigned char System_Reset[];extern unsigned char nbiot_internet[];
extern unsigned char nbiot_internet_ok[];u8 me3616_fini_flag = 0;
//*********************************************
u16 g_hardware_times = 0;
u8 g_me3616_miplnotify_flag = 0;
extern u8 mpu_flag;
extern _sht20_data_t sht20_data_t;/* 任务句柄 */
TaskHandle_t g_me3616_process_back_result_task_handle = NULL;  /**************************************************************
函数名称 : me3616_power_init
函数功能 : me3616电源初始化
输入参数 : 无
返回值      : 无
备注       :  GPIO_Pin_4:ME3616 POWER_ON引脚GPIO_Pin_5:ME3616 RESET引脚GPIO_Pin_7:ME3616 WAKE_UP引脚
**************************************************************/
void me3616_power_init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/* 使能GPIOC时钟 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  /* 推挽输出 */GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7);
}/**************************************************************
函数名称 : me3616_power_on
函数功能 : me3616 开机
输入参数 : 无
返回值      : 无
备注       : 无
**************************************************************/
void me3616_power_on(void)
{GPIO_SetBits(GPIOC, GPIO_Pin_4);   /* 拉高power引脚开机 */delay_ms(1000);        GPIO_ResetBits(GPIOC, GPIO_Pin_4);  /* 释放power引脚 */
}/**************************************************************
函数名称 : me3616_hardware_reset
函数功能 : me3616硬件复位
输入参数 : 无
返回值      : 无
备注       : 无
**************************************************************/
void me3616_hardware_reset(void)
{GPIO_SetBits(GPIOC, GPIO_Pin_5);   /* 拉高RESET引脚开始复位 */delay_ms(600);       GPIO_ResetBits(GPIOC, GPIO_Pin_5);  /* 释放RESET引脚 */GPIO_ResetBits(GPIOC, GPIO_Pin_12);delay_ms(100);GPIO_SetBits(GPIOC, GPIO_Pin_12);delay_ms(100);GPIO_ResetBits(GPIOC, GPIO_Pin_12);printf("me3616_hardware_reset_OK!\r\n");}/**************************************************************
函数名称 : me3616_wake_up
函数功能 : me3616 外部唤醒
输入参数 : 无
返回值      : 无
备注       : 无
**************************************************************/
void me3616_wake_up(void)
{GPIO_SetBits(GPIOC, GPIO_Pin_7);   /* 拉高WAKE_UP引脚,唤醒模组 */delay_ms(100);GPIO_ResetBits(GPIOC, GPIO_Pin_7);
}/**************************************************************
函数名称 : me3616_at_response
函数功能 : 将收到的AT指令应答数据返回给电脑串口
输入参数 : mode:0,不清零USART3_RX_STA;1,清零USART3_RX_STA;
返回值      : 无
备注       : 无
**************************************************************/
void me3616_at_response(u8 mode)
{if(USART3_RX_STA & 0X8000) /* 接收到一次数据了 */{ USART3_RX_BUF[USART3_RX_STA&0X7FFF] = 0;   /* 添加结束符 */printf("%s\r\n", USART3_RX_BUF);       /* 发送到串口 */if(mode){USART3_RX_STA = 0;}}
}/**************************************************************
函数名称 : me3616_clear_recv
函数功能 : 清空接收缓冲区
输入参数 : 无
返回值      : 无
备注       : 无
**************************************************************/
void me3616_clear_recv(void)
{u16 i = 0;for(i = 0; i < USART3_MAX_RECV_LEN; i++){ USART3_RX_BUF[i] = 0;  }USART3_RX_STA = 0;
}/**************************************************************
函数名称 : me3616_check_cmd
函数功能 : me3616 发送命令后,检测接收到的应答
输入参数 : str:期待的应答结果
返回值      : NULL:没有得到期待的应答结果其他,期待应答结果的位置(str的位置)
备注       : 无
**************************************************************/
char* me3616_check_cmd(char *str)
{char *strx = 0;if(USART3_RX_STA & 0X8000)                 /* 接收到一次数据了 */{ USART3_RX_BUF[USART3_RX_STA&0X7FFF] = 0;/* 添加结束符 */strx = strstr((const char*)USART3_RX_BUF, (const char*)str);} return strx;
}/**************************************************************
函数名称 : me3616_send_cmd
函数功能 : me3616 发送命令
输入参数 : cmd:发送的命令字符串当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.ack:期待的应答结果,如果为空,则表示不需要等待应答waittime:等待时间(单位:10ms)
返回值      : 0:发送成功(得到了期待的应答结果)1:发送失败
备注       : 用此函数发送命令时,命令不需加\r\n
**************************************************************/
u8 me3616_send_cmd(char *cmd, char *ack, u16 waittime)
{   USART3_RX_STA = 0;if((u32)cmd <= 0XFF){while(0 == (USART3->SR & 0X40));/* 等待上一次数据发送完成 */USART3->DR = (u32)cmd;}else{  usart3_printf("%s\r\n", cmd);//发送命令}if(ack && waittime)       /* 需要等待应答 */{while(--waittime)  /* 等待倒计时 */{if(USART3_RX_STA & 0X8000)/* 接收到期待的应答结果 */{if(me3616_check_cmd(ack))/* 得到有效数据 */{break;}USART3_RX_STA = 0;} delay_ms(10);}if(0 == waittime){return 1;}}return 0;
} /**************************************************************
函数名称 : me3616_sleep_config
函数功能 : 模组睡眠开关
输入参数 : mode:0,关闭睡眠模式;1:开启睡眠模式
返回值      : 0:成功1:失败
备注       : 配置完之后,需要重启模组才能生效
**************************************************************/
u8 me3616_sleep_config(u8 mode)
{u8 res;if(mode){res = me3616_send_cmd("AT+ZSLR=1", "OK", 300);printf("AT+ZSLR=1\r\n");}else{res = me3616_send_cmd("AT+ZSLR=0", "OK", 300);printf("AT+ZSLR=0\r\n");}return res;
}/**************************************************************
函数名称 : me3616_onenet_miplcreate
函数功能 : me3616 创建 OneNET instance
输入参数 : 无
返回值      : 0:成功1:失败
备注       :
**************************************************************/
u8 me3616_onenet_miplcreate(void)
{u8 res;res = me3616_send_cmd("AT+MIPLCREATE", "OK", 300);    printf("%s\r\n", "AT+MIPLCREATE");return res;
}/**************************************************************
函数名称 : me3616_onenet_mipladdobj
函数功能 : 创建一个 object(对象)
输入参数 : objectid:整型,object idinstancecount:整型,instance数量instancebitmap:二进制字符串,instance bitmap例: “00101” (5 instances, only instance 1 & 3 are available)attributecount:整型,attribute count(具有 Read/Write 操作的 object 有 attribute)actioncount:整型,action count (具有 Execute 操作的 object 有 action)
返回值      : 0:成功1:失败
备注       : 无
**************************************************************/
u8 me3616_onenet_mipladdobj(int objectid, int instancecount, const char *instancebitmap,int attributecount, int actioncount)
{u8 res;char cmd_string[64];memset(cmd_string, 0, sizeof(cmd_string));sprintf(cmd_string, "AT+MIPLADDOBJ=0,%d,%d,%s,%d,%d", objectid, instancecount, instancebitmap, attributecount, actioncount);printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_miplopen
函数功能 : 设备注册到 OneNET 平台
输入参数 : lifetime:整型,注册到OneNET平台的生存时间,单位:S
返回值      : 0:成功1:失败
备注       : 无
**************************************************************/
u8 me3616_onenet_miplopen(int lifetime)
{u8 res;char cmd_string[64];memset(cmd_string, 0, sizeof(cmd_string));sprintf(cmd_string, "AT+MIPLOPEN=0,%d", lifetime);printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_miplobserve_rsp
函数功能 : 模组响应平台的 observe 请求
输入参数 : msgid:整型,消息id,+MIPLOBSERVE上报的消息idresult:整型, observe请求的结果((取消)观察结果,1表示(取消)观察成功
返回值      : 0:成功1:失败
备注       : 无
**************************************************************/
u8 me3616_onenet_miplobserve_rsp(int msgid, int result)
{u8 res;char cmd_string[64];memset(cmd_string, 0, sizeof(cmd_string));sprintf(cmd_string, "AT+MIPLOBSERVERSP=0,%d,%d", msgid, result);printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_mipldiscover_rsp
函数功能 : 模组响应平台的 observe 请求
输入参数 : msgid:整型,消息id,+ MIPLDISCOVER上报的消息idresult:整型,DISCOVER请求的结果,1表示read成功,应同时提供read内容length: 整型,响应DISCOVER 请求的valuestring长度valuestring:字符串,响应DISCOVER请求的object对应的属性
返回值      : 0:成功1:失败
备注       : 多个对象属性用“;”来分开,如5900;5750
**************************************************************/
u8 me3616_onenet_mipldiscover_rsp(int msgid, int result, int length,const char *valuestring)
{u8 res;char cmd_string[64];memset(cmd_string, 0, sizeof(cmd_string));sprintf(cmd_string, "AT+MIPLDISCOVERRSP=0,%d,%d,%d,%s", msgid, result, length, valuestring);printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_miplnotify
函数功能 : 模组向平台请求同步数据
输入参数 : msgid::整型,消息idobjectid :整型, 发送notify请求的object idinstanceid: 整型, 发送notify请求的instance idresourceid:整型, 发送 notify请求的resource idvaluetype: 整型, 发送notify请求的上报数据类型(1 string; 2 opaque; 3 integer; 4 float; 5 bool )len: 整型, 发送notify请求的上报数据长度,只有 opaque 和 string 类型数据时需要配置<len>参数信息,对其他类型数据(如浮点类型)则无需配置<len>参数信息。value: 发送notify请求的上报数据值index:整型,配置文件表示,范围从 N-1 到 0flag:消息标志,1 first message; 2 middle message; 0 last message (请填 0, 用 index 来区分, 后续所有 AT 命令里的 flag 都填 0)
返回值      : 0:成功1:失败
备注       : value在这里无字符型,在填这个参数时请将对应的类型转换为字符型
**************************************************************/
u8 me3616_onenet_miplnotify(int msgid, int objectid, int instanceid, int resourceid, int valuetype, int len,const char *value, int index, int flag)
{u8 res;char cmd_string[256];memset(cmd_string, 0, sizeof(cmd_string));sprintf(cmd_string, "AT+MIPLNOTIFY=0,%d,%d,%d,%d,%d,%d,%s,%d,%d", msgid, objectid, instanceid, resourceid, valuetype, len, value, index, flag);printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_miplupdate
函数功能 : 注册更新命令
输入参数 : lifetime:注册到 OneNET 平台的生存时间mode:1,更新objects 0,不更新objects
返回值      : 0:成功1:失败
备注       : 无
**************************************************************/
u8 me3616_onenet_miplupdate(int lifetime, u8 mode)
{u8 res;char cmd_string[64];memset(cmd_string, 0, sizeof(cmd_string));if(mode){sprintf(cmd_string, "AT+MIPLUPDATE=0,%d,1", lifetime);}else{sprintf(cmd_string, "AT+MIPLUPDATE=0,%d,0", lifetime);}printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_miplwrite_rsp
函数功能 : 模组响应平台的 WRITE 请求
输入参数 : msgid::整型,消息id,+MIPLWRITE上报的消息idresult:整型,write 请求的结果,2表示写入成功
返回值      : 0:成功1:失败
备注       : 无
**************************************************************/
u8 me3616_onenet_miplwrite_rsp(int msgid, int result)
{u8 res;char cmd_string[64];memset(cmd_string, 0, sizeof(cmd_string));sprintf(cmd_string, "AT+MIPLWRITERSP=0,%d,%d", msgid, result);printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_miplread_rsp
函数功能 : 模组响应平台的 READ 请求
输入参数 : msgid:: 整型,消息id ,+MIPLREAD 上报的消息idresult:整型, read 请求的结果,1表示成功,应同时提供read内容objectid: 整型, 响应 read 请求的 object idinstanceid: 整型, 响应 read 请求的 in stance idresourceid: 整型, 响应 read 请求的 resource idvaluetype:  整型, 响应 read 请求的上报数据类型 (1 string; 2 opaque; 3 integer; 4 float; 5 bool )len:整型, 响应 read 请求的上报数据长度,只有 opaque 和 string 类型数据时需要配置<len>参数信息,对其他类型数据(如浮点类型)则无需配置<len>参数信息。value:  整型, 响应 read 请求的上报数据值index:整型,配置文件表示,范围从 N-1 到 0flag:整型,消息标志 ,1 first message; 2 middle message; 0 last message(请填 0, 用 index 来区分, 后续所有 AT 命令里的 flag 都填 0)
返回值      : 0:成功1:失败
备注       : value在这里无字符型,在填这个参数时请将对应的类型转换为字符型
**************************************************************/
u8 me3616_onenet_miplread_rsp(int msgid, int result, int objectid, int instanceid, int resourceid, int valuetype,int len, const char *value, int index, int flag)
{u8 res;char cmd_string[256];memset(cmd_string, 0, sizeof(cmd_string));sprintf(cmd_string, "AT+MIPLREADRSP=0,%d,%d,%d,%d,%d,%d,%d,%s,%d,%d", msgid, result, objectid, instanceid, resourceid, valuetype, len, value, index, flag);printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_miplexecute_rsp
函数功能 : 模组响应平台的 execute 请求
输入参数 : msgid:整型,消息id,+MIPLEXEUTERSP上报的消息idresult:整型,execute请求的结果,2表示execute成功
返回值      : 0:成功1:失败
备注       : 无
**************************************************************/
u8 me3616_onenet_miplexecute_rsp(int msgid, int result)
{u8 res;char cmd_string[64];memset(cmd_string, 0, sizeof(cmd_string));sprintf(cmd_string, "AT+MIPLEXEUTERSP=0,%d,%d", msgid, result);printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_miplparameter_rsp
函数功能 : 模组响应平台的设置 paramete 请求
输入参数 : msgid:整型,消息id,+MIPLPARAMETER上报的消息idresult:整型, 设置parameter请求的结果,1表示设置参数成功
返回值      : 0:成功1:失败
备注       : 无
**************************************************************/
u8 me3616_onenet_miplparameter_rsp(int msgid, int result)
{u8 res;char cmd_string[64];memset(cmd_string, 0, sizeof(cmd_string));sprintf(cmd_string, "AT+MIPLPARAMETERRSP=0,%d,%d", msgid, result);printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_miplclose
函数功能 : 模组向平台发起注销请求
输入参数 : 无
返回值      : 0:成功1:失败
备注       : 无
**************************************************************/
u8 me3616_onenet_miplclose(void)
{u8 res;res = me3616_send_cmd("AT+MIPLCLOSE=0", "OK", 300);printf("AT+MIPLCLOSE=0\r\n");return res;
}/**************************************************************
函数名称 : me3616_onenet_mipldelobj
函数功能 : 删除一个 object(对象)
输入参数 : objectid:object id
返回值      : 0:成功1:失败
备注       : 无
**************************************************************/
u8 me3616_onenet_mipldelobj(int objectid)
{u8 res;char cmd_string[64];memset(cmd_string, 0, sizeof(cmd_string));sprintf(cmd_string, "AT+MIPLDELOBJ=0,%d", objectid);printf("%s\r\n", cmd_string);res = me3616_send_cmd(cmd_string, "OK", 300);return res;
}/**************************************************************
函数名称 : me3616_onenet_mipldelete
函数功能 : 删除 OneNET instance
输入参数 : 无
返回值      : 0:成功1:失败
备注       : 无
**************************************************************/
u8 me3616_onenet_mipldelete(void)
{u8 res;res = me3616_send_cmd("AT+MIPLDELETE=0", "OK", 300);printf("AT+MIPLDELETE=0\r\n");return res;
}/**************************************************************
函数名称 : me3616_parse_onenet_miplobserve
函数功能 : 解析平台向模组发起 observe 请求参数
输入参数 : 要解析的参数
返回值      : 无
备注       : 无
**************************************************************/
void me3616_parse_onenet_miplobserve(int *msgid, int *flag, int *objectid, int *instanceid, int *resourceid)
{char *token = NULL;/* 用strtok函数解析 */token = strtok(strstr((const char*)USART3_RX_BUF, "+MIPLOBSERVE"), ", ");token = strtok(NULL, ", ");token = strtok(NULL, ", ");*msgid = atoi(token);token = strtok(NULL, ", ");*flag = atoi(token);token = strtok(NULL, ", ");*objectid = atoi(token);token = strtok(NULL, ", ");*instanceid = atoi(token);token = strtok(NULL, ", ");*resourceid = atoi(token);
}/**************************************************************
函数名称 : me3616_parse_onenet_mipldiscover
函数功能 : 解析平台向模组发起 discover 请求参数
输入参数 : 要解析的参数
返回值      : 无
备注       : 无
**************************************************************/
void me3616_parse_onenet_mipldiscover(int *msgid, int *objectid)
{char *token = NULL;/* 用strtok函数解析 */token = strtok(strstr((const char*)USART3_RX_BUF, "+MIPLDISCOVER"), ", ");token = strtok(NULL, ", ");token = strtok(NULL, ", ");*msgid =atoi(token);token = strtok(NULL, ", ");*objectid =atoi(token);
}/**************************************************************
函数名称 : me3616_parse_onenet_mipldwrite
函数功能 : 解析平台向模组发起 write 请求参数
输入参数 : 要解析的参数
返回值      : 无
备注       : 无
**************************************************************/
void me3616_parse_onenet_mipldwrite(int *msgid, int *objectid, int *instanceid, int *resourceid, int *valuetype, int *len, char *value, int *flag, int *index)
{char *token = NULL;/* 用strtok函数解析 */token = strtok(strstr((const char*)USART3_RX_BUF, "+MIPLWRITE"), ", ");token = strtok(NULL, ", ");token = strtok(NULL, ", ");*msgid =atoi(token);token = strtok(NULL, ", ");*objectid = atoi(token);token = strtok(NULL, ", ");*instanceid = atoi(token);token = strtok(NULL, ", ");*resourceid = atoi(token);token = strtok(NULL, ", ");*valuetype = atoi(token);token = strtok(NULL, ", ");*len = atoi(token);token = strtok(NULL, ", ");sprintf((char*)value, "%s", token);token = strtok(NULL, ", ");*flag = atoi(token);token = strtok(NULL, ", ");*index = atoi(token);
}/**************************************************************
函数名称 : me3616_parse_onenet_miplread
函数功能 : 解析OneNET 平台向模组发起 read 请求参数
输入参数 : 要解析的参数
返回值      : 无
备注       : 无
**************************************************************/
void me3616_parse_onenet_miplread(int *msgid, int *objectid, int *instanceid, int *resourceid)
{char *token = NULL;/* 用strtok函数解析 */token = strtok(strstr((const char*)USART3_RX_BUF, "+MIPLREAD"), ", ");token = strtok(NULL, ", ");token = strtok(NULL, ", ");*msgid =atoi(token);token = strtok(NULL, ", ");*objectid = atoi(token);token = strtok(NULL, ", ");*instanceid = atoi(token);token = strtok(NULL, ", ");*resourceid = atoi(token);
}/**************************************************************
函数名称 : me3616_registered_to_onenet
函数功能 : 设备注册到OneNET平台
输入参数 : 无
返回值      : 无
备注       : 无
**************************************************************/
void me3616_registered_to_onenet(void)
{   if(0 == me3616_onenet_miplclose()){printf("AT+MIPLCLOSE OK\r\n");}delay_ms(300);
//*********************************************************me3616_onenet_mipldelobj(g_addobj_objectid_3300);delay_ms(300);me3616_onenet_mipldelobj(g_addobj_objectid_3303);delay_ms(300);me3616_onenet_mipldelobj(g_addobj_objectid_3304);delay_ms(300);me3616_onenet_mipldelobj(g_addobj_objectid_3336);delay_ms(300);//*********************************************************  if(0 == me3616_onenet_mipldelete()){printf("AT+MIPLDELETE OK\r\n");}delay_ms(300);if(0 == me3616_onenet_miplcreate()){printf("AT+MIPLCREATE OK\r\n");}delay_ms(300);
/**********************************************************************/me3616_onenet_mipladdobj(g_addobj_objectid_3300, 3, "\"111\"", 1, 0);delay_ms(300);me3616_onenet_mipladdobj(g_addobj_objectid_3303, 1, "\"1\"", 1, 0);delay_ms(300);me3616_onenet_mipladdobj(g_addobj_objectid_3304, 1, "\"1\"", 1, 0);delay_ms(300);   me3616_onenet_mipladdobj(g_addobj_objectid_3336, 1, "\"1\"", 2, 0);delay_ms(300);/**********************************************************************/   if(0 == me3616_onenet_miplopen(g_opend_lifetime)){printf("AT+MIPLOPEN OK\r\n");}delay_ms(300);
}/**************************************************************
函数名称 : me3616_onenet_miplnotify_process
函数功能 : 数据上报到OneNET平台
输入参数 : 无
返回值      : 无
备注       : 无
**************************************************************/
void me3616_onenet_miplnotify_process(void)
{TIM_SetCounter(TIM3, 0);   /* 计数器清空 */TIM_Cmd(TIM3, DISABLE);      /* 关闭TIMx */TIM_SetCounter(TIM2, 0);    /* 计数器清空 */TIM_Cmd(TIM2, DISABLE);TIM_SetCounter(TIM4, 0);  /* 计数器清空 */TIM_Cmd(TIM4, DISABLE);g_hardware_times = 0;//*******************************************************************/printf("notify to onenet\r\n");Falldetection();memset(g_sensor_value_Tem, 0, sizeof(g_sensor_value_Tem));memset(g_sensor_value_Hul, 0, sizeof(g_sensor_value_Hul));sht20_get_value();sprintf(g_sensor_value_Tem, "%0.1f", sht20_data_t.sht20_temperture);//温湿度sprintf(g_sensor_value_Hul, "%0.1f", sht20_data_t.sht20_humidity);g_sensor_value_Tem[4] = '\0';g_sensor_value_Hul[4] = '\0';
/**********************************************************************/
//      memset(g_sensor_value_Pitch, 0, sizeof(g_sensor_value_Pitch));
//      sprintf(g_sensor_value_Pitch, "%d", (int)Pitch);
//      g_sensor_value_Pitch[4] = '\0';
//      memset(g_sensor_value_Roll, 0, sizeof(g_sensor_value_Roll));
//      sprintf(g_sensor_value_Roll, "%d", (int)Roll);
//      g_sensor_value_Roll[4] = '\0';
//      memset(g_sensor_value_Yaw, 0, sizeof(g_sensor_value_Yaw));
//      sprintf(g_sensor_value_Yaw, "%d", (int)Yaw);
//      g_sensor_value_Yaw[4] = '\0';
/*********************************************************************/memset(g_sensor_value_FS, 0, sizeof(g_sensor_value_FS));//老人姿态sprintf(g_sensor_value_FS, "%d", mpu_flag);  g_sensor_value_FS[4] = '\0';memset(g_sensor_value_temp, 0, sizeof(g_sensor_value_temp));//人体温度sprintf(g_sensor_value_temp, "%0.2f", temp); g_sensor_value_temp[7] = '\0';memset(g_sensor_value_HeartRate, 0, sizeof(g_sensor_value_HeartRate));//心率sprintf(g_sensor_value_HeartRate, "%d", n_heart_rate);g_sensor_value_HeartRate[4] = '\0';memset(g_sensor_value_Lat, 0, sizeof(g_sensor_value_Lat));//GPSmemset(g_sensor_value_Lon, 0, sizeof(g_sensor_value_Lon));sprintf(g_sensor_value_Lat, "%f", Baidu_Lat);sprintf(g_sensor_value_Lon, "%f", Baidu_Lon);g_sensor_value_Lat[14] = '\0';g_sensor_value_Lon[14] = '\0';//*********************************************************************/  //报警模式下if(Warn_flag == 1){me3616_onenet_miplnotify(g_observe_msgid_T[0], g_addobj_objectid_3300, 0, g_notify_resourceid_5700_sensor_value, 4, 4, g_sensor_value_FS, 0, 0);//人体姿态检测delay_ms(100);me3616_onenet_miplnotify(g_observe_msgid_T[5], g_addobj_objectid_3336, 0, g_notify_resourceid_5513_sensor_value, 1, strlen(g_sensor_value_Lat), g_sensor_value_Lat, 1, 1);//纬度delay_ms(100);me3616_onenet_miplnotify(g_observe_msgid_T[5], g_addobj_objectid_3336, 0, g_notify_resourceid_5514_sensor_value, 1, strlen(g_sensor_value_Lon), g_sensor_value_Lon, 0, 0);//经度delay_ms(100);}else//非报警模式下{if(temp>=10){me3616_onenet_miplnotify(g_observe_msgid_T[1], g_addobj_objectid_3300, 1, g_notify_resourceid_5700_sensor_value, 4, 4, g_sensor_value_temp, 0, 0);//人体温度}delay_ms(100);if((n_heart_rate<170)&&(n_heart_rate>10)){me3616_onenet_miplnotify(g_observe_msgid_T[2], g_addobj_objectid_3300, 2, g_notify_resourceid_5700_sensor_value, 4, 4, g_sensor_value_HeartRate, 0, 0);//人体心率}}delay_ms(100);me3616_onenet_miplnotify(g_observe_msgid_T[3], g_addobj_objectid_3303, 0, g_notify_resourceid_5700_sensor_value, 4, 4, g_sensor_value_Tem, 0, 0);//空气温度delay_ms(100);  me3616_onenet_miplnotify(g_observe_msgid_T[4], g_addobj_objectid_3304, 0, g_notify_resourceid_5700_sensor_value, 4, 4, g_sensor_value_Hul, 0, 0);//空气湿度delay_ms(100);//***************************************************  me3616_onenet_miplupdate(g_opend_lifetime, 1);  g_me3616_miplnotify_flag = 0;TIM_Cmd(TIM3, ENABLE);    /* 使能TIMx */if(Warn_flag == 0) TIM_Cmd(TIM4, ENABLE);     /* 使能TIMx */if(Warn_flag == 0) TIM_Cmd(TIM2, ENABLE);     /* 使能TIMx */}/**************************************************************
函数名称 : me3616_process_back_result_task
函数功能 : 模组返回结果任务处理任务
输入参数 : parameter
返回值      : 无
备注       : 无
**************************************************************/
void me3616_process_back_result_task(void *parameter)
{while(1){if(USART3_RX_STA & 0X8000){if(strstr((const char*)USART3_RX_BUF, "+MIPLEVENT") && (0 == g_me3616_miplnotify_flag)){if(strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 25") || strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 8") \|| strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 7") || strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 5") \|| strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 9") || strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 10") \|| strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 12") || strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 13") \|| strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 20") || strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 3")){me3616_at_response(1);g_hardware_times = 0;TIM_Cmd(TIM3, DISABLE);  /* 关闭TIMx */me3616_hardware_reset(); /* 执行硬件复位重启 */}else if(strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 14")){me3616_onenet_miplupdate(g_opend_lifetime, 1);}me3616_at_response(1);}
//          #ifdef ME3616_OPEN_SLEEP_MODE
//          else if(strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 4") && (1 == g_me3616_miplnotify_flag))
//          {//              me3616_onenet_miplnotify_process();
//          }
            #else
            else if(1 == g_me3616_miplnotify_flag)
            {                me3616_onenet_miplnotify_process();

            }
//          #endifelse if(strstr((const char*)USART3_RX_BUF, "+MIPLOBSERVE")){/***************************************************************************me3616_parse_onenet_miplobserve(&g_observe_msgid, &g_observe_flag, &g_observe_objectid, &g_observe_instanceid, &g_observe_resourceid);me3616_at_response(1);delay_ms(300);if(me3616_onenet_miplobserve_rsp(g_observe_msgid, 1)==0){g_observe_msgid_T[a++] = g_observe_msgid;g_observe_objectid_T[b++] = g_observe_objectid;    }*****************************************************************************/me3616_parse_onenet_miplobserve(&g_observe_msgid, &g_observe_flag, &g_observe_objectid, &g_observe_instanceid, &g_observe_resourceid);me3616_at_response(1);delay_ms(300);if((g_observe_objectid == 3300)&&(g_observe_instanceid == 0)){me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);g_observe_msgid_T[a++] = g_observe_msgid;   }if((g_observe_objectid == 3300)&&(g_observe_instanceid == 1)){me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);g_observe_msgid_T[a++] = g_observe_msgid;   }if((g_observe_objectid == 3300)&&(g_observe_instanceid == 2)){me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);g_observe_msgid_T[a++] = g_observe_msgid;   }if((g_observe_objectid == 3303)&&(g_observe_instanceid == 0)){me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);g_observe_msgid_T[a++] = g_observe_msgid;   }if((g_observe_objectid == 3304)&&(g_observe_instanceid == 0)){me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);g_observe_msgid_T[a++] = g_observe_msgid;   }               if((g_observe_objectid == 3336)&&(g_observe_instanceid == 0)){me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);g_observe_msgid_T[a++] = g_observe_msgid;    }}else if(strstr((const char*)USART3_RX_BUF, "+MIPLDISCOVER")){me3616_parse_onenet_mipldiscover(&g_discover_msgid, &g_discover_objectid);me3616_at_response(1);delay_ms(300);if(g_discover_objectid == 3300){me3616_onenet_mipldiscover_rsp(g_discover_msgid, 1, 4, g_discover_valuestring_5700);me3616_at_response(1);delay_ms(300);}if(g_discover_objectid == 3303){me3616_onenet_mipldiscover_rsp(g_discover_msgid, 1, 4, g_discover_valuestring_5700);me3616_at_response(1);delay_ms(300);}if(g_discover_objectid == 3304){me3616_onenet_mipldiscover_rsp(g_discover_msgid, 1, 4, g_discover_valuestring_5700);me3616_at_response(1);delay_ms(300);}if(g_discover_objectid == 3336){me3616_onenet_mipldiscover_rsp(g_discover_msgid, 1, 9, g_discover_valuestring_1314);me3616_at_response(1);delay_ms(300);TIM_Cmd(TIM2, ENABLE);  //使能TIMx外设TIM_Cmd(TIM4, ENABLE);  //使能TIMx外设OLED_CLS();//清屏for(i_OLED=0;i_OLED<6;i_OLED++){OLED_ShowCN(20+i_OLED*16,3,nbiot_internet_ok,i_OLED);//测试显示中文}delay_ms(500);me3616_onenet_miplnotify_process();me3616_fini_flag = 1;}}else if(strstr((const char*)USART3_RX_BUF, "+CIS ERROR")){me3616_at_response(1);g_hardware_times = 0;TIM_Cmd(TIM3, DISABLE);    /* 关闭TIMx */me3616_hardware_reset();    /* 执行硬件复位重启 */}else if(strstr((const char*)USART3_RX_BUF, "auto-reboot"))/* 模组发生异常重启现象 */{me3616_at_response(1);g_hardware_times = 0;TIM_Cmd(TIM3, DISABLE);  /* 关闭TIMx */}else if(strstr((const char*)USART3_RX_BUF, "+IP")) /* 查到IP,说明模组开机或者重启后注册上网络了 */{me3616_at_response(1);printf("me3616 network registed...\r\n");OLED_CLS();//清屏OLED_ShowStr(10,3,"NB-IOT IN NET",2);delay_ms(100);me3616_registered_to_onenet();}//******************************************GPS***********************************************************/         else if(strstr((const char*)USART3_RX_BUF, "$GNGLL")) /*查到 +ZGPS,说明模组GPS下载或查询 AGNSS 数据*/{me3616_at_response(1);printf("me3616 GPS data processing ...\r\n");me3616_onenet_GPS_parse_data( &GPS_Lat, &GPS_Lon);delay_ms(300);Baidu_Lat = me3616_onenet_GPS_data_Convert(GPS_Lat);delay_ms(300);Baidu_Lon = me3616_onenet_GPS_data_Convert(GPS_Lon);printf("\nBaidu_Lat:%f\r\n",Baidu_Lat);printf("\nBaidu_Lon:%f\r\n",Baidu_Lon);}else if(strstr((const char*)USART3_RX_BUF, "TIMEOUT")){me3616_at_response(1);me3616_onenet_GPS_Run(1);}//*****************************************************************************************************/else{me3616_at_response(1);}}
/*****************************************************************************/ if(1 == g_me3616_miplnotify_flag)   //定时notify发送数据{me3616_onenet_miplnotify_process();}//     t=Falldetection();key=KEY_Scan(1);    //得到键值if(key){                         switch(key){              case KEY1_PRES:    //添加报警   Warn_flag = 1;GPIO_SetBits(GPIOC, GPIO_Pin_12); //LED灭break;case KEY0_PRES:   //取消报警Warn_flag = 0;GPIO_ResetBits(GPIOC, GPIO_Pin_12);//LED亮break;}}if(Warn_flag == 1 && me3616_fini_flag == 1)//报警模式{TIM_Cmd(TIM4, DISABLE);  //关闭TIM4外设TIM_Cmd(TIM2, ENABLE);  //开启TIM2外设OLED_CLS();//清屏OLED_Fill(0x00);//全屏灭if(mpu_flag == 1 ){GPIO_ResetBits(GPIOF, GPIO_Pin_14);send_message_chinese("80014EBA8DCC50120021"); //测试短信delay_ms(100);}else GPIO_SetBits(GPIOF, GPIO_Pin_14);}else if(Warn_flag == 0 && me3616_fini_flag == 1) //非报警{    GPIO_SetBits(GPIOF, GPIO_Pin_14);TIM_Cmd(TIM2, DISABLE);  //关闭TIM2外设TIM_Cmd(TIM4, ENABLE);  //开启TIM4外设}
/*************************************************************************************************************/         }
}/**************************************************************
函数名称 : me3616_process_back_result_task_init
函数功能 : 创建模组返回结果处理函数
输入参数 : 无
返回值      : 无
备注       : 无
**************************************************************/
void me3616_process_back_result_task_init(void)
{if(g_me3616_process_back_result_task_handle == NULL) {xTaskCreate(me3616_process_back_result_task,"me3616_process_back_result_task",1024 * 4 / sizeof(portSTACK_TYPE),NULL,4,&g_me3616_process_back_result_task_handle);}
}/**************************************************************
函数名称 : TIM3_IRQHandler
函数功能 : 定时器3中断服务函数
输入参数 : 无
返回值      : 无
备注       : 定时来notify数据
**************************************************************/
void TIM3_IRQHandler(void)
{   if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  /* 检查TIM3更新中断发生与否 */{TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  /* 清除TIMx更新中断标志 *///      printf("g_hardware_times=%d\r\n", g_hardware_times);g_hardware_times++;if(g_hardware_times > ME3616_MIPLNOTIFY_TIME){g_me3616_miplnotify_flag = 1;printf("enter notify, g_hardware_times=%d\r\n", g_hardware_times);#ifdef ME3616_OPEN_SLEEP_MODEME3616_WAKE_UP_HIGH;usart3_printf("AT");ME3616_WAKE_UP_LOW;  #endifg_hardware_times = 0;}}
}/**************************************************************
函数名称 : me3616_connect_onenet_app
函数功能 : me3616对接OneNET应用
输入参数 : 无
返回值      : 无
备注       : 放对接OneNET的任务
**************************************************************/
void me3616_connect_onenet_app(void)
{me3616_process_back_result_task_init();
}

程序获取地址:
https://download.csdn.net/download/qq_43493099/87149710

基于 STM32 和 NB-IoT 的可穿戴式老人防摔监测系统相关推荐

  1. 【物联网开发】基于STM32和阿里云的室内温、湿、亮度监测系统(一)—— 物联网介绍和系统初步设计

    这是我的物联网开发系列文章,将介绍如何从嵌入式开发.云平台开发.Android端开发来实现一个简单的物联网应用开发,体验物联网全栈开发的过程,积累开发的经验. 本篇文章为系列文章的第一篇,主要介绍该系 ...

  2. 基于STM32+华为云IOT设计的酒驾监控系统

    1. 前言 随着人们生活水平的提高,为了减少和杜绝车的现象越来越多,所引发的交通事故也引起了人们的重视,为了减少和杜绝酒后驾车导致事故发生,当前设计了一种安装在驾驶室内,能根据具体功能进行鉴别酒精浓度 ...

  3. 基于STM32+华为云IOT设计的智能浇花系统

    一.前言 随着社会的不断发展和人们生活水平的逐渐提高,人们逐渐追求高质量的生活,很多人都会选择在家里或办公室种植一些花卉以净化家庭空气,陶冶情操,但是很多人忙于工作.学习.出差.旅游或者一些其他的原因 ...

  4. 基于STM32的RC522模块读写数据块以及电子钱包充值扣款系统的设计

    目录 前言 STM32F103ZET6单片机 RC522 相关引脚连接 准备工作 Mifare卡 读卡过程 最终实现功能 代码 RC522.C代码 RC522.H main.c led.h 前言 本人 ...

  5. 基于STM32+腾讯云IO+微信小程序设计的混凝土智能养护系统

    1. 前言 混凝土是现在建筑工程中非常重要的一个模块,在桥梁.道路.隧道.房子等等的建设上都少不了混凝土的使用:混凝土一般会与钢筋结合使用,作为建筑的承重结构,包括承重墙.楼板等等,需要用到混凝土,而 ...

  6. 基于c语言开发老人防摔系统,家有老人,做好防摔排查

    受访专家: 北京老年医院骨一科副主任医师 臧传义 老人是骨折的主要受害者,尤其是骨质疏松严重的老人,轻轻一摔就骨折了. 北京老年医院骨一科副主任医师臧传义接受<生命时报>记者采访时表示,老 ...

  7. 基于北斗RDSS短报文的海洋浮标在线水质/气象综合监测系统

    一.系统概述   全球水资源占百分之七十一,随着经济的发展,特别近海城市的污水排放已成重要的污染源,为了预防水资源的过度污染,海洋水资源监测为国家合理开发利用和保护水土资源提供系统水质资料的一项重要的 ...

  8. STM32+华为云IOT制作酒驾监控系统:上车就监控

    本文分享自华为云社区<基于STM32+华为云IOT设计的酒驾监控系统[玩转华为云]>,作者:  DS小龙哥. 1. 前言 随着人们生活水平的提高,为了减少和杜绝车的现象越来越多,所引发的交 ...

  9. 基于stm32人脸识别和红外测温

    目录 一.项目功能 二.原理图 三.实物视频 四.实物图片 五.程序 资料下载地址:基于STM32人脸识别和红外测温 一.项目功能 本系统由stm32f103c8t6单片机最小系统电路+k210人脸识 ...

最新文章

  1. iOS 进阶—— iOS内存管理
  2. matlab土体变形实例,ansys案例——20例ansys经典实例】.pdf
  3. Java 8 (8) 默认方法
  4. SpringBoot处理JSON数据
  5. 【Linux独家秘方】Linux 定时备份oracle库的数据
  6. qt自定义插件creator不显示_让Qt Creator更懂我们的自定义模块
  7. 图像处理傅里叶变换的理解及其matlab实现
  8. 数字图像处理之图像几何变换
  9. 轻松搞定RabbitMQ(二)——工作队列之消息分发机制
  10. 大数据公司Palantir曾向法拉第未来投资2500万美元
  11. 二十六、K8s系统强化2-seccomp与sysdig
  12. python如何循环sql语句_python sql 循环语句怎么写-问答-阿里云开发者社区-阿里云...
  13. 【windows】win10录屏录屏内声音
  14. java 字符串长度截取,实现java字符串长度截取功能,java字符串长度截取
  15. java 数字转换字母大写_大写字母或小写字母转换为数字
  16. Python 根据身份证号码计算持有者年龄
  17. seL4微内核操作系统初期总结 2018.10
  18. mysql查询字段最大的一条数据类型_SQL查询一个表中类别字段中Max()最大值对应的记录...
  19. IOC流程解析-BeanFactory的创建
  20. 阿里云ecs配置ssh

热门文章

  1. 在线考试系统的倒计时
  2. 智能车浅谈——过程通道篇
  3. 知云文献翻译打不开_有了这几个软件,轻松读懂英文文献
  4. Python-小游戏-乌龟吃鱼
  5. LA 4043 Ants
  6. 赛前采访里皮表示:希望队员用真心踢球。
  7. Codeforces - Pokémon Army
  8. js中返回今天是星期几的方法
  9. 大赛征集令|首届“万应杯”低代码应用开发大赛报名开启啦!
  10. DevpTips【golang】安装到测试