[ 电子]STM32驱动28BYJ-48步进电机实现外网控制

news/2024/4/19 19:30:40/

新人博主Github==>https://github.com/MartinxMax

  • 这个项目能做什么?
  • 用到了哪些编程语言?
  • 需要什么硬件?
  • 硬件接线
  • 配置SIM900A
  • STM32 C语言代码
  • 服务器 Python流量转发代码
  • 控制端 Python代码
  • 效果演示

这个项目能做什么?

解除局域网内限制,实现任意地方远程控制开关电闸,远程控制空调开关等…

用到了哪些编程语言?

C语言,Python3.6以上版本,附源代码

需要什么硬件?

最低总合计约83¥
1.STM32F03CT6开发板(价格23¥左右)
在这里插入图片描述

2.I2C驱动的4针脚OLED显示屏 (价格14¥左右)

在这里插入图片描述

  1. SIM900A模块 (价格28¥左右)在这里插入图片描述

  2. 可以流量上网的SIM手机卡 (移动或联通)在这里插入图片描述

  3. 28BYJ-48步进电机(5V)+ULN2003驱动板 (9¥左右)在这里插入图片描述

  4. 一台装有Python环境的服务器

  5. 发光二极管(用于网络检测)

  6. CP2102(用于调试SIM900A,9¥左右)

  7. 天线(SIM900A模块天线靠太近容易干扰影响通讯)

硬件接线

在这里插入图片描述

配置SIM900A

接线图

在这里插入图片描述

插入手机卡配置AT命令
1、AT\r\n 2、AT+CGCLASS="B"\r\n[ AT+CGCLASS="B",设置移动台类别为 B]3、AT+CGDCONT=1,"IP","CMNET"\r\n[设置 PDP 上下文标志为 1,接入点为"CMNET"]4、AT+CGATT=1\r\n
[GPRS业务]5、AT+CIPCSGP=1,"CMNET"\r\n

STM32 C语言代码

下载源代码

# 将这一行改写成你的服务器IP
Serial_SendString("AT+CIPSTART=\"TCP\",\"xx.xx.xx.xx\",\"10030\"\r\n");

服务器 Python流量转发代码

#!/usr/bin/python3
import socket
import sys
import time
import datetime
import threading
DEV_SOCK_AND_USERNAME_PORT = list()
HCK_SOCK_AND_USERNAME_PORT = list()
mutex = threading.Lock()
def SOCK_Dev(PORT):global DEV_SOCK_AND_USERNAME_PORT,HCK_SOCK_AND_USERNAME_PORTMIAN_DEV_SOCK = socket.socket(socket.AF_INET, socket.SOCK_STREAM)MIAN_DEV_SOCK.bind(("", PORT))MIAN_DEV_SOCK.listen(1)while True:print(f"[*]等待远程设备连接...\033[4;33m{PORT}\033[0m")DEV_SOCKET, DevIP = MIAN_DEV_SOCK.accept()print(f"[\033[34m+\033[0m]设备 \033[32m{DevIP[0]}\033[0m:\033[4;33m{DevIP[1]}"f"\033[0m ---------- [\033[32mOnline\033[0m]-[\033[4;33m{PORT}\033[0m]")DEV_SOCK_AND_USERNAME_PORT.append(DEV_SOCKET)DEV_SOCK_AND_USERNAME_PORT.append(DevIP[0])DEV_SOCK_AND_USERNAME_PORT.append(DevIP[1])while True:try:DEV_SOCKET.send(b'x')except:breakelse:time.sleep(5)DEV_SOCK_AND_USERNAME_PORT.remove(DEV_SOCKET)DEV_SOCK_AND_USERNAME_PORT.remove(DevIP[0])DEV_SOCK_AND_USERNAME_PORT.remove(DevIP[1])def Get_DATA(SOCK,Name,Mote):DATA = SOCK.recv(1024).decode()if len(DATA) <= 0:  # 断开连接了if Mote == 0:print(f"[\033[34m-\033[0m]\033[32m{Name}\033[0m ---------- [\033[32mOffline\033[0m]")else:print(f"[\033[34m-\033[0m]\033[31m{Name}\033[0m ---------- [\033[32mOffline\033[0m]")return 0return DATAdef SOCK_Hacker(PORT):global DEV_SOCK_AND_USERNAME_PORT,HCK_SOCK_AND_USERNAME_PORTMIAN_HACK_SOCK = socket.socket(socket.AF_INET, socket.SOCK_STREAM)MIAN_HACK_SOCK.bind(("", PORT))MIAN_HACK_SOCK.listen(1)while True:print(f"[*]等待控制者连接...\033[4;33m{PORT}\033[0m")HACK_SOCKET, Hacker_IP = MIAN_HACK_SOCK.accept()print(f"[\033[34m+\033[0m]控制者 \033[31m{Hacker_IP[0]}\033[0m:\033[4;33m{Hacker_IP[1]}"f"\033[0m ---------- [\033[32mOnline\033[0m]-[\033[4;33m{PORT}\033[0m]")HACK_SOCKET.send(b"[+]Server Connect You !")HCK_SOCK_AND_USERNAME_PORT.append(HACK_SOCKET)HCK_SOCK_AND_USERNAME_PORT.append(Hacker_IP[0])HCK_SOCK_AND_USERNAME_PORT.append(Hacker_IP[1])#HCK_SOCK = HACK_SOCKETwhile True:DATA = Get_DATA(HACK_SOCKET, Hacker_IP[0],1)mutex.acquire()if DATA != 0:if 'EXIT' in DATA:HACK_SOCKET.send("Socket Cloese-----[Success]".encode())HCK_SOCK_AND_USERNAME_PORT[0].close()print(f"[\033[34m-\033[0m]Hacker SOCKET 已被关闭")breakelif 'DEV' in DATA:DEV_SOCK_AND_USERNAME_PORT[0].send(b'y')HACK_SOCKET.send("Device Cloese Socket-----[Success]".encode())if DEV_SOCK_AND_USERNAME_PORT:HACK_SOCKET.send(f"Device----[Online]\r\n".encode())now = datetime.datetime.now()print(f"\033[31m{Hacker_IP[0]}\033[0m ==> \033[32m{DEV_SOCK_AND_USERNAME_PORT[1]}\033[0m ---------- [\033[32mOK\033[0m]  %s" % (now.strftime("%Y-%m-%d %H:%M:%S")))if 'HACK' in DATA:DEV_SOCK_AND_USERNAME_PORT[0].send(b'o')HACK_SOCKET.send(f"Server Send {DEV_SOCK_AND_USERNAME_PORT[1]} RUN Command !!Success!!".encode())print(f"启动----------[\033[32mOK\033[0m]")elif 'STOP' in DATA:DEV_SOCK_AND_USERNAME_PORT[0].send(b'c')HACK_SOCKET.send(f"Server Send {DEV_SOCK_AND_USERNAME_PORT[1]} STOP Command !!Success!!".encode())print(f"停止----------[\033[32mOK\033[0m]")else:HACK_SOCKET.send(f"Device----[OffLine]".encode())mutex.release()else:HACK_SOCKET.close()mutex.release()breakHCK_SOCK_AND_USERNAME_PORT.remove(HACK_SOCKET)HCK_SOCK_AND_USERNAME_PORT.remove(Hacker_IP[0])HCK_SOCK_AND_USERNAME_PORT.remove(Hacker_IP[1])def main():Hacker = threading.Thread(target=SOCK_Hacker,args=(10031,))Device = threading.Thread(target=SOCK_Dev,args=(10030,))Hacker.start()Device.start()if __name__ == '__main__':main()
运行效果图

在这里插入图片描述
这里有些小伙伴可能会出现乱码和报错,把全部中文改成英文即可,若系统并非Linux则将带有print中输出颜色代码(\033[3x和\033)去除即可

无法识别中文修改版
#!/usr/bin/python3
import socket
import sys
import time
import datetime
import threading
DEV_SOCK_AND_USERNAME_PORT = list()
HCK_SOCK_AND_USERNAME_PORT = list()
mutex = threading.Lock()
def SOCK_Dev(PORT):global DEV_SOCK_AND_USERNAME_PORT,HCK_SOCK_AND_USERNAME_PORTMIAN_DEV_SOCK = socket.socket(socket.AF_INET, socket.SOCK_STREAM)MIAN_DEV_SOCK.bind(("", PORT))MIAN_DEV_SOCK.listen(1)while True:print(f"[*]Waiting for remote device connection...\033[4;33m{PORT}\033[0m")DEV_SOCKET, DevIP = MIAN_DEV_SOCK.accept()print(f"[\033[34m+\033[0m]Device \033[32m{DevIP[0]}\033[0m:\033[4;33m{DevIP[1]}"f"\033[0m ---------- [\033[32mOnline\033[0m]-[\033[4;33m{PORT}\033[0m]")DEV_SOCK_AND_USERNAME_PORT.append(DEV_SOCKET)DEV_SOCK_AND_USERNAME_PORT.append(DevIP[0])DEV_SOCK_AND_USERNAME_PORT.append(DevIP[1])while True:try:DEV_SOCKET.send(b'x')except:breakelse:time.sleep(5)DEV_SOCK_AND_USERNAME_PORT.remove(DEV_SOCKET)DEV_SOCK_AND_USERNAME_PORT.remove(DevIP[0])DEV_SOCK_AND_USERNAME_PORT.remove(DevIP[1])def Get_DATA(SOCK,Name,Mote):DATA = SOCK.recv(1024).decode()if len(DATA) <= 0:if Mote == 0:print(f"[\033[34m-\033[0m]\033[32m{Name}\033[0m ---------- [\033[32mOffline\033[0m]")else:print(f"[\033[34m-\033[0m]\033[31m{Name}\033[0m ---------- [\033[32mOffline\033[0m]")return 0return DATAdef SOCK_Hacker(PORT):global DEV_SOCK_AND_USERNAME_PORT,HCK_SOCK_AND_USERNAME_PORTMIAN_HACK_SOCK = socket.socket(socket.AF_INET, socket.SOCK_STREAM)MIAN_HACK_SOCK.bind(("", PORT))MIAN_HACK_SOCK.listen(1)while True:print(f"[*]Waiting for the controller to connect...\033[4;33m{PORT}\033[0m")HACK_SOCKET, Hacker_IP = MIAN_HACK_SOCK.accept()print(f"[\033[34m+\033[0m]Controller \033[31m{Hacker_IP[0]}\033[0m:\033[4;33m{Hacker_IP[1]}"f"\033[0m ---------- [\033[32mOnline\033[0m]-[\033[4;33m{PORT}\033[0m]")HACK_SOCKET.send(b"[+]Server Connect You !")HCK_SOCK_AND_USERNAME_PORT.append(HACK_SOCKET)HCK_SOCK_AND_USERNAME_PORT.append(Hacker_IP[0])HCK_SOCK_AND_USERNAME_PORT.append(Hacker_IP[1])#HCK_SOCK = HACK_SOCKETwhile True:DATA = Get_DATA(HACK_SOCKET, Hacker_IP[0],1)mutex.acquire()if DATA != 0:if 'EXIT' in DATA:HACK_SOCKET.send("Socket Cloese-----[Success]".encode())HCK_SOCK_AND_USERNAME_PORT[0].close()print(f"[\033[34m-\033[0m]Hacker SOCKET 已被关闭")breakelif 'DEV' in DATA:DEV_SOCK_AND_USERNAME_PORT[0].send(b'y')HACK_SOCKET.send("Device Cloese Socket-----[Success]".encode())if DEV_SOCK_AND_USERNAME_PORT:HACK_SOCKET.send(f"Device----[Online]\r\n".encode())now = datetime.datetime.now()print(f"\033[31m{Hacker_IP[0]}\033[0m ==> \033[32m{DEV_SOCK_AND_USERNAME_PORT[1]}\033[0m ---------- [\033[32mOK\033[0m]  %s" % (now.strftime("%Y-%m-%d %H:%M:%S")))if 'HACK' in DATA:DEV_SOCK_AND_USERNAME_PORT[0].send(b'o')HACK_SOCKET.send(f"Server Send {DEV_SOCK_AND_USERNAME_PORT[1]} RUN Command !!Success!!".encode())print(f"Runing----------[\033[32mOK\033[0m]")elif 'STOP' in DATA:DEV_SOCK_AND_USERNAME_PORT[0].send(b'c')HACK_SOCKET.send(f"Server Send {DEV_SOCK_AND_USERNAME_PORT[1]} STOP Command !!Success!!".encode())print(f"Stoping----------[\033[32mOK\033[0m]")else:HACK_SOCKET.send(f"Device----[OffLine]".encode())mutex.release()else:HACK_SOCKET.close()mutex.release()breakHCK_SOCK_AND_USERNAME_PORT.remove(HACK_SOCKET)HCK_SOCK_AND_USERNAME_PORT.remove(Hacker_IP[0])HCK_SOCK_AND_USERNAME_PORT.remove(Hacker_IP[1])def main():Hacker = threading.Thread(target=SOCK_Hacker,args=(10031,))Device = threading.Thread(target=SOCK_Dev,args=(10030,))Hacker.start()Device.start()if __name__ == '__main__':main()
运行效果图

在这里插入图片描述

控制端 Python代码

#!/usr/bin/python3
import socket
import sys
import time
import datetime
def OPTIONS():# OPEN是正转动 CLOSE是反转 Q是断开与服务器的连接 D是将远控设备踢下线CS = input("\n-----#(OPEN||CLOSE|Q|D)>>>")return CS
def main(MoteIP,MotePort):SOCKS = socket.socket(socket.AF_INET, socket.SOCK_STREAM)SOCKS.connect((MoteIP, MotePort))print("[+]正在接入远程主机")print(SOCKS.recv(1024).decode())while True:CS = OPTIONS()if "OPEN" in CS:SOCKS.send(b'HACK') # o 6F # c 63print("[+]发送运行指令成功!")elif "CLOSE" in CS:SOCKS.send(b'STOP')  # o 6F # c 63print("[+]发送停止指令成功!")elif "Q" in CS:SOCKS.send(b'EXIT')print("[-]准备关闭会话")print("[+]服务器返回了一条消息:",SOCKS.recv(1024).decode())sys.exit(0)elif "D" in CS:SOCKS.send(b'DEV')print("[-]准备远程关闭设备")print("[+]服务器返回了一条消息:", SOCKS.recv(1024).decode())else:continueprint("[+]服务器返回了一条消息:", SOCKS.recv(1024).decode())
if __name__ == '__main__':main("这里输入服务器IP",int(10031))

效果演示

在此之前应该开放出入站端口,否则会连不上
在这里插入图片描述

连接服务器

python3 Connect.py

在这里插入图片描述服务器端接监听控制者连接后显示效果

python3 Service.py

在这里插入图片描述将4G卡取出插入SIM900A模块,并将设备上电准备连接服务器

在这里插入图片描述服务器端接监听设备连接后显示效果(设备上线)
在这里插入图片描述
OLED显示屏显示连接成功

在这里插入图片描述在电机上定一个A点
在这里插入图片描述

控制方发送命令,服务器返回设备的在线状态
在这里插入图片描述

服务器收到来自控制方的信息,并执行命令
在这里插入图片描述
受控端收到信号并执行,移动至点B,旋转夹角约30°
在这里插入图片描述
视频效果


http://www.ppmy.cn/news/703831.html

相关文章

hbck

Apache HBase HBCK2 Tool HBCK2是hbase-1.x修复工具&#xff08; 也称作hbck1&#xff09;的继承者。 使用它代替hbck1进行hbase-2.x安装修复。 hbck1 不应该对hbase-2.x群集运行hbase-1.x附带的hbck工具&#xff08; hbck1&#xff09;。 它可能会造成损坏。 虽然hbck1仍然…

Windows驱动 HCK测试方法及数字签名使用方法介绍

一、 HCK安装及使用方法介绍 1. 安装环境要求 操作系统&#xff1a; Windows Server2008 R2英文版 需要两台电脑&#xff0c;一台做测试服务器&#xff0c;另一台做测试机 网络要求&#xff1a;两台电脑必须都能连接internet&#xff0c;并同属一个局域网 地区语言&#xf…

WHQL认证环境部署以及测试攻略二之HLK或者HCK软件的安装

WHQL认证目前所使用的测试软件有WLK1.6&#xff0c;HCK2.1&#xff0c;HLK。 WLK1.6主要是针对Windows Server 2003&#xff0c;已经不是主流测试了&#xff0c;基本属于弃用状态。HCK2.1主要是针对Win7 SP1 Windwos 8 以及Windows8.1 这3个测试系统的测试。目前市场上还是有…

[代码实践]利用LSTM构建基于conll2003数据集的命名实体实体识别NER模型

1. conll2003数据集介绍以及数据集预处理请看下面博客 conll2003数据集下载与预处理_茫茫人海一粒沙的博客-CSDN博客 2. 取预处理过的数据集 import tensorflow as tf from keras.models import Model from keras.layers import Input, Embedding, LSTM, Dense, TimeDistrib…

计算机桌面保护时间,电脑处于屏幕保护或者休眠状态的时间怎么自己设置?

1.打开笔记本2113电脑&#xff0c;点击打开开始菜单-----选择控制面板或者5261打开我的电脑&#xff0c;4102选择点击控制1653面板2.进入到控制面板页面&#xff0c;我们点击选择——硬件和声音 并且点击进入硬件和声音3.点击进入硬件和声音后&#xff0c;你会看到下面的页面—…

Win10电脑每2分钟频繁锁屏,设置锁屏时间也无效解决办法

我的win10系统的电脑不管你锁屏时间设置为多少&#xff0c;两分钟自动就会进入休眠&#xff0c;一遍一遍的解锁真的很麻烦&#xff0c;费时费力。在网上查了好久&#xff0c;终于找到了解决方法&#xff0c;问题的根源是在Windows电源选项的一个隐藏设置项“无人参与系统睡眠超…

diffusion model

(正课)Diffusion Model 原理剖析 (1_4) (optional)_哔哩哔哩_bilibili(正课)Diffusion Model 原理剖析 (1_4) (optional)是【授权】李宏毅2023春机器学习课程的第42集视频&#xff0c;该合集共计64集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。http…

Win7联想电脑休眠后唤醒不了原因和解决方法

2019独角兽企业重金招聘Python工程师标准>>> 一、电脑BIOS不支持造成的。 查看方法&#xff1a; 1、点击运行。 2、输入cmd打开dos命令窗口。 3、输入 powercfg -a。 4、查看是否支持休眠后唤醒。 如图就不支持休眠以后唤醒。就需要升级BIOS解决。 二、没有设置鼠标…

win10计算机休眠设置在哪里,win10休眠时间设置在哪里_win10更改休眠时间的方法...

win10休眠时间休眠在哪里设置&#xff1f;休眠状态能够是电脑处于误操作的状态&#xff0c;又避免了关机之后还要重新开机的麻烦&#xff0c;但很多使用win10精简版系统用户不知道哪里可以更改休眠时间&#xff0c;没关系&#xff0c;今天小编就来给大家分享win10更改休眠时间的…

win10电脑进入睡眠时间过快,电源选项的设置无效

我的笔记本电脑使用的是Windows10操作系统&#xff0c;但是最近发现了一个很奇怪的问题&#xff1a;电脑无操作后自动进入睡眠时间过快。 不管如何设置&#xff0c;电脑总会在无任何操作大约2分多钟后自动进入睡眠状态同时关闭显示器。设置了10分钟后关闭显示器&#xff0c;30分…

设置Ubuntu休眠时间

摘要&#xff1a;主要简介了如何设置Ubuntu18.04的休眠时间 原因&#xff1a;在学习Python过程中&#xff0c;在对照参考书编写代码时&#xff0c;看书时间稍长后&#xff0c;Ubuntu自动休眠&#xff0c;需要重新输入密码&#xff0c;麻烦&#xff0c;解决该问题方法如下。&…

win10总是很快自动休眠,设置休眠时间也无效?

最近升级显卡驱动后&#xff0c;电脑两分钟就会进入休眠&#xff0c;真的很烦&#xff0c;后来找到了解决方法&#xff0c;在硬件管理器先卸载自带的集显&#xff0c;但是卸载时注意不要把驱动也卸载了&#xff0c;然后重启电脑&#xff0c;会自动重新装载集显&#xff0c;之后…

VSC++=》 指针实数排序

缘由https://bbs.csdn.net/topics/396523482 void 指针实数排序(double* aa, int d) {//缘由https://bbs.csdn.net/topics/396523482double lin 0; int j d, jj 0;while (jj < d) if (--j > jj) if (aa[j] > aa[j - 1])lin aa[j], aa[j] aa[j - 1], aa[j - 1] …

libtif+vs2013编译问题

1> tif_fax3.c 1>D:\tiff-4.5.1\libtiff\tif_fax3.c(853): error C2054: 在“inline”之后应输入“(” 1>D:\tiff-4.5.1\libtiff\tif_fax3.c(854): error C2085: “find0span”: 不在形参表中 1>D:\tiff-4.5.1\libtiff\tif_fax3.c(854): error C2143: 语法错误 : …

OPPO Reno5和nova8哪个好?多维度对比告诉你真相

对于很多用户来说&#xff0c;他们的购机预算一般在3K左右&#xff0c;而在这个价位上&#xff0c;我们可选择的对象又非常之多。不过从现阶段的市场关注度来说&#xff0c;OPPO Reno5和华为nova8应该是3K价位中较为理想的选择&#xff0c;这两款机型在各方面的表现都能够达到用…

oppo reno6pro和oppo reno5区别 哪个更值得入手

oppo reno6pro和oppo reno5搭载相同的6.43英寸的 OLED 屏幕 &#xff0c;可以为用户提供很好的1080p分辨率&#xff0c;同时为用户提供90Hz的屏幕刷新 oppo手机活动爆降900这活动太给力了 机会不容错过http://oppo.adiannao.cn/18 opporeno6pro&#xff1a; 搭载3200万前置&a…

亲身使用分享:oppok7和reno4哪个好-对比区别

oppok7和reno4的参数对比&#xff0c;一起来了解一下吧。 2020下半年众多的手机品牌中&#xff0c;最受欢迎的居然是它&#xff1f;&#xff01;看看内行人怎么说&#xff01;真有点出乎意外&#xff01;. 点击参考京东最新手机销量排行榜&#xff1a;https://www.jd.shouji.c…

真我GTNeo3和OPPOReno8Pro+哪个值得买 哪个配置更好

真我GTNeo3和OPPOReno8Pro都是上半年新出的机型&#xff0c;在配置上都有着强劲的性能&#xff0c;但如果让这两款手机相对比&#xff0c;真我GTNeo3和OPPOReno8Pro哪个值得买? 哪个配置更好?来看看下文是怎么说的吧。 真我GTNeo3和OPPOReno8Pro哪个值得买 设计方面 如果你…

oppo k10 Pro和iqooneo6哪个性能更强 哪个值得买呢

oppo k10系列在近日正式发布了&#xff0c;作为一款主打性价比的手机&#xff0c;在配置上也十分亮眼&#xff0c;但如果和前面发布的iqooneo6对比&#xff0c;oppo k10 Pro和iqooneo6哪个性能更强? 哪个值得买呢?下面就一起来看看吧。 oppo k10 Pro和iqooneo6哪个性能更强 …