xld0932

  • 2019-04-19
  • 发表了主题帖: [GD32E231 DIY大赛]——06.ESP8266软件二次开发

    本帖最后由 xld0932 于 2019-4-19 12:25 编辑     概述:乐鑫官网最新的AT文件是2018年8月24日发布的ESP8266 AT Bin V1.7.0版本,但可惜的是在ESP8266 AT指令集中并没有见到有关于MQTT操作的AT指令,所以我们需要对ESP8266模块进行二次开发,移植MQTT通讯协议,增加自定义AT指令。 1.ESP8266 SDK下载     本项目是基于ESP8266 NONOS SDK V2.2.1软件版本进行二次开发的,乐鑫官网下载链接:https://www.espressif.com/zh-hans/products/software/esp-sdk/resource 2.ESP8266开发环境部署     安信可ESP系列一体化开发环境是安信可科技为方便广大用户而推出的基于Windows +CYGWIN + Eclipse + GCC的综合IDE环境。支持ESP8266 NONOS和RTOS环境开发,可直接编译所有乐鑫官方推出的SDK开发包,无需另外配置。(相关链接:https://wiki.ai-thinker.com/esp8266)     下载AiThinkerIDE_V0.5_Setup.exe安装包,双击运行,选择自解压根路径为C:并确定(可以根据需要,选择不同的根路径进行自解压)。等待解压完成后,安装程序路径存放在C盘根目录下的AiThinkerIDE_V0.5文件夹,此时桌面上会自动添加AiThinker_IDE快捷启动图标和ConfigTool快捷配置图标。     双击ConfigTool快捷配置图标,在弹出的配置对话窗体中点击Default按键进行默认配置设置,再点击Save进行保存配置,至此ESP8266开发环境就部署完成了。如下图所示:    3.新建ESP8266项目工程    将SDK进行解压缩得到ESP8266_NONOS_SDK-2.2.1文件夹,重命名为ESP8266_DIY。在ESP8266_DIY->example目录下有一个esp_mqtt_proj的例程,这就是我们用到的基于移植好MQTT协议的项目工程。     拷贝esp_mqtt_proj到ESP8266_DIY目录下,重命名为app。将原先的example文件夹删除。将ESP8266_DIY->driver_lib目录下的driver文件夹内容移动到app目录下,include文件内容移动到app->include目录下。     打开AiThinker_IDE,点击File->Import...,在弹出的Import对话框中选择C/C++下的Existing Code as Makefile Project,点击Next。        在弹出的New Project对话框中,输入Project Name和Existing Code Location,Toolchain for Indexer Settings选择Cygwin GCC,然后点击Next。        至此ESP8266的项目工程就创建OK了,我们的应用程序主要功能就是在app\user\user_main.c这个源文件中实现的、用户自定义AT指令是在app\driver\uart.c源文件中实现的,MQTT配置定义是在app->include\mqtt_config.h源文件中实现的。         此外为了代码界面简洁,我们将Window->Preferences->General->Editors->Text Editors中的Show whitespace characters(configure visibility)这个选项给勾选掉。 4.ESP8266 连接Wi-Fi/** * @brief: smartconfig配网过程回调函数 * @param  : * @returns: * @details: */ void ICACHE_FLASH_ATTR smartconfig_callback(sc_status status, void *pdata) {         struct station_config *station_cfg;         switch(status)         {         case SC_STATUS_WAIT: break;         case SC_STATUS_FIND_CHANNEL: break;         case SC_STATUS_GETTING_SSID_PSWD: break;         case SC_STATUS_LINK:                 // 获取STA参数指针                 station_cfg = pdata;                 // 保存连网参数:网络名称、网络密码                 spi_flash_erase_sector(STATION_INFO_SECTOR);                 spi_flash_write(STATION_INFO_SECTOR * 4096, (uint32 *)station_cfg, 96);                 // 连接无线网络                 wifi_station_set_config(station_cfg);                 wifi_station_disconnect();                 wifi_station_connect();                 break;         case SC_STATUS_LINK_OVER:                 smartconfig_stop();                 // 初始化获取网络时间                 USER_SNTP_Init();                 break;         } } /** * @brief  : 系统启动后等待无线网络连接成功 * @param  : None * @returns: None * @details: 每间隔一秒钟去获取连接状态,如果连接成功则进行网络时间同步,如果连接不成功则进入微信配网 */ void ICACHE_FLASH_ATTR USER_WiFi_Waiting(void) {         uint8 status = wifi_station_get_connect_status();         if(status == STATION_GOT_IP) // 成功连接Wi-Fi并获取到IP地址         {                 os_timer_disarm(&USER_TIMER);                 USER_SNTP_Init(); // 初始化获取网络时间         }         else if(                         (status == STATION_NO_AP_FOUND)                ||                         (status == STATION_WRONG_PASSWORD)        ||                         (status == STATION_CONNECT_FAIL)         )         {                 os_timer_disarm(&USER_TIMER);                 smartconfig_set_type(SC_TYPE_AIRKISS); // ESP8266配网方式:AIRKISS                 smartconfig_start(smartconfig_callback); // 进入配网模式,并注册回调函数         }         else         {                 os_printf(".");         } }复制代码 5.ESP8266 同步网络时间/** * @brief  : 等待网络时间同步完成 * @param  : * @returns: * @details: */ void ICACHE_FLASH_ATTR USER_SNTP_Waiting(void) {         // 查询当前距离基准时间的时间戳(单位为秒)         if(sntp_get_current_timestamp() != 0)         {                 os_timer_disarm(&USER_TIMER);                 SNTP_STATUS = 1;                 USER_MQTT_Init(); // 初始化MQTT         } } /** * @brief  : 初始化同步网络时间,设置同步时间服务器 * @param  : * @returns: * @details: */ void ICACHE_FLASH_ATTR USER_SNTP_Init(void) {         SNTP_STATUS = 0;         sntp_setservername(0, "0.cn.pool.ntp.org");         sntp_setservername(1, "1.cn.pool.ntp.org");         sntp_setservername(2, "2.cn.pool.ntp.org");         sntp_init();         USER_TIMER_Init(1000, 1, (os_timer_func_t *)USER_SNTP_Waiting); }复制代码 6.ESP8266 设置MQTT配置#ifndef __MQTT_CONFIG_H__ #define __MQTT_CONFIG_H__ typedef enum{         // 0: disable SSL/TLS, there must be no certificate verify between MQTT server and ESP8266         NO_TLS = 0,         // 1: enable  SSL/TLS, but there is no a certificate verify         TLS_WITHOUT_AUTHENTICATION = 1,         // 2: enable  SSL/TLS, ESP8266 would verify the SSL server certificate at the same time         ONE_WAY_ANTHENTICATION = 2,         // 3: enable  SSL/TLS, ESP8266 would verify the SSL server certificate and SSL server would verify ESP8266 certificate         TWO_WAY_ANTHENTICATION = 3, }TLS_LEVEL; /******************************************************************************/ #define MQTT_HOST                       "xld0932.xicp.net"         // MQTT服务端域名/IP地址 #define MQTT_PORT                       10520                          // 网络连接端口号 #define MQTT_SECURITY                 NO_TLS                       // 加密传输类型:默认不加密 #define MQTT_CLIENT_ID               "MQTT-ESP8266-001"    // 客户端标识符,必须唯一 #define MQTT_USER                       "admin"                        // MQTT用户名 #define MQTT_PASS                       "password"                   // MQTT密码 #define MQTT_KEEPALIVE               120                             // 保持连接时长 /******************************************************************************/ #define MQTT_BUF_SIZE                       1024                     // MQTT缓存大小 #define MQTT_RECONNECT_TIMEOUT    5                          // 重连超时时长 #define QUEUE_BUFFER_SIZE                2048                     // 消息队列的缓存大小 /******************************************************************************/ #define PROTOCOL_NAMEv311                                          // 使用MQTT协议【v311】版本 #endif 复制代码 7.ESP8266 建立MQTT通讯/** * @brief  : * @param  : * @returns: * @details: */ void MQTT_OnConnectedCallback(uint32_t *args) {         MQTT_Client* client = (MQTT_Client*)args;   // 获取MQTT Client指针         os_printf("+MQTT:CON\r\n");         // 订阅主题:Message,QoS=0         MQTT_Subscribe(client, "Message", 0);         os_sprintf(JSON_Buffer, JSON_ONLINE_FORMAT, DIY_ID, "V1.0", "GD32E231 DIY");         // Online主题发布消息         MQTT_Publish(client, "Online", JSON_Buffer, strlen(JSON_Buffer), 1, 0);         // 当MQTT服务器连接成功后,客户端每间隔60秒钟,向MQTT服务器发送一次心跳包数据         USER_TIMER_ALIVE_Init(60000, 1);         // 不断的检测有无数据包发送,如果有则发送相应TOPIC,并清除相关缓存         USER_TIMER_PUBLISH_Init(1000, 1); } /** * @brief  : * @param  : * @returns: * @details: */ void MQTT_OnDisconnectedCallback(uint32_t *args) {     MQTT_Client* client = (MQTT_Client*)args;         os_timer_disarm(&USER_TIMER_ALIVE);         os_timer_disarm(&USER_TIMER_PUBLISH);         os_printf("+MQTT:DIS\r\n"); } /** * @brief  : * @param  : * @returns: * @details: */ void MQTT_OnPublishedCallback(uint32_t *args) {     MQTT_Client* client = (MQTT_Client*)args;     os_printf("+MQTT:PUB\r\n"); } /** * @brief  : * @param  : * @returns: * @details: */ void MQTT_OnDataCallback(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len) {     char *topicBuf = (char*)os_zalloc(topic_len+1);                // 申请【主题】空间     char *dataBuf  = (char*)os_zalloc(data_len +1);               // 申请【有效载荷】空间     MQTT_Client* client = (MQTT_Client*)args;                      // 获取MQTT_Client指针     os_printf("+MQTT:GET\r\n");     os_memcpy(topicBuf, topic, topic_len);                             // 缓存主题     topicBuf[topic_len] = 0;                                                  // 最后添'\0'     os_memcpy(dataBuf, data, data_len);                              // 缓存有效载荷     dataBuf[data_len] = 0;                                                   // 最后添'\0' #if 0     os_printf("Receive topic: %s,  data: %s \r\n", topicBuf, dataBuf);        // 串口打印【主题】【有效载荷】     os_printf("Topic_len = %d, Data_len = %d\r\n", topic_len, data_len); // 串口打印【主题长度】【有效载荷长度】 #endif     // 根据接收到的Topic进行相应的操作     //-----------------------------------------------------------------------------------     if(os_strcmp(topicBuf, "Message") == 0)     {             // {"id":"EEWORLD:xld0932","message":"demo"}             char *str = strtok(dataBuf, ",");             if(os_strstr(str, DIY_ID) != NULL)             {                     str = strtok(NULL, ":");                     str = strtok(NULL, """);                 os_memcpy(MQTT_MESSAGE_DATA, str, os_strlen(str));                 MQTT_MESSAGE_FLAG = 1;             }     }     os_free(topicBuf);        // 释放【主题】空间     os_free(dataBuf);        // 释放【有效载荷】空间 } /** * @brief  : * @param  : * @returns: * @details: */ void ICACHE_FLASH_ATTR USER_MQTT_Init(void) {         os_timer_disarm(&USER_TIMER);         // 网络连接参数设置         MQTT_InitConnection(&MQTTClient, MQTT_HOST, MQTT_PORT, MQTT_SECURITY);         // MQTT连接参数设置         MQTT_InitClient(&MQTTClient, MQTT_CLIENT_ID, MQTT_USER, MQTT_PASS, MQTT_KEEPALIVE, 1);         // 设置MQTT相关回调函数         MQTT_OnConnected(&MQTTClient, MQTT_OnConnectedCallback);         MQTT_OnDisconnected(&MQTTClient, MQTT_OnDisconnectedCallback);         MQTT_OnPublished(&MQTTClient, MQTT_OnPublishedCallback);         MQTT_OnData(&MQTTClient, MQTT_OnDataCallback);         MQTT_Connect(&MQTTClient);        // 开始MQTT连接,准备上传Online Topic等信息 }复制代码 8.ESP8266 自定义AT指令//---xld0932 , 2019-04-19 extern uint8  SNTP_STATUS; extern struct station_config STATION_INFO; extern MQTT_Client MQTTClient; extern uint8  MQTT_PUBLISH_FLAG; extern uint8  MQTT_MESSAGE_FLAG; extern char   MQTT_PUBLISH_DATA[100]; extern char   MQTT_MESSAGE_DATA[100]; char user_uart_buffer[256] = {0}; int  user_uart_length      =  0; /** * 对AT设置指令进行解析并处理 * 1).AT+PUBLISH=  // 发送MQTT消息 , data为消息内容 */ LOCAL void ICACHE_FLASH_ATTR user_at_set_parsing(char *pstring) {         uint8 flag = 1;         char *str = strtok(user_uart_buffer, "=");         if(os_strcmp(str, "AT+PUBLISH") == 0)   // 发送MQTT消息         {                 os_memset(MQTT_PUBLISH_DATA, 0, sizeof(MQTT_PUBLISH_DATA));                 strcpy(MQTT_PUBLISH_DATA, strtok(NULL, "\r\n"));   // MQTT消息发送内容                 MQTT_PUBLISH_FLAG = 1;   // MQTT消息发送标志位         }         else         {                 flag = 0;   // 非法的AT设置指令         }         if(flag) os_printf("OK\r\n");         else    os_printf("ERROR\r\n"); } /** * 对AT查询指令进行解析并处理 * 1).AT+WSTATUS?        // 查询Wi-Fi连接状态 * 2).AT+CCLK?               // 查询网络时间 * 3).AT+MSTATUS?        // 查询与MQTT服务器连接状态 * 4).AT+MESSAGE?        // 查询是否接收到MQTT消息 */ LOCAL void ICACHE_FLASH_ATTR user_at_get_parsing(char *pstring) {         uint8 flag = 1;         char *str = strtok(user_uart_buffer, "?");         if(os_strcmp(str, "AT+WSTATUS") == 0)                // 查询Wi-Fi连接状态         {                 os_printf("+WSTATUS:%d\r\n", wifi_station_get_connect_status());         }         else if(os_strcmp(str, "AT+CCLK") == 0)                // 查询网络时间         {                 if(SNTP_STATUS)                                         // 同步网络时间完成标志                 {                         os_printf("+CCLK:%s", sntp_get_real_time(sntp_get_current_timestamp()));                 }                 else                 {                         os_printf("+CCLK:NULL\r\n");                 }         }         else if(os_strcmp(str, "AT+MSTATUS") == 0)        // 查询与MQTT服务器连接状态         {                 if(MQTTClient.connState == 17)                 {                         os_printf("+MSTATUS:1\r\n");             // MQTT服务器连接成功                 }                 else                 {                         os_printf("+MSTATUS:0\r\n");             // MQTT服务未连接成功                 }         }         else if(os_strcmp(str, "AT+MESSAGE") == 0)        // 查询是否接收到MQTT消息         {                 if(MQTT_MESSAGE_FLAG)                           // MQTT消息接收标志                 {                         MQTT_MESSAGE_FLAG = 0;                // 返回MQTT消息内容                         os_printf("+MESSAGE:%s\r\n", MQTT_MESSAGE_DATA);                 }                 else                 {                         os_printf("+MESSAGE:NULL\r\n");        // 返回MQTT为空的内容                 }         }         else         {                 flag = 0;   // 非法的AT查询指令         }         if(flag) os_printf("OK\r\n");         else     os_printf("ERROR\r\n"); } /** * 将接收到的串口消息缓存的数组中,直到接收到指令结束标志位,对指令进行解析 * 指令类型分为设置指令和查询指令两种 */ LOCAL void ICACHE_FLASH_ATTR user_uart_rx_handler(uint8 dat) {         user_uart_buffer[user_uart_length++] = dat;         user_uart_length %= 256;         if(os_strstr(user_uart_buffer, "\r\n") != NULL)                  // 指令结束标志         {                 if(os_strstr(user_uart_buffer, "=") != NULL)             // 设置指令类型                 {                         user_at_set_parsing(user_uart_buffer);                 }                 else if(os_strstr(user_uart_buffer, "?") != NULL)        // 查询指令类型                 {                         user_at_get_parsing(user_uart_buffer);                 }                 else                 {                         os_printf("ERROR\r\n");   // 非法的AT指令                 }                 os_memset(user_uart_buffer, 0, sizeof(user_uart_buffer));                 user_uart_length = 0;         } } /** * 串口接收处理函数 */ LOCAL void ICACHE_FLASH_ATTR uart_recvTask(os_event_t *events) {     if(events->sig == 0)     { #if  UART_BUFF_EN         Uart_rx_buff_enq(); #else         uint8 fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;         uint8 d_tmp = 0;         uint8 idx=0;         for(idx = 0; idx < fifo_len; idx++)         {             d_tmp = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;             uart_tx_one_char(UART0, d_tmp);             //---xld0932 , 2019-04-19             user_uart_rx_handler(d_tmp);         }         WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR);         uart_rx_intr_enable(UART0); #endif     }     else if(events->sig == 1)     { #if UART_BUFF_EN         //already move uart buffer output to uart empty interrupt         //tx_start_uart_buffer(UART0); #endif     } }复制代码

  • 2019-04-18
  • 加入了学习《操作系统原理 北京大学 陈向群》,观看 操作系统做了什么?

  • 加入了学习《嵌入式软件设计》,观看 嵌入式系统概述

  • 回复了主题帖: [GD32E231 DIY大赛]——05.硬件原理图和PCB设计

    hujj 发表于 2019-4-18 12:43 好象原理图库和封装库可以在网上共享的,避免重复劳动。
    {:1_103:}

  • 发表了主题帖: [GD32E231 DIY大赛]——05.硬件原理图和PCB设计

        概述:结合GD32E231-START-V1.0原理图与项目系统功能的应用,绘制原理图和PCB。本次的设计软件是立创EDA软件,也是我第一次使用,总体感觉上手比较快。对专业软件来说还是有些差距,但是,它的优越性还是相当的明显,有兴趣的朋友可以点击链接(https://docs.lceda.cn/cn/Introduction/Introduction-to-EasyEDA/index.html)去了解一下,这里就不展开说了。 1.器件选型     结合项目应用,系统主要器件选型表如下图所示:     2.原理图设计     2.1.POWER & USB & COM         2.2.KEY & LED & TFT & SENSOR         2.3.Wi-Fi模块:ESP8266         2.4.GD32E231C8T6     3.PCB设计     3.1.Top Layer         3.2.Bottom Layer    

  • 2019-04-17
  • 回复了主题帖: [GD32E231 DIY大赛]——03.项目简介:基于MQTT消息通讯的IoT入门实例

    gcxzhz 发表于 2019-4-17 14:58 mqtt协议是 8266内嵌的去解还是mcu自己去解
    MQTT协议是在ESP8266端实现的;在SDK的基础上移植开发的。

  • 2019-04-16
  • 回复了主题帖: [GD32E231 DIY大赛]——02.新建项目工程及工程配置

    seaguxx 发表于 2019-4-15 21:53 SI工具怎么配合使用呢?
    刚刚更新了一下附件工程,带有了Source Insight工程,Source Insight的版本是3.50.0083

  • 2019-04-15
  • 发表了主题帖: [GD32E231 DIY大赛]——04.搭建基于MQTT通讯的IoT云服务器

        简述:Linux服务器如今已经成熟,由于在云平台和新兴技术方面的突出表现,开始受到越来越多组织的欢迎。当前BAT的云服务器平台也都支持Linux服务器,但考虑到节省DIY的成本,在不影响在实际应用当中的部署过程差异的前提下,结合Windows 10自身的功能,决定在Windows 10系统下安装Linux子系统,进行服务器的部署。 1.Windows10系统准备配置     下面需要对Windows10操作系统在安装Linux子系统之前做一些准备工作:     1.1.确认Windows10版本:通过WIN+R命令调出运行窗口,输入WINVER命令查看当前操作系统版本。系统必须是64位操作系统。         1.2.开启Windows功能:通过WIN+R命令调出运行窗口,输出CONTROL命令调出控制面板。在控制面板中选择程序->启用或关闭Windows功能->适用于Linux的Windows子系统,确定进行安装,安装完成后需要重新启动电脑。         1.3.开启开发人员模式:通过WIN+I命令调出Windows设置界面,在Windows设置->更新和安全->开发者选项中选择“开发人员模式”,并确认启用开发人员模式,等待安装结束。     2.安装Linux子系统:Ubuntu 18.04 LTS     2.1.安装Microsoft Store软件     2.2.打开Microsoft Store软件,在搜索栏输入Ubuntu,选择Ubuntu 18.04 LTS进行免费获取和安装,等完成后将其固定到“开始”菜单。         2.3.点击开始菜单的Ubuntu 18.04启动,第一次启动会显示“Installing, this may take a few minutes...”,等待安装初始化完成。根据界面提示调协用户和密码后Ubuntu 18.04 Linux子系统就安装成功了。         2.4.当前Linux子系统在Windows10是共享硬盘资源的,在Windows10系统中“我的电脑”中的C盘和D盘,可以在Linux的/mnt/路径下进行访问。     3.Linux子系统安装JDK     3.1.下载JDK软件     使用wget命令下载JDK软件包jdk-8u202-linux-x64.tar.gz存放在/tmp/目录下。下载地址https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html     3.2.解压JDK软件安装包     使用tar命令对安装包进行解压:tar˽-zxvf˽jdk-8u202-linux-x64.tar.gz,等待解压完成后在当前目录下会生成一个jdk1.8.0_202的文件夹。     3.3.将解压后的文件夹移动到/usr/lib/目录下     新建目录:sudo˽mkdir˽/usr/lib/jdk    移动文件:sudo˽mv˽/tmp/jdk1.8.0_202˽/usr/lib/jdk     3.4.配置JAVA环境变量     使用sudo˽vim˽/etc/profile命令对/etc/目录下的profile文件进行编辑(在操作此文件前最好先做一下备份:sudo˽cp˽profile˽profile_backup),在末尾添加如下几行文字:    #set java environment    export˽JAVA_HOME=/usr/lib/jdk/jdk1.8.0_202    export˽JRE_HOME=${JAVA_HOME}/jre     export˽CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib    export˽PATH=${JAVA_HOME}/bin:$PATH     *使用source˽/etc/profile命令执行修改立即生效     3.5.验证JDK是否安装成功     在终端输入java˽-version,出现版本号则表示安装成功,如下所示:    java version “1.8.0_202”    Java(TM) SE Runtime Environment (build 1.8.0_202-b08)    Java HotSpot(TM) 64-bit Server VM (build 25.202-b08, mixed mode) 4.Linux子系统安装MQTT服务器:Apache Apollo     4.1.下载Apache Apollo软件     使用wget命令下载Apache Apollo软件包apache-apollo-1.7.1-unix-distro.tar存放在/tmp/目录下。下载地址:http://mirrors.shu.edu.cn/apache/activemq/activemq-apollo/1.7.1/     4.2.解压Apache Apollo软件安装包     使用tar命令对安装包进行解压:tar˽-zxvf˽apache-apollo-1.7.1-unix-distro.tar,等待解压完成后在当前目录下会生成一个apache-apollo-1.7.1的文件夹。     4.3.将解压后的文件夹移动到/home/ubuntu/目录下     mv˽/tmp/apache-apollo-1.7.1˽/home/ubuntu     4.4.创建broker实例:mybroker     cd˽/home/ubuntu/apache-apollo-1.7.1/bin/    ./apollo create mybroker     4.5.修改配置     vim˽/home/ubuntu/apache-apollo-1.7.1/bin/mybroker/etc/apollo.xml     将     <web_admin bind=”http://127.0.0.1:61680”/>    <web_admin bind=”https://127.0.0.1:61681”/>    修改为:    <web_admin bind=”http://0.0.0.0:61680”/>    <web_admin bind=”https://0.0.0.0:61681”/>     4.6.启动Apache Apollo的mybroker实例     cd˽/home/ubuntu/apache-apollo-1.7.1/bin/mybroker/bin/    ./apollo-broker run     启动成功后如下图所示:        4.7.将实例作为Linux Service启动     sudo˽ln˽-s˽/home/ubuntu/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker-service˽/etc/init.d/apollo     4.8.访问Apache Apollo的监控界面     在Windows 10系统下打开浏览器访问:http://localhost:61680,用户名和密码默认为:admin/password     5.Windows10系统安装花生壳软件     5.1.安装花生壳     访问https://hsk.oray.com/download/下载花生壳软件,安装花生壳软件。安装完成后,打开花生壳软件,输入用户名和密码进行登录。    如果没有帐户,则需要申请一个帐户。帐户在申请完成后建议购买一个域名和内网穿透个人版,总体费用在RMB10内,这个费用比租赁一个云服务器便宜多了。     5.2.新增映射     点击花生PC壳客户端软件中的内网穿透,界面将自动跳转到网页版的内网穿透配置界面。    点击新增映射,配置相应有参数后进行确定保存。        说明:    应用名称:MQTT(随便取一个)    选择域名:你购买的一个域名    映射类型:应用类    外网端口:动态端口    内网主机:花生壳PC客户端运行电脑的IP地址    内网端口:61613 6.Windows10系统安装MQTT客户端     6.1.安装MQTT客户端     访问http://www.jensd.de/apps/mqttfx/1.7.1/下载MQTT客户端软件mqttfx-1.7.1-windows-x64.exe,安装MQTT.fx软件。     6.2.配置MQTT客户端     运行MQTT.FX软件,点击齿轮配置按钮,进入到Edit Connection Profiles界面,点击”+”新增一个连接。配置完成后点击OK,返回到MQTT.fx操作界面。            说明:    MQTT Broker Profile Settings配置项:    Broker Address:花生壳购买的域名    Broker Port:花生壳动态生成的端口号     General配置项:如上截图所示进行配置     User Credentials配置项:    User Name:固定为admin    Password:固定为password     6.3.连接MQTT服务器     下拉列表中选择刚刚新建的MQTT连接,点击Connect按钮进行连接MQTT服务器。    在连接MQTT服务器时必须保证Windows 10下花生壳客户端软件处于打开并且登录状态、Linux子系统下Apache Apollo MQTT服务器软件处于运行状态。         6.4.操作MQTT客户端     在MQTT客户端成功连接MQTT服务器后,可以在Publish界面发布Topic、在Subscribe界面订阅Topic。    如下图是一个自发自收的一个例子。   

  • 发表了主题帖: [GD32E231 DIY大赛]——03.项目简介:基于MQTT消息通讯的IoT入门实例

    兆易创新GD32E231 DIY大赛 ——基于MQTT消息通讯的IoT入门实例 GD32E231+ESP8266实现Wi-Fi远程温湿度采集、控制及网络时钟     1.项目名称     《基于MQTT消息通讯的IoT入门实例:GD32E231+ESP8266实现Wi-Fi远程温湿度采集、控制及网络时钟》     2.项目说明     IoT技术成为时下最热门话题,万物互联的想法促使各大互联网平台都提供了IoT云服务器,争抢一席之位。本项目使用基于主控芯片GD32E231 + Wi-Fi模块ESP8266 + 温湿度传感器的硬件平台,通过自行搭建MQTT服务器,将采集终端的温湿度传感数据上报给IoT服务器、通过远程服务器下发指令控制终端以及终端实时同步网络时间显示的功能。通过一个简单的实例,真正实现IoT从零起步,到实现万物互联的IoT项目过程,深刻理解IoT的实现过程。     3.项目计划     第1周、熟悉GD32E231开发板、通过硬件模块验证项目需要使用到的各个技术点。     第2~4周、根据项目功能设计原理图、绘制PCB、投板、焊接、回板调试。     第5周、搭建基于MQTT通讯的IoT云服务器。     第6周、编写项目应用程序,结合MQTT服务器进行调试。     第7周、整理设计资料,提交作品。     *计划执行顺序根据实际项目进度为准     4.系统架构         5.系统主要功能     LCD实时显示当前温湿度数据、通过网络获取当前日期时间并实时显示    通过Wi-Fi模块将系统采集的温湿度数据和系统按键触发事件通过MQTT协议上报到服务器    通过远程服务器下发控制命令来控制本机LED灯的显示状态    串口终端调试

  • 发表了主题帖: [GD32E231 DIY大赛]——02.新建项目工程及工程配置

    本帖最后由 xld0932 于 2019-4-16 08:45 编辑     前提说明:工程目录结构        1.打开Keil软件,在菜单栏中点击Project->New uVision Project...弹出Create New Project对话框,文件名输入工程文件名:GDE32E231_DIY,文件存储路径为GD32E231\Keil\目录下,然后点击保存。如下图所示:        2.在弹出的Select Device for Target ‘Target1’...对话框中选择GD32E231C8这颗芯片,并按下OK按键。如下图所示:        3.在弹出的Manage Run-Time Environment对话框中选择CMSIS的CORE选项,配置如下图所示,直接按下OK按键即可。        4.点击Keil工程软件的File Extensions, Books and Environment...按钮,在弹出的对话框中修改Project Targets,添加Groups和Groups中对应的Files,然后点击OK。如下图所示:        4.1.CMSIS添加文件为GD32E231_DIY\Keil\Source\GD32E23x_Firmware_Library\CMSIS\GD\GD32E23x\Source目录中的system_gd32e23x.c以及子文件夹\ARM目录中的startup_gd32e23x.s这两个文件。    4.2.GD32E23x_Firmware_Library添加文件为GD32E231_DIY\Keil\Source\GD32E23x_Firmware_Library\GD32E23x_Standard_Peripheral\Source目录中的所有源文件。    4.3.User添加文件为GD32E231_DIY\Keil\Source\User\Source目录中的所有源文件。     工程文件目录如下图所示:      5.点击Keil工程软件的Options for Target...弹出Options for Target ‘GD32E231_DIY’对话框,对当前的项目工程做一些工程选项配置设置。    5.1.在Target选项卡中,参照如下图所示的配置:勾选Use Micro LIB选项。        5.2.在C/C++(AC6)选项卡中,参照如下图所示的配置,预设宏定义GD32E231及设置Include  Paths。        5.3.Include Paths设置如下图所示:        5.4.在Debug选项卡中,参照如下图所示配置,Use CMSIS-DAP ARMv8-M Debugger并且勾选Run to main()选项。        6.修改gd32e23x_it.c文件中的void SysTick_Handler(void)函数,清空函数的实现部分;修改main.c文件中的int main(void)函数如下所示:int main(void){    while(1){    }}修改好这两处后,按下Keil工程软件的Rebuild按键,对当前的GD32E231_DIY工程进行编译,编译结果如下图所示:        至此GD32E231_DIY的Keil工程就创建、配置完成了,接下来我就可以在此工程的基础上修改应用代码,完成例程及DIY项目需要使用的技术点验证工作了。

  • 发表了主题帖: [GD32E231 DIY大赛]——01.安装GD32E231芯片支持包

    本帖最后由 xld0932 于 2019-4-15 19:36 编辑     1.KEIL软件的安装步骤省略,打开KEIL软件,点击菜单栏Help->About uVision...弹出对话框查看当前软件版本为MDK-ARM Version:5.25.2.0     2.点击KEIL软件上Pack Installer按钮,如下图所示:         3.在弹出的Pack Installer窗口中,点击File->Import...选择GD32E231芯片支持包GigaDevice.GD32E23x.DFP.1.0.0。待导入完成后,在Device->GigaDevice中会增加GD32E23x Series这个系列的芯片支持型号。    

  • 2019-04-09
  • 回复了主题帖: 兆易创新 GD32E231 DIY 大赛入围名单

    入围啦{:1_103:}

  • 2019-04-01
  • 加入了学习《Linux嵌入式开发》,观看 ADS集成开发环境

  • 2019-03-29
  • 加入了学习《机器人学》,观看 旋转矩阵(二)

  • 加入了学习《机器人学》,观看 旋转矩阵(一)

  • 加入了学习《机器人学》,观看 转动

  • 加入了学习《机器人学》,观看 移动

  • 加入了学习《机器人学》,观看 导论

  • 加入了学习《机器人学》,观看 机器人学导论

  • 加入了学习《新版RTOS教程:15天入门RT-Thread内核》,观看 初识RT-Thread

最近访客

< 1/1 >

统计信息

已有44人来访过

  • 芯币:103
  • 好友:--
  • 主题:6
  • 回复:5
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言