新人博主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°

视频效果

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

  1. 搭建Domoticz智能家居服务器实现外网控制ESP8266

    文章目录 智能家居系统设想 先来成果视频欣赏 Domoticz服务器搭建 MQTT服务器的搭建 外网控制的实现方法 在Domoticz管理页面新建设备 Arduino IDE程序的实现 智能家居系统设 ...

  2. 借助花生壳把内网网站映射给外网。(内网穿透/路由器端口映射)、外网控制内网...

    其实这个东西几年前我就弄过,但是当时心智不成熟,没学会怎么玩耍,今天玩了一把也没啥的, 1.搭建网站 假设内网电脑是192.168.100.9 访问Http://192.168.100.9能打开网站, ...

  3. 2023年新玩法:简单的安卓木马制作(实现外网控制)

    前言: 经常看到大佬写木马,写病毒,很多朋友肯定是心动不已.这次介绍个工具,可以直接生成远控木马. 工具: LX 远控(telegram 直接搜 频道):Windows系统pc机 绕过银行应用程序的黑 ...

  4. 政务外网、政务内网、政务专网介绍

    国家电子政务网络架构由政务内网.政务专网.政务外网组成. 政务内网的联网范围不可能延伸到乡镇这一级政府,且不可能与外网交换信息,因此副省级以下城市中,党政机关业务流转和信 息处理的主要平台一般部署在外 ...

  5. 教程——从外网远程控制内网电脑

    由于希望在图书馆时也能通过笔记本控制寝室的主机,所以研究了一下远程控制,但寝室的网并不属于简单的一层内网,所以踩了一些坑,在这里把经验分享一下 (一) 在同一局域网下的远程控制 首先测试在同一局域网时 ...

  6. Windows外网远程桌面连接【免费内网穿透】

    Windows系统自带的远程桌面连接,正常只能在局域网内使用,但对于出差在外,或者在家想要远程连接公司内网电脑的情况下,可以做内网穿透,映射3389端口到公网,生成公网地址来远程连接. 这里推荐一款免 ...

  7. 外网电脑远程内网电脑用什么软件,没有外网可以远程控制吗

    远程控制电脑,正常来说都是要通网的.电脑连入互联网,才可以进行远程控制.一台没有任何网络连接的电脑,没法进行远程连接和控制. 但是有一种情况比较特殊,就是企业内网环境.有些企业出于数据安全考虑或其他现 ...

  8. STM32驱动十个步进电机

    https://download.csdn.net/download/qq_36958104/12015084 程序链接 脉冲很正点   //stm32驱动步进电机 串口输出控制旋转角度 光电开关检测 ...

  9. 【常用芯片】ULN2003工作原理及中文资料(实例:STM32驱动28BYJ48步进电机)

    ULN2003的基本介绍 ULN2003的概述 ULN2003是高耐压.大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成.一般采用DIP-16 或SOP-16 塑料封装. ULN2003的主要特点 ...

最新文章

  1. adb install -r ,-d 等的解释
  2. 这才是面试官想听的:详解「递归」正确的打开方式
  3. 服务都启用的情况下XP远程桌面还是出现“此计算机无法连接到远程计算机”...
  4. CentOS下 安装xampp
  5. 调用webservice时提示对操作的回复消息正文进行反序列化时出错
  6. BufferQueue 和 gralloc
  7. 学编程一定要掌握的186个关键单词!
  8. 【ANSYS命令流】模型的建立(二):其他相关命令(图形控制、节点单元选择等)
  9. cfree5.0中文版
  10. 【GitChat】精选——个人开发者如何通过人工智能盈利?
  11. 阿里云centos部署jsonserver
  12. SQL 常用英文单词
  13. JAVA微商城_O2O微门店SAAS系统
  14. android设备怎么支持8021x,android WiFi ASSOC_REJECT 流程跟踪
  15. ZOOM——C++软件开发岗(实习)——视频面试一面
  16. 十分详细的阳光十六法则 (转)
  17. Google Analytic谷歌分析
  18. 关于iOS tableview自定义区头
  19. C语言之strrchr函数
  20. 高颜值!广西730分学霸杨晨煜被清华智班录取,学习人工智能,网友纷纷求开微博!

热门文章

  1. 5-QR code识别
  2. 九蒸九晒熟地黄的功效
  3. 日复一日对着电脑何谈健康?想要改善如何做
  4. 数据分析: 带你一览特朗普总统的“微博”世界 (上)
  5. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第二十集
  6. 交叉线和直通线的做法
  7. 生活中的观察者偏见例子_消除人工智能第2部分中的偏见,解决性别和种族偏见...
  8. nexus-基本使用
  9. windows php java_Windows下配置 php-java-bridge
  10. [USACO]1.2.2Milking Cows