搭建简易的物联网服务端和客户端-STM32(一)
时间:2022-07-23
本文章向大家介绍搭建简易的物联网服务端和客户端-STM32(一),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这只是刚开始第一步。单片机代码根据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 "ATrn" //测试esp8266是否工作正常
#define CWMODE "AT+CWMODE=3rn" //设置wifi模块的模式,3为STA+AP模式
#define RST "AT+RSTrn" //重启
#define CIFSR "AT+CIFSRrn" //查看ip
#define CWJAP "AT+CWJAP="nb","123456789"rn" // 设置要连接的无线路由器的 ssid 和 password
#define CIPSTART "AT+CIPSTART="TCP","119.29.201.31",4001rn" //设置服务器IP和端口
#define CIPMODE0 "AT+CIPMODE=0rn" //非透传模式
#define CIPMODE1 "AT+CIPMODE=1rn" //透传模式
#define CIPSEND "AT+CIPSENDrn" //发送
#define CIPSTATUS "AT+CIPSTATUSrn" //网络状态查询
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:%sn", __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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用JFR分析性能问题
- MyISAM 迁移至 InnoDB方案
- 解决Seafile局域网访问失败
- 一键解锁网易云音乐变灰歌曲
- 彻底理解 IO多路复用
- 分享Apache环境禁止目录浏览的方法
- DB2 Linux平台安装 Part 1 Linux环境配置
- DB2 Linux平台安装 Part 2 单机版软件安装
- DB2 Linux平台安装 Part 3 实例的建立与配置
- C++核心准则Con.2:默认情况下,将成员函数定义为const类型
- C++核心准则Con.3:默认情况下,传递参照常量的指针或引用
- C++核心准则Con.4:如果一个对象在构建之后值不会改变,使用const定义它
- C++核心准则Con.5:对于可以在编译时计算的值,使用constexpr进行声明
- DB2 Linux平台安装 Part 4 创建数据库
- VBA编写Ribbon Custom UI编辑器03——认识Ribbon的xml