python - 在Python程序中模拟CTRL+Z发送短信
问题描述
我在我的 Raspberry PI 上编写了 Flask Web 服务器。
服务器接收 POST 并向 SIM868 模块硬件发送命令。这是我可以编写的代码。
def send(self):
if not self.validator():
data = {'message': 'Validation error'}
return jsonify(data), 422
delay = False
if 'AMA' in self.port:
delay = True
gsm = serial.Serial('/dev/tty%s' % self.port, 9600, timeout=1)
gsm.write('AT+CMGF=1\r')
gsm.write('AT+CMGS="%s"\r\n' % self.number.encode())
gsm.write(self.message.encode())
# gsm.write('\x1a') # Doesn't help
# gsm.write(x11x01) # Doesn't help
# gsm.write('\r\n') # Doesn't help
# gsm.write(ascii.ctrl('z')) # Doesn't help
abort_after = 10
start = time.time()
output = ""
while True:
output = output + gsm.readline()
print(output)
if '+CMGS:' in output:
gsm.close()
return '{"id":%s,"error":0,"message":"success", "raw":"%s"}' % (id, output)
if 'ERROR' in output:
gsm.close()
return '{"id":%s,"error":0,"message":"fail", "raw":"%s"}' % (id, output)
delta = time.time() - start
if delta >= abort_after:
gsm.close()
return '{"id":%s,"error":1,"message":"timeout", "raw":"%s"}' % (id, output)
所以问题是:模块可以接收数字和文本但不能发送,因为没有收到CTRL+Z命令。之后,我打开 PICOCOM 并按 CTRL+Z,然后我的 SMS 发送。
一切都很好,但是如何在使用串行端口的 Python 应用程序中真正模拟 CTRL+Z?
在发送到 SIM 硬件的最后一个命令之后,我看到OK答案,但也应该看到CMGS+答案。
我得到的结果 - 超时(最后一个 elseif 情况)
在过去的一个月里多次谷歌并阅读了多个文档:)
解决方案
您可以使用 pynput 库。首先安装它:
pip install pynput
将其导入您的项目,创建一个 Controller 对象,然后使用 .press() 和 .release() 命令来模拟击键。使用 Key.cmd 作为控制键的参数。这是一个教程。
推荐阅读
- regex - 在正则表达式中捕获组
- laravel - 从 laravel 集合中的选择组件中保存名称而不是 id
- android - 数据绑定从字符串中删除 html 标签
- angular - '{ message: string; 类型的参数 }' 不可分配给“any[]”类型的参数
- python - Plotly-Dash:聚合输入和输出以反映复杂的 python 对象
- visual-studio-code - 如何结合来自两个不同主题的 VS Code 工作台和令牌颜色
- python - 如何使用python opencv测量同一图像中两条线之间的角度?
- javascript - Nuxt 应用程序在刷新动态路由时返回 404(Tomcat 服务器)
- postgresql - GraphQL Playground 查询 JSON 到 Postgres - 如何避免查询字符串中的双引号?
- javascript - 如何在文档数组中搜索字符串数组