美文网首页移动互联网程序员我爱编程
搭建简易的物联网服务端和客户端-STM32(一)

搭建简易的物联网服务端和客户端-STM32(一)

作者: ZZES_ZCDC | 来源:发表于2017-03-17 09:26 被阅读2713次

    这只是刚开始第一步。单片机代码根据OneNET平台给的代码改的,纯新手,慢慢学。。后面主要是写服务端处理数据
    代码地址:https://github.com/klren0312/stm32_wifi
    2017.3.16

    搭建简易的物联网服务端和客户端目录

    使用的器件:

    • STM32F103CBT6 单片机
    • ESP8266-01S wifi模块
    • SHT20温湿度
    • BT05蓝牙模块
    • 反射式红外

    使用的Node.js服务端:

    • net模块
    • express
    • node-mysql

    一、单片机相关代码(只提供网络相关代码)

    1.esp8266相关配置代码

    1)esp8266.h(宏定义一些AT指令)

    #define AT          "AT\r\n"    //测试esp8266是否工作正常
    #define CWMODE      "AT+CWMODE=3\r\n"       //设置wifi模块的模式,3为STA+AP模式
    #define RST         "AT+RST\r\n"        //重启
    #define CIFSR       "AT+CIFSR\r\n"      //查看ip
    #define CWJAP       "AT+CWJAP=\"nb\",\"123456789\"\r\n" // 设置要连接的无线路由器的 ssid 和 password
    #define CIPSTART    "AT+CIPSTART=\"TCP\",\"119.29.201.31\",4001\r\n"        //设置服务器IP和端口
    #define CIPMODE0    "AT+CIPMODE=0\r\n"      //非透传模式
    #define CIPMODE1    "AT+CIPMODE=1\r\n"      //透传模式
    #define CIPSEND     "AT+CIPSEND\r\n"        //发送
    #define CIPSTATUS   "AT+CIPSTATUS\r\n"      //网络状态查询
    
    extern void ESP8266_Rst(void);  
    extern void ESP8266_Init(void);
    
    

    2)esp8266.c(两个配置函数)

    /**
      * @brief  ESP8266硬件复位
    **/
    void ESP8266_Rst(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        //Pb5--对应ESP8266的reset引脚;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);
        mDelay(100);
        GPIO_SetBits(GPIOB,GPIO_Pin_5);
        mDelay(100);
    }
    
    
    /*
     *  @brief ESP8266模块初始化
     */
    void ESP8266_Init(void)
    {
        ESP8266_Rst();
    #if 1
        SendCmd(AT, "OK", 1000);          //模块有效性检查
        SendCmd(CWMODE, "OK", 1000);    //模块工作模式
        SendCmd(RST, "OK", 2000);         //模块重置
        SendCmd(CIFSR, "OK", 1000);     //查询网络信息
        SendCmd(CWJAP, "OK", 2000);     //配置需要连接的WIFI热点SSID和密码
        SendCmd(CIPSTART, "OK", 2000);  //TCP连接
        SendCmd(CIPMODE1, "OK", 1000);  //配置透传模式
        SendCmd(CIPSEND, ">", 1000);    //进入透传模式
        USART2_Clear();
    #endif
    }
    

    3)usart2.c中的SendCmd函数(USART2串口发送AT命令使用)

    void SendCmd(char* cmd, char* result, int timeOut)
    {
        while(1)
        {
            USART2_Clear();
            USART2_Write(USART2, (unsigned char *)cmd, strlen((const char *)cmd));
            mDelay(timeOut);
            printf("%s %d cmd:%s,rsp:%s\n", __func__, __LINE__, cmd, usart2_rcv_buf);
            if((NULL != strstr((const char *)usart2_rcv_buf, result)))  //判断是否有预期的结果
            {
                break;
            }
            else
            {
                mDelay(100);
            }
        }
    }
    

    2.拼接发送字符串代码

    1)获取温湿度(sht20代码就不放出来了)

            /* 获取温湿度 */
            SHT2x_MeasureHM(SHT20_Measurement_T_HM, &temp);
            mDelay(500);
            SHT2x_MeasureHM(SHT20_Measurement_RH_HM, &humi);
    
            /* 转化为字符串形式 */
            sprintf(tempStr, "%d", temp);
            sprintf(humiStr, "%d", humi);
            
    

    2)拼接代码(拼接成json格式)

    /**
      * @brief   拼接
      * @param   pkt   缓存指针
      * @param   dsid1  数据流1ID
      * @param   val1   字符串形式的数据点1的值
      * @param   dsid2  数据流2ID
      * @param   val2   字符串形式的数据点2的值
      * @retval  整个包的长度
      */
    uint32_t HTTP_NewPostPacket(char *pkt, char *dsid1, char *val1, char *dsid2, char *val2)
    {
        char dataBuf[50] = {0};
        char lenBuf[10] = {0};
        *pkt = 0;
        sprintf(dataBuf, "{\"%s\":\"%s\",\"%s\":\"%s\"}", dsid1, val1, dsid2, val2);
        sprintf(lenBuf, "%d", strlen(dataBuf));
    
        strcat(pkt, dataBuf);
    
        return strlen(pkt);
    }
    
    

    二、Node.js相关代码

    1.TCP服务端代码

    var net = require('net')
    net.createServer(function(socket){
        socket.on('data',function(data){//接受处理
            console.log('got:',data.toString());//打印接收到的数据
            socket.write('I have received') //接受后回复
        });
        socket.write('Ready to receive your message!')//客户端连接成功后回复
    }).listen(4001);
    

    三、结果截图

    1.服务端打印的信息截图

    服务端打印的信息截图服务端打印的信息截图

    2.客户端串口输出的信息截图

    客户端串口输出的信息截图客户端串口输出的信息截图

    @治电小白菜 20170317

    相关文章

      网友评论

      • 51289fd5cf2d:你好,请问一下,你当时做这个项目的时候这么获得的固定的ip,能抽时间回我一下吗?谢谢。
        ZZES_ZCDC:@心静W 内网中路由器DHCP分配的ip一般都是固定的,如果你不满足可以买个外网服务器

      本文标题:搭建简易的物联网服务端和客户端-STM32(一)

      本文链接:https://www.haomeiwen.com/subject/sbasnttx.html