STM32通过SIM800L向yeelink端上传数据
忙了一个多月,终于完成了一套系统的开发,笔者参与完成了SIM800L向yeelink端上传数据,以及Andriod客户端的开发,视频制作等。装置演示视频地址
为:
http://v.youku.com/v_show/id_XMTI2NTM5OTA2NA==.html
另外我们还做了一套更小的板子,因为外观设计等问题,需要等待。好了,废话不多说,来说一说SIM800L上传数据到yeelink中的一些问题,和解决办法,Andriod
客户端的,技术含量不是很高,就不再提及。
这里我们是通过TCP/IP的方式模拟HTTP进行发送的json格式数据,对发送HTTP要有所了解,不了解的可以windows下,IE 里装个httpwatch,Linux直接用wireshark,跟踪一下
就能大致了解了。
这里就以发送拐杖跌倒标志位来讲述:
const char yeelink1[]="POST /v1.0/device/xxxxx/sensor/xxxxx/datapoint HTTP/1.1\r\n";
const char yeelink2[]="Host: api.yeelink.net\r\n";
const char yeelink3[]="Accept: */*\r\n";
const char yeelink4[]="U-ApiKey:d0fdba9069356c7dc282df3515xxxxxx\r\n";
const char yeelink5[]="Content-Length:13\r\n";
const char yeelink6[]="Content-Type: application/x-www-form-urlencoded\r\n";
const char yeelink7[]="Connection: close\r\n\r\n";
char yeelink8[]="{\"value\":0}\r\n";
const char yeelink9[]="\r\n";
const char yeelink10[]="\x1A\r\n";
这些就是我们要POST的内容(xxx就不公布了)。
要上传这些数据到yeelink,我们首先当然是控制SIM800L上网,GSM联网我们需要:开启任务,激活场景等,依次我们用
AT+CSTT
AT+CIICR
AT+CIFSR
AT+CIPSTART="TCP","42.96.164.52","80"
AT+CIPSEND
然后就可以发送数据了,这些操作倒是没有什么,很正常,在上位机调试也没有什么问题,可放到STM32上面,问题来了
(不是挖掘机技术哪家强的问题),有时候数据发送成功,有时候发送失败,还有时候呢不仅仅没有成功,反而在执行完
指令时,进行AT+CIPSHUT关闭也不成功。首先和大家想到的一样,那就是延迟的问题,没错,确实是延迟的问题,我们
确定一组延迟以后,是可以进行发送的,可信号不好的时候又出现发送不一定成功的时候,而且还会伴随上面的问题,怎样
做呢,刚开始是试着去寻找一组都可以用的延迟,自然是越久越稳定,可激活场景这一步,手册上说最大达到85s,
这个问题考虑了很久,决定放弃这种方法,决定曲线救国吧,这里先说明一点,这里在STM32上调试GSM是有回显的
我们怎样判断每次输入的指令成功执行了呢?
第一,先确定输入指令GSM有应答信号
这里采取的方法是循环等待,直到连接GSM的串口有应答信息,有的需要一次,有的需要两次循环等待,看具体指令。
试验中发现,串口有时连续发送两次,中间有短暂间隔。这里我们借用单片机按键去抖的经验,短暂延时后再次判断
串口中数据长度是否变化来解决。
看到有的人是判断GSM执行指令后,串口缓冲区里面回显的是否正确来判断命令是否成功。这里我不推荐,因为事实上,
比如你的GSM如果已经处于IP GPRSACT状态了,你再执行AT+CIICR返回错误,你却可以进行下一步的操作。
这里推荐的方法是执行命令前,先查询IP所处的状态,使用命令为:AT+CIPSTATUS,这样可以在任意状态下进行。
这里贴出部分代码,这里没有使用结构体偏移,源于对STM32编译器不了解,程序粗糙了点
void open_ip(void)
{
u8 flag=1;
while(flag)
{
if(getipstatus("TCP CONNECTING")||getipstatus("IP CONFIG"))
{
delay_ms(1000);
}else
if(getipstatus("CONNECT OK"))
{
flag=0;
}else
if(getipstatus("TCP CLOSED"))
{
usart3_send_str(atcipshut);
wait_for_answer();
wait_for_answer();
}else
if(getipstatus("IP STATUS"))
{
usart3_send_str(atcipstart);
wait_for_answer();
}else
if(getipstatus("IP GPRSACT"))
{
usart3_send_str(atcifsr);
wait_for_answer();
}else
if(getipstatus("IP START"))
{
usart3_send_str(atciicr);
wait_for_answer();
wait_for_answer();
}else
if(getipstatus("IP INITIAL"))
{
usart3_send_str(atcstt);
wait_for_answer();
}
else{
usart3_send_str(atcipshut);
wait_for_answer();
}
}
}
笔者实验发现,都很成功
STM32通过SIM800L向yeelink端上传数据相关推荐
- 向服务端上传数据如何确保数据完整性、安全性
1.MD5:检验数据的完整性 2.AES:对称加密,有ECB/CBC等模式,有三种填充方式 3.RSA:非对称加密,公钥加密,私钥解密,私钥签名. 总结,通常以上三种方式一起使用以达到加密传输数据的效 ...
- 百度LBS服务我们自己上传数据,我们客户端获取数据然后进行小黄车和膜拜单车定位描点等骚操作
一,演示和需求的SDK和ak等配置最近我们一个项目需要自己android端上传数据到百度LBS服务,然后获取数据并显示.搞了2天完成了.其实很简单的哦!我们一步步来,今天的活我一小时搞定,一天写博客, ...
- java上传音频到服务器_Java 客户端向服务端上传mp3文件数据的实例代码
客户端: package cn.itcast.uploadpicture.demo; import java.io.BufferedInputStream; import java.io.FileIn ...
- 移动端扫码上传数据信息
随着移动端设备的普及,越来越多的工作环节我们可以借助移动设备进行.移动端扫码(支持二维码.条形码)上传数据信息可以很大程度上减少数据录入纰漏,便捷地联动相关数据,提高信息准确率. 在百数的多个解决方案 ...
- vue 移动端头像裁剪_移动端 上传头像 并裁剪功能(h5)
移动端头像图片上传裁剪 .button { outline: 0; display: inline-block; margin-bottom: 0; font-weight: 400; text-al ...
- TCP:利用Socket编程技术实现客户端向服务端上传一个图片。
问题: 利用Socket编程技术实现客户端向服务端上传一个图片的程序. 客户端: import java.io.*; import java.net.Socket;public class clien ...
- 移动端上(传图片太大)处理方案
利用FileReader和FormData实现图片预览和上传(base64转二进制文件) 监听表单文件变化 文件表单的样式主要通过让它后面,通过别的DOM来美化它. <input type=&q ...
- vue2移动端上传,预览,压缩图片,解决拍照旋转问题
https://github.com/exif-js/exif-js http://code.ciaoca.com/javascript/exif-js/demo/ 因为最近遇到个移动端上传头像的需求 ...
- STM32 Proteus仿真PT100温度测量串口上传LCD1602显示-0002
Proteus仿真小实验: STM32 Proteus仿真PT100温度测量串口上传LCD1602显示-0002 功能: 硬件组成:STM32F103R6单片机 +LCD1602显示器+PT100温度 ...
- stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭
stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...
最新文章
- 55道常见的计算机面试题
- java的datatype_java数据类型
- 辞退了一名 2 年工作经验的前端工程师
- 如何通过SpringMVC框架响应JSON数据
- 30个Oracle语句优化规则详解
- 稳定排序与不稳定排序的定义
- 2021年5月信息系统项目管理师案例分析真题+视频讲解(3)
- SpringBoot启动项目时提示:Error:(3, 32) java: 程序包org.springframework.boot不存在
- 【tensorflow-keras-BatchNormalization】BatchNormalization批量标准化层
- Python从数据库读取大量数据批量写入文件的方法
- 如何通过命令终端访问本地/局域网/远程的MySQL数据库_访问数据库_连接数据库_登录数据库
- android DatePicker
- 设置 cell点击 背景色
- 简单的SQL语句 DDL
- 浏览器默认事件,事件监听,事件委托
- JS 实现海康威视摄像头笔记
- 机械制图之平面图形的尺寸分析
- 百度地图(地图生成)
- Xcode 6 删除 DerivedData后,编译异常
- PSO算法求解全局最大值