当前位置: 首页 > news >正文

单片机IWIP MQTT实验

单片机 :STM32F407
开发板:DMF407电机开发板
平台:keil V5.31

HSE 为8MHZ
HSI为16MHZ

一、Aliyun

主函数

int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */ delay_init(168); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ usmart_dev.init(84); /* 初始化USMART */ led_init(); /* 初始化LED */ lcd_init(); /* 初始化LCD */ key_init(); /* 初始化按键 */ my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */ my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */ freertos_demo(); /* 创建lwIP的任务函数 */ }
void freertos_demo(void) { /* start_task任务 */ xTaskCreate((TaskFunction_t )start_task, (const char * )"start_task", (uint16_t )START_STK_SIZE, (void * )NULL, (UBaseType_t )START_TASK_PRIO, (TaskHandle_t * )&StartTask_Handler); vTaskStartScheduler(); /* 开启任务调度 */ }
void start_task(void *pvParameters) { pvParameters = pvParameters; g_lwipdev.lwip_display_fn = lwip_test_ui; lwip_test_ui(1); /* 加载后前部分UI */ while (lwip_comm_init() != 0) { lcd_show_string(30, 110, 200, 16, 16, "lwIP Init failed!!", RED); delay_ms(500); lcd_fill(30, 50, 200 + 30, 50 + 16, WHITE); lcd_show_string(30, 110, 200, 16, 16, "Retrying... ", RED); delay_ms(500); LED1_TOGGLE(); } while (!ethernet_read_phy(PHY_SR)) /* 检查MCU与PHY芯片是否通信成功 */ { printf("MCU与PHY芯片通信失败,请检查电路或者源码!!!!\r\n"); } while ((g_lwipdev.dhcpstatus != 2) && (g_lwipdev.dhcpstatus != 0XFF)) /* 等待DHCP获取成功/超时溢出 */ { vTaskDelay(5); } taskENTER_CRITICAL(); /* 进入临界区 */ /* 创建lwIP任务 */ xTaskCreate((TaskFunction_t )lwip_demo_task, (const char* )"lwip_demo_task", (uint16_t )LWIP_DMEO_STK_SIZE, (void* )NULL, (UBaseType_t )LWIP_DMEO_TASK_PRIO, (TaskHandle_t* )&LWIP_Task_Handler); /* LED测试任务 */ xTaskCreate((TaskFunction_t )led_task, (const char* )"led_task", (uint16_t )LED_STK_SIZE, (void* )NULL, (UBaseType_t )LED_TASK_PRIO, (TaskHandle_t* )&LEDTask_Handler); vTaskDelete(StartTask_Handler); /* 删除开始任务 */ taskEXIT_CRITICAL(); /* 退出临界区 */ }
void lwip_demo_task(void *pvParameters) { pvParameters = pvParameters; lwip_demo(); while (1) { vTaskDelay(5); } }
void lwip_demo(void) { struct hostent *server; static struct mqtt_connect_client_info_t mqtt_client_info; server = gethostbyname((char *)HOST_NAME); /* 对oneNET服务器地址解析 */ memcpy(&g_mqtt_ip,server->h_addr,server->h_length); /* 把解析好的地址存放在mqtt_ip变量当中 */ char *PASSWORD; PASSWORD = mymalloc(SRAMIN, 300); /* 为密码申请内存 */ lwip_ali_get_password(DEVICE_SECRET, CONTENT, PASSWORD); /* 通过hmac_sha1算法得到password */ /* 设置一个空的客户端信息结构 */ memset(&mqtt_client_info, 0, sizeof(mqtt_client_info)); /* 设置客户端的信息量 */ mqtt_client_info.client_id = (char *)CLIENT_ID; /* 设备名称 */ mqtt_client_info.client_user = (char *)USER_NAME; /* 产品ID */ mqtt_client_info.client_pass = (char *)PASSWORD; /* 计算出来的密码 */ mqtt_client_info.keep_alive = 100; /* 保活时间 */ mqtt_client_info.will_msg = NULL; mqtt_client_info.will_qos = NULL; mqtt_client_info.will_retain = 0; mqtt_client_info.will_topic = 0; myfree(SRAMIN, PASSWORD); /* 释放内存 */ /* 创建MQTT客户端控制块 */ g_mqtt_client = mqtt_client_new(); /* 连接服务器 */ mqtt_client_connect(g_mqtt_client, /* 服务器控制块 */ &g_mqtt_ip, MQTT_PORT,/* 服务器IP与端口号 */ mqtt_connection_cb, LWIP_CONST_CAST(void*, &mqtt_client_info),/* 设置服务器连接回调函数 */ &mqtt_client_info); /* MQTT连接信息 */ while(1) { if (g_publish_flag == 1) { g_temp = 30 + rand() % 10 + 1; /* 温度的数据 */ g_humid = 54.8 + rand() % 10 + 1;/* 湿度的数据 */ sprintf((char *)g_payload_out, "{\"params\":{\"CurrentTemperature\":+%0.1f,\"RelativeHumidity\":%0.1f},\"method\":\"thing.event.property.post\"}", g_temp, g_humid); g_payload_out_len = strlen((char *)g_payload_out); mqtt_publish(g_mqtt_client,DEVICE_PUBLISH,g_payload_out,g_payload_out_len,1,0,mqtt_publish_request_cb,NULL); } vTaskDelay(1000); } }

实验结果:

二、Onenet

主函数:

int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */ delay_init(168); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ usmart_dev.init(84); /* 初始化USMART */ led_init(); /* 初始化LED */ lcd_init(); /* 初始化LCD */ key_init(); /* 初始化按键 */ my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */ my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */ freertos_demo(); /* 创建lwIP的任务函数 */ }
void freertos_demo(void) { /* start_task任务 */ xTaskCreate((TaskFunction_t )start_task, (const char * )"start_task", (uint16_t )START_STK_SIZE, (void * )NULL, (UBaseType_t )START_TASK_PRIO, (TaskHandle_t * )&StartTask_Handler); vTaskStartScheduler(); /* 开启任务调度 */ }
void start_task(void *pvParameters) { pvParameters = pvParameters; g_lwipdev.lwip_display_fn = lwip_test_ui; lwip_test_ui(1); /* 加载后前部分UI */ while (lwip_comm_init() != 0) { lcd_show_string(30, 110, 200, 16, 16, "lwIP Init failed!!", RED); delay_ms(500); lcd_fill(30, 50, 200 + 30, 50 + 16, WHITE); lcd_show_string(30, 110, 200, 16, 16, "Retrying... ", RED); delay_ms(500); LED1_TOGGLE(); } while (!ethernet_read_phy(PHY_SR)) /* 检查MCU与PHY芯片是否通信成功 */ { printf("MCU与PHY芯片通信失败,请检查电路或者源码!!!!\r\n"); } while ((g_lwipdev.dhcpstatus != 2)&&(g_lwipdev.dhcpstatus != 0XFF)) /* 等待DHCP获取成功/超时溢出 */ vTaskDelay(5); taskENTER_CRITICAL(); /* 进入临界区 */ /* 创建lwIP任务 */ xTaskCreate((TaskFunction_t )lwip_demo_task, (const char* )"lwip_demo_task", (uint16_t )LWIP_DMEO_STK_SIZE, (void* )NULL, (UBaseType_t )LWIP_DMEO_TASK_PRIO, (TaskHandle_t* )&LWIP_Task_Handler); /* LED测试任务 */ xTaskCreate((TaskFunction_t )led_task, (const char* )"led_task", (uint16_t )LED_STK_SIZE, (void* )NULL, (UBaseType_t )LED_TASK_PRIO, (TaskHandle_t* )&LEDTask_Handler); vTaskDelete(StartTask_Handler); /* 删除开始任务 */ taskEXIT_CRITICAL(); /* 退出临界区 */ }
void lwip_demo_task(void *pvParameters) { pvParameters = pvParameters; lwip_demo(); while (1) { vTaskDelay(5); } }
void lwip_demo(void) { char pro_id[] = USER_PRODUCT_ID; /* 产品ID */ char access_key[] = USER_ACCESS_KEY; /* 产品密钥 */ char dev_name[] = USER_DEVICE_NAME; /* 设备名称 */ char dev_id[] = USER_DEVICE_ID; /* 产品设备ID */ char key[] = USER_KEY; /* 设备密钥 */ struct hostent *server; static struct mqtt_connect_client_info_t mqtt_client_info; char version[] = "2018-10-31"; unsigned int expiration_time = 1956499200; char authorization_buf[160] = {0}; server = gethostbyname((char *)HOST_NAME); /* 对oneNET服务器地址解析 */ memcpy(&g_mqtt_ip,server->h_addr,server->h_length); /* 把解析好的地址存放在mqtt_ip变量当中 */ /* 把各个参数保存在g_onenet_info结构体的成员变量中 */ memset(g_onenet_info.pro_id, 0, sizeof(g_onenet_info.pro_id)); strcpy(g_onenet_info.pro_id, pro_id); memset(g_onenet_info.access_key, 0, sizeof(g_onenet_info.access_key)); strcpy(g_onenet_info.access_key, access_key); memset(g_onenet_info.dev_name, 0, sizeof(g_onenet_info.dev_name)); strcpy(g_onenet_info.dev_name, dev_name); memset(g_onenet_info.dev_id, 0, sizeof(g_onenet_info.dev_id)); strcpy(g_onenet_info.dev_id, dev_id); memset(g_onenet_info.key, 0, sizeof(g_onenet_info.key)); strcpy(g_onenet_info.key, key); /* 根据这些参数进行解码,当然这个密码可以在token软件下解码 */ onenet_authorization(version, (char *)g_onenet_info.pro_id, expiration_time, (char *)g_onenet_info.key, (char *)g_onenet_info.dev_name, authorization_buf, sizeof(authorization_buf), 0); /* 设置一个空的客户端信息结构 */ memset(&mqtt_client_info, 0, sizeof(mqtt_client_info)); /* 设置客户端的信息量 */ mqtt_client_info.client_id = (char *)g_onenet_info.dev_name; /* 设备名称 */ mqtt_client_info.client_user = (char *)g_onenet_info.pro_id; /* 产品ID */ mqtt_client_info.client_pass = (char *)authorization_buf; /* 计算出来的密码 */ mqtt_client_info.keep_alive = 100; /* 保活时间 */ mqtt_client_info.will_msg = NULL; mqtt_client_info.will_qos = NULL; mqtt_client_info.will_retain = 0; mqtt_client_info.will_topic = 0; /* 创建MQTT客户端控制块 */ g_mqtt_client = mqtt_client_new(); /* 连接服务器 */ mqtt_client_connect(g_mqtt_client, /* 服务器控制块 */ &g_mqtt_ip, MQTT_PORT,/* 服务器IP与端口号 */ mqtt_connection_cb, LWIP_CONST_CAST(void*, &mqtt_client_info),/* 设置服务器连接回调函数 */ &mqtt_client_info); /* MQTT连接信息 */ while(1) { if (g_publish_flag == 1) { g_temp = 30 + rand() % 10 + 1; /* 温度的数据 */ g_humid = 54.8 + rand() % 10 + 1;/* 湿度的数据 */ sprintf((char *)g_payload_out, "{\"id\": 123,\"dp\": { \"temperatrue\": [{\"v\": %0.1f,}],\"power\": [{\"v\": %0.1f,}]}}", g_temp, g_humid); g_payload_out_len = strlen((char *)g_payload_out); mqtt_publish(g_mqtt_client,DEVICE_PUBLISH,g_payload_out,g_payload_out_len,1,0,mqtt_publish_request_cb,NULL); } vTaskDelay(1000); } }

实验结果:

http://www.gsyq.cn/news/1627806.html

相关文章:

  • Kiran-Screensaver性能优化指南:减少系统资源占用的5个实用技巧
  • 视频AI放大神器Video2X:5分钟将模糊视频无损升级4K画质
  • 基于Si4731与PIC18F86K22的嵌入式音频开发平台设计
  • Kiran-authentication-devices源码探秘:UKey设备绑定与认证流程的实现原理
  • 2026年,细胞技术如何服务健康管理?聚焦干细胞领域发展观察
  • ChatIG核心功能深度解析:如何实现多模型统一管理
  • 基于13DOF传感器与PIC18F24J11的惯性导航系统设计
  • MIC1557与PIC18LF46K42构建高可靠定时系统
  • GameAssist:基于计算机视觉的智能游戏辅助框架
  • OpenJFX8核心组件深度解析:从基础类到高级UI控件的全面指南
  • 计算机毕业设计之惠友电子产品网上商城的设计与实现
  • LV3296与MK20DN128VFM5嵌入式条码采集方案解析
  • 美国PC出货量下滑,科技企业相关市场动态受关注
  • Kiran-panel安全性分析:桌面面板系统的权限控制与沙盒机制
  • Gazelle常见问题排查:从网卡绑定到抓包工具(gazelle-pdump)使用详解
  • iSula 容器引擎终极教程:轻量级容器解决方案深度解析
  • kiran-log完全解析:基于zlog的Qt5与GTK3日志封装库入门指南
  • AI数字人的“情感分析”是什么技术?背后揭秘
  • Gazelle安全最佳实践:大页内存保护与进程隔离策略
  • Open WebUI + Ollama:三步搭建私有化ChatGPT,构建本地RAG知识库
  • Kiran Calendar:如何在Mate桌面快速安装和配置农历日历组件
  • Gemini Advanced订阅制解析:大模型服务进入能力付费时代
  • 2026年AI简历工具怎么选?3个底层筛选逻辑 + 4款主流工具实测避坑指南
  • AI Native, Now:阿里云 MongoDB 8.3 国内首发
  • LP5812与PIC24FJ128GA310实现RGB LED灯光控制方案
  • DeepSeek-V2企业级任务实测:结构化输出如何重构AI落地链路
  • PCF8591与PIC18LF26K22的嵌入式信号处理系统设计
  • 拯救消失的文字:novel-downloader如何成为数字阅读的守护者
  • MoA:Mixture-of-Agents Enhances Large Language ModelCapabilities混合智能体(Mixture-of-Agents)提升大语言模型能力
  • 如何快速上手openEuler/seccom-tee?零基础入门指南与核心功能解析