本文为看雪论坛精华文章
看雪论坛作者ID:深山修行之人
基本原理
硬件准备
电路接线
开发环境
代码实现
//接收数据定时器
TIM1_Init(50);
//接收超时定时器
TIM3_Init(5000);
//轮询定时器
TIM14_Init(3000);
void WiFi_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
RESET_IO(1);
}
char WiFi_Start()
{
//复位
if (WiFi_Reset(50)) {
return 1;
}
//设置STA模式
if (WiFi_SendCmd("AT+CWMODE=1",50)) {
return 1;
}
//取消自动连接
if (WiFi_SendCmd("AT+CWAUTOCONN=0",50)) {
return 1;
}
//开始连接
if (WiFi_Connect(30)){
return 1;
}
//开启透传
if(WiFi_SendCmd("AT+CIPMODE=1",50)){
return 1;
}
//关闭多路连接
if(WiFi_SendCmd("AT+CIPMUX=0",50)){
return 1;
}
return 0;
}
void USART1_Init(unsigned int baud)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//设置PA9/PA10作为TX/RX端口
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_InitStructure.USART_BaudRate = baud;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 0x02;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void RelayIO_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//默认低电平,高电平闭合
RESET_BUTTON(0);
}
//根据实际情况配置
#define ACCESS_KEY "Basic aW90MTpwYXNzd2Qx" //base64(iot1:passwd1)
#define SSID "****"
#define PASSWORD "****"
#define SERVER_IP ""
#define SERVER_PORT 0
//构造HTTP请求开关数据
void WiFi_MiniSW_Status()
{
char temp[128];
memset(TXbuff,0,sizeof(TXbuff));
memset(temp,0,sizeof(temp));
sprintf(TXbuff,"GET /minisw/ HTTP/1.1\r\n");
sprintf(temp,"Authorization:%s\r\n",ACCESS_KEY);
strcat(TXbuff,temp);
strcat(TXbuff,"Host:33322.zicp.vip:30000\r\n\r\n");
}
//连接服务器
if (!WiFi_Connect_Server(50)) {
//连接成功,Http请求数据
WiFi_RxCounter = 0;
memset(WiFi_RxBuff,0,WiFi_RxBuff_Size);
Conn_Status = 1;
WiFi_MiniSW_Status();
WiFi_Input(TXbuff);
TIM_Cmd(TIM3, ENABLE);
} else {
//失败重置
TIM_Cmd(TIM3, DISABLE);
TIM_Cmd(TIM14, DISABLE);
Conn_Status = 0;
Reset_Status = 1;
Poll_Status = 0;
}
//时间戳改变,说明控制命令有更新
if (memcmp(ts, sw_ts, sizeof(ts))) {
if (sw_ts[0] != '\0') {
presult = strstr(json,"\"act\": ");
if(presult!=NULL){
if(*(presult+7) == '1') {
//闭合1s,实现关机或开机
PRESS_BUTTON();
Delay_Ms(1000);
RELEASE_BUTTON();
} else {
//闭合5s,实现强制关机(重复5次,这样写是防止用5000导致溢出结果不准确)
PRESS_BUTTON();
Delay_Ms(1000);
Delay_Ms(1000);
Delay_Ms(1000);
Delay_Ms(1000);
Delay_Ms(1000);
RELEASE_BUTTON();
}
}
}
}
环境准备
交互接口
代码实现
{
'pc':1, //机器id(保留)
'act':1, //0:强制关机 1:开机/关机
'ts':15212121 //时间戳
}
环境搭建
代码实现
public class GlobalData {
//服务端地址
public static String authUrl = "http://www.aaabbbccc.com:30000/minisw/";
public static OkHttpClient buildBasicAuthClient(final String name, final String password) {
return new OkHttpClient.Builder().authenticator(new Authenticator() {
private int responseCount(Response response) {
int result = 0;
while ((response = response.priorResponse()) != null) {
result++;
}
return result;
}
@Override
public Request authenticate(Route route, Response response) throws IOException {
if (responseCount(response) >= 1) {
System.out.println("认证失败,返回null");
return null;
}
String credential = Credentials.basic(name, password);
return response.request().newBuilder().header("Authorization", credential).build();
}
}).connectTimeout(2, TimeUnit.SECONDS).readTimeout(2, TimeUnit.SECONDS).build();
}
public static class AuthRequest implements Callable<String>{
private String username;
private String password;
private String url;
public AuthRequest(String user, String passwd, String url) {
this.username = user;
this.password = passwd;
this.url = url;
}
public String call() throws Exception {
OkHttpClient client = GlobalData.buildBasicAuthClient(username, password);
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
return response.body().string();
}
};
public static String AuthGet(String url, String username, String password) {
try {
FutureTask<String> ftask = new FutureTask<String>(new GlobalData.AuthRequest(username, password, url));
Thread t = new Thread(ftask);
t.start();
t.join();
String res = ftask.get();
return res;
} catch (Exception e) {
return "err";
}
}
}
看雪ID:深山修行之人
https://bbs.pediy.com/user-857678.htm
推荐文章++++
* 实战栈溢出漏洞
好书推荐