连接阿里云的Python源码

连接阿里云的Python源码,参考网上的代码,然后QT代码也是参照这个写的。

代码中加了很多注释,可以轻易看懂。

# coding=utf-8
# !/usr/bin/python3

import datetime
import time
import hmac
import hashlib
import math

TEST = 0

ProductKey = "a1EdB95bzby"
ClientId = "test123"  # 自定义clientId
DeviceName = "test01"
DeviceSecret = "qU47CjbOh5F26D8isBX6BC5jZ9Uo2Nto"

# signmethod
signmethod = "hmacsha1"
# signmethod = "hmacmd5"

# 当前时间毫秒值
us = math.modf(time.time())[0]#获取当前时间微秒
ms = int(round(us * 1000))#round是默认取整,后面可以加保留的小数位数,不过不是严格四舍五入,结果是毫秒。
#timestamp = str(ms)#转换为字符串
timestamp = "12345"

data = "".join(("clientId", ClientId, "deviceName", DeviceName,    #生成进行哈希算法的原始数据
                "productKey", ProductKey, "timestamp", timestamp
                ))
# print(round((time.time() * 1000)))
print("data:", data)

if "hmacsha1" == signmethod:
    ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),    #hmacsha1是哈希算法的一种
                   bytes(data, encoding="utf-8"),
                   hashlib.sha1).hexdigest()  #这里的hexdigest直接输出16进制str
elif "hmacmd5" == signmethod:
    ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),     #md5也是一种信息摘要算法,用以取代md4。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
                   bytes(data, encoding="utf-8"),
                   hashlib.md5).hexdigest()   #这里的hexdigest直接输出16进制str
else:
    raise ValueError   #当程序出错时,python会自动触发异常,也可以通过raise显示引发异常,一旦执行了raise语句,raise之后的语句不在执行

sign = ret     #ret是哈希算法生成的摘要,这里作为用户密码
print("sign:", sign)

# ======================================================

strBroker = ProductKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"     #生成域名,阿里的服务器域名对应好几个IP地址,有一部分原因是为了做负载均衡。
port = 1883    #端口号是1883

client_id = "".join((ClientId,      #生成client_id
                     "|securemode=3",
                     ",signmethod=", signmethod,
                     ",timestamp=", timestamp,
                     "|"))
username = "".join((DeviceName, "&", ProductKey))   #生成用户名
password = sign   #用户密码也就是ret(哈希生成的摘要)

print("="*30)
print("client_id:", client_id)
print("username:", username)
print("password:", password)
print("="*30)

def secret_test():
    DeviceSecret = "secret"
    data = "clientId12345deviceNamedeviceproductKeypktimestamp789"
    ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),   #bytes主要是给在计算机看的,string主要是给人看的,转换桥梁就是编码
                   bytes(data, encoding="utf-8"),
                   hashlib.sha1).hexdigest()
    print("test:", ret)


# ======================================================
# MQTT Initialize.--------------------------------------

try:
    import paho.mqtt.client as mqtt     #导入paho.mqtt,这是一个MQTT协议的JavaScript库,还有一个js库MQTT.js,MQTT.js是需要Node.js的相关环境的
except ImportError:
    print("MQTT client not find. Please install as follow:")
    print("git clone http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.python.git")
    print("cd org.eclipse.paho.mqtt.python")
    print("sudo python setup.py install")


# ======================================================
#这里重写了mqtt库中的部分函数


def on_connect(mqttc, obj, rc):
    print("OnConnetc, rc: " + str(rc))

    mqttc.subscribe("test", 0)

#将消息发送到云端
def on_publish(mqttc, obj, mid):
    print("OnPublish, mid: " + str(mid))


def on_subscribe(mqttc, obj, mid, granted_qos):
    print("Subscribed: " + str(mid) + " " + str(granted_qos))


def on_log(mqttc, obj, level, string):
    print("Log:" + string)

#接收与处理来自云端的消息
def on_message(mqttc, obj, msg):
    curtime = datetime.datetime.now()
    strcurtime = curtime.strftime("%Y-%m-%d %H:%M:%S")
    print(strcurtime + ": " + msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
    on_exec(str(msg.payload))


def on_exec(strcmd):
    print("Exec:", strcmd)
    strExec = strcmd


# =====================================================
if __name__ == '__main__':
    if TEST:
        secret_test()
        exit(0)

    mqttc = mqtt.Client(client_id)
    mqttc.username_pw_set(username, password)
    mqttc.on_message = on_message
    mqttc.on_connect = on_connect
    mqttc.on_publish = on_publish
    mqttc.on_subscribe = on_subscribe
    mqttc.on_log = on_log

    mqttc.connect(strBroker, port, 120)
    mqttc.loop_forever()

 

### 如何在阿里云上执行Python代码 #### 配置Python环境 为了确保能够在阿里云服务器上顺利运行Python代码,首先需要确认已正确安装所需的Python版本。由于自带的Python版本可能较旧(如2.7),建议按照教程下载更新至更高版本(例如3.6)。完成新版本安装后应删除并备份旧版Python以防止冲突[^1]。 ```bash # 更新软件包列表 sudo apt-get update # 安装依赖项用于编译Python源码 sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \ libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git # 下载指定版本的Python源码并解压 cd /usr/src sudo wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz # 编译安装新的Python版本 cd Python-3.6.8 sudo ./configure --enable-optimizations sudo make altinstall # 测试安装是否成功 python3.6 --version ``` #### 设置PyCharm连接到远程解释器 对于希望使用IDE开发的同学来说,在本地机器上的PyCharm可以通过SSH协议链接到位于云端的服务端来调试程序。具体操作是在PyCharm内通过`文件>>>设置>>>项目>>>Python解释器`路径找到添加按钮,选择SSH选项卡输入相应的主机名(即服务端公网IP),用户名以及密码等必要参数完成配置过程[^2]。 ```python import socket def server_program(): host = '0.0.0.0' # 绑定所有网络接口 port = 5000 # 使用任意未被占用端口号 server_socket = socket.socket() server_socket.bind((host, port)) print(f'Server started on {socket.gethostname()}:{port}') while True: conn, address = server_socket.accept() data = conn.recv(1024).decode() if not data: break message = f"From connected user: {data}" conn.send(message.encode()) conn.close() if __name__ == '__main__': server_program() ``` #### 创建定时任务 当涉及到定期自动化的场景时,则可以在Linux系统的cron工具帮助下来安排周期性的作业计划。只需将编写好的Python脚本放置于合适位置,并编辑crontab文件加入相应的时间表达式即可让其按设定时间间隔重复触发[^3]。 ```bash # 编辑当前用户的crontab条目 crontab -e # 添加一行定义每天凌晨两点整执行一次特定脚本的任务 0 2 * * * /path/to/script.py >> /var/log/my_script.log 2>&1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值